commit c6ec92802bda383ee8308621742e289798f9772b Author: Cauê Faleiros Date: Mon Feb 2 15:31:15 2026 -0300 add: full multi-tenancy control diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..59c2881 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,12 @@ +.git +.env +node_modules +vendor +storage/framework/cache/data +storage/framework/sessions +storage/framework/views +storage/logs +bootstrap/cache/*.php +public/storage +tests +docker diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..6537ca4 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,15 @@ +root = true + +[*] +charset = utf-8 +end_of_line = lf +insert_final_newline = true +indent_style = space +indent_size = 4 +trim_trailing_whitespace = true + +[*.md] +trim_trailing_whitespace = false + +[*.{yml,yaml}] +indent_size = 2 diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..24a72ce --- /dev/null +++ b/.env.example @@ -0,0 +1,66 @@ +APP_NAME='Krayin CRM' +APP_ENV=local +APP_KEY= +APP_DEBUG=true +APP_URL=http://localhost +APP_TIMEZONE=Asia/Kolkata +APP_LOCALE=en +APP_CURRENCY=USD + +VITE_HOST= +VITE_PORT= + +LOG_CHANNEL=stack +LOG_LEVEL=debug + +DB_CONNECTION=mysql +DB_HOST=127.0.0.1 +DB_PORT=3306 +DB_DATABASE=laravel-crm +DB_USERNAME=root +DB_PASSWORD= +DB_PREFIX= + +BROADCAST_DRIVER=log +CACHE_DRIVER=file +QUEUE_CONNECTION=sync +SESSION_DRIVER=file +SESSION_LIFETIME=120 + +MEMCACHED_HOST=127.0.0.1 + +REDIS_HOST=127.0.0.1 +REDIS_PASSWORD=null +REDIS_PORT=6379 + +MAIL_MAILER=smtp +MAIL_HOST=mailhog +MAIL_PORT=1025 +MAIL_USERNAME=null +MAIL_PASSWORD=null +MAIL_ENCRYPTION=null +MAIL_FROM_ADDRESS=laravel@krayincrm.com +MAIL_FROM_NAME="${APP_NAME}" +MAIL_DOMAIN=webkul.com + +MAIL_RECEIVER_DRIVER=sendgrid + +IMAP_HOST=imap.example.com +IMAP_PORT=993 +IMAP_ENCRYPTION=ssl +IMAP_VALIDATE_CERT=true +IMAP_USERNAME=your_username +IMAP_PASSWORD=your_password + +AWS_ACCESS_KEY_ID= +AWS_SECRET_ACCESS_KEY= +AWS_DEFAULT_REGION=us-east-1 +AWS_BUCKET= + +PUSHER_APP_ID= +PUSHER_APP_KEY= +PUSHER_APP_SECRET= +PUSHER_APP_CLUSTER=mt1 + +MIX_PUSHER_APP_KEY="${PUSHER_APP_KEY}" +MIX_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}" diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..fcb21d3 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,11 @@ +* text=auto eol=lf + +*.blade.php diff=html +*.css diff=css +*.html diff=html +*.md diff=markdown +*.php diff=php + +/.github export-ignore +CHANGELOG.md export-ignore +.styleci.yml export-ignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..6cc6208 --- /dev/null +++ b/.gitignore @@ -0,0 +1,35 @@ +.env +.env.testing +.idea +.php_cs.cache +.phpunit.result.cache +.vscode +.vagrant +*.hot +/stubs +/data +/docker-compose-collection +Homestead.json +Homestead.yaml +/ignorables/* +/node_modules +npm-debug.log +package-lock.json +/playwright-report +/public/css +/public/js +/public/hot +/public/storage +/public/vendor +/lang/vendor +/storage/*.key +/storage/dcc-data/ +/vendor +yarn.lock +yarn-error.log + +# Playwright +node_modules/ +/test-results/ +/blob-report/ +/playwright/.cache/ diff --git a/.tmp-growup-v4-final.tar2046928222 b/.tmp-growup-v4-final.tar2046928222 new file mode 100644 index 0000000..e69de29 diff --git a/000-default.conf b/000-default.conf new file mode 100644 index 0000000..37ecc74 --- /dev/null +++ b/000-default.conf @@ -0,0 +1,16 @@ + + ServerAdmin webmaster@localhost + + # AQUI ESTÁ A MÁGICA: Apontar para a pasta public + DocumentRoot /var/www/html/public + + + Options Indexes FollowSymLinks + # Isso permite que o Laravel gerencie as rotas (remove o index.php da url) + AllowOverride All + Require all granted + + + ErrorLog ${APACHE_LOG_DIR}/error.log + CustomLog ${APACHE_LOG_DIR}/access.log combined + diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md new file mode 100644 index 0000000..882f374 --- /dev/null +++ b/CODE_OF_CONDUCT.md @@ -0,0 +1,76 @@ +# Contributor Covenant Code of Conduct + +## Our Pledge + +In the interest of fostering an open and welcoming environment, we as +contributors and maintainers pledge to making participation in our project and +our community a harassment-free experience for everyone, regardless of age, body +size, disability, ethnicity, sex characteristics, gender identity and expression, +level of experience, education, socio-economic status, nationality, personal +appearance, race, religion, or sexual identity and orientation. + +## Our Standards + +Examples of behavior that contributes to creating a positive environment +include: + +* Using welcoming and inclusive language +* Being respectful of differing viewpoints and experiences +* Gracefully accepting constructive criticism +* Focusing on what is best for the community +* Showing empathy towards other community members + +Examples of unacceptable behavior by participants include: + +* The use of sexualized language or imagery and unwelcome sexual attention or + advances +* Trolling, insulting/derogatory comments, and personal or political attacks +* Public or private harassment +* Publishing others' private information, such as a physical or electronic + address, without explicit permission +* Other conduct which could reasonably be considered inappropriate in a + professional setting + +## Our Responsibilities + +Project maintainers are responsible for clarifying the standards of acceptable +behavior and are expected to take appropriate and fair corrective action in +response to any instances of unacceptable behavior. + +Project maintainers have the right and responsibility to remove, edit, or +reject comments, commits, code, wiki edits, issues, and other contributions +that are not aligned to this Code of Conduct, or to ban temporarily or +permanently any contributor for other behaviors that they deem inappropriate, +threatening, offensive, or harmful. + +## Scope + +This Code of Conduct applies both within project spaces and in public spaces +when an individual is representing the project or its community. Examples of +representing a project or community include using an official project e-mail +address, posting via an official social media account, or acting as an appointed +representative at an online or offline event. Representation of a project may be +further defined and clarified by project maintainers. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be +reported by contacting the project team at support@krayincrm.com. All +complaints will be reviewed and investigated and will result in a response that +is deemed necessary and appropriate to the circumstances. The project team is +obligated to maintain confidentiality with regard to the reporter of an incident. +Further details of specific enforcement policies may be posted separately. + +Project maintainers who do not follow or enforce the Code of Conduct in good +faith may face temporary or permanent repercussions as determined by other +members of the project's leadership. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, +available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html + +[homepage]: https://www.contributor-covenant.org + +For answers to common questions about this code of conduct, see +https://www.contributor-covenant.org/faq diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..1673fda --- /dev/null +++ b/Dockerfile @@ -0,0 +1,41 @@ +FROM php:8.2-apache + +# 1. Dependências (Inclui netcat-openbsd e redis) +RUN apt-get update && apt-get install -y \ + git curl unzip libpng-dev libonig-dev libxml2-dev libzip-dev libicu-dev zip vim nano autoconf pkg-config netcat-openbsd \ + && pecl install redis \ + && docker-php-ext-enable redis \ + && docker-php-ext-configure intl \ + && docker-php-ext-install pdo_mysql mbstring exif pcntl bcmath gd zip calendar intl \ + && a2enmod rewrite \ + && apt-get clean && rm -rf /var/lib/apt/lists/* + +COPY --from=composer:latest /usr/bin/composer /usr/bin/composer +WORKDIR /var/www/html +COPY . . + +# 2. Copia as correções manuais +# COPY AppServiceProvider.php app/Providers/AppServiceProvider.php +# COPY TrustProxies.php app/Http/Middleware/TrustProxies.php +COPY 000-default.conf /etc/apache2/sites-available/000-default.conf + +# 3. Pastas e Permissões +RUN mkdir -p storage/framework/sessions \ + && mkdir -p storage/framework/views \ + && mkdir -p storage/framework/cache \ + && mkdir -p bootstrap/cache \ + && chown -R www-data:www-data /var/www/html/storage \ + && chown -R www-data:www-data /var/www/html/bootstrap/cache \ + && chmod -R 775 /var/www/html/storage + +# 4. Instalação do PHP +RUN composer install --no-dev --no-interaction --prefer-dist --optimize-autoloader + +# 5. Script de Entrada +COPY docker-entrypoint.sh /usr/local/bin/ +# Garante quebras de linha Linux +RUN sed -i 's/\r$//' /usr/local/bin/docker-entrypoint.sh +RUN chmod +x /usr/local/bin/docker-entrypoint.sh + +EXPOSE 80 +ENTRYPOINT ["docker-entrypoint.sh"] diff --git a/GEMINI.md b/GEMINI.md new file mode 100644 index 0000000..21e1b5f --- /dev/null +++ b/GEMINI.md @@ -0,0 +1,1068 @@ +# Growup Pro - Krayin CRM Whitelabel Multi-tenant + +## Project Overview + +**Growup Pro** is a whitelabel implementation of [Krayin Laravel CRM](https://github.com/krayin/laravel-crm) with multi-tenancy support. The platform allows multiple companies/organizations to use the same CRM instance with complete data isolation through subdomain-based tenancy. + +**CURRENT STATUS: DEBUGGING PHASE** +- **Multi-tenancy implementation**: Installed but encountering issues. +- **Issue 1**: `localhost` not recognized as central domain (TenantCouldNotBeIdentifiedOnDomainException). +- **Issue 2**: Tenant instances (`tenant1.localhost`) load but missing CSS (Asset 404). +- **Goal**: Fix central domain detection and static asset serving for tenants. + +### Key Differentiators from Krayin +- **Rebranding**: Complete visual overhaul with Growup Pro branding +- **Multi-tenancy**: Isolated environments per client organization +- **Localization**: Full Portuguese (pt-BR) translation +- **White-label ready**: Easy customization per tenant + +## Tech Stack + +- **Framework**: Laravel (check composer.json for exact version) +- **Base CRM**: Krayin Laravel CRM +- **Database**: MySQL/PostgreSQL +- **Multi-tenancy Package**: [Tenancy for Laravel](https://tenancyforlaravel.com/docs/v3/introduction) (v3) +- **Frontend**: Blade templates with Alpine.js (Krayin default) +- **PHP Version**: 8.1+ +- **Containerization**: Docker with Docker Compose +- **Orchestration**: Docker Swarm +- **Management**: Portainer +- **CI/CD**: Gitea Actions (GitHub Actions compatible) +- **Error Tracking**: Sentry for Laravel +- **Code Quality**: PHPStan (static analysis) + Laravel Pint (code formatter) +- **CDN**: Cloudflare (caching and DDoS protection) - **PRODUCTION ONLY** + +## Project Structure + +``` +. +├── .gitea/ +│ └── workflows/ # Gitea Actions CI/CD pipelines +│ ├── deploy.yml # Production deployment +│ ├── deploy-staging.yml # Staging environment deployment +│ └── tests.yml # Automated testing pipeline +├── .husky/ # Git hooks (pre-commit, pre-push) +├── Makefile # Common development commands +├── app/ +│ ├── Models/ # Eloquent models (tenant-scoped) +│ ├── Http/ +│ │ ├── Controllers/ # Application controllers +│ │ └── Middleware/ # Custom middleware (tenant identification) +│ └── Providers/ # Service providers +├── config/ +│ └── tenancy.php # Tenancy for Laravel configuration +├── database/ +│ ├── migrations/ # Database migrations +│ │ ├── tenant/ # Tenant-specific migrations +│ │ └── landlord/ # Central database migrations +│ └── seeders/ # Seeders for tenants and central data +│ ├── DemoTenantSeeder.php # Creates demo tenants for testing +│ └── ProductionSeeder.php # Production data seeding +├── docker/ +│ ├── Dockerfile # Application container definition +│ ├── docker-compose.yml # Local development orchestration +│ └── docker-compose.prod.yml # Production stack definition +├── packages/ # Krayin core packages +│ └── Webkul/ +│ └── ... +├── public/ +│ └── assets/ # Growup Pro assets (logos, images) +├── resources/ +│ ├── lang/ +│ │ └── pt_BR/ # Portuguese translations +│ └── views/ # Blade templates (Growup Pro customized) +└── routes/ + ├── web.php # Central app routes + ├── tenant.php # Tenant-specific routes + ├── admin.php # Admin dashboard routes (tenant management) + └── api.php # API routes +``` + +## Multi-tenancy Configuration + +### Package: Tenancy for Laravel +We use **Tenancy for Laravel v3** for robust multi-tenant architecture with automatic database switching and tenant identification. + +### Tenant Identification Strategy +- **Method**: Subdomain-based identification +- **Domain**: `growuppro.com.br` +- **Pattern**: `{tenant}.growuppro.com.br` +- **Examples**: + - `empresa1.growuppro.com.br` → Tenant: empresa1 + - `empresa2.growuppro.com.br` → Tenant: empresa2 + - `demo.growuppro.com.br` → Tenant: demo + +### Data Isolation +- **Approach**: Separate database per tenant (recommended by Tenancy for Laravel) +- Database naming: `tenant_{tenant_id}` (e.g., `tenant_empresa1`) +- Central database: `growuppro_central` (stores tenant metadata, domains, users) +- Automatic tenant context switching via middleware +- Models automatically scoped to current tenant + +### Tenant Features +Each tenant has isolated: +- **Data**: Leads, contacts, deals, products, activities +- **Users**: Separate user base with roles/permissions +- **Settings**: Email configuration, notifications, workflows +- **Customization**: Optional CSS overrides, email templates + +## Branding & Localization + +### Growup Pro Visual Identity +- **Application Name**: Growup Pro (replacing all Krayin mentions) +- **Logo**: Custom Growup Pro logo in all interfaces +- **Color Scheme**: [Define primary/secondary colors when ready] +- **Typography**: [Define font family when ready] +- **UI/UX**: Modern, clean interface aligned with Growup Pro brand + +### Translation (pt-BR) +- All user-facing text translated to Portuguese (Brazil) +- Language files in `resources/lang/pt_BR/` +- Default locale: `pt_BR` (set in `config/app.php`) +- Maintain translation keys for easy updates +- Include tenant-customizable text snippets + +### Customization Locations +1. **Logo**: `public/assets/images/logo.png` (central) and tenant-specific storage +2. **Translations**: `resources/lang/pt_BR/` +3. **Views**: `resources/views/` (customized Krayin templates) +4. **Styles**: `public/assets/css/custom.css` (Growup Pro overrides) +5. **Config**: `config/growuppro.php` (application-specific settings) + +## Docker & Deployment Architecture + +### Container Strategy +The application runs in Docker containers orchestrated by Docker Swarm and managed through Portainer. + +### Docker Compose Structure +- **Development**: `docker-compose.yml` (local development with hot-reload) +- **Production**: `docker-compose.prod.yml` (optimized for Swarm deployment) + +### Services +Typical stack includes: +- **app**: PHP-FPM application container (Growup Pro) +- **nginx-proxy-manager**: Nginx Proxy Manager for reverse proxy, SSL, and domain management (managed via Portainer) +- **database**: MySQL/PostgreSQL (central + tenants) +- **redis**: Session and cache storage +- **queue**: Laravel queue worker for background jobs +- **scheduler**: Laravel scheduler (cron jobs) + +### Image Management +- **Registry**: GitHub Container Registry (GHCR) +- **Image naming**: `ghcr.io/cauefaleiros/growup-pro:latest` +- **Tagging strategy**: Git commit SHA and semantic versioning +- **Tags**: `latest` (production), `dev` (development), `v{version}` (releases) + +## CI/CD Pipeline with Gitea Actions + +### About Gitea Actions +Gitea Actions (available since Gitea 1.19) is a built-in CI/CD solution similar and mostly compatible with GitHub Actions. It uses the same YAML workflow format and is compatible with most GitHub Actions marketplace plugins. + +**Key Components:** +- **Gitea Server**: Hosts repositories and triggers workflows +- **act_runner**: Standalone runner program (written in Go) that executes jobs, based on a fork of nektos/act +- **Workflows**: YAML files stored in `.gitea/workflows/` directory (compatible with GitHub Actions syntax) + +**Compatibility:** +- Same YAML syntax as GitHub Actions +- Can use most actions from GitHub marketplace (e.g., `actions/checkout@v4`, `actions/setup-node@v4`) +- Workflows are portable between GitHub and Gitea with minimal changes + +### Deployment Flow +``` +Developer pushes code to GitHub + ↓ +GitHub Actions workflow triggered + ↓ +1. Run tests (PHPUnit, Pest) +2. Build Docker image +3. Tag image with commit SHA + ↓ +Push image to GitHub Container Registry (GHCR) + ↓ +Call Portainer API (webhook or direct API) + ↓ +Portainer updates Docker Stack definition + ↓ +Docker Swarm pulls new image + ↓ +Swarm performs rolling update (zero-downtime) + ↓ +Health checks verify deployment + ↓ +Old containers removed +``` + +### GitHub Actions Workflow +Location: `.github/workflows/deploy.yml` + +Key steps: +1. **Checkout code** +2. **Setup PHP & dependencies** (Composer install) +3. **Run code quality checks** (PHPStan, Pint) +4. **Run tests** (PHPUnit/Pest - ensure code quality) +5. **Build Docker image** with build args +6. **Login to GHCR** using GitHub token +7. **Push image** with appropriate tags +8. **Trigger Portainer** via API to update stack +9. **Verify deployment** (health check endpoint) +10. **Notify team** (Slack/Discord webhook on success/failure) + +### Environment Variables +Managed through: +- **GitHub Secrets**: Sensitive data (API keys, tokens, Sentry DSN) +- **Portainer**: Stack environment variables +- **Docker Swarm Secrets**: Database credentials, API keys + +### Portainer Integration +- **Portainer URL**: `https://148.230.76.122:9443` +- **API Endpoint**: `https://148.230.76.122:9443/api` +- **Authentication**: API token (stored in GitHub Secrets) +- **Stack Management**: Update existing stack with new image tag +- **Webhooks**: Optional webhook for automated redeploy +- **Nginx Proxy Manager**: Managed through Portainer for SSL certificates and domain routing + +## Coding Conventions + +### Models +All tenant-scoped models automatically inherit tenant context through Tenancy for Laravel: + +```php +id(); + $table->string('title'); + $table->decimal('value', 10, 2); + // No tenant_id needed - separate databases per tenant + $table->timestamps(); +}); + +// database/migrations/2024_xx_xx_create_tenants_table.php (central) +Schema::create('tenants', function (Blueprint $table) { + $table->string('id')->primary(); + $table->string('company_name'); + $table->string('subdomain')->unique(); + $table->timestamps(); +}); +``` + +### Routes +```php +// routes/tenant.php - Runs in tenant context +Route::middleware(['tenant'])->group(function () { + Route::get('/dashboard', [DashboardController::class, 'index']); + Route::resource('leads', LeadController::class); +}); + +// routes/web.php - Central app (tenant selection, etc.) +Route::get('/', [HomeController::class, 'index']); +Route::post('/register-tenant', [TenantController::class, 'register']); +``` + +## Important Files to Know + +### Configuration +- `config/app.php` - Application configuration (locale: pt_BR) +- `config/tenancy.php` - Tenancy for Laravel settings +- `config/growuppro.php` - Custom Growup Pro configuration +- `app/Http/Kernel.php` - Middleware registration + +### Krayin Core +- `packages/Webkul/` - Krayin core packages (**never modify directly**) +- Extend functionality through Laravel's standard practices (service providers, custom packages) + +### Docker & Deployment +- `docker/Dockerfile` - Application container definition +- `docker-compose.yml` - Local development environment +- `docker-compose.prod.yml` - Production stack for Swarm +- `.github/workflows/deploy.yml` - CI/CD pipeline + +### Branding +- `public/assets/images/logo.png` - Growup Pro logo +- `resources/lang/pt_BR/` - Portuguese translations +- `resources/views/layouts/app.blade.php` - Main layout (branded) + +## CRITICAL: Krayin Authentication Issues (MUST RESOLVE BEFORE MULTI-TENANCY) + +**IMPORTANT:** Multi-tenancy implementation is ON HOLD until we stabilize Krayin's base authentication system. We have experienced critical login issues that must be resolved first. + +### Known Authentication Problems + +#### Problem 1: Error 419 - CSRF Token Mismatch +**Symptoms:** +- User enters credentials +- Form submission returns 419 error +- Login fails even with correct credentials + +**Possible Causes:** +- Session driver misconfiguration (`file` vs `redis` vs `database`) +- Session cookie not being set properly +- Domain/subdomain mismatch in session configuration +- `APP_URL` mismatch with actual access URL +- CSRF token expiration (session timeout too short) +- Reverse proxy stripping session cookies + +**Debug Steps:** +```bash +# Check current session driver +grep SESSION_DRIVER .env + +# Clear all caches +php artisan cache:clear +php artisan config:clear +php artisan route:clear +php artisan view:clear + +# Check session files (if using file driver) +ls -la storage/framework/sessions/ + +# Test session configuration +php artisan tinker +>>> session()->put('test', 'value'); +>>> session()->get('test'); # Should return 'value' +``` + +**Potential Fixes:** +1. **Ensure APP_URL matches access URL exactly:** + ```env + # If accessing via localhost:8000 + APP_URL=http://localhost:8000 + + # If accessing via IP + APP_URL=http://192.168.1.100:8000 + ``` + +2. **Check session configuration** (`config/session.php`): + ```php + 'domain' => env('SESSION_DOMAIN', null), // Should match your domain + 'secure' => env('SESSION_SECURE_COOKIE', false), // false for HTTP, true for HTTPS + 'same_site' => 'lax', // Not 'strict' - can cause issues + ``` + +3. **Verify CSRF middleware** is present in `app/Http/Kernel.php`: + ```php + protected $middlewareGroups = [ + 'web' => [ + \App\Http\Middleware\EncryptCookies::class, + \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class, + \Illuminate\Session\Middleware\StartSession::class, + \Illuminate\View\Middleware\ShareErrorsFromSession::class, + \App\Http\Middleware\VerifyCsrfToken::class, // THIS IS CRITICAL + // ... + ], + ]; + ``` + +4. **Check CSRF exceptions** (if login route needs to be excluded): + ```php + // app/Http/Middleware/VerifyCsrfToken.php + protected $except = [ + // Add routes here ONLY as last resort + ]; + ``` + +#### Problem 2: Tenant Database Connection Issues +**Symptoms:** +- Login attempt fails silently +- Database connection errors in logs +- Can't authenticate against tenant-specific users table + +**Possible Causes:** +- Tenant database doesn't exist yet +- Database migrations not run on tenant database +- Wrong database being queried (central vs tenant) +- Tenant context not initialized before authentication attempt + +**Debug Steps:** +```bash +# List all databases +php artisan tinker +>>> DB::select('SHOW DATABASES'); + +# Check which database Laravel is connected to +>>> DB::connection()->getDatabaseName(); + +# Verify users table exists in tenant DB +>>> Schema::connection('tenant')->hasTable('users'); +``` + +**Critical Notes for Multi-tenancy:** +- Authentication MUST work in single-tenant (non-multi-tenant) mode FIRST +- Only after stable authentication should we add tenant context switching +- Tenant middleware should NOT interfere with session/CSRF handling + +#### Problem 3: Infinite Login Redirect Loop (CRITICAL - UNRESOLVED) +**Symptoms:** +- User enters valid credentials +- Form submits successfully (no 419 error) +- Page redirects back to login page +- User is never authenticated +- Dashboard never loads +- No error messages displayed + +**This is the MOST CRITICAL issue and must be debugged thoroughly.** + +**Possible Causes:** +1. **Session not persisting after authentication:** + - Session written but immediately destroyed + - Session driver issue (file permissions, Redis connection) + - Session ID regeneration failing + +2. **Authentication middleware misconfigured:** + - `Auth` middleware blocking authenticated users + - Wrong guard being checked + - Middleware order issues in Kernel.php + +3. **Redirect logic broken:** + - `redirectTo` property in LoginController pointing to login route + - Intended destination not being preserved + - Route name/path mismatch + +4. **Auth guard misconfigured:** + - Wrong guard specified in `config/auth.php` + - Provider not finding users correctly + - User model relationship issues + +5. **Cookie domain/path mismatch:** + - Session cookie being set but not read back + - Domain attribute too restrictive + - Path attribute incorrect + +**Detailed Debug Steps:** + +```bash +# 1. Enable query logging to see what's happening +# Add to AppServiceProvider boot(): +DB::listen(function ($query) { + Log::info('Query: ' . $query->sql . ' - Bindings: ' . json_encode($query->bindings)); +}); + +# 2. Add extensive logging to login process +# In LoginController or wherever authentication happens: +Log::info('Login attempt for: ' . request()->email); +Log::info('Session ID before auth: ' . session()->getId()); + +# After Auth::attempt(): +Log::info('Auth attempt result: ' . (Auth::check() ? 'success' : 'failed')); +Log::info('Session ID after auth: ' . session()->getId()); +Log::info('Authenticated user: ' . (Auth::user() ? Auth::user()->id : 'none')); + +# 3. Check session files directly +# If using file driver: +tail -f storage/logs/laravel.log & +# Make login attempt +# Check if session file is created and contains auth data: +cat storage/framework/sessions/* + +# 4. Test authentication in Tinker +php artisan tinker +>>> $user = User::first(); +>>> Auth::login($user); +>>> Auth::check(); # Should return true +>>> session()->all(); # Check session data +>>> session()->save(); # Manually save session +``` + +**Configuration Files to Check:** + +1. **config/auth.php** + ```php + 'defaults' => [ + 'guard' => 'web', // Verify this matches your usage + 'passwords' => 'users', + ], + + 'guards' => [ + 'web' => [ + 'driver' => 'session', + 'provider' => 'users', + ], + ], + + 'providers' => [ + 'users' => [ + 'driver' => 'eloquent', + 'model' => App\Models\User::class, // Verify model path + ], + ], + ``` + +2. **config/session.php** + ```php + 'driver' => env('SESSION_DRIVER', 'file'), + 'lifetime' => env('SESSION_LIFETIME', 120), + 'expire_on_close' => false, + 'encrypt' => false, + 'files' => storage_path('framework/sessions'), + 'connection' => env('SESSION_CONNECTION', null), + 'table' => 'sessions', + 'store' => env('SESSION_STORE', null), + 'lottery' => [2, 100], + 'cookie' => env('SESSION_COOKIE', Str::slug(env('APP_NAME', 'laravel'), '_').'_session'), + 'path' => '/', + 'domain' => env('SESSION_DOMAIN', null), // Should be NULL for localhost + 'secure' => env('SESSION_SECURE_COOKIE', false), // FALSE for HTTP + 'http_only' => true, + 'same_site' => 'lax', // NOT 'strict' + ``` + +3. **Verify LoginController redirect logic:** + ```php + // Typical Laravel LoginController + protected $redirectTo = '/dashboard'; // NOT '/login'! + + // Or method: + protected function redirectTo() { + return '/dashboard'; // Verify this route exists and is accessible + } + + // Check authenticated() method isn't causing issues: + protected function authenticated(Request $request, $user) { + // Should NOT return redirect to login + Log::info('User authenticated: ' . $user->id); + } + ``` + +4. **Check middleware in routes:** + ```php + // routes/web.php + Route::middleware(['auth'])->group(function () { + Route::get('/dashboard', [DashboardController::class, 'index']); + }); + + // Verify 'auth' middleware is defined in Kernel.php + // and uses the correct guard + ``` + +**Testing Methodology:** + +1. **Isolate the problem:** + ```bash + # Create a minimal test route + Route::get('/test-auth', function () { + Auth::login(User::first()); + return [ + 'authenticated' => Auth::check(), + 'user_id' => Auth::id(), + 'session_id' => session()->getId(), + 'session_data' => session()->all(), + ]; + }); + ``` + +2. **Test session persistence separately:** + ```bash + Route::get('/test-session-write', function () { + session(['test_key' => 'test_value_' . time()]); + return 'Session written: ' . session('test_key'); + }); + + Route::get('/test-session-read', function () { + return 'Session read: ' . session('test_key', 'NOT FOUND'); + }); + ``` + +3. **Test authentication without redirect:** + ```bash + Route::post('/test-login', function (Request $request) { + $credentials = $request->only('email', 'password'); + + if (Auth::attempt($credentials)) { + return [ + 'status' => 'success', + 'user' => Auth::user()->only(['id', 'email']), + 'session_id' => session()->getId(), + ]; + } + + return ['status' => 'failed']; + }); + ``` + +**Critical Checklist Before Multi-tenancy:** + +- [ ] Session driver works correctly (can write and read session data) +- [ ] CSRF protection works (no 419 errors) +- [ ] Auth::attempt() returns true for valid credentials +- [ ] Auth::check() returns true immediately after Auth::attempt() +- [ ] Session persists across requests (test with simple session()->put/get) +- [ ] User can access protected routes after authentication +- [ ] No infinite redirect loops +- [ ] Login process completes in browser devtools Network tab (check for redirect chains) +- [ ] Session cookie is set and sent back with subsequent requests (check devtools Application/Storage) + +**DO NOT proceed with multi-tenancy until ALL checklist items pass.** + +### Debugging Tools + +```bash +# Enable debug mode +APP_DEBUG=true + +# Tail logs in real-time +tail -f storage/logs/laravel.log + +# Check Redis connection (if using Redis sessions) +redis-cli ping + +# Check MySQL connection +php artisan tinker +>>> DB::connection()->getPdo(); + +# Dump session driver configuration +php artisan tinker +>>> config('session.driver'); +>>> config('session.files'); +>>> config('session.connection'); + +# Test file permissions +ls -la storage/framework/sessions/ +# Should be writable by web server user +``` + +### Next Steps After Resolving Authentication + +1. Document the exact fix that resolved the issue +2. Create test cases to prevent regression +3. Only then begin multi-tenancy implementation +4. Add monitoring/logging to detect authentication issues early + +--- + +## Development Workflow + +### Development Environments +The project uses multiple environments for safe deployment: + +1. **Local Development** (`localhost`) + - Docker Compose for local stack + - Hot reload enabled + - Debug mode on + +2. **Staging Environment** (`staging.growuppro.com.br`) + - Production-like environment + - Deployed from `staging` branch + - Used for testing before production + - Same infrastructure as production + +3. **Production Environment** (`growuppro.com.br`) + - Live environment + - Deployed from `main` branch + - Zero-downtime deployments + +### Local Development +1. Clone repository +2. Copy `.env.example` to `.env` and configure +3. Run `docker-compose up -d` +4. Access: `http://localhost` or configured local domain +5. Create test tenants: `php artisan tenants:create` + +### Making Changes +1. **Never modify Krayin core** - extend via Laravel patterns +2. **Test with multiple tenants** - always verify isolation +3. **Follow PSR-12** coding standards (enforced by Pint) +4. **Run quality checks** before committing: + ```bash + make lint # Run PHPStan + Pint + make test # Run test suite + ``` +5. **Write tests** for new features (PHPUnit/Pest) +6. **Update translations** when adding UI text +7. **Document breaking changes** in pull requests +8. **Use pre-commit hooks** to catch issues early + +### Testing Strategy +- **Unit Tests**: Core business logic, services +- **Feature Tests**: Tenant isolation, API endpoints +- **Browser Tests**: Multi-tenant user flows (Dusk) +- **Database Tests**: Migration rollback/forward +- Test with at least 2-3 active tenants +- **CI/CD Integration**: All tests run automatically on push +- **Coverage Goal**: Minimum 70% code coverage + +### Deployment Process +1. **Create feature branch** from `main` +2. **Develop and test locally** +3. **Push to `staging` branch** for staging deployment +4. **Test on staging environment** (`staging.growuppro.com.br`) +5. **Create Pull Request** to `main` (after PR approval) +6. **Merge to `main`** - GitHub Actions runs automatically +7. **Monitor deployment** in Portainer +8. **Verify health checks** pass +9. **Test critical flows** on production +10. **Sentry** monitors for runtime errors + +## Common Tasks + +### Quick Development Commands (Makefile) +```bash +make dev # Start local development environment +make prod # Start production-like local environment +make test # Run test suite +make lint # Run PHPStan + Pint checks +make fix # Auto-fix code style issues +make deploy-staging # Deploy to staging +make deploy-prod # Deploy to production +make logs # Show application logs +make shell # Enter application container shell +make db-fresh # Fresh database with seeders +make tenant-create # Create a new demo tenant +``` + +### Creating a tenant-scoped feature +1. Create migration in `database/migrations/tenant/` +2. Run migrations: `php artisan tenants:migrate` +3. Create model (no special traits needed) +4. Add routes in `routes/tenant.php` +5. Build controller with tenant-aware logic + +### Adding a new translation +1. Edit `resources/lang/pt_BR/{file}.php` +2. Add translation key and Portuguese text +3. Use in Blade: `{{ __('messages.welcome') }}` +4. Test across different tenant contexts + +### Customizing tenant branding +1. Store settings in Tenant model (JSON or relations) +2. Load in middleware or service provider +3. Pass to views via view composer +4. Cache for performance: `tenant()->cache('branding')` + +### Updating Docker image +1. Modify `docker/Dockerfile` as needed +2. Test locally: `make build` or `docker-compose build app` +3. Push changes to GitHub +4. CI/CD handles the rest automatically + +### Creating demo tenants for testing +```bash +# Using artisan command +php artisan tenants:seed + +# Or via Makefile +make tenant-create + +# Specify tenant details +php artisan tenants:create \ + --domain=demo.growuppro.com.br \ + --name="Empresa Demo" \ + --email=admin@demo.com +``` + +### Managing code quality +```bash +# Run static analysis +./vendor/bin/phpstan analyse + +# Check code style +./vendor/bin/pint --test + +# Auto-fix code style +./vendor/bin/pint + +# Or use Makefile shortcuts +make lint # Check only +make fix # Auto-fix +``` + +### Setting up pre-commit hooks +```bash +# Install Husky (or similar) +npm install --save-dev husky + +# Initialize hooks +npx husky init + +# Add pre-commit hook +echo "make lint && make test" > .husky/pre-commit +chmod +x .husky/pre-commit +``` + +## Environment Variables + +### Required Variables +```env +# Application +APP_NAME="Growup Pro" +APP_ENV=production +APP_KEY=base64:... +APP_URL=https://growuppro.com.br +APP_LOCALE=pt_BR +APP_DEBUG=false + +# Database (Central) +DB_CONNECTION=mysql +DB_HOST=database +DB_PORT=3306 +DB_DATABASE=growuppro_central +DB_USERNAME=growuppro +DB_PASSWORD=secure_password + +# Tenancy +TENANCY_DATABASE_PREFIX=tenant_ +CENTRAL_DOMAINS=growuppro.com.br + +# Redis +REDIS_HOST=redis +REDIS_PASSWORD=null +REDIS_PORT=6379 + +# Cache & Queue +CACHE_DRIVER=redis +QUEUE_CONNECTION=redis +SESSION_DRIVER=redis + +# Sentry (Error Tracking) +SENTRY_LARAVEL_DSN=https://xxx@sentry.io/xxx +SENTRY_TRACES_SAMPLE_RATE=0.2 +SENTRY_PROFILES_SAMPLE_RATE=0.2 + +# Gitea Container Registry (or GitHub Container Registry as fallback) +REGISTRY_URL=gitea.yourdomain.com +REGISTRY_USERNAME=cauefaleiros +REGISTRY_PASSWORD=... # Or use token + +# GitHub Container Registry (GHCR) - if using as fallback +GHCR_TOKEN=ghp_... +GHCR_USERNAME=cauefaleiros +GHCR_IMAGE=ghcr.io/cauefaleiros/growup-pro + +# Portainer +PORTAINER_URL=https://148.230.76.122:9443 +PORTAINER_API_TOKEN=ptr_... +PORTAINER_STACK_ID=... + +# Cloudflare (Optional - for API integration) +CLOUDFLARE_API_TOKEN=... +CLOUDFLARE_ZONE_ID=... +``` + +## Admin Dashboard for Tenant Management + +The platform includes a comprehensive admin dashboard for managing tenants and monitoring platform health. + +### Dashboard Features + +**Tenant Management:** +- View all active tenants with key metrics +- Create/edit/delete tenant accounts +- Suspend or activate tenant access +- View tenant resource usage (storage, bandwidth, users) +- Manage tenant subscriptions and billing + +**Analytics & Monitoring:** +- Total active tenants count +- Growth metrics (new tenants per month) +- Resource utilization per tenant +- Most active tenants (by usage) +- Revenue tracking (if applicable) +- System health overview + +**Tenant Details View:** +- Company information and contact details +- Subdomain and custom domain settings +- User count and activity logs +- Storage usage and database size +- Last login and activity timestamps +- Custom branding settings (logo, colors) + +**Bulk Operations:** +- Bulk tenant creation via CSV import +- Batch notifications to multiple tenants +- Mass configuration updates +- Export tenant data for reporting + +**System Settings:** +- Default tenant configurations +- Resource limits and quotas +- Email templates for tenant communications +- Feature flags management +- Maintenance mode per tenant + +### Access Control +- Admin dashboard accessible only to super admins +- Route: `/admin` (protected by `SuperAdmin` middleware) +- Audit logs for all admin actions +- Two-factor authentication required + +### Implementation Notes +- Built with Filament Admin Panel (recommended) or custom Blade views +- Real-time updates using Livewire +- Caching for performance (tenant list, metrics) +- API endpoints for programmatic access +- Webhooks for tenant lifecycle events (created, suspended, deleted) + +## Notes for Gemini AI Assistant + +### Context Awareness +- This is **Growup Pro**, not Krayin - always use correct branding +- All text should be in **Portuguese (pt-BR)** when user-facing +- Consider **tenant context** in all suggestions +- Respect **Docker/Swarm constraints** in infrastructure suggestions + +### Code Suggestions +- Prefer extending over modifying Krayin core +- Ensure **tenant isolation** in all data operations +- Follow **Tenancy for Laravel best practices** +- Include proper **error handling** (tenant not found, DB connection issues) +- Suggest **Docker-compatible** solutions (env vars, volumes, etc.) +- Always consider **Sentry error tracking** when suggesting error handling +- Recommend **testable code** (dependency injection, mockable services) +- Suggest **code quality improvements** when reviewing code (PHPStan compliance) + +### Infrastructure Suggestions +- Consider **Docker Swarm** constraints (secrets, configs, networks) +- Suggest **zero-downtime** deployment strategies +- Include **health checks** in Docker configurations +- Recommend **scalable** solutions (horizontal scaling, load balancing) + +### Translation Reminders +- Always provide Portuguese translations for new strings +- Check existing translation files before adding new keys +- Maintain consistent terminology across the application + +## Quality Assurance & Best Practices + +### Code Quality Tools +The project enforces code quality through automated tools: + +**PHPStan (Static Analysis):** +- Level 5 minimum (configurable in `phpstan.neon`) +- Catches type errors, undefined variables, incorrect method calls +- Runs on every commit (pre-commit hook) +- Must pass before deployment + +**Laravel Pint (Code Formatter):** +- PSR-12 coding standard enforcement +- Automatic code formatting +- Consistent code style across the team +- Can auto-fix issues: `./vendor/bin/pint` + +**Pre-commit Hooks:** +- Automatically run before every commit +- Prevents committing code that doesn't pass quality checks +- Fast feedback loop for developers +- Configured via Husky or similar + +### Error Tracking with Sentry + +**Setup:** +```bash +composer require sentry/sentry-laravel +php artisan sentry:publish --dsn +``` + +**Features:** +- Real-time error notifications +- Complete stack traces with context +- User tracking (which tenant experienced the error) +- Performance monitoring +- Release tracking (know which deployment introduced bugs) + +**Configuration:** +```php +// config/sentry.php +'dsn' => env('SENTRY_LARAVEL_DSN'), +'environment' => env('APP_ENV'), +'traces_sample_rate' => 0.2, // 20% of requests +'profiles_sample_rate' => 0.2, +``` + +**Tenant Context:** +Always include tenant information in Sentry reports: +```php +\Sentry\configureScope(function (\Sentry\State\Scope $scope): void { + $scope->setTag('tenant_id', tenant('id')); + $scope->setContext('tenant', [ + 'name' => tenant('name'), + 'domain' => tenant('domain'), + ]); +}); +``` + +### Testing Standards +- **Coverage minimum**: 70% code coverage +- **Test pyramid**: More unit tests, fewer integration/feature tests +- **Tenant isolation tests**: Critical - must verify data doesn't leak +- **Performance tests**: Ensure queries are optimized (N+1 detection) +- **CI enforcement**: All tests must pass before merge + +## Resources & Documentation + +### Project Specific +- [Krayin CRM Docs](https://devdocs.krayincrm.com/) +- [Krayin GitHub](https://github.com/krayin/laravel-crm) +- [Tenancy for Laravel Docs](https://tenancyforlaravel.com/docs/v3/introduction) + +### Infrastructure +- [Docker Documentation](https://docs.docker.com/) +- [Docker Compose Reference](https://docs.docker.com/compose/compose-file/) +- [Docker Swarm Guide](https://docs.docker.com/engine/swarm/) +- [Portainer Documentation](https://docs.portainer.io/) +- [Portainer API Reference](https://docs.portainer.io/api/docs) + +### CI/CD +- [Gitea Actions Documentation](https://docs.gitea.com/usage/actions/overview) +- [Gitea Actions Quickstart](https://docs.gitea.com/usage/actions/quickstart) +- [act_runner Documentation](https://gitea.com/gitea/act_runner) +- [GitHub Actions (for compatibility reference)](https://docs.github.com/en/actions) +- [GitHub Container Registry](https://docs.github.com/en/packages/working-with-a-github-packages-registry/working-with-the-container-registry) +- [Docker Build Actions](https://github.com/docker/build-push-action) + +### Laravel & PHP +- [Laravel Documentation](https://laravel.com/docs) +- [Laravel Multi-tenancy Patterns](https://laravel-news.com/multi-tenancy) +- [PSR-12 Coding Standard](https://www.php-fig.org/psr/psr-12/) + +--- + +**Project**: Growup Pro +**Base**: Krayin Laravel CRM (Whitelabel) +**Current Phase**: Initial setup - multi-tenancy integration and Docker infrastructure +**Domain**: growuppro.com.br +**Language**: Portuguese (pt-BR) +**Deployment**: Docker Swarm + Portainer + GitHub Actions CI/CD diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..aa358e8 --- /dev/null +++ b/LICENSE @@ -0,0 +1,20 @@ +MIT License + +Copyright 2010-2025, Webkul Software + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is furnished +to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..9751f9b --- /dev/null +++ b/README.md @@ -0,0 +1,137 @@ +

+Total Downloads +

+ +

+Total Downloads +Latest Stable Version +License +

+ + +![enter image description here](https://raw.githubusercontent.com/krayin/temp-media/master/dashboard.png) + +## Topics + +1. [Introduction](#introduction) +2. [Documentation](#documentation) +3. [Requirements](#requirements) +4. [Installation & Configuration](#installation-and-configuration) +4. [Docker Installation](https://devdocs.krayincrm.com/2.0/introduction/docker.html) +5. [License](#license) +6. [Security Vulnerabilities](#security-vulnerabilities) + +### Introduction + +[Krayin CRM](https://krayincrm.com) is a hand tailored CRM framework built on some of the hottest opensource technologies +such as [Laravel](https://laravel.com) (a [PHP](https://secure.php.net/) framework) and [Vue.js](https://vuejs.org) +a progressive Javascript framework. + +**Free & Opensource Laravel CRM solution for SMEs and Enterprises for complete customer lifecycle management.** + +**Read our documentation: [Krayin CRM Docs](https://devdocs.krayincrm.com/)** + +**We also have a forum for any type of concerns, feature requests, or discussions. Please visit: [Krayin CRM Forums](https://forums.krayincrm.com/)** + +# Visit our live [Demo](https://demo.krayincrm.com) + + + Chinese + + +It packs in lots of features that will allow your E-Commerce business to scale in no time: + +- Descriptive and Simple Admin Panel. +- Admin Dashboard. +- Custom Attributes. +- Built on Modular Approach. +- Email parsing via Sendgrid. +- Check out [these features and more](https://krayincrm.com/features/). + +**For Developers**: +Take advantage of two of the hottest frameworks used in this project -- Laravel and Vue.js -- both of which have been used in Krayin CRM. + +### Documentation + +#### Krayin Documentation [https://devdocs.krayincrm.com](https://devdocs.krayincrm.com) + +### Requirements + +- **SERVER**: Apache 2 or NGINX. +- **RAM**: 3 GB or higher. +- **PHP**: 8.1 or higher +- **For MySQL users**: 5.7.23 or higher. +- **For MariaDB users**: 10.2.7 or Higher. +- **Node**: 8.11.3 LTS or higher. +- **Composer**: 2.5 or higher + +### Installation and Configuration + +##### Execute these commands below, in order + +``` +composer create-project +``` + +- Find **.env** file in root directory and change the **APP_URL** param to your **domain**. + +- Also, Configure the **Mail** and **Database** parameters inside **.env** file. + +``` +php artisan krayin-crm:install +``` + +**To execute Krayin**: + +##### On server: + +Warning: Before going into production mode we recommend you uninstall developer dependencies. +In order to do that, run the command below: + +> composer install --no-dev + +``` +Open the specified entry point in your hosts file in your browser or make an entry in hosts file if not done. +``` + +##### On local: + +``` +php artisan route:clear +php artisan serve +``` + + +**How to log in as admin:** + +> _http(s)://example.com/admin/login_ + +``` +email:admin@example.com +password:admin123 +``` +### Krayin CRM Multi Tenant SaaS + +[Krayin CRM Multi Tenant SaaS](https://krayincrm.com/extensions/krayin-crm-multi-tenant-saas-extension/) Krayin Multitenant SaaS is a Laravel-based CRM solution that allows multiple businesses (tenants) to use a single application instance while keeping their data isolated and secure. + +![enter image description here](https://raw.githubusercontent.com/krayin/temp-media/master/krayin-saas.png) + +### WhatsApp CRM Integration + +[Krayin CRM WhatsApp](https://krayincrm.com/extensions/krayin-crm-whatsapp-extension/) Extension enables the store administrator to generate leads via their WhatsApp number. + +![enter image description here](https://raw.githubusercontent.com/krayin/temp-media/master/krayin-crm-whatsapp-integration.png) + +### VoIP CRM Integration + +[Krayin CRM VoIP](https://krayincrm.com/extensions/krayin-crm-voip/) extension allows the user to make Trunk calls over a broadband Internet connection and the user can also perform Inbound routes. + +![enter image description here](https://raw.githubusercontent.com/krayin/temp-media/master/krayin-voip.png) + +### License + +Krayin CRM is a fully open-source CRM framework which will always be free under the [MIT License](https://github.com/krayin/laravel-crm/blob/2.1/LICENSE). + +### Security Vulnerabilities + +Please don't disclose security vulnerabilities publicly. If you find any security vulnerability in Krayin CRM then please email us: sales@krayincrm.com. diff --git a/app/Console/Kernel.php b/app/Console/Kernel.php new file mode 100644 index 0000000..8d5e390 --- /dev/null +++ b/app/Console/Kernel.php @@ -0,0 +1,27 @@ +command('inbound-emails:process')->everyFiveMinutes(); + } + + /** + * Register the commands for the application. + */ + protected function commands(): void + { + $this->load(__DIR__.'/Commands'); + + require base_path('routes/console.php'); + } +} diff --git a/app/Exceptions/Handler.php b/app/Exceptions/Handler.php new file mode 100644 index 0000000..ba3d384 --- /dev/null +++ b/app/Exceptions/Handler.php @@ -0,0 +1,30 @@ + + */ + protected $dontFlash = [ + 'current_password', + 'password', + 'password_confirmation', + ]; + + /** + * Register the exception handling callbacks for the application. + */ + public function register(): void + { + $this->reportable(function (Throwable $e) { + // + }); + } +} diff --git a/app/Http/Controllers/Api/LeadController.php b/app/Http/Controllers/Api/LeadController.php new file mode 100644 index 0000000..1f6e7c7 --- /dev/null +++ b/app/Http/Controllers/Api/LeadController.php @@ -0,0 +1,156 @@ +validate([ + 'title' => 'required|string|max:255', + 'person_name' => 'required|string|max:255', + 'person_email' => 'nullable|email', + 'person_phone' => 'nullable|string', + 'lead_value' => 'nullable|numeric', + 'description' => 'nullable|string', + 'lead_pipeline_stage_id' => 'nullable|integer|exists:lead_pipeline_stages,id', // Nova validação + ]); + + // Inicia transação + DB::beginTransaction(); + + // 1. Busca ou cria a pessoa + $personId = null; + + if (!empty($validated['person_email'])) { + // Busca pessoa existente pelo email + $existingPerson = DB::table('persons') + ->where('emails', 'like', '%' . $validated['person_email'] . '%') + ->first(); + + if ($existingPerson) { + $personId = $existingPerson->id; + } + } + + // Se não encontrou pessoa, cria uma nova + if (!$personId) { + $personEmails = !empty($validated['person_email']) + ? json_encode([['value' => $validated['person_email'], 'label' => 'work']]) + : json_encode([]); + + $personPhones = !empty($validated['person_phone']) + ? json_encode([['value' => $validated['person_phone'], 'label' => 'work']]) + : json_encode([]); + + $personId = DB::table('persons')->insertGetId([ + 'name' => $validated['person_name'], + 'emails' => $personEmails, + 'contact_numbers' => $personPhones, + 'created_at' => now(), + 'updated_at' => now(), + ]); + } + + // 2. Cria o lead + $leadId = DB::table('leads')->insertGetId([ + 'title' => $validated['title'], + 'description' => $validated['description'] ?? '', + 'lead_value' => $validated['lead_value'] ?? 0, + 'status' => 1, + 'person_id' => $personId, + 'user_id' => 1, + 'lead_pipeline_id' => 1, + 'lead_pipeline_stage_id' => $validated['lead_pipeline_stage_id'] ?? 1, // Usa o valor enviado ou padrão (2) + 'lead_source_id' => 1, + 'lead_type_id' => 1, + 'expected_close_date' => null, + 'created_at' => now(), + 'updated_at' => now(), + ]); + + // Commit da transação + DB::commit(); + + // Busca o lead criado com a pessoa + $lead = DB::table('leads') + ->join('persons', 'leads.person_id', '=', 'persons.id') + ->where('leads.id', $leadId) + ->select('leads.*', 'persons.name as person_name', 'persons.emails as person_emails') + ->first(); + + return response()->json([ + 'success' => true, + 'message' => 'Lead criado com sucesso', + 'data' => [ + 'lead_id' => $lead->id, + 'title' => $lead->title, + 'person_id' => $personId, + 'person_name' => $lead->person_name, + 'lead_value' => $lead->lead_value, + 'lead_pipeline_stage_id' => $lead->lead_pipeline_stage_id, + ] + ], 201); + + } catch (\Illuminate\Validation\ValidationException $e) { + DB::rollBack(); + return response()->json([ + 'success' => false, + 'message' => 'Erro de validação', + 'errors' => $e->errors() + ], 422); + + } catch (\Exception $e) { + DB::rollBack(); + + \Log::error('Erro ao criar lead via API', [ + 'message' => $e->getMessage(), + 'line' => $e->getLine(), + 'file' => $e->getFile(), + ]); + + return response()->json([ + 'success' => false, + 'message' => 'Erro ao criar lead', + 'error' => $e->getMessage(), + ], 500); + } + } + + public function index() + { + try { + $leads = DB::table('leads') + ->join('persons', 'leads.person_id', '=', 'persons.id') + ->select( + 'leads.id', + 'leads.title', + 'leads.lead_value', + 'leads.created_at', + 'persons.name as person_name', + 'persons.emails as person_emails' + ) + ->orderBy('leads.created_at', 'desc') + ->limit(50) + ->get(); + + return response()->json([ + 'success' => true, + 'count' => $leads->count(), + 'data' => $leads + ], 200); + + } catch (\Exception $e) { + return response()->json([ + 'success' => false, + 'message' => 'Erro ao listar leads: ' . $e->getMessage() + ], 500); + } + } +} diff --git a/app/Http/Controllers/Controller.php b/app/Http/Controllers/Controller.php new file mode 100644 index 0000000..a0a2a8a --- /dev/null +++ b/app/Http/Controllers/Controller.php @@ -0,0 +1,13 @@ +email === 'admin@example.com') { + return redirect()->route('super-admin.tenants.index'); + } + return view('super-admin.session.login'); + } + + public function store(Request $request) + { + $credentials = $request->validate([ + 'email' => ['required', 'email'], + 'password' => ['required'], + ]); + + if (Auth::attempt($credentials)) { + $request->session()->regenerate(); + + if (Auth::user()->email !== 'admin@example.com') { + Auth::logout(); + return back()->withErrors([ + 'email' => 'Unauthorized access.', + ]); + } + + return redirect()->route('super-admin.tenants.index'); + } + + return back()->withErrors([ + 'email' => 'The provided credentials do not match our records.', + ]); + } + + public function destroy(Request $request) + { + Auth::logout(); + $request->session()->invalidate(); + $request->session()->regenerateToken(); + return redirect()->route('super-admin.session.create'); + } +} diff --git a/app/Http/Controllers/SuperAdmin/TenantController.php b/app/Http/Controllers/SuperAdmin/TenantController.php new file mode 100644 index 0000000..431d7b2 --- /dev/null +++ b/app/Http/Controllers/SuperAdmin/TenantController.php @@ -0,0 +1,52 @@ +validate([ + 'id' => 'required|string|unique:mysql.tenants', + 'domain' => 'required|string|unique:mysql.domains,domain', + ]); + + $tenant = Tenant::create([ + 'id' => $validated['id'], + 'last_updated_by' => Auth::user()->name ?? 'Super Admin', + ]); + + $tenant->domains()->create([ + 'domain' => $validated['domain'], + ]); + + return redirect()->route('super-admin.tenants.index') + ->with('success', 'Tenant created successfully.'); + } + + public function destroy($id) + { + $tenant = Tenant::findOrFail($id); + $tenant->delete(); + + return redirect()->route('super-admin.tenants.index') + ->with('success', 'Tenant deleted successfully.'); + } +} diff --git a/app/Http/Kernel.php b/app/Http/Kernel.php new file mode 100644 index 0000000..fe8013b --- /dev/null +++ b/app/Http/Kernel.php @@ -0,0 +1,69 @@ + [ + \App\Http\Middleware\UniversalTenancy::class, + \App\Http\Middleware\EncryptCookies::class, + \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class, + \Illuminate\Session\Middleware\StartSession::class, + // \Illuminate\Session\Middleware\AuthenticateSession::class, + \Illuminate\View\Middleware\ShareErrorsFromSession::class, + \App\Http\Middleware\VerifyCsrfToken::class, + \Illuminate\Routing\Middleware\SubstituteBindings::class, + ], + + 'api' => [ + \Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class, + 'throttle:api', + \Illuminate\Routing\Middleware\SubstituteBindings::class, + ], + ]; + + /** + * The application's route middleware. + * + * These middleware may be assigned to groups or used individually. + * + * @var array + */ + protected $routeMiddleware = [ + 'auth' => \App\Http\Middleware\Authenticate::class, + 'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class, + 'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class, + 'can' => \Illuminate\Auth\Middleware\Authorize::class, + 'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class, + 'password.confirm' => \Illuminate\Auth\Middleware\RequirePassword::class, + 'signed' => \Illuminate\Routing\Middleware\ValidateSignature::class, + 'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class, + 'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class, + 'super_admin' => \App\Http\Middleware\SuperAdminMiddleware::class, + ]; +} \ No newline at end of file diff --git a/app/Http/Middleware/Authenticate.php b/app/Http/Middleware/Authenticate.php new file mode 100644 index 0000000..704089a --- /dev/null +++ b/app/Http/Middleware/Authenticate.php @@ -0,0 +1,21 @@ +expectsJson()) { + return route('login'); + } + } +} diff --git a/app/Http/Middleware/EncryptCookies.php b/app/Http/Middleware/EncryptCookies.php new file mode 100644 index 0000000..607561a --- /dev/null +++ b/app/Http/Middleware/EncryptCookies.php @@ -0,0 +1,17 @@ +check()) { + return redirect(RouteServiceProvider::HOME); + } + } + + return $next($request); + } +} diff --git a/app/Http/Middleware/SuperAdminMiddleware.php b/app/Http/Middleware/SuperAdminMiddleware.php new file mode 100644 index 0000000..b152766 --- /dev/null +++ b/app/Http/Middleware/SuperAdminMiddleware.php @@ -0,0 +1,19 @@ +email === 'admin@example.com') { + return $next($request); + } + + return redirect()->route('super-admin.session.create'); + } +} diff --git a/app/Http/Middleware/TrimStrings.php b/app/Http/Middleware/TrimStrings.php new file mode 100644 index 0000000..a8a252d --- /dev/null +++ b/app/Http/Middleware/TrimStrings.php @@ -0,0 +1,19 @@ +allSubdomainsOfApplicationUrl(), + ]; + } +} diff --git a/app/Http/Middleware/TrustProxies.php b/app/Http/Middleware/TrustProxies.php new file mode 100644 index 0000000..6bc81d9 --- /dev/null +++ b/app/Http/Middleware/TrustProxies.php @@ -0,0 +1,13 @@ +getHost(), config('tenancy.central_domains'))) { + // It's a central domain, skip tenancy initialization + return $next($request); + } + + // It's a tenant domain, proceed with standard initialization + return parent::handle($request, $next); + } +} diff --git a/app/Http/Middleware/VerifyCsrfToken.php b/app/Http/Middleware/VerifyCsrfToken.php new file mode 100644 index 0000000..788d6bd --- /dev/null +++ b/app/Http/Middleware/VerifyCsrfToken.php @@ -0,0 +1,18 @@ + 'datetime', + ]; +} diff --git a/app/Providers/AppServiceProvider.php b/app/Providers/AppServiceProvider.php new file mode 100644 index 0000000..637878d --- /dev/null +++ b/app/Providers/AppServiceProvider.php @@ -0,0 +1,59 @@ +overrideCoreConfigDefaults(); + } + + protected function overrideCoreConfigDefaults() + { + $config = config('core_config'); + + if (!$config) { + return; + } + + // Filter out the 'general.settings' item + $config = array_values(array_filter($config, function ($item) { + return !isset($item['key']) || $item['key'] !== 'general.settings'; + })); + + foreach ($config as &$item) { + if (isset($item['key']) && $item['key'] === 'general.general.locale_settings') { + if (isset($item['fields'])) { + foreach ($item['fields'] as &$field) { + if (isset($field['name']) && $field['name'] === 'locale') { + $field['default'] = 'pt_BR'; + } + } + } + } + } + + config(['core_config' => $config]); + } +} diff --git a/app/Providers/AuthServiceProvider.php b/app/Providers/AuthServiceProvider.php new file mode 100644 index 0000000..54756cd --- /dev/null +++ b/app/Providers/AuthServiceProvider.php @@ -0,0 +1,26 @@ + + */ + protected $policies = [ + // + ]; + + /** + * Register any authentication / authorization services. + */ + public function boot(): void + { + // + } +} diff --git a/app/Providers/BroadcastServiceProvider.php b/app/Providers/BroadcastServiceProvider.php new file mode 100644 index 0000000..2be04f5 --- /dev/null +++ b/app/Providers/BroadcastServiceProvider.php @@ -0,0 +1,19 @@ +> + */ + protected $listen = [ + Registered::class => [ + SendEmailVerificationNotification::class, + ], + ]; + + /** + * Register any events for your application. + */ + public function boot(): void + { + // + } + + /** + * Determine if events and listeners should be automatically discovered. + */ + public function shouldDiscoverEvents(): bool + { + return false; + } +} diff --git a/app/Providers/RouteServiceProvider.php b/app/Providers/RouteServiceProvider.php new file mode 100644 index 0000000..1cf5f15 --- /dev/null +++ b/app/Providers/RouteServiceProvider.php @@ -0,0 +1,40 @@ +by($request->user()?->id ?: $request->ip()); + }); + + $this->routes(function () { + Route::middleware('api') + ->prefix('api') + ->group(base_path('routes/api.php')); + + Route::middleware('web') + ->group(base_path('routes/web.php')); + }); + } +} diff --git a/app/Providers/TenancyServiceProvider.php b/app/Providers/TenancyServiceProvider.php new file mode 100644 index 0000000..2cb93fc --- /dev/null +++ b/app/Providers/TenancyServiceProvider.php @@ -0,0 +1,151 @@ + [], + Events\TenantCreated::class => [ + JobPipeline::make([ + Jobs\CreateDatabase::class, + Jobs\MigrateDatabase::class, + Jobs\SeedDatabase::class, + + // Your own jobs to prepare the tenant. + // Provision API keys, create S3 buckets, anything you want! + + ])->send(function (Events\TenantCreated $event) { + return $event->tenant; + })->shouldBeQueued(false), // `false` by default, but you probably want to make this `true` for production. + ], + Events\SavingTenant::class => [], + Events\TenantSaved::class => [], + Events\UpdatingTenant::class => [], + Events\TenantUpdated::class => [], + Events\DeletingTenant::class => [], + Events\TenantDeleted::class => [ + JobPipeline::make([ + Jobs\DeleteDatabase::class, + ])->send(function (Events\TenantDeleted $event) { + return $event->tenant; + })->shouldBeQueued(false), // `false` by default, but you probably want to make this `true` for production. + ], + + // Domain events + Events\CreatingDomain::class => [], + Events\DomainCreated::class => [], + Events\SavingDomain::class => [], + Events\DomainSaved::class => [], + Events\UpdatingDomain::class => [], + Events\DomainUpdated::class => [], + Events\DeletingDomain::class => [], + Events\DomainDeleted::class => [], + + // Database events + Events\DatabaseCreated::class => [], + Events\DatabaseMigrated::class => [], + Events\DatabaseSeeded::class => [], + Events\DatabaseRolledBack::class => [], + Events\DatabaseDeleted::class => [], + + // Tenancy events + Events\InitializingTenancy::class => [], + Events\TenancyInitialized::class => [ + Listeners\BootstrapTenancy::class, + function (Events\TenancyInitialized $event) { + app()->setLocale('pt_BR'); + }, + ], + + Events\EndingTenancy::class => [], + Events\TenancyEnded::class => [ + Listeners\RevertToCentralContext::class, + ], + + Events\BootstrappingTenancy::class => [], + Events\TenancyBootstrapped::class => [], + Events\RevertingToCentralContext::class => [], + Events\RevertedToCentralContext::class => [], + + // Resource syncing + Events\SyncedResourceSaved::class => [ + Listeners\UpdateSyncedResource::class, + ], + + // Fired only when a synced resource is changed in a different DB than the origin DB (to avoid infinite loops) + Events\SyncedResourceChangedInForeignDatabase::class => [], + ]; + } + + public function register() + { + // + } + + public function boot() + { + $this->bootEvents(); + $this->mapRoutes(); + + $this->makeTenancyMiddlewareHighestPriority(); + } + + protected function bootEvents() + { + foreach ($this->events() as $event => $listeners) { + foreach ($listeners as $listener) { + if ($listener instanceof JobPipeline) { + $listener = $listener->toListener(); + } + + Event::listen($event, $listener); + } + } + } + + protected function mapRoutes() + { + $this->app->booted(function () { + if (file_exists(base_path('routes/tenant.php'))) { + Route::namespace(static::$controllerNamespace) + ->group(base_path('routes/tenant.php')); + } + }); + } + + protected function makeTenancyMiddlewareHighestPriority() + { + $tenancyMiddleware = [ + // Even higher priority than the initialization middleware + Middleware\PreventAccessFromCentralDomains::class, + + Middleware\InitializeTenancyByDomain::class, + Middleware\InitializeTenancyBySubdomain::class, + Middleware\InitializeTenancyByDomainOrSubdomain::class, + Middleware\InitializeTenancyByPath::class, + Middleware\InitializeTenancyByRequestData::class, + ]; + + foreach (array_reverse($tenancyMiddleware) as $middleware) { + $this->app[\Illuminate\Contracts\Http\Kernel::class]->prependToMiddlewarePriority($middleware); + } + } +} diff --git a/artisan b/artisan new file mode 100755 index 0000000..5c23e2e --- /dev/null +++ b/artisan @@ -0,0 +1,53 @@ +#!/usr/bin/env php +make(Illuminate\Contracts\Console\Kernel::class); + +$status = $kernel->handle( + $input = new Symfony\Component\Console\Input\ArgvInput, + new Symfony\Component\Console\Output\ConsoleOutput +); + +/* +|-------------------------------------------------------------------------- +| Shutdown The Application +|-------------------------------------------------------------------------- +| +| Once Artisan has finished running, we will fire off the shutdown events +| so that any final work may be done by the application before we shut +| down the process. This is the last thing to happen to the request. +| +*/ + +$kernel->terminate($input, $status); + +exit($status); diff --git a/bootstrap/app.php b/bootstrap/app.php new file mode 100755 index 0000000..037e17d --- /dev/null +++ b/bootstrap/app.php @@ -0,0 +1,55 @@ +singleton( + Illuminate\Contracts\Http\Kernel::class, + App\Http\Kernel::class +); + +$app->singleton( + Illuminate\Contracts\Console\Kernel::class, + App\Console\Kernel::class +); + +$app->singleton( + Illuminate\Contracts\Debug\ExceptionHandler::class, + App\Exceptions\Handler::class +); + +/* +|-------------------------------------------------------------------------- +| Return The Application +|-------------------------------------------------------------------------- +| +| This script returns the application instance. The instance is given to +| the calling script so we can separate the building of the instances +| from the actual running of the application and sending responses. +| +*/ + +return $app; diff --git a/bootstrap/cache/.gitignore b/bootstrap/cache/.gitignore new file mode 100755 index 0000000..d6b7ef3 --- /dev/null +++ b/bootstrap/cache/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore diff --git a/build.sh b/build.sh new file mode 100755 index 0000000..1e6ca36 --- /dev/null +++ b/build.sh @@ -0,0 +1,193 @@ +#!/bin/bash +set -e + +echo "🚀 Criando imagem Docker do Krayin..." + +# Criar pasta docker se não existir +mkdir -p docker + +# ======================================== +# NGINX CONFIG +# ======================================== +cat > docker/nginx.conf << 'NGINX_EOF' +server { + listen 80; + server_name _; + root /var/www/html/public; + + add_header X-Frame-Options "SAMEORIGIN"; + add_header X-Content-Type-Options "nosniff"; + + index index.php; + charset utf-8; + + location / { + try_files $uri $uri/ /index.php?$query_string; + } + + location = /favicon.ico { access_log off; log_not_found off; } + location = /robots.txt { access_log off; log_not_found off; } + + error_page 404 /index.php; + + location ~ \.php$ { + fastcgi_pass 127.0.0.1:9000; + fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name; + include fastcgi_params; + } + + location ~ /\.(?!well-known).* { + deny all; + } +} +NGINX_EOF + +# ======================================== +# SUPERVISOR CONFIG +# ======================================== +cat > docker/supervisord.conf << 'SUPER_EOF' +[supervisord] +nodaemon=true +user=root + +[program:php-fpm] +command=/usr/local/sbin/php-fpm +autostart=true +autorestart=true +priority=5 +stdout_logfile=/dev/stdout +stdout_logfile_maxbytes=0 +stderr_logfile=/dev/stderr +stderr_logfile_maxbytes=0 + +[program:nginx] +command=/usr/sbin/nginx -g "daemon off;" +autostart=true +autorestart=true +priority=10 +stdout_logfile=/dev/stdout +stdout_logfile_maxbytes=0 +stderr_logfile=/dev/stderr +stderr_logfile_maxbytes=0 +SUPER_EOF + +# ======================================== +# DOCKERIGNORE +# ======================================== +cat > .dockerignore << 'IGNORE_EOF' +.git +.gitignore +node_modules +storage/logs/* +storage/framework/cache/* +storage/framework/sessions/* +storage/framework/views/* +bootstrap/cache/* +.DS_Store +Thumbs.db +*.tar +*.tar.gz +IGNORE_EOF + +# ======================================== +# DOCKERFILE +# ======================================== +cat > Dockerfile << 'DOCKER_EOF' +FROM php:8.2-fpm + +# Instalar dependências +RUN apt-get update && apt-get install -y \ + git curl libpng-dev libonig-dev libxml2-dev \ + zip unzip libzip-dev nginx supervisor \ + && docker-php-ext-install pdo_mysql mbstring exif pcntl bcmath gd zip calendar \ + && apt-get clean && rm -rf /var/lib/apt/lists/* + +# Instalar Composer +COPY --from=composer:latest /usr/bin/composer /usr/bin/composer + +WORKDIR /var/www/html + +# Copiar composer.json e composer.lock primeiro (cache layer) +COPY composer.json composer.lock ./ + +# Instalar dependências (isso vai rodar composer update se necessário) +RUN composer install --no-dev --no-scripts --no-interaction || \ + composer update --no-dev --no-scripts --no-interaction + +# Copiar todo o código +COPY . . + +# Rodar scripts do composer +RUN composer dump-autoload --optimize --no-dev + +# Ajustar permissões +RUN chown -R www-data:www-data /var/www/html \ + && chmod -R 755 /var/www/html/storage \ + && chmod -R 755 /var/www/html/bootstrap/cache + +# Copiar configurações +COPY docker/nginx.conf /etc/nginx/sites-available/default +COPY docker/supervisord.conf /etc/supervisor/conf.d/supervisord.conf + +# Script de inicialização +RUN echo '#!/bin/bash' > /start.sh && \ + echo 'php artisan config:cache' >> /start.sh && \ + echo 'php artisan route:cache' >> /start.sh && \ + echo 'php artisan view:cache' >> /start.sh && \ + echo 'exec /usr/bin/supervisord -c /etc/supervisor/conf.d/supervisord.conf' >> /start.sh && \ + chmod +x /start.sh + +EXPOSE 80 + +CMD ["/start.sh"] +DOCKER_EOF + +echo "" +echo "✅ Arquivos de configuração criados!" +echo "" + +# ======================================== +# BUILD +# ======================================== +echo "🔨 Construindo imagem Docker..." +if docker build -t growup:latest .; then + echo "" + echo "✅ Imagem construída com sucesso!" + echo "" + + # ======================================== + # SAVE + # ======================================== + echo "💾 Salvando imagem em arquivo..." + if docker save growup:latest -o growup-latest.tar; then + echo "" + echo "================================================" + echo "✅ SUCESSO TOTAL!" + echo "================================================" + echo "" + echo "📦 Arquivo criado: growup-latest.tar" + echo "📊 Tamanho: $(du -h growup-latest.tar | cut -f1)" + echo "" + echo "🚀 PRÓXIMOS PASSOS:" + echo "" + echo "1️⃣ Transferir para o servidor:" + echo " scp growup-latest.tar usuario@servidor:/caminho/" + echo "" + echo "2️⃣ No servidor, carregar a imagem:" + echo " docker load -i growup-latest.tar" + echo "" + echo "3️⃣ No docker-compose.yml, use:" + echo " image: growup:latest" + echo "" + echo "================================================" + else + echo "❌ Erro ao salvar a imagem" + exit 1 + fi +else + echo "" + echo "❌ Erro ao construir a imagem" + echo "" + echo "💡 DICA: Verifique se você está na pasta raiz do projeto Krayin" + exit 1 +fi diff --git a/composer.json b/composer.json new file mode 100644 index 0000000..18bdb1a --- /dev/null +++ b/composer.json @@ -0,0 +1,110 @@ +{ + "name": "krayin/laravel-crm", + "type": "project", + "description": "Krayin CRM", + "keywords": [ + "framework", + "laravel" + ], + "license": "MIT", + "require": { + "php": "^8.2", + "barryvdh/laravel-dompdf": "^2.0.0", + "diglactic/laravel-breadcrumbs": "^8.0", + "doctrine/dbal": "^3.0", + "enshrined/svg-sanitize": "^0.21.0", + "guzzlehttp/guzzle": "^7.0.1", + "khaled.alshamaa/ar-php": "^6.3", + "konekt/concord": "^1.10", + "laravel/framework": "^10.0", + "laravel/sanctum": "^3.2", + "laravel/tinker": "^2.5", + "laravel/ui": "^4.5", + "maatwebsite/excel": "^3.1", + "mpdf/mpdf": "^8.2", + "prettus/l5-repository": "^2.7.9", + "smalot/pdfparser": "^2.11", + "stancl/tenancy": "^3.8", + "webklex/laravel-imap": "^5.3" + }, + "require-dev": { + "barryvdh/laravel-debugbar": "^3.6", + "fakerphp/faker": "^1.9.1", + "krayin/krayin-package-generator": "dev-master", + "laravel/pint": "^1.16", + "laravel/sail": "^1.0.1", + "mockery/mockery": "^1.4.2", + "nunomaduro/collision": "^7.0", + "pestphp/pest": "^2.6", + "pestphp/pest-plugin-laravel": "^2.1", + "phpunit/phpunit": "^10.0", + "spatie/laravel-ignition": "^2.0" + }, + "config": { + "optimize-autoloader": true, + "preferred-install": "dist", + "sort-packages": true, + "allow-plugins": { + "pestphp/pest-plugin": true + } + }, + "extra": { + "laravel": { + "dont-discover": [] + } + }, + "autoload": { + "psr-4": { + "App\\": "app/", + "Database\\Factories\\": "database/factories/", + "Database\\Seeders\\": "database/seeders/", + "Webkul\\Activity\\": "packages/Webkul/Activity/src", + "Webkul\\Admin\\": "packages/Webkul/Admin/src", + "Webkul\\Attribute\\": "packages/Webkul/Attribute/src", + "Webkul\\Contact\\": "packages/Webkul/Contact/src", + "Webkul\\Core\\": "packages/Webkul/Core/src", + "Webkul\\DataGrid\\": "packages/Webkul/DataGrid/src", + "Webkul\\DataTransfer\\": "packages/Webkul/DataTransfer/src", + "Webkul\\Email\\": "packages/Webkul/Email/src", + "Webkul\\EmailTemplate\\": "packages/Webkul/EmailTemplate/src", + "Webkul\\Marketing\\": "packages/Webkul/Marketing/src", + "Webkul\\Installer\\": "packages/Webkul/Installer/src", + "Webkul\\Lead\\": "packages/Webkul/Lead/src", + "Webkul\\Product\\": "packages/Webkul/Product/src", + "Webkul\\Quote\\": "packages/Webkul/Quote/src", + "Webkul\\Tag\\": "packages/Webkul/Tag/src", + "Webkul\\User\\": "packages/Webkul/User/src", + "Webkul\\Warehouse\\": "packages/Webkul/Warehouse/src", + "Webkul\\WebForm\\": "packages/Webkul/WebForm/src", + "Webkul\\Automation\\": "packages/Webkul/Automation/src" + } + }, + "autoload-dev": { + "psr-4": { + "Tests\\": "tests/" + } + }, + "repositories": [ + { + "type": "path", + "url": "packages/*/*", + "options": { + "symlink": true + } + } + ], + "minimum-stability": "stable", + "prefer-stable": true, + "scripts": { + "post-autoload-dump": [ + "Illuminate\\Foundation\\ComposerScripts::postAutoloadDump", + "@php artisan package:discover --ansi" + ], + "post-root-package-install": [ + "@php -r \"file_exists('.env') || copy('.env.example', '.env');\"" + ], + "post-create-project-cmd": [ + "@php artisan key:generate --ansi" + ] + } +} diff --git a/composer.lock b/composer.lock new file mode 100644 index 0000000..ff3f83e --- /dev/null +++ b/composer.lock @@ -0,0 +1,11770 @@ +{ + "_readme": [ + "This file locks the dependencies of your project to a known state", + "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", + "This file is @generated automatically" + ], + "content-hash": "623afca672b2112feb8f9c4a5dc491ce", + "packages": [ + { + "name": "barryvdh/laravel-dompdf", + "version": "v2.2.0", + "source": { + "type": "git", + "url": "https://github.com/barryvdh/laravel-dompdf.git", + "reference": "c96f90c97666cebec154ca1ffb67afed372114d8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/barryvdh/laravel-dompdf/zipball/c96f90c97666cebec154ca1ffb67afed372114d8", + "reference": "c96f90c97666cebec154ca1ffb67afed372114d8", + "shasum": "" + }, + "require": { + "dompdf/dompdf": "^2.0.7", + "illuminate/support": "^6|^7|^8|^9|^10|^11", + "php": "^7.2 || ^8.0" + }, + "require-dev": { + "larastan/larastan": "^1.0|^2.7.0", + "orchestra/testbench": "^4|^5|^6|^7|^8|^9", + "phpro/grumphp": "^1 || ^2.5", + "squizlabs/php_codesniffer": "^3.5" + }, + "type": "library", + "extra": { + "laravel": { + "aliases": { + "PDF": "Barryvdh\\DomPDF\\Facade\\Pdf", + "Pdf": "Barryvdh\\DomPDF\\Facade\\Pdf" + }, + "providers": [ + "Barryvdh\\DomPDF\\ServiceProvider" + ] + }, + "branch-alias": { + "dev-master": "2.0-dev" + } + }, + "autoload": { + "psr-4": { + "Barryvdh\\DomPDF\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Barry vd. Heuvel", + "email": "barryvdh@gmail.com" + } + ], + "description": "A DOMPDF Wrapper for Laravel", + "keywords": [ + "dompdf", + "laravel", + "pdf" + ], + "support": { + "issues": "https://github.com/barryvdh/laravel-dompdf/issues", + "source": "https://github.com/barryvdh/laravel-dompdf/tree/v2.2.0" + }, + "funding": [ + { + "url": "https://fruitcake.nl", + "type": "custom" + }, + { + "url": "https://github.com/barryvdh", + "type": "github" + } + ], + "time": "2024-04-25T13:16:04+00:00" + }, + { + "name": "brick/math", + "version": "0.12.3", + "source": { + "type": "git", + "url": "https://github.com/brick/math.git", + "reference": "866551da34e9a618e64a819ee1e01c20d8a588ba" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/brick/math/zipball/866551da34e9a618e64a819ee1e01c20d8a588ba", + "reference": "866551da34e9a618e64a819ee1e01c20d8a588ba", + "shasum": "" + }, + "require": { + "php": "^8.1" + }, + "require-dev": { + "php-coveralls/php-coveralls": "^2.2", + "phpunit/phpunit": "^10.1", + "vimeo/psalm": "6.8.8" + }, + "type": "library", + "autoload": { + "psr-4": { + "Brick\\Math\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Arbitrary-precision arithmetic library", + "keywords": [ + "Arbitrary-precision", + "BigInteger", + "BigRational", + "arithmetic", + "bigdecimal", + "bignum", + "bignumber", + "brick", + "decimal", + "integer", + "math", + "mathematics", + "rational" + ], + "support": { + "issues": "https://github.com/brick/math/issues", + "source": "https://github.com/brick/math/tree/0.12.3" + }, + "funding": [ + { + "url": "https://github.com/BenMorel", + "type": "github" + } + ], + "time": "2025-02-28T13:11:00+00:00" + }, + { + "name": "carbonphp/carbon-doctrine-types", + "version": "2.1.0", + "source": { + "type": "git", + "url": "https://github.com/CarbonPHP/carbon-doctrine-types.git", + "reference": "99f76ffa36cce3b70a4a6abce41dba15ca2e84cb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/CarbonPHP/carbon-doctrine-types/zipball/99f76ffa36cce3b70a4a6abce41dba15ca2e84cb", + "reference": "99f76ffa36cce3b70a4a6abce41dba15ca2e84cb", + "shasum": "" + }, + "require": { + "php": "^7.4 || ^8.0" + }, + "conflict": { + "doctrine/dbal": "<3.7.0 || >=4.0.0" + }, + "require-dev": { + "doctrine/dbal": "^3.7.0", + "nesbot/carbon": "^2.71.0 || ^3.0.0", + "phpunit/phpunit": "^10.3" + }, + "type": "library", + "autoload": { + "psr-4": { + "Carbon\\Doctrine\\": "src/Carbon/Doctrine/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "KyleKatarn", + "email": "kylekatarnls@gmail.com" + } + ], + "description": "Types to use Carbon in Doctrine", + "keywords": [ + "carbon", + "date", + "datetime", + "doctrine", + "time" + ], + "support": { + "issues": "https://github.com/CarbonPHP/carbon-doctrine-types/issues", + "source": "https://github.com/CarbonPHP/carbon-doctrine-types/tree/2.1.0" + }, + "funding": [ + { + "url": "https://github.com/kylekatarnls", + "type": "github" + }, + { + "url": "https://opencollective.com/Carbon", + "type": "open_collective" + }, + { + "url": "https://tidelift.com/funding/github/packagist/nesbot/carbon", + "type": "tidelift" + } + ], + "time": "2023-12-11T17:09:12+00:00" + }, + { + "name": "composer/pcre", + "version": "3.3.2", + "source": { + "type": "git", + "url": "https://github.com/composer/pcre.git", + "reference": "b2bed4734f0cc156ee1fe9c0da2550420d99a21e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/pcre/zipball/b2bed4734f0cc156ee1fe9c0da2550420d99a21e", + "reference": "b2bed4734f0cc156ee1fe9c0da2550420d99a21e", + "shasum": "" + }, + "require": { + "php": "^7.4 || ^8.0" + }, + "conflict": { + "phpstan/phpstan": "<1.11.10" + }, + "require-dev": { + "phpstan/phpstan": "^1.12 || ^2", + "phpstan/phpstan-strict-rules": "^1 || ^2", + "phpunit/phpunit": "^8 || ^9" + }, + "type": "library", + "extra": { + "phpstan": { + "includes": [ + "extension.neon" + ] + }, + "branch-alias": { + "dev-main": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Composer\\Pcre\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" + } + ], + "description": "PCRE wrapping library that offers type-safe preg_* replacements.", + "keywords": [ + "PCRE", + "preg", + "regex", + "regular expression" + ], + "support": { + "issues": "https://github.com/composer/pcre/issues", + "source": "https://github.com/composer/pcre/tree/3.3.2" + }, + "funding": [ + { + "url": "https://packagist.com", + "type": "custom" + }, + { + "url": "https://github.com/composer", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/composer/composer", + "type": "tidelift" + } + ], + "time": "2024-11-12T16:29:46+00:00" + }, + { + "name": "composer/semver", + "version": "3.4.3", + "source": { + "type": "git", + "url": "https://github.com/composer/semver.git", + "reference": "4313d26ada5e0c4edfbd1dc481a92ff7bff91f12" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/semver/zipball/4313d26ada5e0c4edfbd1dc481a92ff7bff91f12", + "reference": "4313d26ada5e0c4edfbd1dc481a92ff7bff91f12", + "shasum": "" + }, + "require": { + "php": "^5.3.2 || ^7.0 || ^8.0" + }, + "require-dev": { + "phpstan/phpstan": "^1.11", + "symfony/phpunit-bridge": "^3 || ^7" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Composer\\Semver\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nils Adermann", + "email": "naderman@naderman.de", + "homepage": "http://www.naderman.de" + }, + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" + }, + { + "name": "Rob Bast", + "email": "rob.bast@gmail.com", + "homepage": "http://robbast.nl" + } + ], + "description": "Semver library that offers utilities, version constraint parsing and validation.", + "keywords": [ + "semantic", + "semver", + "validation", + "versioning" + ], + "support": { + "irc": "ircs://irc.libera.chat:6697/composer", + "issues": "https://github.com/composer/semver/issues", + "source": "https://github.com/composer/semver/tree/3.4.3" + }, + "funding": [ + { + "url": "https://packagist.com", + "type": "custom" + }, + { + "url": "https://github.com/composer", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/composer/composer", + "type": "tidelift" + } + ], + "time": "2024-09-19T14:15:21+00:00" + }, + { + "name": "dflydev/dot-access-data", + "version": "v3.0.3", + "source": { + "type": "git", + "url": "https://github.com/dflydev/dflydev-dot-access-data.git", + "reference": "a23a2bf4f31d3518f3ecb38660c95715dfead60f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/dflydev/dflydev-dot-access-data/zipball/a23a2bf4f31d3518f3ecb38660c95715dfead60f", + "reference": "a23a2bf4f31d3518f3ecb38660c95715dfead60f", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "phpstan/phpstan": "^0.12.42", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.3", + "scrutinizer/ocular": "1.6.0", + "squizlabs/php_codesniffer": "^3.5", + "vimeo/psalm": "^4.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Dflydev\\DotAccessData\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Dragonfly Development Inc.", + "email": "info@dflydev.com", + "homepage": "http://dflydev.com" + }, + { + "name": "Beau Simensen", + "email": "beau@dflydev.com", + "homepage": "http://beausimensen.com" + }, + { + "name": "Carlos Frutos", + "email": "carlos@kiwing.it", + "homepage": "https://github.com/cfrutos" + }, + { + "name": "Colin O'Dell", + "email": "colinodell@gmail.com", + "homepage": "https://www.colinodell.com" + } + ], + "description": "Given a deep data structure, access data by dot notation.", + "homepage": "https://github.com/dflydev/dflydev-dot-access-data", + "keywords": [ + "access", + "data", + "dot", + "notation" + ], + "support": { + "issues": "https://github.com/dflydev/dflydev-dot-access-data/issues", + "source": "https://github.com/dflydev/dflydev-dot-access-data/tree/v3.0.3" + }, + "time": "2024-07-08T12:26:09+00:00" + }, + { + "name": "diglactic/laravel-breadcrumbs", + "version": "v8.1.1", + "source": { + "type": "git", + "url": "https://github.com/diglactic/laravel-breadcrumbs.git", + "reference": "f72a78eb3e26aea507d7888a65f15e5790864e21" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/diglactic/laravel-breadcrumbs/zipball/f72a78eb3e26aea507d7888a65f15e5790864e21", + "reference": "f72a78eb3e26aea507d7888a65f15e5790864e21", + "shasum": "" + }, + "require": { + "facade/ignition-contracts": "^1.0", + "laravel/framework": "^6.0 || ^7.0 || ^8.0 || ^9.0 || ^10.0", + "php": "^7.2 || ^8.0" + }, + "conflict": { + "davejamesmiller/laravel-breadcrumbs": "*" + }, + "require-dev": { + "orchestra/testbench": "^4.0 || ^5.0 || ^6.0 || ^7.0 || ^8.0", + "php-coveralls/php-coveralls": "^2.4", + "phpunit/phpunit": "^8.5 || ^9.5", + "spatie/phpunit-snapshot-assertions": "^2.2 || ^4.2" + }, + "type": "library", + "extra": { + "laravel": { + "aliases": { + "Breadcrumbs": "Diglactic\\Breadcrumbs\\Breadcrumbs" + }, + "providers": [ + "Diglactic\\Breadcrumbs\\ServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Diglactic\\Breadcrumbs\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Sheng Slogar", + "email": "sheng@diglactic.com", + "role": "Maintainer" + }, + { + "name": "Dave James Miller", + "email": "dave@davejamesmiller.com", + "role": "Original Creator" + } + ], + "description": "A simple Laravel-style way to create breadcrumbs.", + "homepage": "https://github.com/diglactic/laravel-breadcrumbs", + "keywords": [ + "laravel" + ], + "support": { + "issues": "https://github.com/diglactic/laravel-breadcrumbs/issues", + "source": "https://github.com/diglactic/laravel-breadcrumbs/tree/v8.1.1" + }, + "time": "2023-04-17T23:24:15+00:00" + }, + { + "name": "doctrine/cache", + "version": "2.2.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/cache.git", + "reference": "1ca8f21980e770095a31456042471a57bc4c68fb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/cache/zipball/1ca8f21980e770095a31456042471a57bc4c68fb", + "reference": "1ca8f21980e770095a31456042471a57bc4c68fb", + "shasum": "" + }, + "require": { + "php": "~7.1 || ^8.0" + }, + "conflict": { + "doctrine/common": ">2.2,<2.4" + }, + "require-dev": { + "cache/integration-tests": "dev-master", + "doctrine/coding-standard": "^9", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", + "psr/cache": "^1.0 || ^2.0 || ^3.0", + "symfony/cache": "^4.4 || ^5.4 || ^6", + "symfony/var-exporter": "^4.4 || ^5.4 || ^6" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Common\\Cache\\": "lib/Doctrine/Common/Cache" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "PHP Doctrine Cache library is a popular cache implementation that supports many different drivers such as redis, memcache, apc, mongodb and others.", + "homepage": "https://www.doctrine-project.org/projects/cache.html", + "keywords": [ + "abstraction", + "apcu", + "cache", + "caching", + "couchdb", + "memcached", + "php", + "redis", + "xcache" + ], + "support": { + "issues": "https://github.com/doctrine/cache/issues", + "source": "https://github.com/doctrine/cache/tree/2.2.0" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fcache", + "type": "tidelift" + } + ], + "time": "2022-05-20T20:07:39+00:00" + }, + { + "name": "doctrine/dbal", + "version": "3.9.4", + "source": { + "type": "git", + "url": "https://github.com/doctrine/dbal.git", + "reference": "ec16c82f20be1a7224e65ac67144a29199f87959" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/dbal/zipball/ec16c82f20be1a7224e65ac67144a29199f87959", + "reference": "ec16c82f20be1a7224e65ac67144a29199f87959", + "shasum": "" + }, + "require": { + "composer-runtime-api": "^2", + "doctrine/cache": "^1.11|^2.0", + "doctrine/deprecations": "^0.5.3|^1", + "doctrine/event-manager": "^1|^2", + "php": "^7.4 || ^8.0", + "psr/cache": "^1|^2|^3", + "psr/log": "^1|^2|^3" + }, + "require-dev": { + "doctrine/coding-standard": "12.0.0", + "fig/log-test": "^1", + "jetbrains/phpstorm-stubs": "2023.1", + "phpstan/phpstan": "2.1.1", + "phpstan/phpstan-strict-rules": "^2", + "phpunit/phpunit": "9.6.22", + "slevomat/coding-standard": "8.13.1", + "squizlabs/php_codesniffer": "3.10.2", + "symfony/cache": "^5.4|^6.0|^7.0", + "symfony/console": "^4.4|^5.4|^6.0|^7.0" + }, + "suggest": { + "symfony/console": "For helpful console commands such as SQL execution and import of files." + }, + "bin": [ + "bin/doctrine-dbal" + ], + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\DBAL\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + } + ], + "description": "Powerful PHP database abstraction layer (DBAL) with many features for database schema introspection and management.", + "homepage": "https://www.doctrine-project.org/projects/dbal.html", + "keywords": [ + "abstraction", + "database", + "db2", + "dbal", + "mariadb", + "mssql", + "mysql", + "oci8", + "oracle", + "pdo", + "pgsql", + "postgresql", + "queryobject", + "sasql", + "sql", + "sqlite", + "sqlserver", + "sqlsrv" + ], + "support": { + "issues": "https://github.com/doctrine/dbal/issues", + "source": "https://github.com/doctrine/dbal/tree/3.9.4" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fdbal", + "type": "tidelift" + } + ], + "time": "2025-01-16T08:28:55+00:00" + }, + { + "name": "doctrine/deprecations", + "version": "1.1.4", + "source": { + "type": "git", + "url": "https://github.com/doctrine/deprecations.git", + "reference": "31610dbb31faa98e6b5447b62340826f54fbc4e9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/deprecations/zipball/31610dbb31faa98e6b5447b62340826f54fbc4e9", + "reference": "31610dbb31faa98e6b5447b62340826f54fbc4e9", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "doctrine/coding-standard": "^9 || ^12", + "phpstan/phpstan": "1.4.10 || 2.0.3", + "phpstan/phpstan-phpunit": "^1.0 || ^2", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", + "psr/log": "^1 || ^2 || ^3" + }, + "suggest": { + "psr/log": "Allows logging deprecations via PSR-3 logger implementation" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Deprecations\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A small layer on top of trigger_error(E_USER_DEPRECATED) or PSR-3 logging with options to disable all deprecations or selectively for packages.", + "homepage": "https://www.doctrine-project.org/", + "support": { + "issues": "https://github.com/doctrine/deprecations/issues", + "source": "https://github.com/doctrine/deprecations/tree/1.1.4" + }, + "time": "2024-12-07T21:18:45+00:00" + }, + { + "name": "doctrine/event-manager", + "version": "2.0.1", + "source": { + "type": "git", + "url": "https://github.com/doctrine/event-manager.git", + "reference": "b680156fa328f1dfd874fd48c7026c41570b9c6e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/event-manager/zipball/b680156fa328f1dfd874fd48c7026c41570b9c6e", + "reference": "b680156fa328f1dfd874fd48c7026c41570b9c6e", + "shasum": "" + }, + "require": { + "php": "^8.1" + }, + "conflict": { + "doctrine/common": "<2.9" + }, + "require-dev": { + "doctrine/coding-standard": "^12", + "phpstan/phpstan": "^1.8.8", + "phpunit/phpunit": "^10.5", + "vimeo/psalm": "^5.24" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Common\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + }, + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com" + } + ], + "description": "The Doctrine Event Manager is a simple PHP event system that was built to be used with the various Doctrine projects.", + "homepage": "https://www.doctrine-project.org/projects/event-manager.html", + "keywords": [ + "event", + "event dispatcher", + "event manager", + "event system", + "events" + ], + "support": { + "issues": "https://github.com/doctrine/event-manager/issues", + "source": "https://github.com/doctrine/event-manager/tree/2.0.1" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fevent-manager", + "type": "tidelift" + } + ], + "time": "2024-05-22T20:47:39+00:00" + }, + { + "name": "doctrine/inflector", + "version": "2.0.10", + "source": { + "type": "git", + "url": "https://github.com/doctrine/inflector.git", + "reference": "5817d0659c5b50c9b950feb9af7b9668e2c436bc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/inflector/zipball/5817d0659c5b50c9b950feb9af7b9668e2c436bc", + "reference": "5817d0659c5b50c9b950feb9af7b9668e2c436bc", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "require-dev": { + "doctrine/coding-standard": "^11.0", + "phpstan/phpstan": "^1.8", + "phpstan/phpstan-phpunit": "^1.1", + "phpstan/phpstan-strict-rules": "^1.3", + "phpunit/phpunit": "^8.5 || ^9.5", + "vimeo/psalm": "^4.25 || ^5.4" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Inflector\\": "lib/Doctrine/Inflector" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "PHP Doctrine Inflector is a small library that can perform string manipulations with regard to upper/lowercase and singular/plural forms of words.", + "homepage": "https://www.doctrine-project.org/projects/inflector.html", + "keywords": [ + "inflection", + "inflector", + "lowercase", + "manipulation", + "php", + "plural", + "singular", + "strings", + "uppercase", + "words" + ], + "support": { + "issues": "https://github.com/doctrine/inflector/issues", + "source": "https://github.com/doctrine/inflector/tree/2.0.10" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finflector", + "type": "tidelift" + } + ], + "time": "2024-02-18T20:23:39+00:00" + }, + { + "name": "doctrine/lexer", + "version": "3.0.1", + "source": { + "type": "git", + "url": "https://github.com/doctrine/lexer.git", + "reference": "31ad66abc0fc9e1a1f2d9bc6a42668d2fbbcd6dd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/lexer/zipball/31ad66abc0fc9e1a1f2d9bc6a42668d2fbbcd6dd", + "reference": "31ad66abc0fc9e1a1f2d9bc6a42668d2fbbcd6dd", + "shasum": "" + }, + "require": { + "php": "^8.1" + }, + "require-dev": { + "doctrine/coding-standard": "^12", + "phpstan/phpstan": "^1.10", + "phpunit/phpunit": "^10.5", + "psalm/plugin-phpunit": "^0.18.3", + "vimeo/psalm": "^5.21" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Common\\Lexer\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "PHP Doctrine Lexer parser library that can be used in Top-Down, Recursive Descent Parsers.", + "homepage": "https://www.doctrine-project.org/projects/lexer.html", + "keywords": [ + "annotations", + "docblock", + "lexer", + "parser", + "php" + ], + "support": { + "issues": "https://github.com/doctrine/lexer/issues", + "source": "https://github.com/doctrine/lexer/tree/3.0.1" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Flexer", + "type": "tidelift" + } + ], + "time": "2024-02-05T11:56:58+00:00" + }, + { + "name": "dompdf/dompdf", + "version": "v2.0.8", + "source": { + "type": "git", + "url": "https://github.com/dompdf/dompdf.git", + "reference": "c20247574601700e1f7c8dab39310fca1964dc52" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/dompdf/dompdf/zipball/c20247574601700e1f7c8dab39310fca1964dc52", + "reference": "c20247574601700e1f7c8dab39310fca1964dc52", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-mbstring": "*", + "masterminds/html5": "^2.0", + "phenx/php-font-lib": ">=0.5.4 <1.0.0", + "phenx/php-svg-lib": ">=0.5.2 <1.0.0", + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "ext-json": "*", + "ext-zip": "*", + "mockery/mockery": "^1.3", + "phpunit/phpunit": "^7.5 || ^8 || ^9", + "squizlabs/php_codesniffer": "^3.5" + }, + "suggest": { + "ext-gd": "Needed to process images", + "ext-gmagick": "Improves image processing performance", + "ext-imagick": "Improves image processing performance", + "ext-zlib": "Needed for pdf stream compression" + }, + "type": "library", + "autoload": { + "psr-4": { + "Dompdf\\": "src/" + }, + "classmap": [ + "lib/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "LGPL-2.1" + ], + "authors": [ + { + "name": "The Dompdf Community", + "homepage": "https://github.com/dompdf/dompdf/blob/master/AUTHORS.md" + } + ], + "description": "DOMPDF is a CSS 2.1 compliant HTML to PDF converter", + "homepage": "https://github.com/dompdf/dompdf", + "support": { + "issues": "https://github.com/dompdf/dompdf/issues", + "source": "https://github.com/dompdf/dompdf/tree/v2.0.8" + }, + "time": "2024-04-29T13:06:17+00:00" + }, + { + "name": "dragonmantank/cron-expression", + "version": "v3.4.0", + "source": { + "type": "git", + "url": "https://github.com/dragonmantank/cron-expression.git", + "reference": "8c784d071debd117328803d86b2097615b457500" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/dragonmantank/cron-expression/zipball/8c784d071debd117328803d86b2097615b457500", + "reference": "8c784d071debd117328803d86b2097615b457500", + "shasum": "" + }, + "require": { + "php": "^7.2|^8.0", + "webmozart/assert": "^1.0" + }, + "replace": { + "mtdowling/cron-expression": "^1.0" + }, + "require-dev": { + "phpstan/extension-installer": "^1.0", + "phpstan/phpstan": "^1.0", + "phpunit/phpunit": "^7.0|^8.0|^9.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Cron\\": "src/Cron/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Chris Tankersley", + "email": "chris@ctankersley.com", + "homepage": "https://github.com/dragonmantank" + } + ], + "description": "CRON for PHP: Calculate the next or previous run date and determine if a CRON expression is due", + "keywords": [ + "cron", + "schedule" + ], + "support": { + "issues": "https://github.com/dragonmantank/cron-expression/issues", + "source": "https://github.com/dragonmantank/cron-expression/tree/v3.4.0" + }, + "funding": [ + { + "url": "https://github.com/dragonmantank", + "type": "github" + } + ], + "time": "2024-10-09T13:47:03+00:00" + }, + { + "name": "egulias/email-validator", + "version": "4.0.3", + "source": { + "type": "git", + "url": "https://github.com/egulias/EmailValidator.git", + "reference": "b115554301161fa21467629f1e1391c1936de517" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/egulias/EmailValidator/zipball/b115554301161fa21467629f1e1391c1936de517", + "reference": "b115554301161fa21467629f1e1391c1936de517", + "shasum": "" + }, + "require": { + "doctrine/lexer": "^2.0 || ^3.0", + "php": ">=8.1", + "symfony/polyfill-intl-idn": "^1.26" + }, + "require-dev": { + "phpunit/phpunit": "^10.2", + "vimeo/psalm": "^5.12" + }, + "suggest": { + "ext-intl": "PHP Internationalization Libraries are required to use the SpoofChecking validation" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Egulias\\EmailValidator\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Eduardo Gulias Davis" + } + ], + "description": "A library for validating emails against several RFCs", + "homepage": "https://github.com/egulias/EmailValidator", + "keywords": [ + "email", + "emailvalidation", + "emailvalidator", + "validation", + "validator" + ], + "support": { + "issues": "https://github.com/egulias/EmailValidator/issues", + "source": "https://github.com/egulias/EmailValidator/tree/4.0.3" + }, + "funding": [ + { + "url": "https://github.com/egulias", + "type": "github" + } + ], + "time": "2024-12-27T00:36:43+00:00" + }, + { + "name": "enshrined/svg-sanitize", + "version": "0.21.0", + "source": { + "type": "git", + "url": "https://github.com/darylldoyle/svg-sanitizer.git", + "reference": "5e477468fac5c5ce933dce53af3e8e4e58dcccc9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/darylldoyle/svg-sanitizer/zipball/5e477468fac5c5ce933dce53af3e8e4e58dcccc9", + "reference": "5e477468fac5c5ce933dce53af3e8e4e58dcccc9", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-libxml": "*", + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "phpunit/phpunit": "^6.5 || ^8.5" + }, + "type": "library", + "autoload": { + "psr-4": { + "enshrined\\svgSanitize\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-2.0-or-later" + ], + "authors": [ + { + "name": "Daryll Doyle", + "email": "daryll@enshrined.co.uk" + } + ], + "description": "An SVG sanitizer for PHP", + "support": { + "issues": "https://github.com/darylldoyle/svg-sanitizer/issues", + "source": "https://github.com/darylldoyle/svg-sanitizer/tree/0.21.0" + }, + "time": "2025-01-13T09:32:25+00:00" + }, + { + "name": "ezyang/htmlpurifier", + "version": "v4.18.0", + "source": { + "type": "git", + "url": "https://github.com/ezyang/htmlpurifier.git", + "reference": "cb56001e54359df7ae76dc522d08845dc741621b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ezyang/htmlpurifier/zipball/cb56001e54359df7ae76dc522d08845dc741621b", + "reference": "cb56001e54359df7ae76dc522d08845dc741621b", + "shasum": "" + }, + "require": { + "php": "~5.6.0 || ~7.0.0 || ~7.1.0 || ~7.2.0 || ~7.3.0 || ~7.4.0 || ~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0" + }, + "require-dev": { + "cerdic/css-tidy": "^1.7 || ^2.0", + "simpletest/simpletest": "dev-master" + }, + "suggest": { + "cerdic/css-tidy": "If you want to use the filter 'Filter.ExtractStyleBlocks'.", + "ext-bcmath": "Used for unit conversion and imagecrash protection", + "ext-iconv": "Converts text to and from non-UTF-8 encodings", + "ext-tidy": "Used for pretty-printing HTML" + }, + "type": "library", + "autoload": { + "files": [ + "library/HTMLPurifier.composer.php" + ], + "psr-0": { + "HTMLPurifier": "library/" + }, + "exclude-from-classmap": [ + "/library/HTMLPurifier/Language/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "LGPL-2.1-or-later" + ], + "authors": [ + { + "name": "Edward Z. Yang", + "email": "admin@htmlpurifier.org", + "homepage": "http://ezyang.com" + } + ], + "description": "Standards compliant HTML filter written in PHP", + "homepage": "http://htmlpurifier.org/", + "keywords": [ + "html" + ], + "support": { + "issues": "https://github.com/ezyang/htmlpurifier/issues", + "source": "https://github.com/ezyang/htmlpurifier/tree/v4.18.0" + }, + "time": "2024-11-01T03:51:45+00:00" + }, + { + "name": "facade/ignition-contracts", + "version": "1.0.2", + "source": { + "type": "git", + "url": "https://github.com/facade/ignition-contracts.git", + "reference": "3c921a1cdba35b68a7f0ccffc6dffc1995b18267" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/facade/ignition-contracts/zipball/3c921a1cdba35b68a7f0ccffc6dffc1995b18267", + "reference": "3c921a1cdba35b68a7f0ccffc6dffc1995b18267", + "shasum": "" + }, + "require": { + "php": "^7.3|^8.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^v2.15.8", + "phpunit/phpunit": "^9.3.11", + "vimeo/psalm": "^3.17.1" + }, + "type": "library", + "autoload": { + "psr-4": { + "Facade\\IgnitionContracts\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Freek Van der Herten", + "email": "freek@spatie.be", + "homepage": "https://flareapp.io", + "role": "Developer" + } + ], + "description": "Solution contracts for Ignition", + "homepage": "https://github.com/facade/ignition-contracts", + "keywords": [ + "contracts", + "flare", + "ignition" + ], + "support": { + "issues": "https://github.com/facade/ignition-contracts/issues", + "source": "https://github.com/facade/ignition-contracts/tree/1.0.2" + }, + "time": "2020-10-16T08:27:54+00:00" + }, + { + "name": "fruitcake/php-cors", + "version": "v1.3.0", + "source": { + "type": "git", + "url": "https://github.com/fruitcake/php-cors.git", + "reference": "3d158f36e7875e2f040f37bc0573956240a5a38b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/fruitcake/php-cors/zipball/3d158f36e7875e2f040f37bc0573956240a5a38b", + "reference": "3d158f36e7875e2f040f37bc0573956240a5a38b", + "shasum": "" + }, + "require": { + "php": "^7.4|^8.0", + "symfony/http-foundation": "^4.4|^5.4|^6|^7" + }, + "require-dev": { + "phpstan/phpstan": "^1.4", + "phpunit/phpunit": "^9", + "squizlabs/php_codesniffer": "^3.5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.2-dev" + } + }, + "autoload": { + "psr-4": { + "Fruitcake\\Cors\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fruitcake", + "homepage": "https://fruitcake.nl" + }, + { + "name": "Barryvdh", + "email": "barryvdh@gmail.com" + } + ], + "description": "Cross-origin resource sharing library for the Symfony HttpFoundation", + "homepage": "https://github.com/fruitcake/php-cors", + "keywords": [ + "cors", + "laravel", + "symfony" + ], + "support": { + "issues": "https://github.com/fruitcake/php-cors/issues", + "source": "https://github.com/fruitcake/php-cors/tree/v1.3.0" + }, + "funding": [ + { + "url": "https://fruitcake.nl", + "type": "custom" + }, + { + "url": "https://github.com/barryvdh", + "type": "github" + } + ], + "time": "2023-10-12T05:21:21+00:00" + }, + { + "name": "graham-campbell/result-type", + "version": "v1.1.3", + "source": { + "type": "git", + "url": "https://github.com/GrahamCampbell/Result-Type.git", + "reference": "3ba905c11371512af9d9bdd27d99b782216b6945" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/GrahamCampbell/Result-Type/zipball/3ba905c11371512af9d9bdd27d99b782216b6945", + "reference": "3ba905c11371512af9d9bdd27d99b782216b6945", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0", + "phpoption/phpoption": "^1.9.3" + }, + "require-dev": { + "phpunit/phpunit": "^8.5.39 || ^9.6.20 || ^10.5.28" + }, + "type": "library", + "autoload": { + "psr-4": { + "GrahamCampbell\\ResultType\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + } + ], + "description": "An Implementation Of The Result Type", + "keywords": [ + "Graham Campbell", + "GrahamCampbell", + "Result Type", + "Result-Type", + "result" + ], + "support": { + "issues": "https://github.com/GrahamCampbell/Result-Type/issues", + "source": "https://github.com/GrahamCampbell/Result-Type/tree/v1.1.3" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/graham-campbell/result-type", + "type": "tidelift" + } + ], + "time": "2024-07-20T21:45:45+00:00" + }, + { + "name": "guzzlehttp/guzzle", + "version": "7.9.2", + "source": { + "type": "git", + "url": "https://github.com/guzzle/guzzle.git", + "reference": "d281ed313b989f213357e3be1a179f02196ac99b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/d281ed313b989f213357e3be1a179f02196ac99b", + "reference": "d281ed313b989f213357e3be1a179f02196ac99b", + "shasum": "" + }, + "require": { + "ext-json": "*", + "guzzlehttp/promises": "^1.5.3 || ^2.0.3", + "guzzlehttp/psr7": "^2.7.0", + "php": "^7.2.5 || ^8.0", + "psr/http-client": "^1.0", + "symfony/deprecation-contracts": "^2.2 || ^3.0" + }, + "provide": { + "psr/http-client-implementation": "1.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "ext-curl": "*", + "guzzle/client-integration-tests": "3.0.2", + "php-http/message-factory": "^1.1", + "phpunit/phpunit": "^8.5.39 || ^9.6.20", + "psr/log": "^1.1 || ^2.0 || ^3.0" + }, + "suggest": { + "ext-curl": "Required for CURL handler support", + "ext-intl": "Required for Internationalized Domain Name (IDN) support", + "psr/log": "Required for using the Log middleware" + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + } + }, + "autoload": { + "files": [ + "src/functions_include.php" + ], + "psr-4": { + "GuzzleHttp\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "Jeremy Lindblom", + "email": "jeremeamia@gmail.com", + "homepage": "https://github.com/jeremeamia" + }, + { + "name": "George Mponos", + "email": "gmponos@gmail.com", + "homepage": "https://github.com/gmponos" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://github.com/sagikazarmark" + }, + { + "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", + "homepage": "https://github.com/Tobion" + } + ], + "description": "Guzzle is a PHP HTTP client library", + "keywords": [ + "client", + "curl", + "framework", + "http", + "http client", + "psr-18", + "psr-7", + "rest", + "web service" + ], + "support": { + "issues": "https://github.com/guzzle/guzzle/issues", + "source": "https://github.com/guzzle/guzzle/tree/7.9.2" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/guzzle", + "type": "tidelift" + } + ], + "time": "2024-07-24T11:22:20+00:00" + }, + { + "name": "guzzlehttp/promises", + "version": "2.0.4", + "source": { + "type": "git", + "url": "https://github.com/guzzle/promises.git", + "reference": "f9c436286ab2892c7db7be8c8da4ef61ccf7b455" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/promises/zipball/f9c436286ab2892c7db7be8c8da4ef61ccf7b455", + "reference": "f9c436286ab2892c7db7be8c8da4ef61ccf7b455", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "phpunit/phpunit": "^8.5.39 || ^9.6.20" + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + } + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\Promise\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, + { + "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", + "homepage": "https://github.com/Tobion" + } + ], + "description": "Guzzle promises library", + "keywords": [ + "promise" + ], + "support": { + "issues": "https://github.com/guzzle/promises/issues", + "source": "https://github.com/guzzle/promises/tree/2.0.4" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/promises", + "type": "tidelift" + } + ], + "time": "2024-10-17T10:06:22+00:00" + }, + { + "name": "guzzlehttp/psr7", + "version": "2.7.0", + "source": { + "type": "git", + "url": "https://github.com/guzzle/psr7.git", + "reference": "a70f5c95fb43bc83f07c9c948baa0dc1829bf201" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/a70f5c95fb43bc83f07c9c948baa0dc1829bf201", + "reference": "a70f5c95fb43bc83f07c9c948baa0dc1829bf201", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0", + "psr/http-factory": "^1.0", + "psr/http-message": "^1.1 || ^2.0", + "ralouphie/getallheaders": "^3.0" + }, + "provide": { + "psr/http-factory-implementation": "1.0", + "psr/http-message-implementation": "1.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "http-interop/http-factory-tests": "0.9.0", + "phpunit/phpunit": "^8.5.39 || ^9.6.20" + }, + "suggest": { + "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses" + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + } + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\Psr7\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "George Mponos", + "email": "gmponos@gmail.com", + "homepage": "https://github.com/gmponos" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://github.com/sagikazarmark" + }, + { + "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", + "homepage": "https://github.com/Tobion" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://sagikazarmark.hu" + } + ], + "description": "PSR-7 message implementation that also provides common utility methods", + "keywords": [ + "http", + "message", + "psr-7", + "request", + "response", + "stream", + "uri", + "url" + ], + "support": { + "issues": "https://github.com/guzzle/psr7/issues", + "source": "https://github.com/guzzle/psr7/tree/2.7.0" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/psr7", + "type": "tidelift" + } + ], + "time": "2024-07-18T11:15:46+00:00" + }, + { + "name": "guzzlehttp/uri-template", + "version": "v1.0.4", + "source": { + "type": "git", + "url": "https://github.com/guzzle/uri-template.git", + "reference": "30e286560c137526eccd4ce21b2de477ab0676d2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/uri-template/zipball/30e286560c137526eccd4ce21b2de477ab0676d2", + "reference": "30e286560c137526eccd4ce21b2de477ab0676d2", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0", + "symfony/polyfill-php80": "^1.24" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "phpunit/phpunit": "^8.5.36 || ^9.6.15", + "uri-template/tests": "1.0.0" + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + } + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\UriTemplate\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "George Mponos", + "email": "gmponos@gmail.com", + "homepage": "https://github.com/gmponos" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + } + ], + "description": "A polyfill class for uri_template of PHP", + "keywords": [ + "guzzlehttp", + "uri-template" + ], + "support": { + "issues": "https://github.com/guzzle/uri-template/issues", + "source": "https://github.com/guzzle/uri-template/tree/v1.0.4" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/uri-template", + "type": "tidelift" + } + ], + "time": "2025-02-03T10:55:03+00:00" + }, + { + "name": "khaled.alshamaa/ar-php", + "version": "v6.3.4", + "source": { + "type": "git", + "url": "https://github.com/khaled-alshamaa/ar-php.git", + "reference": "36550a0d805dc50fcede0132cd8b83c80fe1fd6c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/khaled-alshamaa/ar-php/zipball/36550a0d805dc50fcede0132cd8b83c80fe1fd6c", + "reference": "36550a0d805dc50fcede0132cd8b83c80fe1fd6c", + "shasum": "" + }, + "require": { + "ext-calendar": "*", + "ext-mbstring": "*", + "php": ">=5.6.0" + }, + "require-dev": { + "phpunit/phpunit": "9.*" + }, + "type": "library", + "autoload": { + "psr-4": { + "ArPHP\\I18N\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "LGPL-3.0" + ], + "authors": [ + { + "name": "Khaled Al-Sham'aa", + "email": "khaled@ar-php.org", + "homepage": "http://www.ar-php.org", + "role": "Developer" + } + ], + "description": "Set of functionalities enable Arabic website developers to serve professional search, present and process Arabic content in PHP", + "homepage": "https://github.com/khaled-alshamaa/ar-php", + "keywords": [ + "arabic", + "arabic-calendar", + "arabic-glyphs", + "arabic-numbers", + "arabic-segments-identifier", + "arabic-sentiment", + "arabic-sql-query" + ], + "support": { + "issues": "https://github.com/khaled-alshamaa/ar-php/issues", + "source": "https://github.com/khaled-alshamaa/ar-php/tree/v6.3.4" + }, + "funding": [ + { + "url": "https://github.com/khaled-alshamaa", + "type": "github" + } + ], + "time": "2023-04-04T22:05:31+00:00" + }, + { + "name": "konekt/concord", + "version": "1.16.0", + "source": { + "type": "git", + "url": "https://github.com/artkonekt/concord.git", + "reference": "56d337f6ffc8534175c98b82071556a2d74f659c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/artkonekt/concord/zipball/56d337f6ffc8534175c98b82071556a2d74f659c", + "reference": "56d337f6ffc8534175c98b82071556a2d74f659c", + "shasum": "" + }, + "require": { + "illuminate/console": "^10.0|^11.0|^12.0", + "illuminate/support": "^10.0|^11.0|^12.0", + "konekt/enum": "^2.1|^3.0|^4.0", + "konekt/enum-eloquent": "^1.7", + "php": "^8.1" + }, + "require-dev": { + "orchestra/testbench": "^8.0|^9.0|^10.0", + "phpunit/phpunit": "9 - 11" + }, + "type": "library", + "extra": { + "laravel": { + "aliases": { + "Helper": "Konekt\\Concord\\Facades\\Helper", + "Concord": "Konekt\\Concord\\Facades\\Concord" + }, + "providers": [ + "Konekt\\Concord\\ConcordServiceProvider" + ] + } + }, + "autoload": { + "files": [ + "src/Support/functions.php" + ], + "psr-4": { + "Konekt\\Concord\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Attila Fulop", + "homepage": "https://github.com/fulopattila122" + } + ], + "description": "Concord is a Laravel Extension for building modular Laravel Applications", + "support": { + "issues": "https://github.com/artkonekt/concord", + "source": "https://github.com/artkonekt/concord/tree/1.16.0" + }, + "time": "2025-03-03T11:39:09+00:00" + }, + { + "name": "konekt/enum", + "version": "4.2.0", + "source": { + "type": "git", + "url": "https://github.com/artkonekt/enum.git", + "reference": "e3c723fc65e6c7bc901f022477a9e37f0f278bdb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/artkonekt/enum/zipball/e3c723fc65e6c7bc901f022477a9e37f0f278bdb", + "reference": "e3c723fc65e6c7bc901f022477a9e37f0f278bdb", + "shasum": "" + }, + "require": { + "php": "^8.0" + }, + "require-dev": { + "phpunit/phpunit": "^9.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.x-dev" + } + }, + "autoload": { + "psr-4": { + "Konekt\\Enum\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Attila Fulop", + "homepage": "https://github.com/fulopattila122" + } + ], + "description": "SPL inspired PHP enum class implementation", + "keywords": [ + "artkonekt", + "enum", + "konekt" + ], + "support": { + "issues": "https://github.com/artkonekt/enum/issues", + "source": "https://github.com/artkonekt/enum" + }, + "time": "2024-02-29T15:32:06+00:00" + }, + { + "name": "konekt/enum-eloquent", + "version": "1.10.0", + "source": { + "type": "git", + "url": "https://github.com/artkonekt/enum-eloquent.git", + "reference": "ebfbc29706c407eb98fdabd90c38501315d99ec7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/artkonekt/enum-eloquent/zipball/ebfbc29706c407eb98fdabd90c38501315d99ec7", + "reference": "ebfbc29706c407eb98fdabd90c38501315d99ec7", + "shasum": "" + }, + "require": { + "illuminate/database": "^8.75|9.*|10.*|11.*|12.*", + "konekt/enum": "^2.0.2 || ^3.0 | ^4.0", + "php": "^8.0" + }, + "require-dev": { + "illuminate/events": "^8.75|9.*|10.*|11.*|12.*", + "phpunit/phpunit": "9 - 11" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Konekt\\Enum\\Eloquent\\EnumServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Konekt\\Enum\\Eloquent\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Attila Fulop", + "homepage": "https://github.com/fulopattila122" + }, + { + "name": "Semyon Chetvertnyh", + "homepage": "https://github.com/semyonchetvertnyh" + }, + { + "name": "Mark Boessenkool", + "homepage": "https://github.com/TheM1984" + } + ], + "description": "Enum attribute casting for Eloquent models", + "keywords": [ + "artkonekt", + "eloquent", + "enum", + "konekt", + "laravel" + ], + "support": { + "issues": "https://github.com/artkonekt/enum-eloquent/issues", + "source": "https://github.com/artkonekt/enum-eloquent" + }, + "time": "2025-03-03T11:34:47+00:00" + }, + { + "name": "laravel/framework", + "version": "v10.48.29", + "source": { + "type": "git", + "url": "https://github.com/laravel/framework.git", + "reference": "8f7f9247cb8aad1a769d6b9815a6623d89b46b47" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/framework/zipball/8f7f9247cb8aad1a769d6b9815a6623d89b46b47", + "reference": "8f7f9247cb8aad1a769d6b9815a6623d89b46b47", + "shasum": "" + }, + "require": { + "brick/math": "^0.9.3|^0.10.2|^0.11|^0.12", + "composer-runtime-api": "^2.2", + "doctrine/inflector": "^2.0.5", + "dragonmantank/cron-expression": "^3.3.2", + "egulias/email-validator": "^3.2.1|^4.0", + "ext-ctype": "*", + "ext-filter": "*", + "ext-hash": "*", + "ext-mbstring": "*", + "ext-openssl": "*", + "ext-session": "*", + "ext-tokenizer": "*", + "fruitcake/php-cors": "^1.2", + "guzzlehttp/uri-template": "^1.0", + "laravel/prompts": "^0.1.9", + "laravel/serializable-closure": "^1.3", + "league/commonmark": "^2.2.1", + "league/flysystem": "^3.8.0", + "monolog/monolog": "^3.0", + "nesbot/carbon": "^2.67", + "nunomaduro/termwind": "^1.13", + "php": "^8.1", + "psr/container": "^1.1.1|^2.0.1", + "psr/log": "^1.0|^2.0|^3.0", + "psr/simple-cache": "^1.0|^2.0|^3.0", + "ramsey/uuid": "^4.7", + "symfony/console": "^6.2", + "symfony/error-handler": "^6.2", + "symfony/finder": "^6.2", + "symfony/http-foundation": "^6.4", + "symfony/http-kernel": "^6.2", + "symfony/mailer": "^6.2", + "symfony/mime": "^6.2", + "symfony/process": "^6.2", + "symfony/routing": "^6.2", + "symfony/uid": "^6.2", + "symfony/var-dumper": "^6.2", + "tijsverkoyen/css-to-inline-styles": "^2.2.5", + "vlucas/phpdotenv": "^5.4.1", + "voku/portable-ascii": "^2.0" + }, + "conflict": { + "carbonphp/carbon-doctrine-types": ">=3.0", + "doctrine/dbal": ">=4.0", + "mockery/mockery": "1.6.8", + "phpunit/phpunit": ">=11.0.0", + "tightenco/collect": "<5.5.33" + }, + "provide": { + "psr/container-implementation": "1.1|2.0", + "psr/simple-cache-implementation": "1.0|2.0|3.0" + }, + "replace": { + "illuminate/auth": "self.version", + "illuminate/broadcasting": "self.version", + "illuminate/bus": "self.version", + "illuminate/cache": "self.version", + "illuminate/collections": "self.version", + "illuminate/conditionable": "self.version", + "illuminate/config": "self.version", + "illuminate/console": "self.version", + "illuminate/container": "self.version", + "illuminate/contracts": "self.version", + "illuminate/cookie": "self.version", + "illuminate/database": "self.version", + "illuminate/encryption": "self.version", + "illuminate/events": "self.version", + "illuminate/filesystem": "self.version", + "illuminate/hashing": "self.version", + "illuminate/http": "self.version", + "illuminate/log": "self.version", + "illuminate/macroable": "self.version", + "illuminate/mail": "self.version", + "illuminate/notifications": "self.version", + "illuminate/pagination": "self.version", + "illuminate/pipeline": "self.version", + "illuminate/process": "self.version", + "illuminate/queue": "self.version", + "illuminate/redis": "self.version", + "illuminate/routing": "self.version", + "illuminate/session": "self.version", + "illuminate/support": "self.version", + "illuminate/testing": "self.version", + "illuminate/translation": "self.version", + "illuminate/validation": "self.version", + "illuminate/view": "self.version" + }, + "require-dev": { + "ably/ably-php": "^1.0", + "aws/aws-sdk-php": "^3.235.5", + "doctrine/dbal": "^3.5.1", + "ext-gmp": "*", + "fakerphp/faker": "^1.21", + "guzzlehttp/guzzle": "^7.5", + "league/flysystem-aws-s3-v3": "^3.0", + "league/flysystem-ftp": "^3.0", + "league/flysystem-path-prefixing": "^3.3", + "league/flysystem-read-only": "^3.3", + "league/flysystem-sftp-v3": "^3.0", + "mockery/mockery": "^1.5.1", + "nyholm/psr7": "^1.2", + "orchestra/testbench-core": "^8.23.4", + "pda/pheanstalk": "^4.0", + "phpstan/phpstan": "~1.11.11", + "phpunit/phpunit": "^10.0.7", + "predis/predis": "^2.0.2", + "symfony/cache": "^6.2", + "symfony/http-client": "^6.2.4", + "symfony/psr-http-message-bridge": "^2.0" + }, + "suggest": { + "ably/ably-php": "Required to use the Ably broadcast driver (^1.0).", + "aws/aws-sdk-php": "Required to use the SQS queue driver, DynamoDb failed job storage, and SES mail driver (^3.235.5).", + "brianium/paratest": "Required to run tests in parallel (^6.0).", + "doctrine/dbal": "Required to rename columns and drop SQLite columns (^3.5.1).", + "ext-apcu": "Required to use the APC cache driver.", + "ext-fileinfo": "Required to use the Filesystem class.", + "ext-ftp": "Required to use the Flysystem FTP driver.", + "ext-gd": "Required to use Illuminate\\Http\\Testing\\FileFactory::image().", + "ext-memcached": "Required to use the memcache cache driver.", + "ext-pcntl": "Required to use all features of the queue worker and console signal trapping.", + "ext-pdo": "Required to use all database features.", + "ext-posix": "Required to use all features of the queue worker.", + "ext-redis": "Required to use the Redis cache and queue drivers (^4.0|^5.0).", + "fakerphp/faker": "Required to use the eloquent factory builder (^1.9.1).", + "filp/whoops": "Required for friendly error pages in development (^2.14.3).", + "guzzlehttp/guzzle": "Required to use the HTTP Client and the ping methods on schedules (^7.5).", + "laravel/tinker": "Required to use the tinker console command (^2.0).", + "league/flysystem-aws-s3-v3": "Required to use the Flysystem S3 driver (^3.0).", + "league/flysystem-ftp": "Required to use the Flysystem FTP driver (^3.0).", + "league/flysystem-path-prefixing": "Required to use the scoped driver (^3.3).", + "league/flysystem-read-only": "Required to use read-only disks (^3.3)", + "league/flysystem-sftp-v3": "Required to use the Flysystem SFTP driver (^3.0).", + "mockery/mockery": "Required to use mocking (^1.5.1).", + "nyholm/psr7": "Required to use PSR-7 bridging features (^1.2).", + "pda/pheanstalk": "Required to use the beanstalk queue driver (^4.0).", + "phpunit/phpunit": "Required to use assertions and run tests (^9.5.8|^10.0.7).", + "predis/predis": "Required to use the predis connector (^2.0.2).", + "psr/http-message": "Required to allow Storage::put to accept a StreamInterface (^1.0).", + "pusher/pusher-php-server": "Required to use the Pusher broadcast driver (^6.0|^7.0).", + "symfony/cache": "Required to PSR-6 cache bridge (^6.2).", + "symfony/filesystem": "Required to enable support for relative symbolic links (^6.2).", + "symfony/http-client": "Required to enable support for the Symfony API mail transports (^6.2).", + "symfony/mailgun-mailer": "Required to enable support for the Mailgun mail transport (^6.2).", + "symfony/postmark-mailer": "Required to enable support for the Postmark mail transport (^6.2).", + "symfony/psr-http-message-bridge": "Required to use PSR-7 bridging features (^2.0)." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "10.x-dev" + } + }, + "autoload": { + "files": [ + "src/Illuminate/Collections/helpers.php", + "src/Illuminate/Events/functions.php", + "src/Illuminate/Filesystem/functions.php", + "src/Illuminate/Foundation/helpers.php", + "src/Illuminate/Support/helpers.php" + ], + "psr-4": { + "Illuminate\\": "src/Illuminate/", + "Illuminate\\Support\\": [ + "src/Illuminate/Macroable/", + "src/Illuminate/Collections/", + "src/Illuminate/Conditionable/" + ] + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Laravel Framework.", + "homepage": "https://laravel.com", + "keywords": [ + "framework", + "laravel" + ], + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "time": "2025-03-12T14:42:01+00:00" + }, + { + "name": "laravel/prompts", + "version": "v0.1.25", + "source": { + "type": "git", + "url": "https://github.com/laravel/prompts.git", + "reference": "7b4029a84c37cb2725fc7f011586e2997040bc95" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/prompts/zipball/7b4029a84c37cb2725fc7f011586e2997040bc95", + "reference": "7b4029a84c37cb2725fc7f011586e2997040bc95", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "illuminate/collections": "^10.0|^11.0", + "php": "^8.1", + "symfony/console": "^6.2|^7.0" + }, + "conflict": { + "illuminate/console": ">=10.17.0 <10.25.0", + "laravel/framework": ">=10.17.0 <10.25.0" + }, + "require-dev": { + "mockery/mockery": "^1.5", + "pestphp/pest": "^2.3", + "phpstan/phpstan": "^1.11", + "phpstan/phpstan-mockery": "^1.1" + }, + "suggest": { + "ext-pcntl": "Required for the spinner to be animated." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "0.1.x-dev" + } + }, + "autoload": { + "files": [ + "src/helpers.php" + ], + "psr-4": { + "Laravel\\Prompts\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Add beautiful and user-friendly forms to your command-line applications.", + "support": { + "issues": "https://github.com/laravel/prompts/issues", + "source": "https://github.com/laravel/prompts/tree/v0.1.25" + }, + "time": "2024-08-12T22:06:33+00:00" + }, + { + "name": "laravel/sanctum", + "version": "v3.3.3", + "source": { + "type": "git", + "url": "https://github.com/laravel/sanctum.git", + "reference": "8c104366459739f3ada0e994bcd3e6fd681ce3d5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/sanctum/zipball/8c104366459739f3ada0e994bcd3e6fd681ce3d5", + "reference": "8c104366459739f3ada0e994bcd3e6fd681ce3d5", + "shasum": "" + }, + "require": { + "ext-json": "*", + "illuminate/console": "^9.21|^10.0", + "illuminate/contracts": "^9.21|^10.0", + "illuminate/database": "^9.21|^10.0", + "illuminate/support": "^9.21|^10.0", + "php": "^8.0.2" + }, + "require-dev": { + "mockery/mockery": "^1.0", + "orchestra/testbench": "^7.28.2|^8.8.3", + "phpstan/phpstan": "^1.10", + "phpunit/phpunit": "^9.6" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Laravel\\Sanctum\\SanctumServiceProvider" + ] + }, + "branch-alias": { + "dev-master": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Laravel\\Sanctum\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "Laravel Sanctum provides a featherweight authentication system for SPAs and simple APIs.", + "keywords": [ + "auth", + "laravel", + "sanctum" + ], + "support": { + "issues": "https://github.com/laravel/sanctum/issues", + "source": "https://github.com/laravel/sanctum" + }, + "time": "2023-12-19T18:44:48+00:00" + }, + { + "name": "laravel/serializable-closure", + "version": "v1.3.7", + "source": { + "type": "git", + "url": "https://github.com/laravel/serializable-closure.git", + "reference": "4f48ade902b94323ca3be7646db16209ec76be3d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/serializable-closure/zipball/4f48ade902b94323ca3be7646db16209ec76be3d", + "reference": "4f48ade902b94323ca3be7646db16209ec76be3d", + "shasum": "" + }, + "require": { + "php": "^7.3|^8.0" + }, + "require-dev": { + "illuminate/support": "^8.0|^9.0|^10.0|^11.0", + "nesbot/carbon": "^2.61|^3.0", + "pestphp/pest": "^1.21.3", + "phpstan/phpstan": "^1.8.2", + "symfony/var-dumper": "^5.4.11|^6.2.0|^7.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Laravel\\SerializableClosure\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + }, + { + "name": "Nuno Maduro", + "email": "nuno@laravel.com" + } + ], + "description": "Laravel Serializable Closure provides an easy and secure way to serialize closures in PHP.", + "keywords": [ + "closure", + "laravel", + "serializable" + ], + "support": { + "issues": "https://github.com/laravel/serializable-closure/issues", + "source": "https://github.com/laravel/serializable-closure" + }, + "time": "2024-11-14T18:34:49+00:00" + }, + { + "name": "laravel/tinker", + "version": "v2.10.1", + "source": { + "type": "git", + "url": "https://github.com/laravel/tinker.git", + "reference": "22177cc71807d38f2810c6204d8f7183d88a57d3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/tinker/zipball/22177cc71807d38f2810c6204d8f7183d88a57d3", + "reference": "22177cc71807d38f2810c6204d8f7183d88a57d3", + "shasum": "" + }, + "require": { + "illuminate/console": "^6.0|^7.0|^8.0|^9.0|^10.0|^11.0|^12.0", + "illuminate/contracts": "^6.0|^7.0|^8.0|^9.0|^10.0|^11.0|^12.0", + "illuminate/support": "^6.0|^7.0|^8.0|^9.0|^10.0|^11.0|^12.0", + "php": "^7.2.5|^8.0", + "psy/psysh": "^0.11.1|^0.12.0", + "symfony/var-dumper": "^4.3.4|^5.0|^6.0|^7.0" + }, + "require-dev": { + "mockery/mockery": "~1.3.3|^1.4.2", + "phpstan/phpstan": "^1.10", + "phpunit/phpunit": "^8.5.8|^9.3.3|^10.0" + }, + "suggest": { + "illuminate/database": "The Illuminate Database package (^6.0|^7.0|^8.0|^9.0|^10.0|^11.0|^12.0)." + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Laravel\\Tinker\\TinkerServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Laravel\\Tinker\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "Powerful REPL for the Laravel framework.", + "keywords": [ + "REPL", + "Tinker", + "laravel", + "psysh" + ], + "support": { + "issues": "https://github.com/laravel/tinker/issues", + "source": "https://github.com/laravel/tinker/tree/v2.10.1" + }, + "time": "2025-01-27T14:24:01+00:00" + }, + { + "name": "laravel/ui", + "version": "v4.6.1", + "source": { + "type": "git", + "url": "https://github.com/laravel/ui.git", + "reference": "7d6ffa38d79f19c9b3e70a751a9af845e8f41d88" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/ui/zipball/7d6ffa38d79f19c9b3e70a751a9af845e8f41d88", + "reference": "7d6ffa38d79f19c9b3e70a751a9af845e8f41d88", + "shasum": "" + }, + "require": { + "illuminate/console": "^9.21|^10.0|^11.0|^12.0", + "illuminate/filesystem": "^9.21|^10.0|^11.0|^12.0", + "illuminate/support": "^9.21|^10.0|^11.0|^12.0", + "illuminate/validation": "^9.21|^10.0|^11.0|^12.0", + "php": "^8.0", + "symfony/console": "^6.0|^7.0" + }, + "require-dev": { + "orchestra/testbench": "^7.35|^8.15|^9.0|^10.0", + "phpunit/phpunit": "^9.3|^10.4|^11.5" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Laravel\\Ui\\UiServiceProvider" + ] + }, + "branch-alias": { + "dev-master": "4.x-dev" + } + }, + "autoload": { + "psr-4": { + "Laravel\\Ui\\": "src/", + "Illuminate\\Foundation\\Auth\\": "auth-backend/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "Laravel UI utilities and presets.", + "keywords": [ + "laravel", + "ui" + ], + "support": { + "source": "https://github.com/laravel/ui/tree/v4.6.1" + }, + "time": "2025-01-28T15:15:29+00:00" + }, + { + "name": "league/commonmark", + "version": "2.7.1", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/commonmark.git", + "reference": "10732241927d3971d28e7ea7b5712721fa2296ca" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/commonmark/zipball/10732241927d3971d28e7ea7b5712721fa2296ca", + "reference": "10732241927d3971d28e7ea7b5712721fa2296ca", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "league/config": "^1.1.1", + "php": "^7.4 || ^8.0", + "psr/event-dispatcher": "^1.0", + "symfony/deprecation-contracts": "^2.1 || ^3.0", + "symfony/polyfill-php80": "^1.16" + }, + "require-dev": { + "cebe/markdown": "^1.0", + "commonmark/cmark": "0.31.1", + "commonmark/commonmark.js": "0.31.1", + "composer/package-versions-deprecated": "^1.8", + "embed/embed": "^4.4", + "erusev/parsedown": "^1.0", + "ext-json": "*", + "github/gfm": "0.29.0", + "michelf/php-markdown": "^1.4 || ^2.0", + "nyholm/psr7": "^1.5", + "phpstan/phpstan": "^1.8.2", + "phpunit/phpunit": "^9.5.21 || ^10.5.9 || ^11.0.0", + "scrutinizer/ocular": "^1.8.1", + "symfony/finder": "^5.3 | ^6.0 | ^7.0", + "symfony/process": "^5.4 | ^6.0 | ^7.0", + "symfony/yaml": "^2.3 | ^3.0 | ^4.0 | ^5.0 | ^6.0 | ^7.0", + "unleashedtech/php-coding-standard": "^3.1.1", + "vimeo/psalm": "^4.24.0 || ^5.0.0 || ^6.0.0" + }, + "suggest": { + "symfony/yaml": "v2.3+ required if using the Front Matter extension" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.8-dev" + } + }, + "autoload": { + "psr-4": { + "League\\CommonMark\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Colin O'Dell", + "email": "colinodell@gmail.com", + "homepage": "https://www.colinodell.com", + "role": "Lead Developer" + } + ], + "description": "Highly-extensible PHP Markdown parser which fully supports the CommonMark spec and GitHub-Flavored Markdown (GFM)", + "homepage": "https://commonmark.thephpleague.com", + "keywords": [ + "commonmark", + "flavored", + "gfm", + "github", + "github-flavored", + "markdown", + "md", + "parser" + ], + "support": { + "docs": "https://commonmark.thephpleague.com/", + "forum": "https://github.com/thephpleague/commonmark/discussions", + "issues": "https://github.com/thephpleague/commonmark/issues", + "rss": "https://github.com/thephpleague/commonmark/releases.atom", + "source": "https://github.com/thephpleague/commonmark" + }, + "funding": [ + { + "url": "https://www.colinodell.com/sponsor", + "type": "custom" + }, + { + "url": "https://www.paypal.me/colinpodell/10.00", + "type": "custom" + }, + { + "url": "https://github.com/colinodell", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/league/commonmark", + "type": "tidelift" + } + ], + "time": "2025-07-20T12:47:49+00:00" + }, + { + "name": "league/config", + "version": "v1.2.0", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/config.git", + "reference": "754b3604fb2984c71f4af4a9cbe7b57f346ec1f3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/config/zipball/754b3604fb2984c71f4af4a9cbe7b57f346ec1f3", + "reference": "754b3604fb2984c71f4af4a9cbe7b57f346ec1f3", + "shasum": "" + }, + "require": { + "dflydev/dot-access-data": "^3.0.1", + "nette/schema": "^1.2", + "php": "^7.4 || ^8.0" + }, + "require-dev": { + "phpstan/phpstan": "^1.8.2", + "phpunit/phpunit": "^9.5.5", + "scrutinizer/ocular": "^1.8.1", + "unleashedtech/php-coding-standard": "^3.1", + "vimeo/psalm": "^4.7.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.2-dev" + } + }, + "autoload": { + "psr-4": { + "League\\Config\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Colin O'Dell", + "email": "colinodell@gmail.com", + "homepage": "https://www.colinodell.com", + "role": "Lead Developer" + } + ], + "description": "Define configuration arrays with strict schemas and access values with dot notation", + "homepage": "https://config.thephpleague.com", + "keywords": [ + "array", + "config", + "configuration", + "dot", + "dot-access", + "nested", + "schema" + ], + "support": { + "docs": "https://config.thephpleague.com/", + "issues": "https://github.com/thephpleague/config/issues", + "rss": "https://github.com/thephpleague/config/releases.atom", + "source": "https://github.com/thephpleague/config" + }, + "funding": [ + { + "url": "https://www.colinodell.com/sponsor", + "type": "custom" + }, + { + "url": "https://www.paypal.me/colinpodell/10.00", + "type": "custom" + }, + { + "url": "https://github.com/colinodell", + "type": "github" + } + ], + "time": "2022-12-11T20:36:23+00:00" + }, + { + "name": "league/flysystem", + "version": "3.29.1", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/flysystem.git", + "reference": "edc1bb7c86fab0776c3287dbd19b5fa278347319" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/edc1bb7c86fab0776c3287dbd19b5fa278347319", + "reference": "edc1bb7c86fab0776c3287dbd19b5fa278347319", + "shasum": "" + }, + "require": { + "league/flysystem-local": "^3.0.0", + "league/mime-type-detection": "^1.0.0", + "php": "^8.0.2" + }, + "conflict": { + "async-aws/core": "<1.19.0", + "async-aws/s3": "<1.14.0", + "aws/aws-sdk-php": "3.209.31 || 3.210.0", + "guzzlehttp/guzzle": "<7.0", + "guzzlehttp/ringphp": "<1.1.1", + "phpseclib/phpseclib": "3.0.15", + "symfony/http-client": "<5.2" + }, + "require-dev": { + "async-aws/s3": "^1.5 || ^2.0", + "async-aws/simple-s3": "^1.1 || ^2.0", + "aws/aws-sdk-php": "^3.295.10", + "composer/semver": "^3.0", + "ext-fileinfo": "*", + "ext-ftp": "*", + "ext-mongodb": "^1.3", + "ext-zip": "*", + "friendsofphp/php-cs-fixer": "^3.5", + "google/cloud-storage": "^1.23", + "guzzlehttp/psr7": "^2.6", + "microsoft/azure-storage-blob": "^1.1", + "mongodb/mongodb": "^1.2", + "phpseclib/phpseclib": "^3.0.36", + "phpstan/phpstan": "^1.10", + "phpunit/phpunit": "^9.5.11|^10.0", + "sabre/dav": "^4.6.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "League\\Flysystem\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Frank de Jonge", + "email": "info@frankdejonge.nl" + } + ], + "description": "File storage abstraction for PHP", + "keywords": [ + "WebDAV", + "aws", + "cloud", + "file", + "files", + "filesystem", + "filesystems", + "ftp", + "s3", + "sftp", + "storage" + ], + "support": { + "issues": "https://github.com/thephpleague/flysystem/issues", + "source": "https://github.com/thephpleague/flysystem/tree/3.29.1" + }, + "time": "2024-10-08T08:58:34+00:00" + }, + { + "name": "league/flysystem-local", + "version": "3.29.0", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/flysystem-local.git", + "reference": "e0e8d52ce4b2ed154148453d321e97c8e931bd27" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/flysystem-local/zipball/e0e8d52ce4b2ed154148453d321e97c8e931bd27", + "reference": "e0e8d52ce4b2ed154148453d321e97c8e931bd27", + "shasum": "" + }, + "require": { + "ext-fileinfo": "*", + "league/flysystem": "^3.0.0", + "league/mime-type-detection": "^1.0.0", + "php": "^8.0.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "League\\Flysystem\\Local\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Frank de Jonge", + "email": "info@frankdejonge.nl" + } + ], + "description": "Local filesystem adapter for Flysystem.", + "keywords": [ + "Flysystem", + "file", + "files", + "filesystem", + "local" + ], + "support": { + "source": "https://github.com/thephpleague/flysystem-local/tree/3.29.0" + }, + "time": "2024-08-09T21:24:39+00:00" + }, + { + "name": "league/mime-type-detection", + "version": "1.16.0", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/mime-type-detection.git", + "reference": "2d6702ff215bf922936ccc1ad31007edc76451b9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/mime-type-detection/zipball/2d6702ff215bf922936ccc1ad31007edc76451b9", + "reference": "2d6702ff215bf922936ccc1ad31007edc76451b9", + "shasum": "" + }, + "require": { + "ext-fileinfo": "*", + "php": "^7.4 || ^8.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^3.2", + "phpstan/phpstan": "^0.12.68", + "phpunit/phpunit": "^8.5.8 || ^9.3 || ^10.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "League\\MimeTypeDetection\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Frank de Jonge", + "email": "info@frankdejonge.nl" + } + ], + "description": "Mime-type detection for Flysystem", + "support": { + "issues": "https://github.com/thephpleague/mime-type-detection/issues", + "source": "https://github.com/thephpleague/mime-type-detection/tree/1.16.0" + }, + "funding": [ + { + "url": "https://github.com/frankdejonge", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/league/flysystem", + "type": "tidelift" + } + ], + "time": "2024-09-21T08:32:55+00:00" + }, + { + "name": "maatwebsite/excel", + "version": "3.1.64", + "source": { + "type": "git", + "url": "https://github.com/SpartnerNL/Laravel-Excel.git", + "reference": "e25d44a2d91da9179cd2d7fec952313548597a79" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/SpartnerNL/Laravel-Excel/zipball/e25d44a2d91da9179cd2d7fec952313548597a79", + "reference": "e25d44a2d91da9179cd2d7fec952313548597a79", + "shasum": "" + }, + "require": { + "composer/semver": "^3.3", + "ext-json": "*", + "illuminate/support": "5.8.*||^6.0||^7.0||^8.0||^9.0||^10.0||^11.0||^12.0", + "php": "^7.0||^8.0", + "phpoffice/phpspreadsheet": "^1.29.9", + "psr/simple-cache": "^1.0||^2.0||^3.0" + }, + "require-dev": { + "laravel/scout": "^7.0||^8.0||^9.0||^10.0", + "orchestra/testbench": "^6.0||^7.0||^8.0||^9.0||^10.0", + "predis/predis": "^1.1" + }, + "type": "library", + "extra": { + "laravel": { + "aliases": { + "Excel": "Maatwebsite\\Excel\\Facades\\Excel" + }, + "providers": [ + "Maatwebsite\\Excel\\ExcelServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Maatwebsite\\Excel\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Patrick Brouwers", + "email": "patrick@spartner.nl" + } + ], + "description": "Supercharged Excel exports and imports in Laravel", + "keywords": [ + "PHPExcel", + "batch", + "csv", + "excel", + "export", + "import", + "laravel", + "php", + "phpspreadsheet" + ], + "support": { + "issues": "https://github.com/SpartnerNL/Laravel-Excel/issues", + "source": "https://github.com/SpartnerNL/Laravel-Excel/tree/3.1.64" + }, + "funding": [ + { + "url": "https://laravel-excel.com/commercial-support", + "type": "custom" + }, + { + "url": "https://github.com/patrickbrouwers", + "type": "github" + } + ], + "time": "2025-02-24T11:12:50+00:00" + }, + { + "name": "maennchen/zipstream-php", + "version": "3.1.2", + "source": { + "type": "git", + "url": "https://github.com/maennchen/ZipStream-PHP.git", + "reference": "aeadcf5c412332eb426c0f9b4485f6accba2a99f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/maennchen/ZipStream-PHP/zipball/aeadcf5c412332eb426c0f9b4485f6accba2a99f", + "reference": "aeadcf5c412332eb426c0f9b4485f6accba2a99f", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "ext-zlib": "*", + "php-64bit": "^8.2" + }, + "require-dev": { + "brianium/paratest": "^7.7", + "ext-zip": "*", + "friendsofphp/php-cs-fixer": "^3.16", + "guzzlehttp/guzzle": "^7.5", + "mikey179/vfsstream": "^1.6", + "php-coveralls/php-coveralls": "^2.5", + "phpunit/phpunit": "^11.0", + "vimeo/psalm": "^6.0" + }, + "suggest": { + "guzzlehttp/psr7": "^2.4", + "psr/http-message": "^2.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "ZipStream\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Paul Duncan", + "email": "pabs@pablotron.org" + }, + { + "name": "Jonatan Männchen", + "email": "jonatan@maennchen.ch" + }, + { + "name": "Jesse Donat", + "email": "donatj@gmail.com" + }, + { + "name": "András Kolesár", + "email": "kolesar@kolesar.hu" + } + ], + "description": "ZipStream is a library for dynamically streaming dynamic zip files from PHP without writing to the disk at all on the server.", + "keywords": [ + "stream", + "zip" + ], + "support": { + "issues": "https://github.com/maennchen/ZipStream-PHP/issues", + "source": "https://github.com/maennchen/ZipStream-PHP/tree/3.1.2" + }, + "funding": [ + { + "url": "https://github.com/maennchen", + "type": "github" + } + ], + "time": "2025-01-27T12:07:53+00:00" + }, + { + "name": "markbaker/complex", + "version": "3.0.2", + "source": { + "type": "git", + "url": "https://github.com/MarkBaker/PHPComplex.git", + "reference": "95c56caa1cf5c766ad6d65b6344b807c1e8405b9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/MarkBaker/PHPComplex/zipball/95c56caa1cf5c766ad6d65b6344b807c1e8405b9", + "reference": "95c56caa1cf5c766ad6d65b6344b807c1e8405b9", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "require-dev": { + "dealerdirect/phpcodesniffer-composer-installer": "dev-master", + "phpcompatibility/php-compatibility": "^9.3", + "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0", + "squizlabs/php_codesniffer": "^3.7" + }, + "type": "library", + "autoload": { + "psr-4": { + "Complex\\": "classes/src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mark Baker", + "email": "mark@lange.demon.co.uk" + } + ], + "description": "PHP Class for working with complex numbers", + "homepage": "https://github.com/MarkBaker/PHPComplex", + "keywords": [ + "complex", + "mathematics" + ], + "support": { + "issues": "https://github.com/MarkBaker/PHPComplex/issues", + "source": "https://github.com/MarkBaker/PHPComplex/tree/3.0.2" + }, + "time": "2022-12-06T16:21:08+00:00" + }, + { + "name": "markbaker/matrix", + "version": "3.0.1", + "source": { + "type": "git", + "url": "https://github.com/MarkBaker/PHPMatrix.git", + "reference": "728434227fe21be27ff6d86621a1b13107a2562c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/MarkBaker/PHPMatrix/zipball/728434227fe21be27ff6d86621a1b13107a2562c", + "reference": "728434227fe21be27ff6d86621a1b13107a2562c", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "dealerdirect/phpcodesniffer-composer-installer": "dev-master", + "phpcompatibility/php-compatibility": "^9.3", + "phpdocumentor/phpdocumentor": "2.*", + "phploc/phploc": "^4.0", + "phpmd/phpmd": "2.*", + "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0", + "sebastian/phpcpd": "^4.0", + "squizlabs/php_codesniffer": "^3.7" + }, + "type": "library", + "autoload": { + "psr-4": { + "Matrix\\": "classes/src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mark Baker", + "email": "mark@demon-angel.eu" + } + ], + "description": "PHP Class for working with matrices", + "homepage": "https://github.com/MarkBaker/PHPMatrix", + "keywords": [ + "mathematics", + "matrix", + "vector" + ], + "support": { + "issues": "https://github.com/MarkBaker/PHPMatrix/issues", + "source": "https://github.com/MarkBaker/PHPMatrix/tree/3.0.1" + }, + "time": "2022-12-02T22:17:43+00:00" + }, + { + "name": "masterminds/html5", + "version": "2.9.0", + "source": { + "type": "git", + "url": "https://github.com/Masterminds/html5-php.git", + "reference": "f5ac2c0b0a2eefca70b2ce32a5809992227e75a6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Masterminds/html5-php/zipball/f5ac2c0b0a2eefca70b2ce32a5809992227e75a6", + "reference": "f5ac2c0b0a2eefca70b2ce32a5809992227e75a6", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "php": ">=5.3.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.8.35 || ^5.7.21 || ^6 || ^7 || ^8 || ^9" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.7-dev" + } + }, + "autoload": { + "psr-4": { + "Masterminds\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Matt Butcher", + "email": "technosophos@gmail.com" + }, + { + "name": "Matt Farina", + "email": "matt@mattfarina.com" + }, + { + "name": "Asmir Mustafic", + "email": "goetas@gmail.com" + } + ], + "description": "An HTML5 parser and serializer.", + "homepage": "http://masterminds.github.io/html5-php", + "keywords": [ + "HTML5", + "dom", + "html", + "parser", + "querypath", + "serializer", + "xml" + ], + "support": { + "issues": "https://github.com/Masterminds/html5-php/issues", + "source": "https://github.com/Masterminds/html5-php/tree/2.9.0" + }, + "time": "2024-03-31T07:05:07+00:00" + }, + { + "name": "monolog/monolog", + "version": "3.8.1", + "source": { + "type": "git", + "url": "https://github.com/Seldaek/monolog.git", + "reference": "aef6ee73a77a66e404dd6540934a9ef1b3c855b4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Seldaek/monolog/zipball/aef6ee73a77a66e404dd6540934a9ef1b3c855b4", + "reference": "aef6ee73a77a66e404dd6540934a9ef1b3c855b4", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/log": "^2.0 || ^3.0" + }, + "provide": { + "psr/log-implementation": "3.0.0" + }, + "require-dev": { + "aws/aws-sdk-php": "^3.0", + "doctrine/couchdb": "~1.0@dev", + "elasticsearch/elasticsearch": "^7 || ^8", + "ext-json": "*", + "graylog2/gelf-php": "^1.4.2 || ^2.0", + "guzzlehttp/guzzle": "^7.4.5", + "guzzlehttp/psr7": "^2.2", + "mongodb/mongodb": "^1.8", + "php-amqplib/php-amqplib": "~2.4 || ^3", + "php-console/php-console": "^3.1.8", + "phpstan/phpstan": "^2", + "phpstan/phpstan-deprecation-rules": "^2", + "phpstan/phpstan-strict-rules": "^2", + "phpunit/phpunit": "^10.5.17 || ^11.0.7", + "predis/predis": "^1.1 || ^2", + "rollbar/rollbar": "^4.0", + "ruflin/elastica": "^7 || ^8", + "symfony/mailer": "^5.4 || ^6", + "symfony/mime": "^5.4 || ^6" + }, + "suggest": { + "aws/aws-sdk-php": "Allow sending log messages to AWS services like DynamoDB", + "doctrine/couchdb": "Allow sending log messages to a CouchDB server", + "elasticsearch/elasticsearch": "Allow sending log messages to an Elasticsearch server via official client", + "ext-amqp": "Allow sending log messages to an AMQP server (1.0+ required)", + "ext-curl": "Required to send log messages using the IFTTTHandler, the LogglyHandler, the SendGridHandler, the SlackWebhookHandler or the TelegramBotHandler", + "ext-mbstring": "Allow to work properly with unicode symbols", + "ext-mongodb": "Allow sending log messages to a MongoDB server (via driver)", + "ext-openssl": "Required to send log messages using SSL", + "ext-sockets": "Allow sending log messages to a Syslog server (via UDP driver)", + "graylog2/gelf-php": "Allow sending log messages to a GrayLog2 server", + "mongodb/mongodb": "Allow sending log messages to a MongoDB server (via library)", + "php-amqplib/php-amqplib": "Allow sending log messages to an AMQP server using php-amqplib", + "rollbar/rollbar": "Allow sending log messages to Rollbar", + "ruflin/elastica": "Allow sending log messages to an Elastic Search server" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Monolog\\": "src/Monolog" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "https://seld.be" + } + ], + "description": "Sends your logs to files, sockets, inboxes, databases and various web services", + "homepage": "https://github.com/Seldaek/monolog", + "keywords": [ + "log", + "logging", + "psr-3" + ], + "support": { + "issues": "https://github.com/Seldaek/monolog/issues", + "source": "https://github.com/Seldaek/monolog/tree/3.8.1" + }, + "funding": [ + { + "url": "https://github.com/Seldaek", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/monolog/monolog", + "type": "tidelift" + } + ], + "time": "2024-12-05T17:15:07+00:00" + }, + { + "name": "mpdf/mpdf", + "version": "v8.2.5", + "source": { + "type": "git", + "url": "https://github.com/mpdf/mpdf.git", + "reference": "e175b05e3e00977b85feb96a8cccb174ac63621f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/mpdf/mpdf/zipball/e175b05e3e00977b85feb96a8cccb174ac63621f", + "reference": "e175b05e3e00977b85feb96a8cccb174ac63621f", + "shasum": "" + }, + "require": { + "ext-gd": "*", + "ext-mbstring": "*", + "mpdf/psr-http-message-shim": "^1.0 || ^2.0", + "mpdf/psr-log-aware-trait": "^2.0 || ^3.0", + "myclabs/deep-copy": "^1.7", + "paragonie/random_compat": "^1.4|^2.0|^9.99.99", + "php": "^5.6 || ^7.0 || ~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0", + "psr/http-message": "^1.0 || ^2.0", + "psr/log": "^1.0 || ^2.0 || ^3.0", + "setasign/fpdi": "^2.1" + }, + "require-dev": { + "mockery/mockery": "^1.3.0", + "mpdf/qrcode": "^1.1.0", + "squizlabs/php_codesniffer": "^3.5.0", + "tracy/tracy": "~2.5", + "yoast/phpunit-polyfills": "^1.0" + }, + "suggest": { + "ext-bcmath": "Needed for generation of some types of barcodes", + "ext-xml": "Needed mainly for SVG manipulation", + "ext-zlib": "Needed for compression of embedded resources, such as fonts" + }, + "type": "library", + "autoload": { + "files": [ + "src/functions.php" + ], + "psr-4": { + "Mpdf\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-2.0-only" + ], + "authors": [ + { + "name": "Matěj Humpál", + "role": "Developer, maintainer" + }, + { + "name": "Ian Back", + "role": "Developer (retired)" + } + ], + "description": "PHP library generating PDF files from UTF-8 encoded HTML", + "homepage": "https://mpdf.github.io", + "keywords": [ + "pdf", + "php", + "utf-8" + ], + "support": { + "docs": "https://mpdf.github.io", + "issues": "https://github.com/mpdf/mpdf/issues", + "source": "https://github.com/mpdf/mpdf" + }, + "funding": [ + { + "url": "https://www.paypal.me/mpdf", + "type": "custom" + } + ], + "time": "2024-11-18T15:30:42+00:00" + }, + { + "name": "mpdf/psr-http-message-shim", + "version": "v2.0.1", + "source": { + "type": "git", + "url": "https://github.com/mpdf/psr-http-message-shim.git", + "reference": "f25a0153d645e234f9db42e5433b16d9b113920f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/mpdf/psr-http-message-shim/zipball/f25a0153d645e234f9db42e5433b16d9b113920f", + "reference": "f25a0153d645e234f9db42e5433b16d9b113920f", + "shasum": "" + }, + "require": { + "psr/http-message": "^2.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Mpdf\\PsrHttpMessageShim\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mark Dorison", + "email": "mark@chromatichq.com" + }, + { + "name": "Kristofer Widholm", + "email": "kristofer@chromatichq.com" + }, + { + "name": "Nigel Cunningham", + "email": "nigel.cunningham@technocrat.com.au" + } + ], + "description": "Shim to allow support of different psr/message versions.", + "support": { + "issues": "https://github.com/mpdf/psr-http-message-shim/issues", + "source": "https://github.com/mpdf/psr-http-message-shim/tree/v2.0.1" + }, + "time": "2023-10-02T14:34:03+00:00" + }, + { + "name": "mpdf/psr-log-aware-trait", + "version": "v3.0.0", + "source": { + "type": "git", + "url": "https://github.com/mpdf/psr-log-aware-trait.git", + "reference": "a633da6065e946cc491e1c962850344bb0bf3e78" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/mpdf/psr-log-aware-trait/zipball/a633da6065e946cc491e1c962850344bb0bf3e78", + "reference": "a633da6065e946cc491e1c962850344bb0bf3e78", + "shasum": "" + }, + "require": { + "psr/log": "^3.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Mpdf\\PsrLogAwareTrait\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mark Dorison", + "email": "mark@chromatichq.com" + }, + { + "name": "Kristofer Widholm", + "email": "kristofer@chromatichq.com" + } + ], + "description": "Trait to allow support of different psr/log versions.", + "support": { + "issues": "https://github.com/mpdf/psr-log-aware-trait/issues", + "source": "https://github.com/mpdf/psr-log-aware-trait/tree/v3.0.0" + }, + "time": "2023-05-03T06:19:36+00:00" + }, + { + "name": "myclabs/deep-copy", + "version": "1.13.0", + "source": { + "type": "git", + "url": "https://github.com/myclabs/DeepCopy.git", + "reference": "024473a478be9df5fdaca2c793f2232fe788e414" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/024473a478be9df5fdaca2c793f2232fe788e414", + "reference": "024473a478be9df5fdaca2c793f2232fe788e414", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "conflict": { + "doctrine/collections": "<1.6.8", + "doctrine/common": "<2.13.3 || >=3 <3.2.2" + }, + "require-dev": { + "doctrine/collections": "^1.6.8", + "doctrine/common": "^2.13.3 || ^3.2.2", + "phpspec/prophecy": "^1.10", + "phpunit/phpunit": "^7.5.20 || ^8.5.23 || ^9.5.13" + }, + "type": "library", + "autoload": { + "files": [ + "src/DeepCopy/deep_copy.php" + ], + "psr-4": { + "DeepCopy\\": "src/DeepCopy/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Create deep copies (clones) of your objects", + "keywords": [ + "clone", + "copy", + "duplicate", + "object", + "object graph" + ], + "support": { + "issues": "https://github.com/myclabs/DeepCopy/issues", + "source": "https://github.com/myclabs/DeepCopy/tree/1.13.0" + }, + "funding": [ + { + "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy", + "type": "tidelift" + } + ], + "time": "2025-02-12T12:17:51+00:00" + }, + { + "name": "nesbot/carbon", + "version": "2.73.0", + "source": { + "type": "git", + "url": "https://github.com/CarbonPHP/carbon.git", + "reference": "9228ce90e1035ff2f0db84b40ec2e023ed802075" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/CarbonPHP/carbon/zipball/9228ce90e1035ff2f0db84b40ec2e023ed802075", + "reference": "9228ce90e1035ff2f0db84b40ec2e023ed802075", + "shasum": "" + }, + "require": { + "carbonphp/carbon-doctrine-types": "*", + "ext-json": "*", + "php": "^7.1.8 || ^8.0", + "psr/clock": "^1.0", + "symfony/polyfill-mbstring": "^1.0", + "symfony/polyfill-php80": "^1.16", + "symfony/translation": "^3.4 || ^4.0 || ^5.0 || ^6.0" + }, + "provide": { + "psr/clock-implementation": "1.0" + }, + "require-dev": { + "doctrine/dbal": "^2.0 || ^3.1.4 || ^4.0", + "doctrine/orm": "^2.7 || ^3.0", + "friendsofphp/php-cs-fixer": "^3.0", + "kylekatarnls/multi-tester": "^2.0", + "ondrejmirtes/better-reflection": "<6", + "phpmd/phpmd": "^2.9", + "phpstan/extension-installer": "^1.0", + "phpstan/phpstan": "^0.12.99 || ^1.7.14", + "phpunit/php-file-iterator": "^2.0.5 || ^3.0.6", + "phpunit/phpunit": "^7.5.20 || ^8.5.26 || ^9.5.20", + "squizlabs/php_codesniffer": "^3.4" + }, + "bin": [ + "bin/carbon" + ], + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Carbon\\Laravel\\ServiceProvider" + ] + }, + "phpstan": { + "includes": [ + "extension.neon" + ] + }, + "branch-alias": { + "dev-2.x": "2.x-dev", + "dev-master": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Carbon\\": "src/Carbon/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Brian Nesbitt", + "email": "brian@nesbot.com", + "homepage": "https://markido.com" + }, + { + "name": "kylekatarnls", + "homepage": "https://github.com/kylekatarnls" + } + ], + "description": "An API extension for DateTime that supports 281 different languages.", + "homepage": "https://carbon.nesbot.com", + "keywords": [ + "date", + "datetime", + "time" + ], + "support": { + "docs": "https://carbon.nesbot.com/docs", + "issues": "https://github.com/briannesbitt/Carbon/issues", + "source": "https://github.com/briannesbitt/Carbon" + }, + "funding": [ + { + "url": "https://github.com/sponsors/kylekatarnls", + "type": "github" + }, + { + "url": "https://opencollective.com/Carbon#sponsor", + "type": "opencollective" + }, + { + "url": "https://tidelift.com/subscription/pkg/packagist-nesbot-carbon?utm_source=packagist-nesbot-carbon&utm_medium=referral&utm_campaign=readme", + "type": "tidelift" + } + ], + "time": "2025-01-08T20:10:23+00:00" + }, + { + "name": "nette/schema", + "version": "v1.3.2", + "source": { + "type": "git", + "url": "https://github.com/nette/schema.git", + "reference": "da801d52f0354f70a638673c4a0f04e16529431d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nette/schema/zipball/da801d52f0354f70a638673c4a0f04e16529431d", + "reference": "da801d52f0354f70a638673c4a0f04e16529431d", + "shasum": "" + }, + "require": { + "nette/utils": "^4.0", + "php": "8.1 - 8.4" + }, + "require-dev": { + "nette/tester": "^2.5.2", + "phpstan/phpstan-nette": "^1.0", + "tracy/tracy": "^2.8" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.3-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause", + "GPL-2.0-only", + "GPL-3.0-only" + ], + "authors": [ + { + "name": "David Grudl", + "homepage": "https://davidgrudl.com" + }, + { + "name": "Nette Community", + "homepage": "https://nette.org/contributors" + } + ], + "description": "📐 Nette Schema: validating data structures against a given Schema.", + "homepage": "https://nette.org", + "keywords": [ + "config", + "nette" + ], + "support": { + "issues": "https://github.com/nette/schema/issues", + "source": "https://github.com/nette/schema/tree/v1.3.2" + }, + "time": "2024-10-06T23:10:23+00:00" + }, + { + "name": "nette/utils", + "version": "v4.0.7", + "source": { + "type": "git", + "url": "https://github.com/nette/utils.git", + "reference": "e67c4061eb40b9c113b218214e42cb5a0dda28f2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nette/utils/zipball/e67c4061eb40b9c113b218214e42cb5a0dda28f2", + "reference": "e67c4061eb40b9c113b218214e42cb5a0dda28f2", + "shasum": "" + }, + "require": { + "php": "8.0 - 8.4" + }, + "conflict": { + "nette/finder": "<3", + "nette/schema": "<1.2.2" + }, + "require-dev": { + "jetbrains/phpstorm-attributes": "dev-master", + "nette/tester": "^2.5", + "phpstan/phpstan": "^1.0", + "tracy/tracy": "^2.9" + }, + "suggest": { + "ext-gd": "to use Image", + "ext-iconv": "to use Strings::webalize(), toAscii(), chr() and reverse()", + "ext-intl": "to use Strings::webalize(), toAscii(), normalize() and compare()", + "ext-json": "to use Nette\\Utils\\Json", + "ext-mbstring": "to use Strings::lower() etc...", + "ext-tokenizer": "to use Nette\\Utils\\Reflection::getUseStatements()" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause", + "GPL-2.0-only", + "GPL-3.0-only" + ], + "authors": [ + { + "name": "David Grudl", + "homepage": "https://davidgrudl.com" + }, + { + "name": "Nette Community", + "homepage": "https://nette.org/contributors" + } + ], + "description": "🛠 Nette Utils: lightweight utilities for string & array manipulation, image handling, safe JSON encoding/decoding, validation, slug or strong password generating etc.", + "homepage": "https://nette.org", + "keywords": [ + "array", + "core", + "datetime", + "images", + "json", + "nette", + "paginator", + "password", + "slugify", + "string", + "unicode", + "utf-8", + "utility", + "validation" + ], + "support": { + "issues": "https://github.com/nette/utils/issues", + "source": "https://github.com/nette/utils/tree/v4.0.7" + }, + "time": "2025-06-03T04:55:08+00:00" + }, + { + "name": "nikic/php-parser", + "version": "v5.4.0", + "source": { + "type": "git", + "url": "https://github.com/nikic/PHP-Parser.git", + "reference": "447a020a1f875a434d62f2a401f53b82a396e494" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/447a020a1f875a434d62f2a401f53b82a396e494", + "reference": "447a020a1f875a434d62f2a401f53b82a396e494", + "shasum": "" + }, + "require": { + "ext-ctype": "*", + "ext-json": "*", + "ext-tokenizer": "*", + "php": ">=7.4" + }, + "require-dev": { + "ircmaxell/php-yacc": "^0.0.7", + "phpunit/phpunit": "^9.0" + }, + "bin": [ + "bin/php-parse" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.0-dev" + } + }, + "autoload": { + "psr-4": { + "PhpParser\\": "lib/PhpParser" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Nikita Popov" + } + ], + "description": "A PHP parser written in PHP", + "keywords": [ + "parser", + "php" + ], + "support": { + "issues": "https://github.com/nikic/PHP-Parser/issues", + "source": "https://github.com/nikic/PHP-Parser/tree/v5.4.0" + }, + "time": "2024-12-30T11:07:19+00:00" + }, + { + "name": "nunomaduro/termwind", + "version": "v1.17.0", + "source": { + "type": "git", + "url": "https://github.com/nunomaduro/termwind.git", + "reference": "5369ef84d8142c1d87e4ec278711d4ece3cbf301" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nunomaduro/termwind/zipball/5369ef84d8142c1d87e4ec278711d4ece3cbf301", + "reference": "5369ef84d8142c1d87e4ec278711d4ece3cbf301", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "php": "^8.1", + "symfony/console": "^6.4.15" + }, + "require-dev": { + "illuminate/console": "^10.48.24", + "illuminate/support": "^10.48.24", + "laravel/pint": "^1.18.2", + "pestphp/pest": "^2.36.0", + "pestphp/pest-plugin-mock": "2.0.0", + "phpstan/phpstan": "^1.12.11", + "phpstan/phpstan-strict-rules": "^1.6.1", + "symfony/var-dumper": "^6.4.15", + "thecodingmachine/phpstan-strict-rules": "^1.0.0" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Termwind\\Laravel\\TermwindServiceProvider" + ] + } + }, + "autoload": { + "files": [ + "src/Functions.php" + ], + "psr-4": { + "Termwind\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nuno Maduro", + "email": "enunomaduro@gmail.com" + } + ], + "description": "Its like Tailwind CSS, but for the console.", + "keywords": [ + "cli", + "console", + "css", + "package", + "php", + "style" + ], + "support": { + "issues": "https://github.com/nunomaduro/termwind/issues", + "source": "https://github.com/nunomaduro/termwind/tree/v1.17.0" + }, + "funding": [ + { + "url": "https://www.paypal.com/paypalme/enunomaduro", + "type": "custom" + }, + { + "url": "https://github.com/nunomaduro", + "type": "github" + }, + { + "url": "https://github.com/xiCO2k", + "type": "github" + } + ], + "time": "2024-11-21T10:36:35+00:00" + }, + { + "name": "paragonie/random_compat", + "version": "v9.99.100", + "source": { + "type": "git", + "url": "https://github.com/paragonie/random_compat.git", + "reference": "996434e5492cb4c3edcb9168db6fbb1359ef965a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/paragonie/random_compat/zipball/996434e5492cb4c3edcb9168db6fbb1359ef965a", + "reference": "996434e5492cb4c3edcb9168db6fbb1359ef965a", + "shasum": "" + }, + "require": { + "php": ">= 7" + }, + "require-dev": { + "phpunit/phpunit": "4.*|5.*", + "vimeo/psalm": "^1" + }, + "suggest": { + "ext-libsodium": "Provides a modern crypto API that can be used to generate random bytes." + }, + "type": "library", + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Paragon Initiative Enterprises", + "email": "security@paragonie.com", + "homepage": "https://paragonie.com" + } + ], + "description": "PHP 5.x polyfill for random_bytes() and random_int() from PHP 7", + "keywords": [ + "csprng", + "polyfill", + "pseudorandom", + "random" + ], + "support": { + "email": "info@paragonie.com", + "issues": "https://github.com/paragonie/random_compat/issues", + "source": "https://github.com/paragonie/random_compat" + }, + "time": "2020-10-15T08:29:30+00:00" + }, + { + "name": "phenx/php-font-lib", + "version": "0.5.6", + "source": { + "type": "git", + "url": "https://github.com/dompdf/php-font-lib.git", + "reference": "a1681e9793040740a405ac5b189275059e2a9863" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/dompdf/php-font-lib/zipball/a1681e9793040740a405ac5b189275059e2a9863", + "reference": "a1681e9793040740a405ac5b189275059e2a9863", + "shasum": "" + }, + "require": { + "ext-mbstring": "*" + }, + "require-dev": { + "symfony/phpunit-bridge": "^3 || ^4 || ^5 || ^6" + }, + "type": "library", + "autoload": { + "psr-4": { + "FontLib\\": "src/FontLib" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "LGPL-2.1-or-later" + ], + "authors": [ + { + "name": "Fabien Ménager", + "email": "fabien.menager@gmail.com" + } + ], + "description": "A library to read, parse, export and make subsets of different types of font files.", + "homepage": "https://github.com/PhenX/php-font-lib", + "support": { + "issues": "https://github.com/dompdf/php-font-lib/issues", + "source": "https://github.com/dompdf/php-font-lib/tree/0.5.6" + }, + "time": "2024-01-29T14:45:26+00:00" + }, + { + "name": "phenx/php-svg-lib", + "version": "0.5.4", + "source": { + "type": "git", + "url": "https://github.com/dompdf/php-svg-lib.git", + "reference": "46b25da81613a9cf43c83b2a8c2c1bdab27df691" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/dompdf/php-svg-lib/zipball/46b25da81613a9cf43c83b2a8c2c1bdab27df691", + "reference": "46b25da81613a9cf43c83b2a8c2c1bdab27df691", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "php": "^7.1 || ^8.0", + "sabberworm/php-css-parser": "^8.4" + }, + "require-dev": { + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5" + }, + "type": "library", + "autoload": { + "psr-4": { + "Svg\\": "src/Svg" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "LGPL-3.0-or-later" + ], + "authors": [ + { + "name": "Fabien Ménager", + "email": "fabien.menager@gmail.com" + } + ], + "description": "A library to read, parse and export to PDF SVG files.", + "homepage": "https://github.com/PhenX/php-svg-lib", + "support": { + "issues": "https://github.com/dompdf/php-svg-lib/issues", + "source": "https://github.com/dompdf/php-svg-lib/tree/0.5.4" + }, + "time": "2024-04-08T12:52:34+00:00" + }, + { + "name": "phpoffice/phpspreadsheet", + "version": "1.29.10", + "source": { + "type": "git", + "url": "https://github.com/PHPOffice/PhpSpreadsheet.git", + "reference": "c80041b1628c4f18030407134fe88303661d4e4e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/PHPOffice/PhpSpreadsheet/zipball/c80041b1628c4f18030407134fe88303661d4e4e", + "reference": "c80041b1628c4f18030407134fe88303661d4e4e", + "shasum": "" + }, + "require": { + "composer/pcre": "^1||^2||^3", + "ext-ctype": "*", + "ext-dom": "*", + "ext-fileinfo": "*", + "ext-gd": "*", + "ext-iconv": "*", + "ext-libxml": "*", + "ext-mbstring": "*", + "ext-simplexml": "*", + "ext-xml": "*", + "ext-xmlreader": "*", + "ext-xmlwriter": "*", + "ext-zip": "*", + "ext-zlib": "*", + "ezyang/htmlpurifier": "^4.15", + "maennchen/zipstream-php": "^2.1 || ^3.0", + "markbaker/complex": "^3.0", + "markbaker/matrix": "^3.0", + "php": "^7.4 || ^8.0", + "psr/http-client": "^1.0", + "psr/http-factory": "^1.0", + "psr/simple-cache": "^1.0 || ^2.0 || ^3.0" + }, + "require-dev": { + "dealerdirect/phpcodesniffer-composer-installer": "dev-main", + "dompdf/dompdf": "^1.0 || ^2.0 || ^3.0", + "friendsofphp/php-cs-fixer": "^3.2", + "mitoteam/jpgraph": "^10.3", + "mpdf/mpdf": "^8.1.1", + "phpcompatibility/php-compatibility": "^9.3", + "phpstan/phpstan": "^1.1", + "phpstan/phpstan-phpunit": "^1.0", + "phpunit/phpunit": "^8.5 || ^9.0", + "squizlabs/php_codesniffer": "^3.7", + "tecnickcom/tcpdf": "^6.5" + }, + "suggest": { + "dompdf/dompdf": "Option for rendering PDF with PDF Writer", + "ext-intl": "PHP Internationalization Functions", + "mitoteam/jpgraph": "Option for rendering charts, or including charts with PDF or HTML Writers", + "mpdf/mpdf": "Option for rendering PDF with PDF Writer", + "tecnickcom/tcpdf": "Option for rendering PDF with PDF Writer" + }, + "type": "library", + "autoload": { + "psr-4": { + "PhpOffice\\PhpSpreadsheet\\": "src/PhpSpreadsheet" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Maarten Balliauw", + "homepage": "https://blog.maartenballiauw.be" + }, + { + "name": "Mark Baker", + "homepage": "https://markbakeruk.net" + }, + { + "name": "Franck Lefevre", + "homepage": "https://rootslabs.net" + }, + { + "name": "Erik Tilt" + }, + { + "name": "Adrien Crivelli" + } + ], + "description": "PHPSpreadsheet - Read, Create and Write Spreadsheet documents in PHP - Spreadsheet engine", + "homepage": "https://github.com/PHPOffice/PhpSpreadsheet", + "keywords": [ + "OpenXML", + "excel", + "gnumeric", + "ods", + "php", + "spreadsheet", + "xls", + "xlsx" + ], + "support": { + "issues": "https://github.com/PHPOffice/PhpSpreadsheet/issues", + "source": "https://github.com/PHPOffice/PhpSpreadsheet/tree/1.29.10" + }, + "time": "2025-02-08T02:56:14+00:00" + }, + { + "name": "phpoption/phpoption", + "version": "1.9.3", + "source": { + "type": "git", + "url": "https://github.com/schmittjoh/php-option.git", + "reference": "e3fac8b24f56113f7cb96af14958c0dd16330f54" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/schmittjoh/php-option/zipball/e3fac8b24f56113f7cb96af14958c0dd16330f54", + "reference": "e3fac8b24f56113f7cb96af14958c0dd16330f54", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "phpunit/phpunit": "^8.5.39 || ^9.6.20 || ^10.5.28" + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + }, + "branch-alias": { + "dev-master": "1.9-dev" + } + }, + "autoload": { + "psr-4": { + "PhpOption\\": "src/PhpOption/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "Johannes M. Schmitt", + "email": "schmittjoh@gmail.com", + "homepage": "https://github.com/schmittjoh" + }, + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + } + ], + "description": "Option Type for PHP", + "keywords": [ + "language", + "option", + "php", + "type" + ], + "support": { + "issues": "https://github.com/schmittjoh/php-option/issues", + "source": "https://github.com/schmittjoh/php-option/tree/1.9.3" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpoption/phpoption", + "type": "tidelift" + } + ], + "time": "2024-07-20T21:41:07+00:00" + }, + { + "name": "prettus/l5-repository", + "version": "2.10.1", + "source": { + "type": "git", + "url": "https://github.com/andersao/l5-repository.git", + "reference": "27835088f92f42d73cc7f4f98b9386ddba709dcf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/andersao/l5-repository/zipball/27835088f92f42d73cc7f4f98b9386ddba709dcf", + "reference": "27835088f92f42d73cc7f4f98b9386ddba709dcf", + "shasum": "" + }, + "require": { + "illuminate/config": "~5.0|~6.0|~7.0|^8.0|^9.0|^10.0|^11.0|^12.0", + "illuminate/console": "~5.0|~6.0|~7.0|^8.0|^9.0|^10.0|^11.0|^12.0", + "illuminate/database": "~5.0|~6.0|~7.0|^8.0|^9.0|^10.0|^11.0|^12.0", + "illuminate/filesystem": "~5.0|~6.0|~7.0|^8.0|^9.0|^10.0|^11.0|^12.0", + "illuminate/http": "~5.0|~6.0|~7.0|^8.0|^9.0|^10.0|^11.0|^12.0", + "illuminate/pagination": "~5.0|~6.0|~7.0|^8.0|^9.0|^10.0|^11.0|^12.0", + "illuminate/support": "~5.0|~6.0|~7.0|^8.0|^9.0|^10.0|^11.0|^12.0", + "illuminate/validation": "~5.0|~6.0|~7.0|^8.0|^9.0|^10.0|^11.0|^12.0", + "prettus/laravel-validation": "~1.1|~1.2|~1.3|~1.4|~1.5|~1.6|~1.7" + }, + "suggest": { + "league/fractal": "Required to use the Fractal Presenter (0.12.*).", + "prettus/laravel-validation": "Required to provide easy validation with the repository (1.1.*)", + "robclancy/presenter": "Required to use the Presenter Model (1.3.*)" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Prettus\\Repository\\Providers\\RepositoryServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Prettus\\Repository\\": "src/Prettus/Repository/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Anderson Andrade", + "email": "contato@andersonandra.de", + "homepage": "http://andersonandra.de", + "role": "Developer" + } + ], + "description": "Laravel 5|6|7|8|9|10|11|12 - Repositories to the database layer", + "homepage": "http://andersao.github.io/l5-repository", + "keywords": [ + "cache", + "eloquent", + "laravel", + "model", + "repository" + ], + "support": { + "docs": "http://andersao.github.io/l5-repository", + "email": "contato@andersonandra.de", + "issues": "https://github.com/andersao/l5-repository/issues", + "source": "https://github.com/andersao/l5-repository", + "wiki": "https://github.com/andersao/l5-repository" + }, + "time": "2025-03-10T11:13:50+00:00" + }, + { + "name": "prettus/laravel-validation", + "version": "1.7.0", + "source": { + "type": "git", + "url": "https://github.com/andersao/laravel-validator.git", + "reference": "fc6ecaaedb482767592eba2a4178792437c86bda" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/andersao/laravel-validator/zipball/fc6ecaaedb482767592eba2a4178792437c86bda", + "reference": "fc6ecaaedb482767592eba2a4178792437c86bda", + "shasum": "" + }, + "require": { + "illuminate/support": "~5.4|^6.0|^7.0|^8.0|^9.0|^10.0|^11.0|^12.0", + "illuminate/validation": "~5.4|^6.0|^7.0|^8.0|^9.0|^10.0|^11.0|^12.0", + "php": ">=5.4.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Prettus\\Validator\\": "src/Prettus/Validator/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "authors": [ + { + "name": "Anderson Andrade", + "email": "contato@andersonandra.de", + "homepage": "http://andersonandra.de", + "role": "Developer" + } + ], + "description": "Laravel Validation Service", + "homepage": "http://andersao.github.io/laravel-validation", + "keywords": [ + "laravel", + "service", + "validation" + ], + "support": { + "docs": "http://andersao.github.io/laravel-validation", + "email": "contato@andersonandra.de", + "issues": "https://github.com/andersao/laravel-validation/issues", + "source": "https://github.com/andersao/laravel-validation", + "wiki": "https://github.com/andersao/laravel-validation" + }, + "time": "2025-03-07T18:33:05+00:00" + }, + { + "name": "psr/cache", + "version": "3.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/cache.git", + "reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/cache/zipball/aa5030cfa5405eccfdcb1083ce040c2cb8d253bf", + "reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf", + "shasum": "" + }, + "require": { + "php": ">=8.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Cache\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for caching libraries", + "keywords": [ + "cache", + "psr", + "psr-6" + ], + "support": { + "source": "https://github.com/php-fig/cache/tree/3.0.0" + }, + "time": "2021-02-03T23:26:27+00:00" + }, + { + "name": "psr/clock", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/clock.git", + "reference": "e41a24703d4560fd0acb709162f73b8adfc3aa0d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/clock/zipball/e41a24703d4560fd0acb709162f73b8adfc3aa0d", + "reference": "e41a24703d4560fd0acb709162f73b8adfc3aa0d", + "shasum": "" + }, + "require": { + "php": "^7.0 || ^8.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Psr\\Clock\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for reading the clock.", + "homepage": "https://github.com/php-fig/clock", + "keywords": [ + "clock", + "now", + "psr", + "psr-20", + "time" + ], + "support": { + "issues": "https://github.com/php-fig/clock/issues", + "source": "https://github.com/php-fig/clock/tree/1.0.0" + }, + "time": "2022-11-25T14:36:26+00:00" + }, + { + "name": "psr/container", + "version": "2.0.2", + "source": { + "type": "git", + "url": "https://github.com/php-fig/container.git", + "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/container/zipball/c71ecc56dfe541dbd90c5360474fbc405f8d5963", + "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963", + "shasum": "" + }, + "require": { + "php": ">=7.4.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Container\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common Container Interface (PHP FIG PSR-11)", + "homepage": "https://github.com/php-fig/container", + "keywords": [ + "PSR-11", + "container", + "container-interface", + "container-interop", + "psr" + ], + "support": { + "issues": "https://github.com/php-fig/container/issues", + "source": "https://github.com/php-fig/container/tree/2.0.2" + }, + "time": "2021-11-05T16:47:00+00:00" + }, + { + "name": "psr/event-dispatcher", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/event-dispatcher.git", + "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/event-dispatcher/zipball/dbefd12671e8a14ec7f180cab83036ed26714bb0", + "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0", + "shasum": "" + }, + "require": { + "php": ">=7.2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\EventDispatcher\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Standard interfaces for event handling.", + "keywords": [ + "events", + "psr", + "psr-14" + ], + "support": { + "issues": "https://github.com/php-fig/event-dispatcher/issues", + "source": "https://github.com/php-fig/event-dispatcher/tree/1.0.0" + }, + "time": "2019-01-08T18:20:26+00:00" + }, + { + "name": "psr/http-client", + "version": "1.0.3", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-client.git", + "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-client/zipball/bb5906edc1c324c9a05aa0873d40117941e5fa90", + "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90", + "shasum": "" + }, + "require": { + "php": "^7.0 || ^8.0", + "psr/http-message": "^1.0 || ^2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Client\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP clients", + "homepage": "https://github.com/php-fig/http-client", + "keywords": [ + "http", + "http-client", + "psr", + "psr-18" + ], + "support": { + "source": "https://github.com/php-fig/http-client" + }, + "time": "2023-09-23T14:17:50+00:00" + }, + { + "name": "psr/http-factory", + "version": "1.1.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-factory.git", + "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-factory/zipball/2b4765fddfe3b508ac62f829e852b1501d3f6e8a", + "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a", + "shasum": "" + }, + "require": { + "php": ">=7.1", + "psr/http-message": "^1.0 || ^2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "PSR-17: Common interfaces for PSR-7 HTTP message factories", + "keywords": [ + "factory", + "http", + "message", + "psr", + "psr-17", + "psr-7", + "request", + "response" + ], + "support": { + "source": "https://github.com/php-fig/http-factory" + }, + "time": "2024-04-15T12:06:14+00:00" + }, + { + "name": "psr/http-message", + "version": "2.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-message.git", + "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-message/zipball/402d35bcb92c70c026d1a6a9883f06b2ead23d71", + "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP messages", + "homepage": "https://github.com/php-fig/http-message", + "keywords": [ + "http", + "http-message", + "psr", + "psr-7", + "request", + "response" + ], + "support": { + "source": "https://github.com/php-fig/http-message/tree/2.0" + }, + "time": "2023-04-04T09:54:51+00:00" + }, + { + "name": "psr/log", + "version": "3.0.2", + "source": { + "type": "git", + "url": "https://github.com/php-fig/log.git", + "reference": "f16e1d5863e37f8d8c2a01719f5b34baa2b714d3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/log/zipball/f16e1d5863e37f8d8c2a01719f5b34baa2b714d3", + "reference": "f16e1d5863e37f8d8c2a01719f5b34baa2b714d3", + "shasum": "" + }, + "require": { + "php": ">=8.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Log\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for logging libraries", + "homepage": "https://github.com/php-fig/log", + "keywords": [ + "log", + "psr", + "psr-3" + ], + "support": { + "source": "https://github.com/php-fig/log/tree/3.0.2" + }, + "time": "2024-09-11T13:17:53+00:00" + }, + { + "name": "psr/simple-cache", + "version": "3.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/simple-cache.git", + "reference": "764e0b3939f5ca87cb904f570ef9be2d78a07865" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/simple-cache/zipball/764e0b3939f5ca87cb904f570ef9be2d78a07865", + "reference": "764e0b3939f5ca87cb904f570ef9be2d78a07865", + "shasum": "" + }, + "require": { + "php": ">=8.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\SimpleCache\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interfaces for simple caching", + "keywords": [ + "cache", + "caching", + "psr", + "psr-16", + "simple-cache" + ], + "support": { + "source": "https://github.com/php-fig/simple-cache/tree/3.0.0" + }, + "time": "2021-10-29T13:26:27+00:00" + }, + { + "name": "psy/psysh", + "version": "v0.12.7", + "source": { + "type": "git", + "url": "https://github.com/bobthecow/psysh.git", + "reference": "d73fa3c74918ef4522bb8a3bf9cab39161c4b57c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/bobthecow/psysh/zipball/d73fa3c74918ef4522bb8a3bf9cab39161c4b57c", + "reference": "d73fa3c74918ef4522bb8a3bf9cab39161c4b57c", + "shasum": "" + }, + "require": { + "ext-json": "*", + "ext-tokenizer": "*", + "nikic/php-parser": "^5.0 || ^4.0", + "php": "^8.0 || ^7.4", + "symfony/console": "^7.0 || ^6.0 || ^5.0 || ^4.0 || ^3.4", + "symfony/var-dumper": "^7.0 || ^6.0 || ^5.0 || ^4.0 || ^3.4" + }, + "conflict": { + "symfony/console": "4.4.37 || 5.3.14 || 5.3.15 || 5.4.3 || 5.4.4 || 6.0.3 || 6.0.4" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.2" + }, + "suggest": { + "ext-pcntl": "Enabling the PCNTL extension makes PsySH a lot happier :)", + "ext-pdo-sqlite": "The doc command requires SQLite to work.", + "ext-posix": "If you have PCNTL, you'll want the POSIX extension as well." + }, + "bin": [ + "bin/psysh" + ], + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": false, + "forward-command": false + }, + "branch-alias": { + "dev-main": "0.12.x-dev" + } + }, + "autoload": { + "files": [ + "src/functions.php" + ], + "psr-4": { + "Psy\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Justin Hileman", + "email": "justin@justinhileman.info", + "homepage": "http://justinhileman.com" + } + ], + "description": "An interactive shell for modern PHP.", + "homepage": "http://psysh.org", + "keywords": [ + "REPL", + "console", + "interactive", + "shell" + ], + "support": { + "issues": "https://github.com/bobthecow/psysh/issues", + "source": "https://github.com/bobthecow/psysh/tree/v0.12.7" + }, + "time": "2024-12-10T01:58:33+00:00" + }, + { + "name": "ralouphie/getallheaders", + "version": "3.0.3", + "source": { + "type": "git", + "url": "https://github.com/ralouphie/getallheaders.git", + "reference": "120b605dfeb996808c31b6477290a714d356e822" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/120b605dfeb996808c31b6477290a714d356e822", + "reference": "120b605dfeb996808c31b6477290a714d356e822", + "shasum": "" + }, + "require": { + "php": ">=5.6" + }, + "require-dev": { + "php-coveralls/php-coveralls": "^2.1", + "phpunit/phpunit": "^5 || ^6.5" + }, + "type": "library", + "autoload": { + "files": [ + "src/getallheaders.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ralph Khattar", + "email": "ralph.khattar@gmail.com" + } + ], + "description": "A polyfill for getallheaders.", + "support": { + "issues": "https://github.com/ralouphie/getallheaders/issues", + "source": "https://github.com/ralouphie/getallheaders/tree/develop" + }, + "time": "2019-03-08T08:55:37+00:00" + }, + { + "name": "ramsey/collection", + "version": "2.1.0", + "source": { + "type": "git", + "url": "https://github.com/ramsey/collection.git", + "reference": "3c5990b8a5e0b79cd1cf11c2dc1229e58e93f109" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ramsey/collection/zipball/3c5990b8a5e0b79cd1cf11c2dc1229e58e93f109", + "reference": "3c5990b8a5e0b79cd1cf11c2dc1229e58e93f109", + "shasum": "" + }, + "require": { + "php": "^8.1" + }, + "require-dev": { + "captainhook/plugin-composer": "^5.3", + "ergebnis/composer-normalize": "^2.45", + "fakerphp/faker": "^1.24", + "hamcrest/hamcrest-php": "^2.0", + "jangregor/phpstan-prophecy": "^2.1", + "mockery/mockery": "^1.6", + "php-parallel-lint/php-console-highlighter": "^1.0", + "php-parallel-lint/php-parallel-lint": "^1.4", + "phpspec/prophecy-phpunit": "^2.3", + "phpstan/extension-installer": "^1.4", + "phpstan/phpstan": "^2.1", + "phpstan/phpstan-mockery": "^2.0", + "phpstan/phpstan-phpunit": "^2.0", + "phpunit/phpunit": "^10.5", + "ramsey/coding-standard": "^2.3", + "ramsey/conventional-commits": "^1.6", + "roave/security-advisories": "dev-latest" + }, + "type": "library", + "extra": { + "captainhook": { + "force-install": true + }, + "ramsey/conventional-commits": { + "configFile": "conventional-commits.json" + } + }, + "autoload": { + "psr-4": { + "Ramsey\\Collection\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ben Ramsey", + "email": "ben@benramsey.com", + "homepage": "https://benramsey.com" + } + ], + "description": "A PHP library for representing and manipulating collections.", + "keywords": [ + "array", + "collection", + "hash", + "map", + "queue", + "set" + ], + "support": { + "issues": "https://github.com/ramsey/collection/issues", + "source": "https://github.com/ramsey/collection/tree/2.1.0" + }, + "time": "2025-03-02T04:48:29+00:00" + }, + { + "name": "ramsey/uuid", + "version": "4.7.6", + "source": { + "type": "git", + "url": "https://github.com/ramsey/uuid.git", + "reference": "91039bc1faa45ba123c4328958e620d382ec7088" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ramsey/uuid/zipball/91039bc1faa45ba123c4328958e620d382ec7088", + "reference": "91039bc1faa45ba123c4328958e620d382ec7088", + "shasum": "" + }, + "require": { + "brick/math": "^0.8.8 || ^0.9 || ^0.10 || ^0.11 || ^0.12", + "ext-json": "*", + "php": "^8.0", + "ramsey/collection": "^1.2 || ^2.0" + }, + "replace": { + "rhumsaa/uuid": "self.version" + }, + "require-dev": { + "captainhook/captainhook": "^5.10", + "captainhook/plugin-composer": "^5.3", + "dealerdirect/phpcodesniffer-composer-installer": "^0.7.0", + "doctrine/annotations": "^1.8", + "ergebnis/composer-normalize": "^2.15", + "mockery/mockery": "^1.3", + "paragonie/random-lib": "^2", + "php-mock/php-mock": "^2.2", + "php-mock/php-mock-mockery": "^1.3", + "php-parallel-lint/php-parallel-lint": "^1.1", + "phpbench/phpbench": "^1.0", + "phpstan/extension-installer": "^1.1", + "phpstan/phpstan": "^1.8", + "phpstan/phpstan-mockery": "^1.1", + "phpstan/phpstan-phpunit": "^1.1", + "phpunit/phpunit": "^8.5 || ^9", + "ramsey/composer-repl": "^1.4", + "slevomat/coding-standard": "^8.4", + "squizlabs/php_codesniffer": "^3.5", + "vimeo/psalm": "^4.9" + }, + "suggest": { + "ext-bcmath": "Enables faster math with arbitrary-precision integers using BCMath.", + "ext-gmp": "Enables faster math with arbitrary-precision integers using GMP.", + "ext-uuid": "Enables the use of PeclUuidTimeGenerator and PeclUuidRandomGenerator.", + "paragonie/random-lib": "Provides RandomLib for use with the RandomLibAdapter", + "ramsey/uuid-doctrine": "Allows the use of Ramsey\\Uuid\\Uuid as Doctrine field type." + }, + "type": "library", + "extra": { + "captainhook": { + "force-install": true + } + }, + "autoload": { + "files": [ + "src/functions.php" + ], + "psr-4": { + "Ramsey\\Uuid\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A PHP library for generating and working with universally unique identifiers (UUIDs).", + "keywords": [ + "guid", + "identifier", + "uuid" + ], + "support": { + "issues": "https://github.com/ramsey/uuid/issues", + "source": "https://github.com/ramsey/uuid/tree/4.7.6" + }, + "funding": [ + { + "url": "https://github.com/ramsey", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/ramsey/uuid", + "type": "tidelift" + } + ], + "time": "2024-04-27T21:32:50+00:00" + }, + { + "name": "sabberworm/php-css-parser", + "version": "v8.7.0", + "source": { + "type": "git", + "url": "https://github.com/MyIntervals/PHP-CSS-Parser.git", + "reference": "f414ff953002a9b18e3a116f5e462c56f21237cf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/MyIntervals/PHP-CSS-Parser/zipball/f414ff953002a9b18e3a116f5e462c56f21237cf", + "reference": "f414ff953002a9b18e3a116f5e462c56f21237cf", + "shasum": "" + }, + "require": { + "ext-iconv": "*", + "php": "^5.6.20 || ^7.0.0 || ~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0" + }, + "require-dev": { + "phpunit/phpunit": "5.7.27 || 6.5.14 || 7.5.20 || 8.5.40" + }, + "suggest": { + "ext-mbstring": "for parsing UTF-8 CSS" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "9.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Sabberworm\\CSS\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Raphael Schweikert" + }, + { + "name": "Oliver Klee", + "email": "github@oliverklee.de" + }, + { + "name": "Jake Hotson", + "email": "jake.github@qzdesign.co.uk" + } + ], + "description": "Parser for CSS Files written in PHP", + "homepage": "https://www.sabberworm.com/blog/2010/6/10/php-css-parser", + "keywords": [ + "css", + "parser", + "stylesheet" + ], + "support": { + "issues": "https://github.com/MyIntervals/PHP-CSS-Parser/issues", + "source": "https://github.com/MyIntervals/PHP-CSS-Parser/tree/v8.7.0" + }, + "time": "2024-10-27T17:38:32+00:00" + }, + { + "name": "setasign/fpdi", + "version": "v2.6.4", + "source": { + "type": "git", + "url": "https://github.com/Setasign/FPDI.git", + "reference": "4b53852fde2734ec6a07e458a085db627c60eada" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Setasign/FPDI/zipball/4b53852fde2734ec6a07e458a085db627c60eada", + "reference": "4b53852fde2734ec6a07e458a085db627c60eada", + "shasum": "" + }, + "require": { + "ext-zlib": "*", + "php": "^7.1 || ^8.0" + }, + "conflict": { + "setasign/tfpdf": "<1.31" + }, + "require-dev": { + "phpunit/phpunit": "^7", + "setasign/fpdf": "~1.8.6", + "setasign/tfpdf": "~1.33", + "squizlabs/php_codesniffer": "^3.5", + "tecnickcom/tcpdf": "^6.8" + }, + "suggest": { + "setasign/fpdf": "FPDI will extend this class but as it is also possible to use TCPDF or tFPDF as an alternative. There's no fixed dependency configured." + }, + "type": "library", + "autoload": { + "psr-4": { + "setasign\\Fpdi\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jan Slabon", + "email": "jan.slabon@setasign.com", + "homepage": "https://www.setasign.com" + }, + { + "name": "Maximilian Kresse", + "email": "maximilian.kresse@setasign.com", + "homepage": "https://www.setasign.com" + } + ], + "description": "FPDI is a collection of PHP classes facilitating developers to read pages from existing PDF documents and use them as templates in FPDF. Because it is also possible to use FPDI with TCPDF, there are no fixed dependencies defined. Please see suggestions for packages which evaluates the dependencies automatically.", + "homepage": "https://www.setasign.com/fpdi", + "keywords": [ + "fpdf", + "fpdi", + "pdf" + ], + "support": { + "issues": "https://github.com/Setasign/FPDI/issues", + "source": "https://github.com/Setasign/FPDI/tree/v2.6.4" + }, + "funding": [ + { + "url": "https://tidelift.com/funding/github/packagist/setasign/fpdi", + "type": "tidelift" + } + ], + "time": "2025-08-05T09:57:14+00:00" + }, + { + "name": "smalot/pdfparser", + "version": "v2.11.0", + "source": { + "type": "git", + "url": "https://github.com/smalot/pdfparser.git", + "reference": "ac8e6678b0940e4b2ccd5caadd3fb18e68093be6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/smalot/pdfparser/zipball/ac8e6678b0940e4b2ccd5caadd3fb18e68093be6", + "reference": "ac8e6678b0940e4b2ccd5caadd3fb18e68093be6", + "shasum": "" + }, + "require": { + "ext-iconv": "*", + "ext-zlib": "*", + "php": ">=7.1", + "symfony/polyfill-mbstring": "^1.18" + }, + "type": "library", + "autoload": { + "psr-0": { + "Smalot\\PdfParser\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "LGPL-3.0" + ], + "authors": [ + { + "name": "Sebastien MALOT", + "email": "sebastien@malot.fr" + } + ], + "description": "Pdf parser library. Can read and extract information from pdf file.", + "homepage": "https://www.pdfparser.org", + "keywords": [ + "extract", + "parse", + "parser", + "pdf", + "text" + ], + "support": { + "issues": "https://github.com/smalot/pdfparser/issues", + "source": "https://github.com/smalot/pdfparser/tree/v2.11.0" + }, + "time": "2024-08-16T06:48:03+00:00" + }, + { + "name": "stancl/jobpipeline", + "version": "v1.8.1", + "source": { + "type": "git", + "url": "https://github.com/archtechx/jobpipeline.git", + "reference": "c4ba5ef04c99176eb000abb05fc81fb0f44f5d9c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/archtechx/jobpipeline/zipball/c4ba5ef04c99176eb000abb05fc81fb0f44f5d9c", + "reference": "c4ba5ef04c99176eb000abb05fc81fb0f44f5d9c", + "shasum": "" + }, + "require": { + "illuminate/support": "^10.0|^11.0|^12.0", + "php": "^8.0" + }, + "require-dev": { + "ext-redis": "*", + "orchestra/testbench": "^8.0|^9.0|^10.0", + "spatie/valuestore": "^1.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "Stancl\\JobPipeline\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Samuel Štancl", + "email": "samuel.stancl@gmail.com" + } + ], + "description": "Turn any series of jobs into Laravel listeners.", + "support": { + "issues": "https://github.com/archtechx/jobpipeline/issues", + "source": "https://github.com/archtechx/jobpipeline/tree/v1.8.1" + }, + "time": "2025-07-29T20:21:17+00:00" + }, + { + "name": "stancl/tenancy", + "version": "v3.9.1", + "source": { + "type": "git", + "url": "https://github.com/archtechx/tenancy.git", + "reference": "d98a170fbd2e114604bfec3bc6267a3d6e02dec1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/archtechx/tenancy/zipball/d98a170fbd2e114604bfec3bc6267a3d6e02dec1", + "reference": "d98a170fbd2e114604bfec3bc6267a3d6e02dec1", + "shasum": "" + }, + "require": { + "ext-json": "*", + "facade/ignition-contracts": "^1.0.2", + "illuminate/support": "^10.0|^11.0|^12.0", + "php": "^8.0", + "ramsey/uuid": "^4.7.3", + "stancl/jobpipeline": "^1.8.0", + "stancl/virtualcolumn": "^1.5.0" + }, + "require-dev": { + "doctrine/dbal": "^3.6.0", + "laravel/framework": "^10.0|^11.0|^12.0", + "league/flysystem-aws-s3-v3": "^3.12.2", + "orchestra/testbench": "^8.0|^9.0|^10.0", + "spatie/valuestore": "^1.3.2" + }, + "type": "library", + "extra": { + "laravel": { + "aliases": { + "Tenancy": "Stancl\\Tenancy\\Facades\\Tenancy", + "GlobalCache": "Stancl\\Tenancy\\Facades\\GlobalCache" + }, + "providers": [ + "Stancl\\Tenancy\\TenancyServiceProvider" + ] + } + }, + "autoload": { + "files": [ + "src/helpers.php" + ], + "psr-4": { + "Stancl\\Tenancy\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Samuel Štancl", + "email": "samuel.stancl@gmail.com" + } + ], + "description": "Automatic multi-tenancy for your Laravel application.", + "keywords": [ + "laravel", + "multi-database", + "multi-tenancy", + "tenancy" + ], + "support": { + "issues": "https://github.com/archtechx/tenancy/issues", + "source": "https://github.com/archtechx/tenancy/tree/v3.9.1" + }, + "funding": [ + { + "url": "https://tenancyforlaravel.com/donate", + "type": "custom" + }, + { + "url": "https://github.com/stancl", + "type": "github" + } + ], + "time": "2025-03-13T16:02:11+00:00" + }, + { + "name": "stancl/virtualcolumn", + "version": "v1.5.0", + "source": { + "type": "git", + "url": "https://github.com/archtechx/virtualcolumn.git", + "reference": "75718edcfeeb19abc1970f5395043f7d43cce5bc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/archtechx/virtualcolumn/zipball/75718edcfeeb19abc1970f5395043f7d43cce5bc", + "reference": "75718edcfeeb19abc1970f5395043f7d43cce5bc", + "shasum": "" + }, + "require": { + "illuminate/database": ">=10.0", + "illuminate/support": ">=10.0" + }, + "require-dev": { + "orchestra/testbench": ">=8.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Stancl\\VirtualColumn\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Samuel Štancl", + "email": "samuel.stancl@gmail.com" + } + ], + "description": "Eloquent virtual column.", + "support": { + "issues": "https://github.com/archtechx/virtualcolumn/issues", + "source": "https://github.com/archtechx/virtualcolumn/tree/v1.5.0" + }, + "time": "2025-02-25T13:12:44+00:00" + }, + { + "name": "symfony/console", + "version": "v6.4.17", + "source": { + "type": "git", + "url": "https://github.com/symfony/console.git", + "reference": "799445db3f15768ecc382ac5699e6da0520a0a04" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/console/zipball/799445db3f15768ecc382ac5699e6da0520a0a04", + "reference": "799445db3f15768ecc382ac5699e6da0520a0a04", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-mbstring": "~1.0", + "symfony/service-contracts": "^2.5|^3", + "symfony/string": "^5.4|^6.0|^7.0" + }, + "conflict": { + "symfony/dependency-injection": "<5.4", + "symfony/dotenv": "<5.4", + "symfony/event-dispatcher": "<5.4", + "symfony/lock": "<5.4", + "symfony/process": "<5.4" + }, + "provide": { + "psr/log-implementation": "1.0|2.0|3.0" + }, + "require-dev": { + "psr/log": "^1|^2|^3", + "symfony/config": "^5.4|^6.0|^7.0", + "symfony/dependency-injection": "^5.4|^6.0|^7.0", + "symfony/event-dispatcher": "^5.4|^6.0|^7.0", + "symfony/http-foundation": "^6.4|^7.0", + "symfony/http-kernel": "^6.4|^7.0", + "symfony/lock": "^5.4|^6.0|^7.0", + "symfony/messenger": "^5.4|^6.0|^7.0", + "symfony/process": "^5.4|^6.0|^7.0", + "symfony/stopwatch": "^5.4|^6.0|^7.0", + "symfony/var-dumper": "^5.4|^6.0|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Console\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Eases the creation of beautiful and testable command line interfaces", + "homepage": "https://symfony.com", + "keywords": [ + "cli", + "command-line", + "console", + "terminal" + ], + "support": { + "source": "https://github.com/symfony/console/tree/v6.4.17" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-12-07T12:07:30+00:00" + }, + { + "name": "symfony/css-selector", + "version": "v7.2.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/css-selector.git", + "reference": "601a5ce9aaad7bf10797e3663faefce9e26c24e2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/css-selector/zipball/601a5ce9aaad7bf10797e3663faefce9e26c24e2", + "reference": "601a5ce9aaad7bf10797e3663faefce9e26c24e2", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\CssSelector\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Jean-François Simon", + "email": "jeanfrancois.simon@sensiolabs.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Converts CSS selectors to XPath expressions", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/css-selector/tree/v7.2.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-25T14:21:43+00:00" + }, + { + "name": "symfony/deprecation-contracts", + "version": "v3.6.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/deprecation-contracts.git", + "reference": "63afe740e99a13ba87ec199bb07bbdee937a5b62" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/63afe740e99a13ba87ec199bb07bbdee937a5b62", + "reference": "63afe740e99a13ba87ec199bb07bbdee937a5b62", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, + "branch-alias": { + "dev-main": "3.6-dev" + } + }, + "autoload": { + "files": [ + "function.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "A generic function and convention to trigger deprecation notices", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/deprecation-contracts/tree/v3.6.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-25T14:21:43+00:00" + }, + { + "name": "symfony/error-handler", + "version": "v6.4.19", + "source": { + "type": "git", + "url": "https://github.com/symfony/error-handler.git", + "reference": "3d4e55cd2b8f1979a65eba9ab749d6466c316f71" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/error-handler/zipball/3d4e55cd2b8f1979a65eba9ab749d6466c316f71", + "reference": "3d4e55cd2b8f1979a65eba9ab749d6466c316f71", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/log": "^1|^2|^3", + "symfony/var-dumper": "^5.4|^6.0|^7.0" + }, + "conflict": { + "symfony/deprecation-contracts": "<2.5", + "symfony/http-kernel": "<6.4" + }, + "require-dev": { + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/http-kernel": "^6.4|^7.0", + "symfony/serializer": "^5.4|^6.0|^7.0" + }, + "bin": [ + "Resources/bin/patch-type-declarations" + ], + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\ErrorHandler\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides tools to manage errors and ease debugging PHP code", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/error-handler/tree/v6.4.19" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-02-02T20:16:33+00:00" + }, + { + "name": "symfony/event-dispatcher", + "version": "v7.2.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/event-dispatcher.git", + "reference": "910c5db85a5356d0fea57680defec4e99eb9c8c1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/910c5db85a5356d0fea57680defec4e99eb9c8c1", + "reference": "910c5db85a5356d0fea57680defec4e99eb9c8c1", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/event-dispatcher-contracts": "^2.5|^3" + }, + "conflict": { + "symfony/dependency-injection": "<6.4", + "symfony/service-contracts": "<2.5" + }, + "provide": { + "psr/event-dispatcher-implementation": "1.0", + "symfony/event-dispatcher-implementation": "2.0|3.0" + }, + "require-dev": { + "psr/log": "^1|^2|^3", + "symfony/config": "^6.4|^7.0", + "symfony/dependency-injection": "^6.4|^7.0", + "symfony/error-handler": "^6.4|^7.0", + "symfony/expression-language": "^6.4|^7.0", + "symfony/http-foundation": "^6.4|^7.0", + "symfony/service-contracts": "^2.5|^3", + "symfony/stopwatch": "^6.4|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\EventDispatcher\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/event-dispatcher/tree/v7.2.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-25T14:21:43+00:00" + }, + { + "name": "symfony/event-dispatcher-contracts", + "version": "v3.5.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/event-dispatcher-contracts.git", + "reference": "7642f5e970b672283b7823222ae8ef8bbc160b9f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/7642f5e970b672283b7823222ae8ef8bbc160b9f", + "reference": "7642f5e970b672283b7823222ae8ef8bbc160b9f", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/event-dispatcher": "^1" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, + "branch-alias": { + "dev-main": "3.5-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\EventDispatcher\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to dispatching event", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.5.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-25T14:20:29+00:00" + }, + { + "name": "symfony/finder", + "version": "v6.4.17", + "source": { + "type": "git", + "url": "https://github.com/symfony/finder.git", + "reference": "1d0e8266248c5d9ab6a87e3789e6dc482af3c9c7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/finder/zipball/1d0e8266248c5d9ab6a87e3789e6dc482af3c9c7", + "reference": "1d0e8266248c5d9ab6a87e3789e6dc482af3c9c7", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "symfony/filesystem": "^6.0|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Finder\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Finds files and directories via an intuitive fluent interface", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/finder/tree/v6.4.17" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-12-29T13:51:37+00:00" + }, + { + "name": "symfony/http-foundation", + "version": "v6.4.18", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-foundation.git", + "reference": "d0492d6217e5ab48f51fca76f64cf8e78919d0db" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/d0492d6217e5ab48f51fca76f64cf8e78919d0db", + "reference": "d0492d6217e5ab48f51fca76f64cf8e78919d0db", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-mbstring": "~1.1", + "symfony/polyfill-php83": "^1.27" + }, + "conflict": { + "symfony/cache": "<6.4.12|>=7.0,<7.1.5" + }, + "require-dev": { + "doctrine/dbal": "^2.13.1|^3|^4", + "predis/predis": "^1.1|^2.0", + "symfony/cache": "^6.4.12|^7.1.5", + "symfony/dependency-injection": "^5.4|^6.0|^7.0", + "symfony/expression-language": "^5.4|^6.0|^7.0", + "symfony/http-kernel": "^5.4.12|^6.0.12|^6.1.4|^7.0", + "symfony/mime": "^5.4|^6.0|^7.0", + "symfony/rate-limiter": "^5.4|^6.0|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\HttpFoundation\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Defines an object-oriented layer for the HTTP specification", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/http-foundation/tree/v6.4.18" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-01-09T15:48:56+00:00" + }, + { + "name": "symfony/http-kernel", + "version": "v6.4.19", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-kernel.git", + "reference": "88f2c9f7feff86bb7b9105c5151bc2c1404cd64c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/88f2c9f7feff86bb7b9105c5151bc2c1404cd64c", + "reference": "88f2c9f7feff86bb7b9105c5151bc2c1404cd64c", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/log": "^1|^2|^3", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/error-handler": "^6.4|^7.0", + "symfony/event-dispatcher": "^5.4|^6.0|^7.0", + "symfony/http-foundation": "^6.4|^7.0", + "symfony/polyfill-ctype": "^1.8" + }, + "conflict": { + "symfony/browser-kit": "<5.4", + "symfony/cache": "<5.4", + "symfony/config": "<6.1", + "symfony/console": "<5.4", + "symfony/dependency-injection": "<6.4", + "symfony/doctrine-bridge": "<5.4", + "symfony/form": "<5.4", + "symfony/http-client": "<5.4", + "symfony/http-client-contracts": "<2.5", + "symfony/mailer": "<5.4", + "symfony/messenger": "<5.4", + "symfony/translation": "<5.4", + "symfony/translation-contracts": "<2.5", + "symfony/twig-bridge": "<5.4", + "symfony/validator": "<6.4", + "symfony/var-dumper": "<6.3", + "twig/twig": "<2.13" + }, + "provide": { + "psr/log-implementation": "1.0|2.0|3.0" + }, + "require-dev": { + "psr/cache": "^1.0|^2.0|^3.0", + "symfony/browser-kit": "^5.4|^6.0|^7.0", + "symfony/clock": "^6.2|^7.0", + "symfony/config": "^6.1|^7.0", + "symfony/console": "^5.4|^6.0|^7.0", + "symfony/css-selector": "^5.4|^6.0|^7.0", + "symfony/dependency-injection": "^6.4|^7.0", + "symfony/dom-crawler": "^5.4|^6.0|^7.0", + "symfony/expression-language": "^5.4|^6.0|^7.0", + "symfony/finder": "^5.4|^6.0|^7.0", + "symfony/http-client-contracts": "^2.5|^3", + "symfony/process": "^5.4|^6.0|^7.0", + "symfony/property-access": "^5.4.5|^6.0.5|^7.0", + "symfony/routing": "^5.4|^6.0|^7.0", + "symfony/serializer": "^6.4.4|^7.0.4", + "symfony/stopwatch": "^5.4|^6.0|^7.0", + "symfony/translation": "^5.4|^6.0|^7.0", + "symfony/translation-contracts": "^2.5|^3", + "symfony/uid": "^5.4|^6.0|^7.0", + "symfony/validator": "^6.4|^7.0", + "symfony/var-dumper": "^5.4|^6.4|^7.0", + "symfony/var-exporter": "^6.2|^7.0", + "twig/twig": "^2.13|^3.0.4" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\HttpKernel\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides a structured process for converting a Request into a Response", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/http-kernel/tree/v6.4.19" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-02-26T10:51:37+00:00" + }, + { + "name": "symfony/mailer", + "version": "v6.4.18", + "source": { + "type": "git", + "url": "https://github.com/symfony/mailer.git", + "reference": "e93a6ae2767d7f7578c2b7961d9d8e27580b2b11" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/mailer/zipball/e93a6ae2767d7f7578c2b7961d9d8e27580b2b11", + "reference": "e93a6ae2767d7f7578c2b7961d9d8e27580b2b11", + "shasum": "" + }, + "require": { + "egulias/email-validator": "^2.1.10|^3|^4", + "php": ">=8.1", + "psr/event-dispatcher": "^1", + "psr/log": "^1|^2|^3", + "symfony/event-dispatcher": "^5.4|^6.0|^7.0", + "symfony/mime": "^6.2|^7.0", + "symfony/service-contracts": "^2.5|^3" + }, + "conflict": { + "symfony/http-client-contracts": "<2.5", + "symfony/http-kernel": "<5.4", + "symfony/messenger": "<6.2", + "symfony/mime": "<6.2", + "symfony/twig-bridge": "<6.2.1" + }, + "require-dev": { + "symfony/console": "^5.4|^6.0|^7.0", + "symfony/http-client": "^5.4|^6.0|^7.0", + "symfony/messenger": "^6.2|^7.0", + "symfony/twig-bridge": "^6.2|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Mailer\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Helps sending emails", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/mailer/tree/v6.4.18" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-01-24T15:27:15+00:00" + }, + { + "name": "symfony/mime", + "version": "v6.4.19", + "source": { + "type": "git", + "url": "https://github.com/symfony/mime.git", + "reference": "ac537b6c55ccc2c749f3c979edfa9ec14aaed4f3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/mime/zipball/ac537b6c55ccc2c749f3c979edfa9ec14aaed4f3", + "reference": "ac537b6c55ccc2c749f3c979edfa9ec14aaed4f3", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-intl-idn": "^1.10", + "symfony/polyfill-mbstring": "^1.0" + }, + "conflict": { + "egulias/email-validator": "~3.0.0", + "phpdocumentor/reflection-docblock": "<3.2.2", + "phpdocumentor/type-resolver": "<1.4.0", + "symfony/mailer": "<5.4", + "symfony/serializer": "<6.4.3|>7.0,<7.0.3" + }, + "require-dev": { + "egulias/email-validator": "^2.1.10|^3.1|^4", + "league/html-to-markdown": "^5.0", + "phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0", + "symfony/dependency-injection": "^5.4|^6.0|^7.0", + "symfony/process": "^5.4|^6.4|^7.0", + "symfony/property-access": "^5.4|^6.0|^7.0", + "symfony/property-info": "^5.4|^6.0|^7.0", + "symfony/serializer": "^6.4.3|^7.0.3" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Mime\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Allows manipulating MIME messages", + "homepage": "https://symfony.com", + "keywords": [ + "mime", + "mime-type" + ], + "support": { + "source": "https://github.com/symfony/mime/tree/v6.4.19" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-02-17T21:23:52+00:00" + }, + { + "name": "symfony/polyfill-ctype", + "version": "v1.31.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-ctype.git", + "reference": "a3cc8b044a6ea513310cbd48ef7333b384945638" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/a3cc8b044a6ea513310cbd48ef7333b384945638", + "reference": "a3cc8b044a6ea513310cbd48ef7333b384945638", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "provide": { + "ext-ctype": "*" + }, + "suggest": { + "ext-ctype": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Ctype\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Gert de Pagter", + "email": "BackEndTea@gmail.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for ctype functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "ctype", + "polyfill", + "portable" + ], + "support": { + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.31.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-09T11:45:10+00:00" + }, + { + "name": "symfony/polyfill-intl-grapheme", + "version": "v1.31.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-grapheme.git", + "reference": "b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe", + "reference": "b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Grapheme\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's grapheme_* functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "grapheme", + "intl", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.31.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-09T11:45:10+00:00" + }, + { + "name": "symfony/polyfill-intl-idn", + "version": "v1.31.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-idn.git", + "reference": "c36586dcf89a12315939e00ec9b4474adcb1d773" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/c36586dcf89a12315939e00ec9b4474adcb1d773", + "reference": "c36586dcf89a12315939e00ec9b4474adcb1d773", + "shasum": "" + }, + "require": { + "php": ">=7.2", + "symfony/polyfill-intl-normalizer": "^1.10" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Idn\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Laurent Bassin", + "email": "laurent@bassin.info" + }, + { + "name": "Trevor Rowbotham", + "email": "trevor.rowbotham@pm.me" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's idn_to_ascii and idn_to_utf8 functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "idn", + "intl", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.31.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-09T11:45:10+00:00" + }, + { + "name": "symfony/polyfill-intl-normalizer", + "version": "v1.31.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-normalizer.git", + "reference": "3833d7255cc303546435cb650316bff708a1c75c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/3833d7255cc303546435cb650316bff708a1c75c", + "reference": "3833d7255cc303546435cb650316bff708a1c75c", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Normalizer\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's Normalizer class and related functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "intl", + "normalizer", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.31.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-09T11:45:10+00:00" + }, + { + "name": "symfony/polyfill-mbstring", + "version": "v1.31.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-mbstring.git", + "reference": "85181ba99b2345b0ef10ce42ecac37612d9fd341" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/85181ba99b2345b0ef10ce42ecac37612d9fd341", + "reference": "85181ba99b2345b0ef10ce42ecac37612d9fd341", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "provide": { + "ext-mbstring": "*" + }, + "suggest": { + "ext-mbstring": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Mbstring\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for the Mbstring extension", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "mbstring", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.31.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-09T11:45:10+00:00" + }, + { + "name": "symfony/polyfill-php80", + "version": "v1.32.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php80.git", + "reference": "0cc9dd0f17f61d8131e7df6b84bd344899fe2608" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/0cc9dd0f17f61d8131e7df6b84bd344899fe2608", + "reference": "0cc9dd0f17f61d8131e7df6b84bd344899fe2608", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php80\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ion Bazan", + "email": "ion.bazan@gmail.com" + }, + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php80/tree/v1.32.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-01-02T08:10:11+00:00" + }, + { + "name": "symfony/polyfill-php83", + "version": "v1.31.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php83.git", + "reference": "2fb86d65e2d424369ad2905e83b236a8805ba491" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php83/zipball/2fb86d65e2d424369ad2905e83b236a8805ba491", + "reference": "2fb86d65e2d424369ad2905e83b236a8805ba491", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php83\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.3+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php83/tree/v1.31.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-09T11:45:10+00:00" + }, + { + "name": "symfony/polyfill-uuid", + "version": "v1.31.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-uuid.git", + "reference": "21533be36c24be3f4b1669c4725c7d1d2bab4ae2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-uuid/zipball/21533be36c24be3f4b1669c4725c7d1d2bab4ae2", + "reference": "21533be36c24be3f4b1669c4725c7d1d2bab4ae2", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "provide": { + "ext-uuid": "*" + }, + "suggest": { + "ext-uuid": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Uuid\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Grégoire Pineau", + "email": "lyrixx@lyrixx.info" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for uuid functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "uuid" + ], + "support": { + "source": "https://github.com/symfony/polyfill-uuid/tree/v1.31.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-09T11:45:10+00:00" + }, + { + "name": "symfony/process", + "version": "v6.4.19", + "source": { + "type": "git", + "url": "https://github.com/symfony/process.git", + "reference": "7a1c12e87b08ec9c97abdd188c9b3f5a40e37fc3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/process/zipball/7a1c12e87b08ec9c97abdd188c9b3f5a40e37fc3", + "reference": "7a1c12e87b08ec9c97abdd188c9b3f5a40e37fc3", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Process\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Executes commands in sub-processes", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/process/tree/v6.4.19" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-02-04T13:35:48+00:00" + }, + { + "name": "symfony/routing", + "version": "v6.4.18", + "source": { + "type": "git", + "url": "https://github.com/symfony/routing.git", + "reference": "e9bfc94953019089acdfb9be51c1b9142c4afa68" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/routing/zipball/e9bfc94953019089acdfb9be51c1b9142c4afa68", + "reference": "e9bfc94953019089acdfb9be51c1b9142c4afa68", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3" + }, + "conflict": { + "doctrine/annotations": "<1.12", + "symfony/config": "<6.2", + "symfony/dependency-injection": "<5.4", + "symfony/yaml": "<5.4" + }, + "require-dev": { + "doctrine/annotations": "^1.12|^2", + "psr/log": "^1|^2|^3", + "symfony/config": "^6.2|^7.0", + "symfony/dependency-injection": "^5.4|^6.0|^7.0", + "symfony/expression-language": "^5.4|^6.0|^7.0", + "symfony/http-foundation": "^5.4|^6.0|^7.0", + "symfony/yaml": "^5.4|^6.0|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Routing\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Maps an HTTP request to a set of configuration variables", + "homepage": "https://symfony.com", + "keywords": [ + "router", + "routing", + "uri", + "url" + ], + "support": { + "source": "https://github.com/symfony/routing/tree/v6.4.18" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-01-09T08:51:02+00:00" + }, + { + "name": "symfony/service-contracts", + "version": "v3.5.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/service-contracts.git", + "reference": "e53260aabf78fb3d63f8d79d69ece59f80d5eda0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/e53260aabf78fb3d63f8d79d69ece59f80d5eda0", + "reference": "e53260aabf78fb3d63f8d79d69ece59f80d5eda0", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/container": "^1.1|^2.0", + "symfony/deprecation-contracts": "^2.5|^3" + }, + "conflict": { + "ext-psr": "<1.1|>=2" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, + "branch-alias": { + "dev-main": "3.5-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\Service\\": "" + }, + "exclude-from-classmap": [ + "/Test/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to writing services", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/service-contracts/tree/v3.5.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-25T14:20:29+00:00" + }, + { + "name": "symfony/string", + "version": "v7.2.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/string.git", + "reference": "446e0d146f991dde3e73f45f2c97a9faad773c82" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/string/zipball/446e0d146f991dde3e73f45f2c97a9faad773c82", + "reference": "446e0d146f991dde3e73f45f2c97a9faad773c82", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-intl-grapheme": "~1.0", + "symfony/polyfill-intl-normalizer": "~1.0", + "symfony/polyfill-mbstring": "~1.0" + }, + "conflict": { + "symfony/translation-contracts": "<2.5" + }, + "require-dev": { + "symfony/emoji": "^7.1", + "symfony/error-handler": "^6.4|^7.0", + "symfony/http-client": "^6.4|^7.0", + "symfony/intl": "^6.4|^7.0", + "symfony/translation-contracts": "^2.5|^3.0", + "symfony/var-exporter": "^6.4|^7.0" + }, + "type": "library", + "autoload": { + "files": [ + "Resources/functions.php" + ], + "psr-4": { + "Symfony\\Component\\String\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides an object-oriented API to strings and deals with bytes, UTF-8 code points and grapheme clusters in a unified way", + "homepage": "https://symfony.com", + "keywords": [ + "grapheme", + "i18n", + "string", + "unicode", + "utf-8", + "utf8" + ], + "support": { + "source": "https://github.com/symfony/string/tree/v7.2.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-11-13T13:31:26+00:00" + }, + { + "name": "symfony/translation", + "version": "v6.4.19", + "source": { + "type": "git", + "url": "https://github.com/symfony/translation.git", + "reference": "3b9bf9f33997c064885a7bfc126c14b9daa0e00e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/translation/zipball/3b9bf9f33997c064885a7bfc126c14b9daa0e00e", + "reference": "3b9bf9f33997c064885a7bfc126c14b9daa0e00e", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-mbstring": "~1.0", + "symfony/translation-contracts": "^2.5|^3.0" + }, + "conflict": { + "symfony/config": "<5.4", + "symfony/console": "<5.4", + "symfony/dependency-injection": "<5.4", + "symfony/http-client-contracts": "<2.5", + "symfony/http-kernel": "<5.4", + "symfony/service-contracts": "<2.5", + "symfony/twig-bundle": "<5.4", + "symfony/yaml": "<5.4" + }, + "provide": { + "symfony/translation-implementation": "2.3|3.0" + }, + "require-dev": { + "nikic/php-parser": "^4.18|^5.0", + "psr/log": "^1|^2|^3", + "symfony/config": "^5.4|^6.0|^7.0", + "symfony/console": "^5.4|^6.0|^7.0", + "symfony/dependency-injection": "^5.4|^6.0|^7.0", + "symfony/finder": "^5.4|^6.0|^7.0", + "symfony/http-client-contracts": "^2.5|^3.0", + "symfony/http-kernel": "^5.4|^6.0|^7.0", + "symfony/intl": "^5.4|^6.0|^7.0", + "symfony/polyfill-intl-icu": "^1.21", + "symfony/routing": "^5.4|^6.0|^7.0", + "symfony/service-contracts": "^2.5|^3", + "symfony/yaml": "^5.4|^6.0|^7.0" + }, + "type": "library", + "autoload": { + "files": [ + "Resources/functions.php" + ], + "psr-4": { + "Symfony\\Component\\Translation\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides tools to internationalize your application", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/translation/tree/v6.4.19" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-02-13T10:18:43+00:00" + }, + { + "name": "symfony/translation-contracts", + "version": "v3.5.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/translation-contracts.git", + "reference": "4667ff3bd513750603a09c8dedbea942487fb07c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/4667ff3bd513750603a09c8dedbea942487fb07c", + "reference": "4667ff3bd513750603a09c8dedbea942487fb07c", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, + "branch-alias": { + "dev-main": "3.5-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\Translation\\": "" + }, + "exclude-from-classmap": [ + "/Test/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to translation", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/translation-contracts/tree/v3.5.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-25T14:20:29+00:00" + }, + { + "name": "symfony/uid", + "version": "v6.4.13", + "source": { + "type": "git", + "url": "https://github.com/symfony/uid.git", + "reference": "18eb207f0436a993fffbdd811b5b8fa35fa5e007" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/uid/zipball/18eb207f0436a993fffbdd811b5b8fa35fa5e007", + "reference": "18eb207f0436a993fffbdd811b5b8fa35fa5e007", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/polyfill-uuid": "^1.15" + }, + "require-dev": { + "symfony/console": "^5.4|^6.0|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Uid\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Grégoire Pineau", + "email": "lyrixx@lyrixx.info" + }, + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides an object-oriented API to generate and represent UIDs", + "homepage": "https://symfony.com", + "keywords": [ + "UID", + "ulid", + "uuid" + ], + "support": { + "source": "https://github.com/symfony/uid/tree/v6.4.13" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-25T14:18:03+00:00" + }, + { + "name": "symfony/var-dumper", + "version": "v6.4.18", + "source": { + "type": "git", + "url": "https://github.com/symfony/var-dumper.git", + "reference": "4ad10cf8b020e77ba665305bb7804389884b4837" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/4ad10cf8b020e77ba665305bb7804389884b4837", + "reference": "4ad10cf8b020e77ba665305bb7804389884b4837", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-mbstring": "~1.0" + }, + "conflict": { + "symfony/console": "<5.4" + }, + "require-dev": { + "ext-iconv": "*", + "symfony/console": "^5.4|^6.0|^7.0", + "symfony/error-handler": "^6.3|^7.0", + "symfony/http-kernel": "^5.4|^6.0|^7.0", + "symfony/process": "^5.4|^6.0|^7.0", + "symfony/uid": "^5.4|^6.0|^7.0", + "twig/twig": "^2.13|^3.0.4" + }, + "bin": [ + "Resources/bin/var-dump-server" + ], + "type": "library", + "autoload": { + "files": [ + "Resources/functions/dump.php" + ], + "psr-4": { + "Symfony\\Component\\VarDumper\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides mechanisms for walking through any arbitrary PHP variable", + "homepage": "https://symfony.com", + "keywords": [ + "debug", + "dump" + ], + "support": { + "source": "https://github.com/symfony/var-dumper/tree/v6.4.18" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-01-17T11:26:11+00:00" + }, + { + "name": "tijsverkoyen/css-to-inline-styles", + "version": "v2.3.0", + "source": { + "type": "git", + "url": "https://github.com/tijsverkoyen/CssToInlineStyles.git", + "reference": "0d72ac1c00084279c1816675284073c5a337c20d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/tijsverkoyen/CssToInlineStyles/zipball/0d72ac1c00084279c1816675284073c5a337c20d", + "reference": "0d72ac1c00084279c1816675284073c5a337c20d", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-libxml": "*", + "php": "^7.4 || ^8.0", + "symfony/css-selector": "^5.4 || ^6.0 || ^7.0" + }, + "require-dev": { + "phpstan/phpstan": "^2.0", + "phpstan/phpstan-phpunit": "^2.0", + "phpunit/phpunit": "^8.5.21 || ^9.5.10" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.x-dev" + } + }, + "autoload": { + "psr-4": { + "TijsVerkoyen\\CssToInlineStyles\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Tijs Verkoyen", + "email": "css_to_inline_styles@verkoyen.eu", + "role": "Developer" + } + ], + "description": "CssToInlineStyles is a class that enables you to convert HTML-pages/files into HTML-pages/files with inline styles. This is very useful when you're sending emails.", + "homepage": "https://github.com/tijsverkoyen/CssToInlineStyles", + "support": { + "issues": "https://github.com/tijsverkoyen/CssToInlineStyles/issues", + "source": "https://github.com/tijsverkoyen/CssToInlineStyles/tree/v2.3.0" + }, + "time": "2024-12-21T16:25:41+00:00" + }, + { + "name": "vlucas/phpdotenv", + "version": "v5.6.1", + "source": { + "type": "git", + "url": "https://github.com/vlucas/phpdotenv.git", + "reference": "a59a13791077fe3d44f90e7133eb68e7d22eaff2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/a59a13791077fe3d44f90e7133eb68e7d22eaff2", + "reference": "a59a13791077fe3d44f90e7133eb68e7d22eaff2", + "shasum": "" + }, + "require": { + "ext-pcre": "*", + "graham-campbell/result-type": "^1.1.3", + "php": "^7.2.5 || ^8.0", + "phpoption/phpoption": "^1.9.3", + "symfony/polyfill-ctype": "^1.24", + "symfony/polyfill-mbstring": "^1.24", + "symfony/polyfill-php80": "^1.24" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "ext-filter": "*", + "phpunit/phpunit": "^8.5.34 || ^9.6.13 || ^10.4.2" + }, + "suggest": { + "ext-filter": "Required to use the boolean validator." + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + }, + "branch-alias": { + "dev-master": "5.6-dev" + } + }, + "autoload": { + "psr-4": { + "Dotenv\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Vance Lucas", + "email": "vance@vancelucas.com", + "homepage": "https://github.com/vlucas" + } + ], + "description": "Loads environment variables from `.env` to `getenv()`, `$_ENV` and `$_SERVER` automagically.", + "keywords": [ + "dotenv", + "env", + "environment" + ], + "support": { + "issues": "https://github.com/vlucas/phpdotenv/issues", + "source": "https://github.com/vlucas/phpdotenv/tree/v5.6.1" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/vlucas/phpdotenv", + "type": "tidelift" + } + ], + "time": "2024-07-20T21:52:34+00:00" + }, + { + "name": "voku/portable-ascii", + "version": "2.0.3", + "source": { + "type": "git", + "url": "https://github.com/voku/portable-ascii.git", + "reference": "b1d923f88091c6bf09699efcd7c8a1b1bfd7351d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/voku/portable-ascii/zipball/b1d923f88091c6bf09699efcd7c8a1b1bfd7351d", + "reference": "b1d923f88091c6bf09699efcd7c8a1b1bfd7351d", + "shasum": "" + }, + "require": { + "php": ">=7.0.0" + }, + "require-dev": { + "phpunit/phpunit": "~6.0 || ~7.0 || ~9.0" + }, + "suggest": { + "ext-intl": "Use Intl for transliterator_transliterate() support" + }, + "type": "library", + "autoload": { + "psr-4": { + "voku\\": "src/voku/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Lars Moelleken", + "homepage": "https://www.moelleken.org/" + } + ], + "description": "Portable ASCII library - performance optimized (ascii) string functions for php.", + "homepage": "https://github.com/voku/portable-ascii", + "keywords": [ + "ascii", + "clean", + "php" + ], + "support": { + "issues": "https://github.com/voku/portable-ascii/issues", + "source": "https://github.com/voku/portable-ascii/tree/2.0.3" + }, + "funding": [ + { + "url": "https://www.paypal.me/moelleken", + "type": "custom" + }, + { + "url": "https://github.com/voku", + "type": "github" + }, + { + "url": "https://opencollective.com/portable-ascii", + "type": "open_collective" + }, + { + "url": "https://www.patreon.com/voku", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/voku/portable-ascii", + "type": "tidelift" + } + ], + "time": "2024-11-21T01:49:47+00:00" + }, + { + "name": "webklex/laravel-imap", + "version": "5.3.0", + "source": { + "type": "git", + "url": "https://github.com/Webklex/laravel-imap.git", + "reference": "a424988a314c09f924390011a7baa8025efb9e14" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Webklex/laravel-imap/zipball/a424988a314c09f924390011a7baa8025efb9e14", + "reference": "a424988a314c09f924390011a7baa8025efb9e14", + "shasum": "" + }, + "require": { + "laravel/framework": ">=6.0.0", + "php": "^8.0.2", + "webklex/php-imap": "^5.3.0" + }, + "type": "library", + "extra": { + "laravel": { + "aliases": { + "Client": "Webklex\\IMAP\\Facades\\Client" + }, + "providers": [ + "Webklex\\IMAP\\Providers\\LaravelServiceProvider" + ] + }, + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "psr-4": { + "Webklex\\IMAP\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Malte Goldenbaum", + "email": "github@webklex.com", + "role": "Developer" + } + ], + "description": "Laravel IMAP client", + "homepage": "https://github.com/webklex/laravel-imap", + "keywords": [ + "idle", + "imap", + "laravel", + "laravel-imap", + "mail", + "oauth", + "pop3", + "webklex" + ], + "support": { + "issues": "https://github.com/Webklex/laravel-imap/issues", + "source": "https://github.com/Webklex/laravel-imap/tree/5.3.0" + }, + "funding": [ + { + "url": "https://www.buymeacoffee.com/webklex", + "type": "custom" + }, + { + "url": "https://ko-fi.com/webklex", + "type": "ko_fi" + } + ], + "time": "2023-06-20T11:42:58+00:00" + }, + { + "name": "webklex/php-imap", + "version": "5.5.0", + "source": { + "type": "git", + "url": "https://github.com/Webklex/php-imap.git", + "reference": "3c23c8f66b772ce8597772816e068326559e7e4b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Webklex/php-imap/zipball/3c23c8f66b772ce8597772816e068326559e7e4b", + "reference": "3c23c8f66b772ce8597772816e068326559e7e4b", + "shasum": "" + }, + "require": { + "ext-fileinfo": "*", + "ext-iconv": "*", + "ext-json": "*", + "ext-libxml": "*", + "ext-mbstring": "*", + "ext-openssl": "*", + "ext-zip": "*", + "illuminate/pagination": ">=5.0.0", + "nesbot/carbon": "^2.62.1", + "php": "^8.0.2", + "symfony/http-foundation": ">=2.8.0" + }, + "require-dev": { + "phpunit/phpunit": "^9.5.10" + }, + "suggest": { + "symfony/mime": "Recomended for better extension support", + "symfony/var-dumper": "Usefull tool for debugging" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "psr-4": { + "Webklex\\PHPIMAP\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Malte Goldenbaum", + "email": "github@webklex.com", + "role": "Developer" + } + ], + "description": "PHP IMAP client", + "homepage": "https://github.com/webklex/php-imap", + "keywords": [ + "imap", + "mail", + "php-imap", + "pop3", + "webklex" + ], + "support": { + "issues": "https://github.com/Webklex/php-imap/issues", + "source": "https://github.com/Webklex/php-imap/tree/5.5.0" + }, + "funding": [ + { + "url": "https://www.buymeacoffee.com/webklex", + "type": "custom" + }, + { + "url": "https://ko-fi.com/webklex", + "type": "ko_fi" + } + ], + "time": "2023-06-28T01:57:03+00:00" + }, + { + "name": "webmozart/assert", + "version": "1.11.0", + "source": { + "type": "git", + "url": "https://github.com/webmozarts/assert.git", + "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/webmozarts/assert/zipball/11cb2199493b2f8a3b53e7f19068fc6aac760991", + "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991", + "shasum": "" + }, + "require": { + "ext-ctype": "*", + "php": "^7.2 || ^8.0" + }, + "conflict": { + "phpstan/phpstan": "<0.12.20", + "vimeo/psalm": "<4.6.1 || 4.6.2" + }, + "require-dev": { + "phpunit/phpunit": "^8.5.13" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.10-dev" + } + }, + "autoload": { + "psr-4": { + "Webmozart\\Assert\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Bernhard Schussek", + "email": "bschussek@gmail.com" + } + ], + "description": "Assertions to validate method input/output with nice error messages.", + "keywords": [ + "assert", + "check", + "validate" + ], + "support": { + "issues": "https://github.com/webmozarts/assert/issues", + "source": "https://github.com/webmozarts/assert/tree/1.11.0" + }, + "time": "2022-06-03T18:03:27+00:00" + } + ], + "packages-dev": [ + { + "name": "barryvdh/laravel-debugbar", + "version": "v3.15.2", + "source": { + "type": "git", + "url": "https://github.com/barryvdh/laravel-debugbar.git", + "reference": "0bc1e1361e7fffc2be156f46ad1fba6927c01729" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/barryvdh/laravel-debugbar/zipball/0bc1e1361e7fffc2be156f46ad1fba6927c01729", + "reference": "0bc1e1361e7fffc2be156f46ad1fba6927c01729", + "shasum": "" + }, + "require": { + "illuminate/routing": "^9|^10|^11|^12", + "illuminate/session": "^9|^10|^11|^12", + "illuminate/support": "^9|^10|^11|^12", + "php": "^8.1", + "php-debugbar/php-debugbar": "~2.1.1", + "symfony/finder": "^6|^7" + }, + "conflict": { + "maximebf/debugbar": "*" + }, + "require-dev": { + "mockery/mockery": "^1.3.3", + "orchestra/testbench-dusk": "^7|^8|^9|^10", + "phpunit/phpunit": "^9.5.10|^10|^11", + "squizlabs/php_codesniffer": "^3.5" + }, + "type": "library", + "extra": { + "laravel": { + "aliases": { + "Debugbar": "Barryvdh\\Debugbar\\Facades\\Debugbar" + }, + "providers": [ + "Barryvdh\\Debugbar\\ServiceProvider" + ] + }, + "branch-alias": { + "dev-master": "3.15-dev" + } + }, + "autoload": { + "files": [ + "src/helpers.php" + ], + "psr-4": { + "Barryvdh\\Debugbar\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Barry vd. Heuvel", + "email": "barryvdh@gmail.com" + } + ], + "description": "PHP Debugbar integration for Laravel", + "keywords": [ + "debug", + "debugbar", + "dev", + "laravel", + "profiler", + "webprofiler" + ], + "support": { + "issues": "https://github.com/barryvdh/laravel-debugbar/issues", + "source": "https://github.com/barryvdh/laravel-debugbar/tree/v3.15.2" + }, + "funding": [ + { + "url": "https://fruitcake.nl", + "type": "custom" + }, + { + "url": "https://github.com/barryvdh", + "type": "github" + } + ], + "time": "2025-02-25T15:25:22+00:00" + }, + { + "name": "brianium/paratest", + "version": "v7.4.8", + "source": { + "type": "git", + "url": "https://github.com/paratestphp/paratest.git", + "reference": "cf16fcbb9b8107a7df6b97e497fc91e819774d8b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/paratestphp/paratest/zipball/cf16fcbb9b8107a7df6b97e497fc91e819774d8b", + "reference": "cf16fcbb9b8107a7df6b97e497fc91e819774d8b", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-pcre": "*", + "ext-reflection": "*", + "ext-simplexml": "*", + "fidry/cpu-core-counter": "^1.2.0", + "jean85/pretty-package-versions": "^2.0.6", + "php": "~8.2.0 || ~8.3.0 || ~8.4.0", + "phpunit/php-code-coverage": "^10.1.16", + "phpunit/php-file-iterator": "^4.1.0", + "phpunit/php-timer": "^6.0.0", + "phpunit/phpunit": "^10.5.36", + "sebastian/environment": "^6.1.0", + "symfony/console": "^6.4.7 || ^7.1.5", + "symfony/process": "^6.4.7 || ^7.1.5" + }, + "require-dev": { + "doctrine/coding-standard": "^12.0.0", + "ext-pcov": "*", + "ext-posix": "*", + "phpstan/phpstan": "^1.12.6", + "phpstan/phpstan-deprecation-rules": "^1.2.1", + "phpstan/phpstan-phpunit": "^1.4.0", + "phpstan/phpstan-strict-rules": "^1.6.1", + "squizlabs/php_codesniffer": "^3.10.3", + "symfony/filesystem": "^6.4.3 || ^7.1.5" + }, + "bin": [ + "bin/paratest", + "bin/paratest_for_phpstorm" + ], + "type": "library", + "autoload": { + "psr-4": { + "ParaTest\\": [ + "src/" + ] + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Brian Scaturro", + "email": "scaturrob@gmail.com", + "role": "Developer" + }, + { + "name": "Filippo Tessarotto", + "email": "zoeslam@gmail.com", + "role": "Developer" + } + ], + "description": "Parallel testing for PHP", + "homepage": "https://github.com/paratestphp/paratest", + "keywords": [ + "concurrent", + "parallel", + "phpunit", + "testing" + ], + "support": { + "issues": "https://github.com/paratestphp/paratest/issues", + "source": "https://github.com/paratestphp/paratest/tree/v7.4.8" + }, + "funding": [ + { + "url": "https://github.com/sponsors/Slamdunk", + "type": "github" + }, + { + "url": "https://paypal.me/filippotessarotto", + "type": "paypal" + } + ], + "time": "2024-10-15T12:45:19+00:00" + }, + { + "name": "fakerphp/faker", + "version": "v1.24.1", + "source": { + "type": "git", + "url": "https://github.com/FakerPHP/Faker.git", + "reference": "e0ee18eb1e6dc3cda3ce9fd97e5a0689a88a64b5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/FakerPHP/Faker/zipball/e0ee18eb1e6dc3cda3ce9fd97e5a0689a88a64b5", + "reference": "e0ee18eb1e6dc3cda3ce9fd97e5a0689a88a64b5", + "shasum": "" + }, + "require": { + "php": "^7.4 || ^8.0", + "psr/container": "^1.0 || ^2.0", + "symfony/deprecation-contracts": "^2.2 || ^3.0" + }, + "conflict": { + "fzaninotto/faker": "*" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.4.1", + "doctrine/persistence": "^1.3 || ^2.0", + "ext-intl": "*", + "phpunit/phpunit": "^9.5.26", + "symfony/phpunit-bridge": "^5.4.16" + }, + "suggest": { + "doctrine/orm": "Required to use Faker\\ORM\\Doctrine", + "ext-curl": "Required by Faker\\Provider\\Image to download images.", + "ext-dom": "Required by Faker\\Provider\\HtmlLorem for generating random HTML.", + "ext-iconv": "Required by Faker\\Provider\\ru_RU\\Text::realText() for generating real Russian text.", + "ext-mbstring": "Required for multibyte Unicode string functionality." + }, + "type": "library", + "autoload": { + "psr-4": { + "Faker\\": "src/Faker/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "François Zaninotto" + } + ], + "description": "Faker is a PHP library that generates fake data for you.", + "keywords": [ + "data", + "faker", + "fixtures" + ], + "support": { + "issues": "https://github.com/FakerPHP/Faker/issues", + "source": "https://github.com/FakerPHP/Faker/tree/v1.24.1" + }, + "time": "2024-11-21T13:46:39+00:00" + }, + { + "name": "fidry/cpu-core-counter", + "version": "1.2.0", + "source": { + "type": "git", + "url": "https://github.com/theofidry/cpu-core-counter.git", + "reference": "8520451a140d3f46ac33042715115e290cf5785f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/theofidry/cpu-core-counter/zipball/8520451a140d3f46ac33042715115e290cf5785f", + "reference": "8520451a140d3f46ac33042715115e290cf5785f", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "require-dev": { + "fidry/makefile": "^0.2.0", + "fidry/php-cs-fixer-config": "^1.1.2", + "phpstan/extension-installer": "^1.2.0", + "phpstan/phpstan": "^1.9.2", + "phpstan/phpstan-deprecation-rules": "^1.0.0", + "phpstan/phpstan-phpunit": "^1.2.2", + "phpstan/phpstan-strict-rules": "^1.4.4", + "phpunit/phpunit": "^8.5.31 || ^9.5.26", + "webmozarts/strict-phpunit": "^7.5" + }, + "type": "library", + "autoload": { + "psr-4": { + "Fidry\\CpuCoreCounter\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Théo FIDRY", + "email": "theo.fidry@gmail.com" + } + ], + "description": "Tiny utility to get the number of CPU cores.", + "keywords": [ + "CPU", + "core" + ], + "support": { + "issues": "https://github.com/theofidry/cpu-core-counter/issues", + "source": "https://github.com/theofidry/cpu-core-counter/tree/1.2.0" + }, + "funding": [ + { + "url": "https://github.com/theofidry", + "type": "github" + } + ], + "time": "2024-08-06T10:04:20+00:00" + }, + { + "name": "filp/whoops", + "version": "2.17.0", + "source": { + "type": "git", + "url": "https://github.com/filp/whoops.git", + "reference": "075bc0c26631110584175de6523ab3f1652eb28e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/filp/whoops/zipball/075bc0c26631110584175de6523ab3f1652eb28e", + "reference": "075bc0c26631110584175de6523ab3f1652eb28e", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0", + "psr/log": "^1.0.1 || ^2.0 || ^3.0" + }, + "require-dev": { + "mockery/mockery": "^1.0", + "phpunit/phpunit": "^7.5.20 || ^8.5.8 || ^9.3.3", + "symfony/var-dumper": "^4.0 || ^5.0" + }, + "suggest": { + "symfony/var-dumper": "Pretty print complex values better with var-dumper available", + "whoops/soap": "Formats errors as SOAP responses" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.7-dev" + } + }, + "autoload": { + "psr-4": { + "Whoops\\": "src/Whoops/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Filipe Dobreira", + "homepage": "https://github.com/filp", + "role": "Developer" + } + ], + "description": "php error handling for cool kids", + "homepage": "https://filp.github.io/whoops/", + "keywords": [ + "error", + "exception", + "handling", + "library", + "throwable", + "whoops" + ], + "support": { + "issues": "https://github.com/filp/whoops/issues", + "source": "https://github.com/filp/whoops/tree/2.17.0" + }, + "funding": [ + { + "url": "https://github.com/denis-sokolov", + "type": "github" + } + ], + "time": "2025-01-25T12:00:00+00:00" + }, + { + "name": "hamcrest/hamcrest-php", + "version": "v2.0.1", + "source": { + "type": "git", + "url": "https://github.com/hamcrest/hamcrest-php.git", + "reference": "8c3d0a3f6af734494ad8f6fbbee0ba92422859f3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/hamcrest/hamcrest-php/zipball/8c3d0a3f6af734494ad8f6fbbee0ba92422859f3", + "reference": "8c3d0a3f6af734494ad8f6fbbee0ba92422859f3", + "shasum": "" + }, + "require": { + "php": "^5.3|^7.0|^8.0" + }, + "replace": { + "cordoval/hamcrest-php": "*", + "davedevelopment/hamcrest-php": "*", + "kodova/hamcrest-php": "*" + }, + "require-dev": { + "phpunit/php-file-iterator": "^1.4 || ^2.0", + "phpunit/phpunit": "^4.8.36 || ^5.7 || ^6.5 || ^7.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.1-dev" + } + }, + "autoload": { + "classmap": [ + "hamcrest" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "This is the PHP port of Hamcrest Matchers", + "keywords": [ + "test" + ], + "support": { + "issues": "https://github.com/hamcrest/hamcrest-php/issues", + "source": "https://github.com/hamcrest/hamcrest-php/tree/v2.0.1" + }, + "time": "2020-07-09T08:09:16+00:00" + }, + { + "name": "jean85/pretty-package-versions", + "version": "2.1.0", + "source": { + "type": "git", + "url": "https://github.com/Jean85/pretty-package-versions.git", + "reference": "3c4e5f62ba8d7de1734312e4fff32f67a8daaf10" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Jean85/pretty-package-versions/zipball/3c4e5f62ba8d7de1734312e4fff32f67a8daaf10", + "reference": "3c4e5f62ba8d7de1734312e4fff32f67a8daaf10", + "shasum": "" + }, + "require": { + "composer-runtime-api": "^2.1.0", + "php": "^7.4|^8.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^3.2", + "jean85/composer-provided-replaced-stub-package": "^1.0", + "phpstan/phpstan": "^1.4", + "phpunit/phpunit": "^7.5|^8.5|^9.6", + "vimeo/psalm": "^4.3 || ^5.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Jean85\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Alessandro Lai", + "email": "alessandro.lai85@gmail.com" + } + ], + "description": "A library to get pretty versions strings of installed dependencies", + "keywords": [ + "composer", + "package", + "release", + "versions" + ], + "support": { + "issues": "https://github.com/Jean85/pretty-package-versions/issues", + "source": "https://github.com/Jean85/pretty-package-versions/tree/2.1.0" + }, + "time": "2024-11-18T16:19:46+00:00" + }, + { + "name": "krayin/krayin-package-generator", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/krayin/krayin-package-generator.git", + "reference": "b9a61169ca985e45e83b9225c885b77692793f39" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/krayin/krayin-package-generator/zipball/b9a61169ca985e45e83b9225c885b77692793f39", + "reference": "b9a61169ca985e45e83b9225c885b77692793f39", + "shasum": "" + }, + "default-branch": true, + "type": "library", + "extra": { + "laravel": { + "aliases": [], + "providers": [ + "Webkul\\PackageGenerator\\Providers\\PackageGeneratorServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Webkul\\PackageGenerator\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jitendra Singh", + "email": "jitendra@webkul.com" + } + ], + "description": "Krayin Package Generator", + "support": { + "issues": "https://github.com/krayin/krayin-package-generator/issues", + "source": "https://github.com/krayin/krayin-package-generator/tree/v2.0.0" + }, + "time": "2024-09-27T04:57:16+00:00" + }, + { + "name": "laravel/pint", + "version": "v1.21.1", + "source": { + "type": "git", + "url": "https://github.com/laravel/pint.git", + "reference": "c44bffbb2334e90fba560933c45948fa4a3f3e86" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/pint/zipball/c44bffbb2334e90fba560933c45948fa4a3f3e86", + "reference": "c44bffbb2334e90fba560933c45948fa4a3f3e86", + "shasum": "" + }, + "require": { + "ext-json": "*", + "ext-mbstring": "*", + "ext-tokenizer": "*", + "ext-xml": "*", + "php": "^8.2.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^3.70.2", + "illuminate/view": "^11.44.1", + "larastan/larastan": "^3.1.0", + "laravel-zero/framework": "^11.36.1", + "mockery/mockery": "^1.6.12", + "nunomaduro/termwind": "^2.3", + "pestphp/pest": "^2.36.0" + }, + "bin": [ + "builds/pint" + ], + "type": "project", + "autoload": { + "psr-4": { + "App\\": "app/", + "Database\\Seeders\\": "database/seeders/", + "Database\\Factories\\": "database/factories/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nuno Maduro", + "email": "enunomaduro@gmail.com" + } + ], + "description": "An opinionated code formatter for PHP.", + "homepage": "https://laravel.com", + "keywords": [ + "format", + "formatter", + "lint", + "linter", + "php" + ], + "support": { + "issues": "https://github.com/laravel/pint/issues", + "source": "https://github.com/laravel/pint" + }, + "time": "2025-03-11T03:22:21+00:00" + }, + { + "name": "laravel/sail", + "version": "v1.41.0", + "source": { + "type": "git", + "url": "https://github.com/laravel/sail.git", + "reference": "fe1a4ada0abb5e4bd99eb4e4b0d87906c00cdeec" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/sail/zipball/fe1a4ada0abb5e4bd99eb4e4b0d87906c00cdeec", + "reference": "fe1a4ada0abb5e4bd99eb4e4b0d87906c00cdeec", + "shasum": "" + }, + "require": { + "illuminate/console": "^9.52.16|^10.0|^11.0|^12.0", + "illuminate/contracts": "^9.52.16|^10.0|^11.0|^12.0", + "illuminate/support": "^9.52.16|^10.0|^11.0|^12.0", + "php": "^8.0", + "symfony/console": "^6.0|^7.0", + "symfony/yaml": "^6.0|^7.0" + }, + "require-dev": { + "orchestra/testbench": "^7.0|^8.0|^9.0|^10.0", + "phpstan/phpstan": "^1.10" + }, + "bin": [ + "bin/sail" + ], + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Laravel\\Sail\\SailServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Laravel\\Sail\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "Docker files for running a basic Laravel application.", + "keywords": [ + "docker", + "laravel" + ], + "support": { + "issues": "https://github.com/laravel/sail/issues", + "source": "https://github.com/laravel/sail" + }, + "time": "2025-01-24T15:45:36+00:00" + }, + { + "name": "mockery/mockery", + "version": "1.6.12", + "source": { + "type": "git", + "url": "https://github.com/mockery/mockery.git", + "reference": "1f4efdd7d3beafe9807b08156dfcb176d18f1699" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/mockery/mockery/zipball/1f4efdd7d3beafe9807b08156dfcb176d18f1699", + "reference": "1f4efdd7d3beafe9807b08156dfcb176d18f1699", + "shasum": "" + }, + "require": { + "hamcrest/hamcrest-php": "^2.0.1", + "lib-pcre": ">=7.0", + "php": ">=7.3" + }, + "conflict": { + "phpunit/phpunit": "<8.0" + }, + "require-dev": { + "phpunit/phpunit": "^8.5 || ^9.6.17", + "symplify/easy-coding-standard": "^12.1.14" + }, + "type": "library", + "autoload": { + "files": [ + "library/helpers.php", + "library/Mockery.php" + ], + "psr-4": { + "Mockery\\": "library/Mockery" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Pádraic Brady", + "email": "padraic.brady@gmail.com", + "homepage": "https://github.com/padraic", + "role": "Author" + }, + { + "name": "Dave Marshall", + "email": "dave.marshall@atstsolutions.co.uk", + "homepage": "https://davedevelopment.co.uk", + "role": "Developer" + }, + { + "name": "Nathanael Esayeas", + "email": "nathanael.esayeas@protonmail.com", + "homepage": "https://github.com/ghostwriter", + "role": "Lead Developer" + } + ], + "description": "Mockery is a simple yet flexible PHP mock object framework", + "homepage": "https://github.com/mockery/mockery", + "keywords": [ + "BDD", + "TDD", + "library", + "mock", + "mock objects", + "mockery", + "stub", + "test", + "test double", + "testing" + ], + "support": { + "docs": "https://docs.mockery.io/", + "issues": "https://github.com/mockery/mockery/issues", + "rss": "https://github.com/mockery/mockery/releases.atom", + "security": "https://github.com/mockery/mockery/security/advisories", + "source": "https://github.com/mockery/mockery" + }, + "time": "2024-05-16T03:13:13+00:00" + }, + { + "name": "nunomaduro/collision", + "version": "v7.11.0", + "source": { + "type": "git", + "url": "https://github.com/nunomaduro/collision.git", + "reference": "994ea93df5d4132f69d3f1bd74730509df6e8a05" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nunomaduro/collision/zipball/994ea93df5d4132f69d3f1bd74730509df6e8a05", + "reference": "994ea93df5d4132f69d3f1bd74730509df6e8a05", + "shasum": "" + }, + "require": { + "filp/whoops": "^2.16.0", + "nunomaduro/termwind": "^1.15.1", + "php": "^8.1.0", + "symfony/console": "^6.4.12" + }, + "conflict": { + "laravel/framework": ">=11.0.0" + }, + "require-dev": { + "brianium/paratest": "^7.3.1", + "laravel/framework": "^10.48.22", + "laravel/pint": "^1.18.1", + "laravel/sail": "^1.36.0", + "laravel/sanctum": "^3.3.3", + "laravel/tinker": "^2.10.0", + "nunomaduro/larastan": "^2.9.8", + "orchestra/testbench-core": "^8.28.3", + "pestphp/pest": "^2.35.1", + "phpunit/phpunit": "^10.5.36", + "sebastian/environment": "^6.1.0", + "spatie/laravel-ignition": "^2.8.0" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "NunoMaduro\\Collision\\Adapters\\Laravel\\CollisionServiceProvider" + ] + } + }, + "autoload": { + "files": [ + "./src/Adapters/Phpunit/Autoload.php" + ], + "psr-4": { + "NunoMaduro\\Collision\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nuno Maduro", + "email": "enunomaduro@gmail.com" + } + ], + "description": "Cli error handling for console/command-line PHP applications.", + "keywords": [ + "artisan", + "cli", + "command-line", + "console", + "error", + "handling", + "laravel", + "laravel-zero", + "php", + "symfony" + ], + "support": { + "issues": "https://github.com/nunomaduro/collision/issues", + "source": "https://github.com/nunomaduro/collision" + }, + "funding": [ + { + "url": "https://www.paypal.com/paypalme/enunomaduro", + "type": "custom" + }, + { + "url": "https://github.com/nunomaduro", + "type": "github" + }, + { + "url": "https://www.patreon.com/nunomaduro", + "type": "patreon" + } + ], + "time": "2024-10-15T15:12:40+00:00" + }, + { + "name": "pestphp/pest", + "version": "v2.36.0", + "source": { + "type": "git", + "url": "https://github.com/pestphp/pest.git", + "reference": "f8c88bd14dc1772bfaf02169afb601ecdf2724cd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/pestphp/pest/zipball/f8c88bd14dc1772bfaf02169afb601ecdf2724cd", + "reference": "f8c88bd14dc1772bfaf02169afb601ecdf2724cd", + "shasum": "" + }, + "require": { + "brianium/paratest": "^7.3.1", + "nunomaduro/collision": "^7.11.0|^8.4.0", + "nunomaduro/termwind": "^1.16.0|^2.1.0", + "pestphp/pest-plugin": "^2.1.1", + "pestphp/pest-plugin-arch": "^2.7.0", + "php": "^8.1.0", + "phpunit/phpunit": "^10.5.36" + }, + "conflict": { + "filp/whoops": "<2.16.0", + "phpunit/phpunit": ">10.5.36", + "sebastian/exporter": "<5.1.0", + "webmozart/assert": "<1.11.0" + }, + "require-dev": { + "pestphp/pest-dev-tools": "^2.17.0", + "pestphp/pest-plugin-type-coverage": "^2.8.7", + "symfony/process": "^6.4.0|^7.1.5" + }, + "bin": [ + "bin/pest" + ], + "type": "library", + "extra": { + "pest": { + "plugins": [ + "Pest\\Plugins\\Bail", + "Pest\\Plugins\\Cache", + "Pest\\Plugins\\Coverage", + "Pest\\Plugins\\Init", + "Pest\\Plugins\\Environment", + "Pest\\Plugins\\Help", + "Pest\\Plugins\\Memory", + "Pest\\Plugins\\Only", + "Pest\\Plugins\\Printer", + "Pest\\Plugins\\ProcessIsolation", + "Pest\\Plugins\\Profile", + "Pest\\Plugins\\Retry", + "Pest\\Plugins\\Snapshot", + "Pest\\Plugins\\Verbose", + "Pest\\Plugins\\Version", + "Pest\\Plugins\\Parallel" + ] + }, + "phpstan": { + "includes": [ + "extension.neon" + ] + } + }, + "autoload": { + "files": [ + "src/Functions.php", + "src/Pest.php" + ], + "psr-4": { + "Pest\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nuno Maduro", + "email": "enunomaduro@gmail.com" + } + ], + "description": "The elegant PHP Testing Framework.", + "keywords": [ + "framework", + "pest", + "php", + "test", + "testing", + "unit" + ], + "support": { + "issues": "https://github.com/pestphp/pest/issues", + "source": "https://github.com/pestphp/pest/tree/v2.36.0" + }, + "funding": [ + { + "url": "https://www.paypal.com/paypalme/enunomaduro", + "type": "custom" + }, + { + "url": "https://github.com/nunomaduro", + "type": "github" + } + ], + "time": "2024-10-15T15:30:56+00:00" + }, + { + "name": "pestphp/pest-plugin", + "version": "v2.1.1", + "source": { + "type": "git", + "url": "https://github.com/pestphp/pest-plugin.git", + "reference": "e05d2859e08c2567ee38ce8b005d044e72648c0b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/pestphp/pest-plugin/zipball/e05d2859e08c2567ee38ce8b005d044e72648c0b", + "reference": "e05d2859e08c2567ee38ce8b005d044e72648c0b", + "shasum": "" + }, + "require": { + "composer-plugin-api": "^2.0.0", + "composer-runtime-api": "^2.2.2", + "php": "^8.1" + }, + "conflict": { + "pestphp/pest": "<2.2.3" + }, + "require-dev": { + "composer/composer": "^2.5.8", + "pestphp/pest": "^2.16.0", + "pestphp/pest-dev-tools": "^2.16.0" + }, + "type": "composer-plugin", + "extra": { + "class": "Pest\\Plugin\\Manager" + }, + "autoload": { + "psr-4": { + "Pest\\Plugin\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "The Pest plugin manager", + "keywords": [ + "framework", + "manager", + "pest", + "php", + "plugin", + "test", + "testing", + "unit" + ], + "support": { + "source": "https://github.com/pestphp/pest-plugin/tree/v2.1.1" + }, + "funding": [ + { + "url": "https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=66BYDWAT92N6L", + "type": "custom" + }, + { + "url": "https://github.com/nunomaduro", + "type": "github" + }, + { + "url": "https://www.patreon.com/nunomaduro", + "type": "patreon" + } + ], + "time": "2023-08-22T08:40:06+00:00" + }, + { + "name": "pestphp/pest-plugin-arch", + "version": "v2.7.0", + "source": { + "type": "git", + "url": "https://github.com/pestphp/pest-plugin-arch.git", + "reference": "d23b2d7498475354522c3818c42ef355dca3fcda" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/pestphp/pest-plugin-arch/zipball/d23b2d7498475354522c3818c42ef355dca3fcda", + "reference": "d23b2d7498475354522c3818c42ef355dca3fcda", + "shasum": "" + }, + "require": { + "nunomaduro/collision": "^7.10.0|^8.1.0", + "pestphp/pest-plugin": "^2.1.1", + "php": "^8.1", + "ta-tikoma/phpunit-architecture-test": "^0.8.4" + }, + "require-dev": { + "pestphp/pest": "^2.33.0", + "pestphp/pest-dev-tools": "^2.16.0" + }, + "type": "library", + "extra": { + "pest": { + "plugins": [ + "Pest\\Arch\\Plugin" + ] + } + }, + "autoload": { + "files": [ + "src/Autoload.php" + ], + "psr-4": { + "Pest\\Arch\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "The Arch plugin for Pest PHP.", + "keywords": [ + "arch", + "architecture", + "framework", + "pest", + "php", + "plugin", + "test", + "testing", + "unit" + ], + "support": { + "source": "https://github.com/pestphp/pest-plugin-arch/tree/v2.7.0" + }, + "funding": [ + { + "url": "https://www.paypal.com/paypalme/enunomaduro", + "type": "custom" + }, + { + "url": "https://github.com/nunomaduro", + "type": "github" + } + ], + "time": "2024-01-26T09:46:42+00:00" + }, + { + "name": "pestphp/pest-plugin-laravel", + "version": "v2.4.0", + "source": { + "type": "git", + "url": "https://github.com/pestphp/pest-plugin-laravel.git", + "reference": "53df51169a7f9595e06839cce638c73e59ace5e8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/pestphp/pest-plugin-laravel/zipball/53df51169a7f9595e06839cce638c73e59ace5e8", + "reference": "53df51169a7f9595e06839cce638c73e59ace5e8", + "shasum": "" + }, + "require": { + "laravel/framework": "^10.48.9|^11.5.0", + "pestphp/pest": "^2.34.7", + "php": "^8.1.0" + }, + "require-dev": { + "laravel/dusk": "^7.13.0", + "orchestra/testbench": "^8.22.3|^9.0.4", + "pestphp/pest-dev-tools": "^2.16.0" + }, + "type": "library", + "extra": { + "pest": { + "plugins": [ + "Pest\\Laravel\\Plugin" + ] + }, + "laravel": { + "providers": [ + "Pest\\Laravel\\PestServiceProvider" + ] + } + }, + "autoload": { + "files": [ + "src/Autoload.php" + ], + "psr-4": { + "Pest\\Laravel\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "The Pest Laravel Plugin", + "keywords": [ + "framework", + "laravel", + "pest", + "php", + "test", + "testing", + "unit" + ], + "support": { + "source": "https://github.com/pestphp/pest-plugin-laravel/tree/v2.4.0" + }, + "funding": [ + { + "url": "https://www.paypal.com/paypalme/enunomaduro", + "type": "custom" + }, + { + "url": "https://github.com/nunomaduro", + "type": "github" + } + ], + "time": "2024-04-27T10:41:54+00:00" + }, + { + "name": "phar-io/manifest", + "version": "2.0.4", + "source": { + "type": "git", + "url": "https://github.com/phar-io/manifest.git", + "reference": "54750ef60c58e43759730615a392c31c80e23176" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phar-io/manifest/zipball/54750ef60c58e43759730615a392c31c80e23176", + "reference": "54750ef60c58e43759730615a392c31c80e23176", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-libxml": "*", + "ext-phar": "*", + "ext-xmlwriter": "*", + "phar-io/version": "^3.0.1", + "php": "^7.2 || ^8.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + }, + { + "name": "Sebastian Heuer", + "email": "sebastian@phpeople.de", + "role": "Developer" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "Developer" + } + ], + "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", + "support": { + "issues": "https://github.com/phar-io/manifest/issues", + "source": "https://github.com/phar-io/manifest/tree/2.0.4" + }, + "funding": [ + { + "url": "https://github.com/theseer", + "type": "github" + } + ], + "time": "2024-03-03T12:33:53+00:00" + }, + { + "name": "phar-io/version", + "version": "3.2.1", + "source": { + "type": "git", + "url": "https://github.com/phar-io/version.git", + "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phar-io/version/zipball/4f7fd7836c6f332bb2933569e566a0d6c4cbed74", + "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + }, + { + "name": "Sebastian Heuer", + "email": "sebastian@phpeople.de", + "role": "Developer" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "Developer" + } + ], + "description": "Library for handling version information and constraints", + "support": { + "issues": "https://github.com/phar-io/version/issues", + "source": "https://github.com/phar-io/version/tree/3.2.1" + }, + "time": "2022-02-21T01:04:05+00:00" + }, + { + "name": "php-debugbar/php-debugbar", + "version": "v2.1.6", + "source": { + "type": "git", + "url": "https://github.com/php-debugbar/php-debugbar.git", + "reference": "16fa68da5617220594aa5e33fa9de415f94784a0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-debugbar/php-debugbar/zipball/16fa68da5617220594aa5e33fa9de415f94784a0", + "reference": "16fa68da5617220594aa5e33fa9de415f94784a0", + "shasum": "" + }, + "require": { + "php": "^8", + "psr/log": "^1|^2|^3", + "symfony/var-dumper": "^4|^5|^6|^7" + }, + "require-dev": { + "dbrekelmans/bdi": "^1", + "phpunit/phpunit": "^8|^9", + "symfony/panther": "^1|^2.1", + "twig/twig": "^1.38|^2.7|^3.0" + }, + "suggest": { + "kriswallsmith/assetic": "The best way to manage assets", + "monolog/monolog": "Log using Monolog", + "predis/predis": "Redis storage" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0-dev" + } + }, + "autoload": { + "psr-4": { + "DebugBar\\": "src/DebugBar/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Maxime Bouroumeau-Fuseau", + "email": "maxime.bouroumeau@gmail.com", + "homepage": "http://maximebf.com" + }, + { + "name": "Barry vd. Heuvel", + "email": "barryvdh@gmail.com" + } + ], + "description": "Debug bar in the browser for php application", + "homepage": "https://github.com/php-debugbar/php-debugbar", + "keywords": [ + "debug", + "debug bar", + "debugbar", + "dev" + ], + "support": { + "issues": "https://github.com/php-debugbar/php-debugbar/issues", + "source": "https://github.com/php-debugbar/php-debugbar/tree/v2.1.6" + }, + "time": "2025-02-21T17:47:03+00:00" + }, + { + "name": "phpdocumentor/reflection-common", + "version": "2.2.0", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/ReflectionCommon.git", + "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/1d01c49d4ed62f25aa84a747ad35d5a16924662b", + "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-2.x": "2.x-dev" + } + }, + "autoload": { + "psr-4": { + "phpDocumentor\\Reflection\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jaap van Otterdijk", + "email": "opensource@ijaap.nl" + } + ], + "description": "Common reflection classes used by phpdocumentor to reflect the code structure", + "homepage": "http://www.phpdoc.org", + "keywords": [ + "FQSEN", + "phpDocumentor", + "phpdoc", + "reflection", + "static analysis" + ], + "support": { + "issues": "https://github.com/phpDocumentor/ReflectionCommon/issues", + "source": "https://github.com/phpDocumentor/ReflectionCommon/tree/2.x" + }, + "time": "2020-06-27T09:03:43+00:00" + }, + { + "name": "phpdocumentor/reflection-docblock", + "version": "5.6.1", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", + "reference": "e5e784149a09bd69d9a5e3b01c5cbd2e2bd653d8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/e5e784149a09bd69d9a5e3b01c5cbd2e2bd653d8", + "reference": "e5e784149a09bd69d9a5e3b01c5cbd2e2bd653d8", + "shasum": "" + }, + "require": { + "doctrine/deprecations": "^1.1", + "ext-filter": "*", + "php": "^7.4 || ^8.0", + "phpdocumentor/reflection-common": "^2.2", + "phpdocumentor/type-resolver": "^1.7", + "phpstan/phpdoc-parser": "^1.7|^2.0", + "webmozart/assert": "^1.9.1" + }, + "require-dev": { + "mockery/mockery": "~1.3.5 || ~1.6.0", + "phpstan/extension-installer": "^1.1", + "phpstan/phpstan": "^1.8", + "phpstan/phpstan-mockery": "^1.1", + "phpstan/phpstan-webmozart-assert": "^1.2", + "phpunit/phpunit": "^9.5", + "psalm/phar": "^5.26" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.x-dev" + } + }, + "autoload": { + "psr-4": { + "phpDocumentor\\Reflection\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mike van Riel", + "email": "me@mikevanriel.com" + }, + { + "name": "Jaap van Otterdijk", + "email": "opensource@ijaap.nl" + } + ], + "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", + "support": { + "issues": "https://github.com/phpDocumentor/ReflectionDocBlock/issues", + "source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/5.6.1" + }, + "time": "2024-12-07T09:39:29+00:00" + }, + { + "name": "phpdocumentor/type-resolver", + "version": "1.10.0", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/TypeResolver.git", + "reference": "679e3ce485b99e84c775d28e2e96fade9a7fb50a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/679e3ce485b99e84c775d28e2e96fade9a7fb50a", + "reference": "679e3ce485b99e84c775d28e2e96fade9a7fb50a", + "shasum": "" + }, + "require": { + "doctrine/deprecations": "^1.0", + "php": "^7.3 || ^8.0", + "phpdocumentor/reflection-common": "^2.0", + "phpstan/phpdoc-parser": "^1.18|^2.0" + }, + "require-dev": { + "ext-tokenizer": "*", + "phpbench/phpbench": "^1.2", + "phpstan/extension-installer": "^1.1", + "phpstan/phpstan": "^1.8", + "phpstan/phpstan-phpunit": "^1.1", + "phpunit/phpunit": "^9.5", + "rector/rector": "^0.13.9", + "vimeo/psalm": "^4.25" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-1.x": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "phpDocumentor\\Reflection\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mike van Riel", + "email": "me@mikevanriel.com" + } + ], + "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names", + "support": { + "issues": "https://github.com/phpDocumentor/TypeResolver/issues", + "source": "https://github.com/phpDocumentor/TypeResolver/tree/1.10.0" + }, + "time": "2024-11-09T15:12:26+00:00" + }, + { + "name": "phpstan/phpdoc-parser", + "version": "2.1.0", + "source": { + "type": "git", + "url": "https://github.com/phpstan/phpdoc-parser.git", + "reference": "9b30d6fd026b2c132b3985ce6b23bec09ab3aa68" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/9b30d6fd026b2c132b3985ce6b23bec09ab3aa68", + "reference": "9b30d6fd026b2c132b3985ce6b23bec09ab3aa68", + "shasum": "" + }, + "require": { + "php": "^7.4 || ^8.0" + }, + "require-dev": { + "doctrine/annotations": "^2.0", + "nikic/php-parser": "^5.3.0", + "php-parallel-lint/php-parallel-lint": "^1.2", + "phpstan/extension-installer": "^1.0", + "phpstan/phpstan": "^2.0", + "phpstan/phpstan-phpunit": "^2.0", + "phpstan/phpstan-strict-rules": "^2.0", + "phpunit/phpunit": "^9.6", + "symfony/process": "^5.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "PHPStan\\PhpDocParser\\": [ + "src/" + ] + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "PHPDoc parser with support for nullable, intersection and generic types", + "support": { + "issues": "https://github.com/phpstan/phpdoc-parser/issues", + "source": "https://github.com/phpstan/phpdoc-parser/tree/2.1.0" + }, + "time": "2025-02-19T13:28:12+00:00" + }, + { + "name": "phpunit/php-code-coverage", + "version": "10.1.16", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-code-coverage.git", + "reference": "7e308268858ed6baedc8704a304727d20bc07c77" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/7e308268858ed6baedc8704a304727d20bc07c77", + "reference": "7e308268858ed6baedc8704a304727d20bc07c77", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-libxml": "*", + "ext-xmlwriter": "*", + "nikic/php-parser": "^4.19.1 || ^5.1.0", + "php": ">=8.1", + "phpunit/php-file-iterator": "^4.1.0", + "phpunit/php-text-template": "^3.0.1", + "sebastian/code-unit-reverse-lookup": "^3.0.0", + "sebastian/complexity": "^3.2.0", + "sebastian/environment": "^6.1.0", + "sebastian/lines-of-code": "^2.0.2", + "sebastian/version": "^4.0.1", + "theseer/tokenizer": "^1.2.3" + }, + "require-dev": { + "phpunit/phpunit": "^10.1" + }, + "suggest": { + "ext-pcov": "PHP extension that provides line coverage", + "ext-xdebug": "PHP extension that provides line coverage as well as branch and path coverage" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "10.1.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", + "homepage": "https://github.com/sebastianbergmann/php-code-coverage", + "keywords": [ + "coverage", + "testing", + "xunit" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", + "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/10.1.16" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-08-22T04:31:57+00:00" + }, + { + "name": "phpunit/php-file-iterator", + "version": "4.1.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-file-iterator.git", + "reference": "a95037b6d9e608ba092da1b23931e537cadc3c3c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/a95037b6d9e608ba092da1b23931e537cadc3c3c", + "reference": "a95037b6d9e608ba092da1b23931e537cadc3c3c", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "FilterIterator implementation that filters files based on a list of suffixes.", + "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", + "keywords": [ + "filesystem", + "iterator" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues", + "security": "https://github.com/sebastianbergmann/php-file-iterator/security/policy", + "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/4.1.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-08-31T06:24:48+00:00" + }, + { + "name": "phpunit/php-invoker", + "version": "4.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-invoker.git", + "reference": "f5e568ba02fa5ba0ddd0f618391d5a9ea50b06d7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/f5e568ba02fa5ba0ddd0f618391d5a9ea50b06d7", + "reference": "f5e568ba02fa5ba0ddd0f618391d5a9ea50b06d7", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "ext-pcntl": "*", + "phpunit/phpunit": "^10.0" + }, + "suggest": { + "ext-pcntl": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Invoke callables with a timeout", + "homepage": "https://github.com/sebastianbergmann/php-invoker/", + "keywords": [ + "process" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-invoker/issues", + "source": "https://github.com/sebastianbergmann/php-invoker/tree/4.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-03T06:56:09+00:00" + }, + { + "name": "phpunit/php-text-template", + "version": "3.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-text-template.git", + "reference": "0c7b06ff49e3d5072f057eb1fa59258bf287a748" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/0c7b06ff49e3d5072f057eb1fa59258bf287a748", + "reference": "0c7b06ff49e3d5072f057eb1fa59258bf287a748", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Simple template engine.", + "homepage": "https://github.com/sebastianbergmann/php-text-template/", + "keywords": [ + "template" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-text-template/issues", + "security": "https://github.com/sebastianbergmann/php-text-template/security/policy", + "source": "https://github.com/sebastianbergmann/php-text-template/tree/3.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-08-31T14:07:24+00:00" + }, + { + "name": "phpunit/php-timer", + "version": "6.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-timer.git", + "reference": "e2a2d67966e740530f4a3343fe2e030ffdc1161d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/e2a2d67966e740530f4a3343fe2e030ffdc1161d", + "reference": "e2a2d67966e740530f4a3343fe2e030ffdc1161d", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "6.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Utility class for timing", + "homepage": "https://github.com/sebastianbergmann/php-timer/", + "keywords": [ + "timer" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-timer/issues", + "source": "https://github.com/sebastianbergmann/php-timer/tree/6.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-03T06:57:52+00:00" + }, + { + "name": "phpunit/phpunit", + "version": "10.5.36", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/phpunit.git", + "reference": "aa0a8ce701ea7ee314b0dfaa8970dc94f3f8c870" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/aa0a8ce701ea7ee314b0dfaa8970dc94f3f8c870", + "reference": "aa0a8ce701ea7ee314b0dfaa8970dc94f3f8c870", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-json": "*", + "ext-libxml": "*", + "ext-mbstring": "*", + "ext-xml": "*", + "ext-xmlwriter": "*", + "myclabs/deep-copy": "^1.12.0", + "phar-io/manifest": "^2.0.4", + "phar-io/version": "^3.2.1", + "php": ">=8.1", + "phpunit/php-code-coverage": "^10.1.16", + "phpunit/php-file-iterator": "^4.1.0", + "phpunit/php-invoker": "^4.0.0", + "phpunit/php-text-template": "^3.0.1", + "phpunit/php-timer": "^6.0.0", + "sebastian/cli-parser": "^2.0.1", + "sebastian/code-unit": "^2.0.0", + "sebastian/comparator": "^5.0.2", + "sebastian/diff": "^5.1.1", + "sebastian/environment": "^6.1.0", + "sebastian/exporter": "^5.1.2", + "sebastian/global-state": "^6.0.2", + "sebastian/object-enumerator": "^5.0.0", + "sebastian/recursion-context": "^5.0.0", + "sebastian/type": "^4.0.0", + "sebastian/version": "^4.0.1" + }, + "suggest": { + "ext-soap": "To be able to generate mocks based on WSDL files" + }, + "bin": [ + "phpunit" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "10.5-dev" + } + }, + "autoload": { + "files": [ + "src/Framework/Assert/Functions.php" + ], + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "The PHP Unit Testing framework.", + "homepage": "https://phpunit.de/", + "keywords": [ + "phpunit", + "testing", + "xunit" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/phpunit/issues", + "security": "https://github.com/sebastianbergmann/phpunit/security/policy", + "source": "https://github.com/sebastianbergmann/phpunit/tree/10.5.36" + }, + "funding": [ + { + "url": "https://phpunit.de/sponsors.html", + "type": "custom" + }, + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpunit/phpunit", + "type": "tidelift" + } + ], + "time": "2024-10-08T15:36:51+00:00" + }, + { + "name": "sebastian/cli-parser", + "version": "2.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/cli-parser.git", + "reference": "c34583b87e7b7a8055bf6c450c2c77ce32a24084" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/c34583b87e7b7a8055bf6c450c2c77ce32a24084", + "reference": "c34583b87e7b7a8055bf6c450c2c77ce32a24084", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library for parsing CLI options", + "homepage": "https://github.com/sebastianbergmann/cli-parser", + "support": { + "issues": "https://github.com/sebastianbergmann/cli-parser/issues", + "security": "https://github.com/sebastianbergmann/cli-parser/security/policy", + "source": "https://github.com/sebastianbergmann/cli-parser/tree/2.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-03-02T07:12:49+00:00" + }, + { + "name": "sebastian/code-unit", + "version": "2.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/code-unit.git", + "reference": "a81fee9eef0b7a76af11d121767abc44c104e503" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/a81fee9eef0b7a76af11d121767abc44c104e503", + "reference": "a81fee9eef0b7a76af11d121767abc44c104e503", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Collection of value objects that represent the PHP code units", + "homepage": "https://github.com/sebastianbergmann/code-unit", + "support": { + "issues": "https://github.com/sebastianbergmann/code-unit/issues", + "source": "https://github.com/sebastianbergmann/code-unit/tree/2.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-03T06:58:43+00:00" + }, + { + "name": "sebastian/code-unit-reverse-lookup", + "version": "3.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", + "reference": "5e3a687f7d8ae33fb362c5c0743794bbb2420a1d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/5e3a687f7d8ae33fb362c5c0743794bbb2420a1d", + "reference": "5e3a687f7d8ae33fb362c5c0743794bbb2420a1d", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Looks up which function or method a line of code belongs to", + "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", + "support": { + "issues": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/issues", + "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/3.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-03T06:59:15+00:00" + }, + { + "name": "sebastian/comparator", + "version": "5.0.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/comparator.git", + "reference": "a18251eb0b7a2dcd2f7aa3d6078b18545ef0558e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/a18251eb0b7a2dcd2f7aa3d6078b18545ef0558e", + "reference": "a18251eb0b7a2dcd2f7aa3d6078b18545ef0558e", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-mbstring": "*", + "php": ">=8.1", + "sebastian/diff": "^5.0", + "sebastian/exporter": "^5.0" + }, + "require-dev": { + "phpunit/phpunit": "^10.5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "5.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Volker Dusch", + "email": "github@wallbash.com" + }, + { + "name": "Bernhard Schussek", + "email": "bschussek@2bepublished.at" + } + ], + "description": "Provides the functionality to compare PHP values for equality", + "homepage": "https://github.com/sebastianbergmann/comparator", + "keywords": [ + "comparator", + "compare", + "equality" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/comparator/issues", + "security": "https://github.com/sebastianbergmann/comparator/security/policy", + "source": "https://github.com/sebastianbergmann/comparator/tree/5.0.3" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-10-18T14:56:07+00:00" + }, + { + "name": "sebastian/complexity", + "version": "3.2.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/complexity.git", + "reference": "68ff824baeae169ec9f2137158ee529584553799" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/68ff824baeae169ec9f2137158ee529584553799", + "reference": "68ff824baeae169ec9f2137158ee529584553799", + "shasum": "" + }, + "require": { + "nikic/php-parser": "^4.18 || ^5.0", + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.2-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library for calculating the complexity of PHP code units", + "homepage": "https://github.com/sebastianbergmann/complexity", + "support": { + "issues": "https://github.com/sebastianbergmann/complexity/issues", + "security": "https://github.com/sebastianbergmann/complexity/security/policy", + "source": "https://github.com/sebastianbergmann/complexity/tree/3.2.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-12-21T08:37:17+00:00" + }, + { + "name": "sebastian/diff", + "version": "5.1.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/diff.git", + "reference": "c41e007b4b62af48218231d6c2275e4c9b975b2e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/c41e007b4b62af48218231d6c2275e4c9b975b2e", + "reference": "c41e007b4b62af48218231d6c2275e4c9b975b2e", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0", + "symfony/process": "^6.4" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "5.1-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Kore Nordmann", + "email": "mail@kore-nordmann.de" + } + ], + "description": "Diff implementation", + "homepage": "https://github.com/sebastianbergmann/diff", + "keywords": [ + "diff", + "udiff", + "unidiff", + "unified diff" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/diff/issues", + "security": "https://github.com/sebastianbergmann/diff/security/policy", + "source": "https://github.com/sebastianbergmann/diff/tree/5.1.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-03-02T07:15:17+00:00" + }, + { + "name": "sebastian/environment", + "version": "6.1.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/environment.git", + "reference": "8074dbcd93529b357029f5cc5058fd3e43666984" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/8074dbcd93529b357029f5cc5058fd3e43666984", + "reference": "8074dbcd93529b357029f5cc5058fd3e43666984", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "suggest": { + "ext-posix": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "6.1-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Provides functionality to handle HHVM/PHP environments", + "homepage": "https://github.com/sebastianbergmann/environment", + "keywords": [ + "Xdebug", + "environment", + "hhvm" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/environment/issues", + "security": "https://github.com/sebastianbergmann/environment/security/policy", + "source": "https://github.com/sebastianbergmann/environment/tree/6.1.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-03-23T08:47:14+00:00" + }, + { + "name": "sebastian/exporter", + "version": "5.1.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/exporter.git", + "reference": "955288482d97c19a372d3f31006ab3f37da47adf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/955288482d97c19a372d3f31006ab3f37da47adf", + "reference": "955288482d97c19a372d3f31006ab3f37da47adf", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "php": ">=8.1", + "sebastian/recursion-context": "^5.0" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "5.1-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Volker Dusch", + "email": "github@wallbash.com" + }, + { + "name": "Adam Harvey", + "email": "aharvey@php.net" + }, + { + "name": "Bernhard Schussek", + "email": "bschussek@gmail.com" + } + ], + "description": "Provides the functionality to export PHP variables for visualization", + "homepage": "https://www.github.com/sebastianbergmann/exporter", + "keywords": [ + "export", + "exporter" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/exporter/issues", + "security": "https://github.com/sebastianbergmann/exporter/security/policy", + "source": "https://github.com/sebastianbergmann/exporter/tree/5.1.2" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-03-02T07:17:12+00:00" + }, + { + "name": "sebastian/global-state", + "version": "6.0.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/global-state.git", + "reference": "987bafff24ecc4c9ac418cab1145b96dd6e9cbd9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/987bafff24ecc4c9ac418cab1145b96dd6e9cbd9", + "reference": "987bafff24ecc4c9ac418cab1145b96dd6e9cbd9", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "sebastian/object-reflector": "^3.0", + "sebastian/recursion-context": "^5.0" + }, + "require-dev": { + "ext-dom": "*", + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "6.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Snapshotting of global state", + "homepage": "https://www.github.com/sebastianbergmann/global-state", + "keywords": [ + "global state" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/global-state/issues", + "security": "https://github.com/sebastianbergmann/global-state/security/policy", + "source": "https://github.com/sebastianbergmann/global-state/tree/6.0.2" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-03-02T07:19:19+00:00" + }, + { + "name": "sebastian/lines-of-code", + "version": "2.0.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/lines-of-code.git", + "reference": "856e7f6a75a84e339195d48c556f23be2ebf75d0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/856e7f6a75a84e339195d48c556f23be2ebf75d0", + "reference": "856e7f6a75a84e339195d48c556f23be2ebf75d0", + "shasum": "" + }, + "require": { + "nikic/php-parser": "^4.18 || ^5.0", + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library for counting the lines of code in PHP source code", + "homepage": "https://github.com/sebastianbergmann/lines-of-code", + "support": { + "issues": "https://github.com/sebastianbergmann/lines-of-code/issues", + "security": "https://github.com/sebastianbergmann/lines-of-code/security/policy", + "source": "https://github.com/sebastianbergmann/lines-of-code/tree/2.0.2" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-12-21T08:38:20+00:00" + }, + { + "name": "sebastian/object-enumerator", + "version": "5.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/object-enumerator.git", + "reference": "202d0e344a580d7f7d04b3fafce6933e59dae906" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/202d0e344a580d7f7d04b3fafce6933e59dae906", + "reference": "202d0e344a580d7f7d04b3fafce6933e59dae906", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "sebastian/object-reflector": "^3.0", + "sebastian/recursion-context": "^5.0" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "5.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Traverses array structures and object graphs to enumerate all referenced objects", + "homepage": "https://github.com/sebastianbergmann/object-enumerator/", + "support": { + "issues": "https://github.com/sebastianbergmann/object-enumerator/issues", + "source": "https://github.com/sebastianbergmann/object-enumerator/tree/5.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-03T07:08:32+00:00" + }, + { + "name": "sebastian/object-reflector", + "version": "3.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/object-reflector.git", + "reference": "24ed13d98130f0e7122df55d06c5c4942a577957" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/24ed13d98130f0e7122df55d06c5c4942a577957", + "reference": "24ed13d98130f0e7122df55d06c5c4942a577957", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Allows reflection of object attributes, including inherited and non-public ones", + "homepage": "https://github.com/sebastianbergmann/object-reflector/", + "support": { + "issues": "https://github.com/sebastianbergmann/object-reflector/issues", + "source": "https://github.com/sebastianbergmann/object-reflector/tree/3.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-03T07:06:18+00:00" + }, + { + "name": "sebastian/recursion-context", + "version": "5.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/recursion-context.git", + "reference": "05909fb5bc7df4c52992396d0116aed689f93712" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/05909fb5bc7df4c52992396d0116aed689f93712", + "reference": "05909fb5bc7df4c52992396d0116aed689f93712", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "5.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Adam Harvey", + "email": "aharvey@php.net" + } + ], + "description": "Provides functionality to recursively process PHP variables", + "homepage": "https://github.com/sebastianbergmann/recursion-context", + "support": { + "issues": "https://github.com/sebastianbergmann/recursion-context/issues", + "source": "https://github.com/sebastianbergmann/recursion-context/tree/5.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-03T07:05:40+00:00" + }, + { + "name": "sebastian/type", + "version": "4.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/type.git", + "reference": "462699a16464c3944eefc02ebdd77882bd3925bf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/462699a16464c3944eefc02ebdd77882bd3925bf", + "reference": "462699a16464c3944eefc02ebdd77882bd3925bf", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Collection of value objects that represent the types of the PHP type system", + "homepage": "https://github.com/sebastianbergmann/type", + "support": { + "issues": "https://github.com/sebastianbergmann/type/issues", + "source": "https://github.com/sebastianbergmann/type/tree/4.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-03T07:10:45+00:00" + }, + { + "name": "sebastian/version", + "version": "4.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/version.git", + "reference": "c51fa83a5d8f43f1402e3f32a005e6262244ef17" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c51fa83a5d8f43f1402e3f32a005e6262244ef17", + "reference": "c51fa83a5d8f43f1402e3f32a005e6262244ef17", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library that helps with managing the version number of Git-hosted PHP projects", + "homepage": "https://github.com/sebastianbergmann/version", + "support": { + "issues": "https://github.com/sebastianbergmann/version/issues", + "source": "https://github.com/sebastianbergmann/version/tree/4.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-07T11:34:05+00:00" + }, + { + "name": "spatie/backtrace", + "version": "1.7.1", + "source": { + "type": "git", + "url": "https://github.com/spatie/backtrace.git", + "reference": "0f2477c520e3729de58e061b8192f161c99f770b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/backtrace/zipball/0f2477c520e3729de58e061b8192f161c99f770b", + "reference": "0f2477c520e3729de58e061b8192f161c99f770b", + "shasum": "" + }, + "require": { + "php": "^7.3 || ^8.0" + }, + "require-dev": { + "ext-json": "*", + "laravel/serializable-closure": "^1.3 || ^2.0", + "phpunit/phpunit": "^9.3 || ^11.4.3", + "spatie/phpunit-snapshot-assertions": "^4.2 || ^5.1.6", + "symfony/var-dumper": "^5.1 || ^6.0 || ^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Spatie\\Backtrace\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Freek Van de Herten", + "email": "freek@spatie.be", + "homepage": "https://spatie.be", + "role": "Developer" + } + ], + "description": "A better backtrace", + "homepage": "https://github.com/spatie/backtrace", + "keywords": [ + "Backtrace", + "spatie" + ], + "support": { + "source": "https://github.com/spatie/backtrace/tree/1.7.1" + }, + "funding": [ + { + "url": "https://github.com/sponsors/spatie", + "type": "github" + }, + { + "url": "https://spatie.be/open-source/support-us", + "type": "other" + } + ], + "time": "2024-12-02T13:28:15+00:00" + }, + { + "name": "spatie/error-solutions", + "version": "1.1.3", + "source": { + "type": "git", + "url": "https://github.com/spatie/error-solutions.git", + "reference": "e495d7178ca524f2dd0fe6a1d99a1e608e1c9936" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/error-solutions/zipball/e495d7178ca524f2dd0fe6a1d99a1e608e1c9936", + "reference": "e495d7178ca524f2dd0fe6a1d99a1e608e1c9936", + "shasum": "" + }, + "require": { + "php": "^8.0" + }, + "require-dev": { + "illuminate/broadcasting": "^10.0|^11.0|^12.0", + "illuminate/cache": "^10.0|^11.0|^12.0", + "illuminate/support": "^10.0|^11.0|^12.0", + "livewire/livewire": "^2.11|^3.5.20", + "openai-php/client": "^0.10.1", + "orchestra/testbench": "8.22.3|^9.0|^10.0", + "pestphp/pest": "^2.20|^3.0", + "phpstan/phpstan": "^2.1", + "psr/simple-cache": "^3.0", + "psr/simple-cache-implementation": "^3.0", + "spatie/ray": "^1.28", + "symfony/cache": "^5.4|^6.0|^7.0", + "symfony/process": "^5.4|^6.0|^7.0", + "vlucas/phpdotenv": "^5.5" + }, + "suggest": { + "openai-php/client": "Require get solutions from OpenAI", + "simple-cache-implementation": "To cache solutions from OpenAI" + }, + "type": "library", + "autoload": { + "psr-4": { + "Spatie\\Ignition\\": "legacy/ignition", + "Spatie\\ErrorSolutions\\": "src", + "Spatie\\LaravelIgnition\\": "legacy/laravel-ignition" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ruben Van Assche", + "email": "ruben@spatie.be", + "role": "Developer" + } + ], + "description": "This is my package error-solutions", + "homepage": "https://github.com/spatie/error-solutions", + "keywords": [ + "error-solutions", + "spatie" + ], + "support": { + "issues": "https://github.com/spatie/error-solutions/issues", + "source": "https://github.com/spatie/error-solutions/tree/1.1.3" + }, + "funding": [ + { + "url": "https://github.com/Spatie", + "type": "github" + } + ], + "time": "2025-02-14T12:29:50+00:00" + }, + { + "name": "spatie/flare-client-php", + "version": "1.10.1", + "source": { + "type": "git", + "url": "https://github.com/spatie/flare-client-php.git", + "reference": "bf1716eb98bd689451b071548ae9e70738dce62f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/flare-client-php/zipball/bf1716eb98bd689451b071548ae9e70738dce62f", + "reference": "bf1716eb98bd689451b071548ae9e70738dce62f", + "shasum": "" + }, + "require": { + "illuminate/pipeline": "^8.0|^9.0|^10.0|^11.0|^12.0", + "php": "^8.0", + "spatie/backtrace": "^1.6.1", + "symfony/http-foundation": "^5.2|^6.0|^7.0", + "symfony/mime": "^5.2|^6.0|^7.0", + "symfony/process": "^5.2|^6.0|^7.0", + "symfony/var-dumper": "^5.2|^6.0|^7.0" + }, + "require-dev": { + "dms/phpunit-arraysubset-asserts": "^0.5.0", + "pestphp/pest": "^1.20|^2.0", + "phpstan/extension-installer": "^1.1", + "phpstan/phpstan-deprecation-rules": "^1.0", + "phpstan/phpstan-phpunit": "^1.0", + "spatie/pest-plugin-snapshots": "^1.0|^2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.3.x-dev" + } + }, + "autoload": { + "files": [ + "src/helpers.php" + ], + "psr-4": { + "Spatie\\FlareClient\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Send PHP errors to Flare", + "homepage": "https://github.com/spatie/flare-client-php", + "keywords": [ + "exception", + "flare", + "reporting", + "spatie" + ], + "support": { + "issues": "https://github.com/spatie/flare-client-php/issues", + "source": "https://github.com/spatie/flare-client-php/tree/1.10.1" + }, + "funding": [ + { + "url": "https://github.com/spatie", + "type": "github" + } + ], + "time": "2025-02-14T13:42:06+00:00" + }, + { + "name": "spatie/ignition", + "version": "1.15.1", + "source": { + "type": "git", + "url": "https://github.com/spatie/ignition.git", + "reference": "31f314153020aee5af3537e507fef892ffbf8c85" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/ignition/zipball/31f314153020aee5af3537e507fef892ffbf8c85", + "reference": "31f314153020aee5af3537e507fef892ffbf8c85", + "shasum": "" + }, + "require": { + "ext-json": "*", + "ext-mbstring": "*", + "php": "^8.0", + "spatie/error-solutions": "^1.0", + "spatie/flare-client-php": "^1.7", + "symfony/console": "^5.4|^6.0|^7.0", + "symfony/var-dumper": "^5.4|^6.0|^7.0" + }, + "require-dev": { + "illuminate/cache": "^9.52|^10.0|^11.0|^12.0", + "mockery/mockery": "^1.4", + "pestphp/pest": "^1.20|^2.0", + "phpstan/extension-installer": "^1.1", + "phpstan/phpstan-deprecation-rules": "^1.0", + "phpstan/phpstan-phpunit": "^1.0", + "psr/simple-cache-implementation": "*", + "symfony/cache": "^5.4|^6.0|^7.0", + "symfony/process": "^5.4|^6.0|^7.0", + "vlucas/phpdotenv": "^5.5" + }, + "suggest": { + "openai-php/client": "Require get solutions from OpenAI", + "simple-cache-implementation": "To cache solutions from OpenAI" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.5.x-dev" + } + }, + "autoload": { + "psr-4": { + "Spatie\\Ignition\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Spatie", + "email": "info@spatie.be", + "role": "Developer" + } + ], + "description": "A beautiful error page for PHP applications.", + "homepage": "https://flareapp.io/ignition", + "keywords": [ + "error", + "flare", + "laravel", + "page" + ], + "support": { + "docs": "https://flareapp.io/docs/ignition-for-laravel/introduction", + "forum": "https://twitter.com/flareappio", + "issues": "https://github.com/spatie/ignition/issues", + "source": "https://github.com/spatie/ignition" + }, + "funding": [ + { + "url": "https://github.com/spatie", + "type": "github" + } + ], + "time": "2025-02-21T14:31:39+00:00" + }, + { + "name": "spatie/laravel-ignition", + "version": "2.9.1", + "source": { + "type": "git", + "url": "https://github.com/spatie/laravel-ignition.git", + "reference": "1baee07216d6748ebd3a65ba97381b051838707a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/laravel-ignition/zipball/1baee07216d6748ebd3a65ba97381b051838707a", + "reference": "1baee07216d6748ebd3a65ba97381b051838707a", + "shasum": "" + }, + "require": { + "ext-curl": "*", + "ext-json": "*", + "ext-mbstring": "*", + "illuminate/support": "^10.0|^11.0|^12.0", + "php": "^8.1", + "spatie/ignition": "^1.15", + "symfony/console": "^6.2.3|^7.0", + "symfony/var-dumper": "^6.2.3|^7.0" + }, + "require-dev": { + "livewire/livewire": "^2.11|^3.3.5", + "mockery/mockery": "^1.5.1", + "openai-php/client": "^0.8.1|^0.10", + "orchestra/testbench": "8.22.3|^9.0|^10.0", + "pestphp/pest": "^2.34|^3.7", + "phpstan/extension-installer": "^1.3.1", + "phpstan/phpstan-deprecation-rules": "^1.1.1|^2.0", + "phpstan/phpstan-phpunit": "^1.3.16|^2.0", + "vlucas/phpdotenv": "^5.5" + }, + "suggest": { + "openai-php/client": "Require get solutions from OpenAI", + "psr/simple-cache-implementation": "Needed to cache solutions from OpenAI" + }, + "type": "library", + "extra": { + "laravel": { + "aliases": { + "Flare": "Spatie\\LaravelIgnition\\Facades\\Flare" + }, + "providers": [ + "Spatie\\LaravelIgnition\\IgnitionServiceProvider" + ] + } + }, + "autoload": { + "files": [ + "src/helpers.php" + ], + "psr-4": { + "Spatie\\LaravelIgnition\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Spatie", + "email": "info@spatie.be", + "role": "Developer" + } + ], + "description": "A beautiful error page for Laravel applications.", + "homepage": "https://flareapp.io/ignition", + "keywords": [ + "error", + "flare", + "laravel", + "page" + ], + "support": { + "docs": "https://flareapp.io/docs/ignition-for-laravel/introduction", + "forum": "https://twitter.com/flareappio", + "issues": "https://github.com/spatie/laravel-ignition/issues", + "source": "https://github.com/spatie/laravel-ignition" + }, + "funding": [ + { + "url": "https://github.com/spatie", + "type": "github" + } + ], + "time": "2025-02-20T13:13:55+00:00" + }, + { + "name": "symfony/yaml", + "version": "v7.2.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/yaml.git", + "reference": "ac238f173df0c9c1120f862d0f599e17535a87ec" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/yaml/zipball/ac238f173df0c9c1120f862d0f599e17535a87ec", + "reference": "ac238f173df0c9c1120f862d0f599e17535a87ec", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3.0", + "symfony/polyfill-ctype": "^1.8" + }, + "conflict": { + "symfony/console": "<6.4" + }, + "require-dev": { + "symfony/console": "^6.4|^7.0" + }, + "bin": [ + "Resources/bin/yaml-lint" + ], + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Yaml\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Loads and dumps YAML files", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/yaml/tree/v7.2.3" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-01-07T12:55:42+00:00" + }, + { + "name": "ta-tikoma/phpunit-architecture-test", + "version": "0.8.4", + "source": { + "type": "git", + "url": "https://github.com/ta-tikoma/phpunit-architecture-test.git", + "reference": "89f0dea1cb0f0d5744d3ec1764a286af5e006636" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ta-tikoma/phpunit-architecture-test/zipball/89f0dea1cb0f0d5744d3ec1764a286af5e006636", + "reference": "89f0dea1cb0f0d5744d3ec1764a286af5e006636", + "shasum": "" + }, + "require": { + "nikic/php-parser": "^4.18.0 || ^5.0.0", + "php": "^8.1.0", + "phpdocumentor/reflection-docblock": "^5.3.0", + "phpunit/phpunit": "^10.5.5 || ^11.0.0", + "symfony/finder": "^6.4.0 || ^7.0.0" + }, + "require-dev": { + "laravel/pint": "^1.13.7", + "phpstan/phpstan": "^1.10.52" + }, + "type": "library", + "autoload": { + "psr-4": { + "PHPUnit\\Architecture\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ni Shi", + "email": "futik0ma011@gmail.com" + }, + { + "name": "Nuno Maduro", + "email": "enunomaduro@gmail.com" + } + ], + "description": "Methods for testing application architecture", + "keywords": [ + "architecture", + "phpunit", + "stucture", + "test", + "testing" + ], + "support": { + "issues": "https://github.com/ta-tikoma/phpunit-architecture-test/issues", + "source": "https://github.com/ta-tikoma/phpunit-architecture-test/tree/0.8.4" + }, + "time": "2024-01-05T14:10:56+00:00" + }, + { + "name": "theseer/tokenizer", + "version": "1.2.3", + "source": { + "type": "git", + "url": "https://github.com/theseer/tokenizer.git", + "reference": "737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/theseer/tokenizer/zipball/737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2", + "reference": "737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-tokenizer": "*", + "ext-xmlwriter": "*", + "php": "^7.2 || ^8.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + } + ], + "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", + "support": { + "issues": "https://github.com/theseer/tokenizer/issues", + "source": "https://github.com/theseer/tokenizer/tree/1.2.3" + }, + "funding": [ + { + "url": "https://github.com/theseer", + "type": "github" + } + ], + "time": "2024-03-03T12:36:25+00:00" + } + ], + "aliases": [], + "minimum-stability": "stable", + "stability-flags": { + "krayin/krayin-package-generator": 20 + }, + "prefer-stable": true, + "prefer-lowest": false, + "platform": { + "php": "^8.2" + }, + "platform-dev": {}, + "plugin-api-version": "2.9.0" +} diff --git a/config/app.php b/config/app.php new file mode 100644 index 0000000..16fef05 --- /dev/null +++ b/config/app.php @@ -0,0 +1,238 @@ + env('APP_NAME', 'Laravel'), + + /* + |-------------------------------------------------------------------------- + | Application Environment + |-------------------------------------------------------------------------- + | + | This value determines the "environment" your application is currently + | running in. This may determine how you prefer to configure various + | services the application utilizes. Set this in your ".env" file. + | + */ + + 'env' => env('APP_ENV', 'production'), + + /* + |-------------------------------------------------------------------------- + | Application Debug Mode + |-------------------------------------------------------------------------- + | + | When your application is in debug mode, detailed error messages with + | stack traces will be shown on every error that occurs within your + | application. If disabled, a simple generic error page is shown. + | + */ + + 'debug' => (bool) env('APP_DEBUG', false), + + /* + |-------------------------------------------------------------------------- + | Application URL + |-------------------------------------------------------------------------- + | + | This URL is used by the console to properly generate URLs when using + | the Artisan command line tool. You should set this to the root of + | your application so that it is used when running Artisan tasks. + | + */ + + 'url' => env('APP_URL', 'http://localhost'), + + /* + |-------------------------------------------------------------------------- + | Application Admin URL + |-------------------------------------------------------------------------- + | + | This URL suffix is used to define the admin url for example + | admin/ or backend/ + | + */ + + 'admin_path' => env('APP_ADMIN_PATH', 'admin'), + + 'asset_url' => env('ASSET_URL', null), + + /* + |-------------------------------------------------------------------------- + | Application Timezone + |-------------------------------------------------------------------------- + | + | Here you may specify the default timezone for your application, which + | will be used by the PHP date and date-time functions. We have gone + | ahead and set this to a sensible default for you out of the box. + | + */ + + 'timezone' => env('APP_TIMEZONE', 'Asia/Kolkata'), + + /* + |-------------------------------------------------------------------------- + | Application Locale Configuration + |-------------------------------------------------------------------------- + | + | The application locale determines the default locale that will be used + | by the translation service provider. You are free to set this value + | to any of the locales which will be supported by the application. + | + */ + + 'locale' => env('APP_LOCALE', 'en'), + + /* + |-------------------------------------------------------------------------- + | Available Locales Configuration + |-------------------------------------------------------------------------- + | + | The application available locale determines the supported locales + | by application + | + */ + + 'available_locales' => [ + 'ar' => 'Arabic', + 'en' => 'English', + 'es' => 'Español', + 'fa' => 'Persian', + 'pt_BR' => 'Portuguese', + 'tr' => 'Türkçe', + 'vi' => 'Vietnamese', + ], + + /* + |-------------------------------------------------------------------------- + | Application Fallback Locale + |-------------------------------------------------------------------------- + | + | The fallback locale determines the locale to use when the current one + | is not available. You may change the value to correspond to any of + | the language folders that are provided through your application. + | + */ + + 'fallback_locale' => 'en', + + /* + |-------------------------------------------------------------------------- + | Faker Locale + |-------------------------------------------------------------------------- + | + | This locale will be used by the Faker PHP library when generating fake + | data for your database seeds. For example, this will be used to get + | localized telephone numbers, street address information and more. + | + */ + + 'faker_locale' => 'en_US', + + /* + |-------------------------------------------------------------------------- + | Base Currency Code + |-------------------------------------------------------------------------- + | + | Here you may specify the base currency code for your application. + | + */ + + 'currency' => env('APP_CURRENCY', 'USD'), + + /* + |-------------------------------------------------------------------------- + | Encryption Key + |-------------------------------------------------------------------------- + | + | This key is used by the Illuminate encrypter service and should be set + | to a random, 32 character string, otherwise these encrypted strings + | will not be safe. Please do this before deploying an application! + | + */ + + 'key' => env('APP_KEY'), + + 'cipher' => 'AES-256-CBC', + + /* + |-------------------------------------------------------------------------- + | Autoloaded Service Providers + |-------------------------------------------------------------------------- + | + | The service providers listed here will be automatically loaded on the + | request to your application. Feel free to add your own services to + | this array to grant expanded functionality to your applications. + | + */ + + 'providers' => ServiceProvider::defaultProviders()->merge([ + /* + * Package Service Providers... + */ + Barryvdh\DomPDF\ServiceProvider::class, + Konekt\Concord\ConcordServiceProvider::class, + Prettus\Repository\Providers\RepositoryServiceProvider::class, + + /* + * Application Service Providers... + */ + App\Providers\AppServiceProvider::class, + App\Providers\AuthServiceProvider::class, + // App\Providers\BroadcastServiceProvider::class, + App\Providers\EventServiceProvider::class, + App\Providers\RouteServiceProvider::class, + App\Providers\TenancyServiceProvider::class, + + /* + * Webkul Service Providers... + */ + Webkul\Activity\Providers\ActivityServiceProvider::class, + Webkul\Admin\Providers\AdminServiceProvider::class, + Webkul\Attribute\Providers\AttributeServiceProvider::class, + Webkul\Automation\Providers\WorkflowServiceProvider::class, + Webkul\Contact\Providers\ContactServiceProvider::class, + Webkul\Core\Providers\CoreServiceProvider::class, + Webkul\DataGrid\Providers\DataGridServiceProvider::class, + Webkul\DataTransfer\Providers\DataTransferServiceProvider::class, + Webkul\EmailTemplate\Providers\EmailTemplateServiceProvider::class, + Webkul\Email\Providers\EmailServiceProvider::class, + Webkul\Marketing\Providers\MarketingServiceProvider::class, + Webkul\Installer\Providers\InstallerServiceProvider::class, + Webkul\Lead\Providers\LeadServiceProvider::class, + Webkul\Product\Providers\ProductServiceProvider::class, + Webkul\Quote\Providers\QuoteServiceProvider::class, + Webkul\Tag\Providers\TagServiceProvider::class, + Webkul\User\Providers\UserServiceProvider::class, + Webkul\Warehouse\Providers\WarehouseServiceProvider::class, + Webkul\WebForm\Providers\WebFormServiceProvider::class, + ])->toArray(), + + /* + |-------------------------------------------------------------------------- + | Class Aliases + |-------------------------------------------------------------------------- + | + | This array of class aliases will be registered when this application + | is started. However, feel free to register as many as you wish as + | the aliases are "lazy" loaded so they don't hinder performance. + | + */ + + 'aliases' => Facade::defaultAliases()->merge([])->toArray(), + +]; diff --git a/config/auth.php b/config/auth.php new file mode 100644 index 0000000..9e0d1c1 --- /dev/null +++ b/config/auth.php @@ -0,0 +1,105 @@ + [ + 'guard' => 'user', + 'passwords' => 'users', + ], + + /* + |-------------------------------------------------------------------------- + | Authentication Guards + |-------------------------------------------------------------------------- + | + | Next, you may define every authentication guard for your application. + | Of course, a great default configuration has been defined for you + | here which uses session storage and the Eloquent user provider. + | + | All authentication drivers have a user provider. This defines how the + | users are actually retrieved out of your database or other storage + | mechanisms used by this application to persist your user's data. + | + | Supported: "session", "token" + | + */ + + 'guards' => [ + 'user' => [ + 'driver' => 'session', + 'provider' => 'users', + ], + ], + + /* + |-------------------------------------------------------------------------- + | User Providers + |-------------------------------------------------------------------------- + | + | All authentication drivers have a user provider. This defines how the + | users are actually retrieved out of your database or other storage + | mechanisms used by this application to persist your user's data. + | + | If you have multiple user tables or models you may configure multiple + | sources which represent each model / table. These sources may then + | be assigned to any extra authentication guards you have defined. + | + | Supported: "database", "eloquent" + | + */ + + 'providers' => [ + 'users' => [ + 'driver' => 'eloquent', + 'model' => Webkul\User\Models\User::class, + ], + ], + + /* + |-------------------------------------------------------------------------- + | Resetting Passwords + |-------------------------------------------------------------------------- + | + | You may specify multiple password reset configurations if you have more + | than one user table or model in the application and you want to have + | separate password reset settings based on the specific user types. + | + | 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. + | + */ + + 'passwords' => [ + 'users' => [ + 'provider' => 'users', + 'table' => 'user_password_resets', + 'expire' => 60, + ], + ], + + /* + |-------------------------------------------------------------------------- + | Password Confirmation Timeout + |-------------------------------------------------------------------------- + | + | Here you may define the amount of seconds before a password confirmation + | times out and the user is prompted to re-enter their password via the + | confirmation screen. By default, the timeout lasts for three hours. + | + */ + + 'password_timeout' => 10800, + +]; diff --git a/config/breadcrumbs.php b/config/breadcrumbs.php new file mode 100644 index 0000000..9a268fa --- /dev/null +++ b/config/breadcrumbs.php @@ -0,0 +1,75 @@ + 'breadcrumbs::bootstrap5', + + /* + |-------------------------------------------------------------------------- + | Breadcrumbs File(s) + |-------------------------------------------------------------------------- + | + | The file(s) where breadcrumbs are defined. e.g. + | + | - base_path('routes/breadcrumbs.php') + | - glob(base_path('breadcrumbs/*.php')) + | + */ + + 'files' => base_path('routes/breadcrumbs.php'), + + /* + |-------------------------------------------------------------------------- + | Exceptions + |-------------------------------------------------------------------------- + | + | Determine when to throw an exception. + | + */ + + // When route-bound breadcrumbs are used but the current route doesn't have a name (UnnamedRouteException) + 'unnamed-route-exception' => true, + + // When route-bound breadcrumbs are used and the matching breadcrumb doesn't exist (InvalidBreadcrumbException) + 'missing-route-bound-breadcrumb-exception' => true, + + // When a named breadcrumb is used but doesn't exist (InvalidBreadcrumbException) + 'invalid-named-breadcrumb-exception' => true, + + /* + |-------------------------------------------------------------------------- + | Classes + |-------------------------------------------------------------------------- + | + | Subclass the default classes for more advanced customisations. + | + */ + + // Manager + 'manager-class' => Diglactic\Breadcrumbs\Manager::class, + + // Generator + 'generator-class' => Diglactic\Breadcrumbs\Generator::class, + +]; diff --git a/config/broadcasting.php b/config/broadcasting.php new file mode 100644 index 0000000..59bccd5 --- /dev/null +++ b/config/broadcasting.php @@ -0,0 +1,64 @@ + env('BROADCAST_DRIVER', 'null'), + + /* + |-------------------------------------------------------------------------- + | Broadcast Connections + |-------------------------------------------------------------------------- + | + | Here you may define all of the broadcast connections that will be used + | to broadcast events to other systems or over websockets. Samples of + | each available type of connection are provided inside this array. + | + */ + + 'connections' => [ + + 'pusher' => [ + 'driver' => 'pusher', + 'key' => env('PUSHER_APP_KEY'), + 'secret' => env('PUSHER_APP_SECRET'), + 'app_id' => env('PUSHER_APP_ID'), + 'options' => [ + 'cluster' => env('PUSHER_APP_CLUSTER'), + 'useTLS' => true, + ], + ], + + 'ably' => [ + 'driver' => 'ably', + 'key' => env('ABLY_KEY'), + ], + + 'redis' => [ + 'driver' => 'redis', + 'connection' => 'default', + ], + + 'log' => [ + 'driver' => 'log', + ], + + 'null' => [ + 'driver' => 'null', + ], + + ], + +]; diff --git a/config/cache.php b/config/cache.php new file mode 100644 index 0000000..3e41cb4 --- /dev/null +++ b/config/cache.php @@ -0,0 +1,106 @@ + env('CACHE_DRIVER', 'file'), + + /* + |-------------------------------------------------------------------------- + | Cache Stores + |-------------------------------------------------------------------------- + | + | Here you may define all of the cache "stores" for your application as + | well as their drivers. You may even define multiple stores for the + | same cache driver to group types of items stored in your caches. + | + | Supported drivers: "apc", "array", "database", "file", + | "memcached", "redis", "dynamodb", "null" + | + */ + + 'stores' => [ + + 'apc' => [ + 'driver' => 'apc', + ], + + 'array' => [ + 'driver' => 'array', + 'serialize' => false, + ], + + 'database' => [ + 'driver' => 'database', + 'table' => 'cache', + 'connection' => null, + 'lock_connection' => null, + ], + + 'file' => [ + 'driver' => 'file', + 'path' => storage_path('framework/cache/data'), + ], + + 'memcached' => [ + 'driver' => 'memcached', + 'persistent_id' => env('MEMCACHED_PERSISTENT_ID'), + 'sasl' => [ + env('MEMCACHED_USERNAME'), + env('MEMCACHED_PASSWORD'), + ], + 'options' => [ + // Memcached::OPT_CONNECT_TIMEOUT => 2000, + ], + 'servers' => [ + [ + 'host' => env('MEMCACHED_HOST', '127.0.0.1'), + 'port' => env('MEMCACHED_PORT', 11211), + 'weight' => 100, + ], + ], + ], + + 'redis' => [ + 'driver' => 'redis', + 'connection' => 'cache', + 'lock_connection' => 'default', + ], + + 'dynamodb' => [ + 'driver' => 'dynamodb', + 'key' => env('AWS_ACCESS_KEY_ID'), + 'secret' => env('AWS_SECRET_ACCESS_KEY'), + 'region' => env('AWS_DEFAULT_REGION', 'us-east-1'), + 'table' => env('DYNAMODB_CACHE_TABLE', 'cache'), + 'endpoint' => env('DYNAMODB_ENDPOINT'), + ], + + ], + + /* + |-------------------------------------------------------------------------- + | Cache Key Prefix + |-------------------------------------------------------------------------- + | + | When utilizing a RAM based store such as APC or Memcached, there might + | be other applications utilizing the same cache. So, we'll specify a + | value to get prefixed to all our keys so we can avoid collisions. + | + */ + + 'prefix' => env('CACHE_PREFIX', Str::slug(env('APP_NAME', 'laravel'), '_').'_cache'), + +]; diff --git a/config/concord.php b/config/concord.php new file mode 100644 index 0000000..5f20fa2 --- /dev/null +++ b/config/concord.php @@ -0,0 +1,25 @@ + [ + \Webkul\Activity\Providers\ModuleServiceProvider::class, + \Webkul\Admin\Providers\ModuleServiceProvider::class, + \Webkul\Attribute\Providers\ModuleServiceProvider::class, + \Webkul\Automation\Providers\ModuleServiceProvider::class, + \Webkul\Contact\Providers\ModuleServiceProvider::class, + \Webkul\Core\Providers\ModuleServiceProvider::class, + \Webkul\DataGrid\Providers\ModuleServiceProvider::class, + \Webkul\EmailTemplate\Providers\ModuleServiceProvider::class, + \Webkul\Email\Providers\ModuleServiceProvider::class, + \Webkul\Lead\Providers\ModuleServiceProvider::class, + \Webkul\Product\Providers\ModuleServiceProvider::class, + \Webkul\Quote\Providers\ModuleServiceProvider::class, + \Webkul\Tag\Providers\ModuleServiceProvider::class, + \Webkul\User\Providers\ModuleServiceProvider::class, + \Webkul\Warehouse\Providers\ModuleServiceProvider::class, + \Webkul\WebForm\Providers\ModuleServiceProvider::class, + \Webkul\DataTransfer\Providers\ModuleServiceProvider::class, + ], + + 'register_route_models' => true, +]; diff --git a/config/cors.php b/config/cors.php new file mode 100644 index 0000000..bf767d9 --- /dev/null +++ b/config/cors.php @@ -0,0 +1,64 @@ + [ + 'admin/web-forms/forms/*', + + 'api/*' + ], + + /* + * Matches the request method. `['*']` allows all methods. + */ + 'allowed_methods' => ['*'], + + /* + * Matches the request origin. `['*']` allows all origins. Wildcards can be used, eg `*.mydomain.com` + */ + 'allowed_origins' => ['*'], + + /* + * Patterns that can be used with `preg_match` to match the origin. + */ + 'allowed_origins_patterns' => [], + + /* + * Sets the Access-Control-Allow-Headers response header. `['*']` allows all headers. + */ + 'allowed_headers' => ['*'], + + /* + * Sets the Access-Control-Expose-Headers response header with these headers. + */ + 'exposed_headers' => [], + + /* + * Sets the Access-Control-Max-Age response header when > 0. + */ + 'max_age' => 0, + + /* + * Sets the Access-Control-Allow-Credentials header. + */ + 'supports_credentials' => false, +]; diff --git a/config/database.php b/config/database.php new file mode 100644 index 0000000..427e72d --- /dev/null +++ b/config/database.php @@ -0,0 +1,147 @@ + env('DB_CONNECTION', 'mysql'), + + /* + |-------------------------------------------------------------------------- + | Database Connections + |-------------------------------------------------------------------------- + | + | Here are each of the database connections setup for your application. + | Of course, examples of configuring each database platform that is + | supported by Laravel is shown below to make development simple. + | + | + | All database work in Laravel is done through the PHP PDO facilities + | so make sure you have the driver for your particular database of + | choice installed on your machine before you begin development. + | + */ + + 'connections' => [ + + 'sqlite' => [ + 'driver' => 'sqlite', + 'url' => env('DATABASE_URL'), + 'database' => env('DB_DATABASE', database_path('database.sqlite')), + 'prefix' => env('DB_PREFIX', ''), + 'foreign_key_constraints' => env('DB_FOREIGN_KEYS', true), + ], + + 'mysql' => [ + 'driver' => 'mysql', + 'url' => env('DATABASE_URL'), + 'host' => env('DB_HOST', '127.0.0.1'), + 'port' => env('DB_PORT', '3306'), + 'database' => env('DB_DATABASE', 'forge'), + 'username' => env('DB_USERNAME', 'forge'), + 'password' => env('DB_PASSWORD', ''), + 'unix_socket' => env('DB_SOCKET', ''), + 'charset' => 'utf8mb4', + 'collation' => 'utf8mb4_unicode_ci', + 'prefix' => env('DB_PREFIX', ''), + 'prefix_indexes' => true, + 'strict' => false, + 'engine' => null, + 'options' => extension_loaded('pdo_mysql') ? array_filter([ + PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'), + ]) : [], + ], + + 'pgsql' => [ + 'driver' => 'pgsql', + 'url' => env('DATABASE_URL'), + 'host' => env('DB_HOST', '127.0.0.1'), + 'port' => env('DB_PORT', '5432'), + 'database' => env('DB_DATABASE', 'forge'), + 'username' => env('DB_USERNAME', 'forge'), + 'password' => env('DB_PASSWORD', ''), + 'charset' => 'utf8', + 'prefix' => env('DB_PREFIX', ''), + 'prefix_indexes' => true, + 'schema' => 'public', + 'sslmode' => 'prefer', + ], + + 'sqlsrv' => [ + 'driver' => 'sqlsrv', + 'url' => env('DATABASE_URL'), + 'host' => env('DB_HOST', 'localhost'), + 'port' => env('DB_PORT', '1433'), + 'database' => env('DB_DATABASE', 'forge'), + 'username' => env('DB_USERNAME', 'forge'), + 'password' => env('DB_PASSWORD', ''), + 'charset' => 'utf8', + 'prefix' => env('DB_PREFIX', ''), + 'prefix_indexes' => true, + ], + + ], + + /* + |-------------------------------------------------------------------------- + | Migration Repository Table + |-------------------------------------------------------------------------- + | + | This table keeps track of all the migrations that have already run for + | your application. Using this information, we can determine which of + | the migrations on disk haven't actually been run in the database. + | + */ + + 'migrations' => 'migrations', + + /* + |-------------------------------------------------------------------------- + | Redis Databases + |-------------------------------------------------------------------------- + | + | Redis is an open source, fast, and advanced key-value store that also + | provides a richer body of commands than a typical key-value system + | such as APC or Memcached. Laravel makes it easy to dig right in. + | + */ + + 'redis' => [ + + 'client' => env('REDIS_CLIENT', 'phpredis'), + + 'options' => [ + 'cluster' => env('REDIS_CLUSTER', 'redis'), + 'prefix' => env('REDIS_PREFIX', Str::slug(env('APP_NAME', 'laravel'), '_').'_database_'), + ], + + 'default' => [ + 'url' => env('REDIS_URL'), + 'host' => env('REDIS_HOST', '127.0.0.1'), + 'password' => env('REDIS_PASSWORD', null), + 'port' => env('REDIS_PORT', '6379'), + 'database' => env('REDIS_DB', '0'), + ], + + 'cache' => [ + 'url' => env('REDIS_URL'), + 'host' => env('REDIS_HOST', '127.0.0.1'), + 'password' => env('REDIS_PASSWORD', null), + 'port' => env('REDIS_PORT', '6379'), + 'database' => env('REDIS_CACHE_DB', '1'), + ], + + ], + +]; diff --git a/config/filesystems.php b/config/filesystems.php new file mode 100644 index 0000000..35c62bf --- /dev/null +++ b/config/filesystems.php @@ -0,0 +1,72 @@ + env('FILESYSTEM_DISK', 'public'), + + /* + |-------------------------------------------------------------------------- + | Filesystem Disks + |-------------------------------------------------------------------------- + | + | Here you may configure as many filesystem "disks" as you wish, and you + | may even configure multiple disks of the same driver. Defaults have + | been setup for each driver as an example of the required options. + | + | Supported Drivers: "local", "ftp", "sftp", "s3" + | + */ + + 'disks' => [ + + 'local' => [ + 'driver' => 'local', + 'root' => storage_path('app'), + ], + + 'public' => [ + 'driver' => 'local', + 'root' => storage_path('app/public'), + 'url' => env('APP_URL').'/storage', + 'visibility' => 'public', + ], + + 's3' => [ + 'driver' => 's3', + 'key' => env('AWS_ACCESS_KEY_ID'), + 'secret' => env('AWS_SECRET_ACCESS_KEY'), + 'region' => env('AWS_DEFAULT_REGION'), + 'bucket' => env('AWS_BUCKET'), + 'url' => env('AWS_URL'), + 'endpoint' => env('AWS_ENDPOINT'), + ], + + ], + + /* + |-------------------------------------------------------------------------- + | Symbolic Links + |-------------------------------------------------------------------------- + | + | Here you may configure the symbolic links that will be created when the + | `storage:link` Artisan command is executed. The array keys should be + | the locations of the links and the values should be their targets. + | + */ + + 'links' => [ + public_path('storage') => storage_path('app/public'), + ], + +]; diff --git a/config/hashing.php b/config/hashing.php new file mode 100644 index 0000000..5b10c09 --- /dev/null +++ b/config/hashing.php @@ -0,0 +1,52 @@ + 'bcrypt', + + /* + |-------------------------------------------------------------------------- + | Bcrypt Options + |-------------------------------------------------------------------------- + | + | Here you may specify the configuration options that should be used when + | passwords are hashed using the Bcrypt algorithm. This will allow you + | to control the amount of time it takes to hash the given password. + | + */ + + 'bcrypt' => [ + 'rounds' => env('BCRYPT_ROUNDS', 10), + ], + + /* + |-------------------------------------------------------------------------- + | Argon Options + |-------------------------------------------------------------------------- + | + | Here you may specify the configuration options that should be used when + | passwords are hashed using the Argon algorithm. These will allow you + | to control the amount of time it takes to hash the given password. + | + */ + + 'argon' => [ + 'memory' => 1024, + 'threads' => 2, + 'time' => 2, + ], + +]; diff --git a/config/imap.php b/config/imap.php new file mode 100644 index 0000000..8797565 --- /dev/null +++ b/config/imap.php @@ -0,0 +1,193 @@ + env('IMAP_DEFAULT_ACCOUNT', 'default'), + + /* + |-------------------------------------------------------------------------- + | Default date format + |-------------------------------------------------------------------------- + | + | The default date format is used to convert any given Carbon::class object into a valid date string. + | These are currently known working formats: "d-M-Y", "d-M-y", "d M y" + | + */ + 'date_format' => 'd-M-Y', + + /* + |-------------------------------------------------------------------------- + | Available IMAP accounts + |-------------------------------------------------------------------------- + | + | Please list all IMAP accounts which you are planning to use within the + | array below. + | + */ + 'accounts' => [ + 'default' => [ + 'host' => env('IMAP_HOST', 'localhost'), + 'port' => env('IMAP_PORT', 993), + 'protocol' => env('IMAP_PROTOCOL', 'imap'), // might also use imap, [pop3 or nntp (untested)] + 'encryption' => env('IMAP_ENCRYPTION', 'ssl'), // Supported: false, 'ssl', 'tls', 'notls', 'starttls' + 'validate_cert' => env('IMAP_VALIDATE_CERT', true), + 'username' => env('IMAP_USERNAME', 'root@example.com'), + 'password' => env('IMAP_PASSWORD', ''), + 'authentication' => env('IMAP_AUTHENTICATION', null), + 'proxy' => [ + 'socket' => null, + 'request_fulluri' => false, + 'username' => null, + 'password' => null, + ], + 'timeout' => 30, + 'extensions' => [], + ], + ], + + /* + |-------------------------------------------------------------------------- + | Available IMAP options + |-------------------------------------------------------------------------- + | + | Available php imap config parameters are listed below + | -Delimiter (optional): + | This option is only used when calling $oClient-> + | You can use any supported char such as ".", "/", (...) + | -Fetch option: + | IMAP::FT_UID - Message marked as read by fetching the body message + | IMAP::FT_PEEK - Fetch the message without setting the "seen" flag + | -Fetch sequence id: + | IMAP::ST_UID - Fetch message components using the message uid + | IMAP::ST_MSGN - Fetch message components using the message number + | -Body download option + | Default TRUE + | -Flag download option + | Default TRUE + | -Soft fail + | Default FALSE - Set to TRUE if you want to ignore certain exception while fetching bulk messages + | -RFC822 + | Default TRUE - Set to FALSE to prevent the usage of \imap_rfc822_parse_headers(). + | See https://github.com/Webklex/php-imap/issues/115 for more information. + | -Debug enable to trace communication traffic + | -UID cache enable the UID cache + | -Fallback date is used if the given message date could not be parsed + | -Boundary regex used to detect message boundaries. If you are having problems with empty messages, missing + | attachments or anything like this. Be advised that it likes to break which causes new problems.. + | -Message key identifier option + | You can choose between the following: + | 'id' - Use the MessageID as array key (default, might cause hickups with yahoo mail) + | 'number' - Use the message number as array key (isn't always unique and can cause some interesting behavior) + | 'list' - Use the message list number as array key (incrementing integer (does not always start at 0 or 1) + | 'uid' - Use the message uid as array key (isn't always unique and can cause some interesting behavior) + | -Fetch order + | 'asc' - Order all messages ascending (probably results in oldest first) + | 'desc' - Order all messages descending (probably results in newest first) + | -Disposition types potentially considered an attachment + | Default ['attachment', 'inline'] + | -Common folders + | Default folder locations and paths assumed if none is provided + | -Open IMAP options: + | DISABLE_AUTHENTICATOR - Disable authentication properties. + | Use 'GSSAPI' if you encounter the following + | error: "Kerberos error: No credentials cache + | file found (try running kinit) (...)" + | or ['GSSAPI','PLAIN'] if you are using outlook mail + | -Decoder options (currently only the message subject and attachment name decoder can be set) + | 'utf-8' - Uses imap_utf8($string) to decode a string + | 'mimeheader' - Uses mb_decode_mimeheader($string) to decode a string + | + */ + 'options' => [ + 'delimiter' => '/', + 'fetch' => \Webklex\PHPIMAP\IMAP::FT_PEEK, + 'sequence' => \Webklex\PHPIMAP\IMAP::ST_UID, + 'fetch_body' => true, + 'fetch_flags' => true, + 'soft_fail' => false, + 'rfc822' => true, + 'debug' => false, + 'uid_cache' => true, + // 'fallback_date' => "01.01.1970 00:00:00", + 'boundary' => '/boundary=(.*?(?=;)|(.*))/i', + 'message_key' => 'list', + 'fetch_order' => 'asc', + 'dispositions' => ['attachment', 'inline'], + 'common_folders' => [ + 'root' => 'INBOX', + 'junk' => 'INBOX/Junk', + 'draft' => 'INBOX/Drafts', + 'sent' => 'INBOX/Sent', + 'trash' => 'INBOX/Trash', + ], + 'decoder' => [ + 'message' => 'utf-8', // mimeheader + 'attachment' => 'utf-8', // mimeheader + ], + 'open' => [ + // 'DISABLE_AUTHENTICATOR' => 'GSSAPI' + ], + ], + + /* + |-------------------------------------------------------------------------- + | Available flags + |-------------------------------------------------------------------------- + | + | List all available / supported flags. Set to null to accept all given flags. + */ + 'flags' => ['recent', 'flagged', 'answered', 'deleted', 'seen', 'draft'], + + /* + |-------------------------------------------------------------------------- + | Available events + |-------------------------------------------------------------------------- + | + */ + 'events' => [ + 'message' => [ + 'new' => \Webklex\IMAP\Events\MessageNewEvent::class, + 'moved' => \Webklex\IMAP\Events\MessageMovedEvent::class, + 'copied' => \Webklex\IMAP\Events\MessageCopiedEvent::class, + 'deleted' => \Webklex\IMAP\Events\MessageDeletedEvent::class, + 'restored' => \Webklex\IMAP\Events\MessageRestoredEvent::class, + ], + 'folder' => [ + 'new' => \Webklex\IMAP\Events\FolderNewEvent::class, + 'moved' => \Webklex\IMAP\Events\FolderMovedEvent::class, + 'deleted' => \Webklex\IMAP\Events\FolderDeletedEvent::class, + ], + 'flag' => [ + 'new' => \Webklex\IMAP\Events\FlagNewEvent::class, + 'deleted' => \Webklex\IMAP\Events\FlagDeletedEvent::class, + ], + ], + + /* + |-------------------------------------------------------------------------- + | Available masking options + |-------------------------------------------------------------------------- + | + | By using your own custom masks you can implement your own methods for + | a better and faster access and less code to write. + | + | Checkout the two examples custom_attachment_mask and custom_message_mask + | for a quick start. + | + | The provided masks below are used as the default masks. + */ + 'masks' => [ + 'message' => \Webklex\PHPIMAP\Support\Masks\MessageMask::class, + 'attachment' => \Webklex\PHPIMAP\Support\Masks\AttachmentMask::class, + ], +]; diff --git a/config/krayin-vite.php b/config/krayin-vite.php new file mode 100755 index 0000000..d502a07 --- /dev/null +++ b/config/krayin-vite.php @@ -0,0 +1,32 @@ + [ + 'admin' => [ + 'hot_file' => 'admin-vite.hot', + 'build_directory' => 'admin/build', + 'package_assets_directory' => 'src/Resources/assets', + ], + + 'installer' => [ + 'hot_file' => 'installer-vite.hot', + 'build_directory' => 'installer/build', + 'package_assets_directory' => 'src/Resources/assets', + ], + + 'webform' => [ + 'hot_file' => 'webform-vite.hot', + 'build_directory' => 'webform/build', + 'package_assets_directory' => 'src/Resources/assets', + ], + ], +]; diff --git a/config/logging.php b/config/logging.php new file mode 100644 index 0000000..c1cb04e --- /dev/null +++ b/config/logging.php @@ -0,0 +1,104 @@ + env('LOG_CHANNEL', 'stack'), + + /* + |-------------------------------------------------------------------------- + | Log Channels + |-------------------------------------------------------------------------- + | + | Here you may configure the log channels for your application. Out of + | the box, Laravel uses the Monolog PHP logging library. This gives + | you a variety of powerful log handlers / formatters to utilize. + | + | Available Drivers: "single", "daily", "slack", "syslog", + | "errorlog", "monolog", + | "custom", "stack" + | + */ + + 'channels' => [ + 'stack' => [ + 'driver' => 'stack', + 'channels' => ['single'], + 'ignore_exceptions' => false, + ], + + 'single' => [ + 'driver' => 'single', + 'path' => storage_path('logs/laravel.log'), + 'level' => env('LOG_LEVEL', 'debug'), + ], + + 'daily' => [ + 'driver' => 'daily', + 'path' => storage_path('logs/laravel.log'), + 'level' => env('LOG_LEVEL', 'debug'), + 'days' => 14, + ], + + 'slack' => [ + 'driver' => 'slack', + 'url' => env('LOG_SLACK_WEBHOOK_URL'), + 'username' => 'Laravel Log', + 'emoji' => ':boom:', + 'level' => env('LOG_LEVEL', 'critical'), + ], + + 'papertrail' => [ + 'driver' => 'monolog', + 'level' => env('LOG_LEVEL', 'debug'), + 'handler' => SyslogUdpHandler::class, + 'handler_with' => [ + 'host' => env('PAPERTRAIL_URL'), + 'port' => env('PAPERTRAIL_PORT'), + ], + ], + + 'stderr' => [ + 'driver' => 'monolog', + 'handler' => StreamHandler::class, + 'formatter' => env('LOG_STDERR_FORMATTER'), + 'with' => [ + 'stream' => 'php://stderr', + ], + ], + + 'syslog' => [ + 'driver' => 'syslog', + 'level' => env('LOG_LEVEL', 'debug'), + ], + + 'errorlog' => [ + 'driver' => 'errorlog', + 'level' => env('LOG_LEVEL', 'debug'), + ], + + 'null' => [ + 'driver' => 'monolog', + 'handler' => NullHandler::class, + ], + + 'emergency' => [ + 'path' => storage_path('logs/laravel.log'), + ], + ], + +]; diff --git a/config/mail-receiver.php b/config/mail-receiver.php new file mode 100644 index 0000000..32f1573 --- /dev/null +++ b/config/mail-receiver.php @@ -0,0 +1,17 @@ + env('MAIL_RECEIVER_DRIVER', 'sendgrid'), +]; diff --git a/config/mail.php b/config/mail.php new file mode 100644 index 0000000..2f2f48d --- /dev/null +++ b/config/mail.php @@ -0,0 +1,130 @@ + env('MAIL_MAILER', 'smtp'), + + /* + |-------------------------------------------------------------------------- + | Mailer Configurations + |-------------------------------------------------------------------------- + | + | Here you may configure all of the mailers used by your application plus + | their respective settings. Several examples have been configured for + | you and you are free to add your own as your application requires. + | + | Laravel supports a variety of mail "transport" drivers to be used while + | sending an e-mail. You will specify which one you are using for your + | mailers below. You are free to add additional mailers as required. + | + | Supported: "smtp", "sendmail", "mailgun", "ses", + | "postmark", "log", "array", "failover" + | + */ + + 'mailers' => [ + 'smtp' => [ + 'transport' => 'smtp', + 'host' => env('MAIL_HOST', 'smtp.mailgun.org'), + 'port' => env('MAIL_PORT', 587), + 'encryption' => env('MAIL_ENCRYPTION', 'tls'), + 'username' => env('MAIL_USERNAME'), + 'password' => env('MAIL_PASSWORD'), + 'timeout' => null, + 'verify_peer' => false, + ], + + 'ses' => [ + 'transport' => 'ses', + ], + + 'mailgun' => [ + 'transport' => 'mailgun', + ], + + 'postmark' => [ + 'transport' => 'postmark', + ], + + 'sendmail' => [ + 'transport' => 'sendmail', + 'path' => env('MAIL_SENDMAIL_PATH', '/usr/sbin/sendmail -bs -i'), + ], + + 'log' => [ + 'transport' => 'log', + 'channel' => env('MAIL_LOG_CHANNEL'), + ], + + 'array' => [ + 'transport' => 'array', + ], + + 'failover' => [ + 'transport' => 'failover', + 'mailers' => [ + 'smtp', + 'log', + ], + ], + ], + + /* + |-------------------------------------------------------------------------- + | Global "From" Address + |-------------------------------------------------------------------------- + | + | You may wish for all e-mails sent by your application to be sent from + | the same address. Here, you may specify a name and address that is + | used globally for all e-mails that are sent by your application. + | + */ + + 'from' => [ + 'address' => env('MAIL_FROM_ADDRESS'), + 'name' => env('MAIL_FROM_NAME'), + ], + + /* + |-------------------------------------------------------------------------- + | Default Mailer Domain + |-------------------------------------------------------------------------- + | + | This option controls the domain for email message_id that is used to send email + | messages sent by your application. + | + */ + + 'domain' => env('MAIL_DOMAIN', 'webkul.com'), + + /* + |-------------------------------------------------------------------------- + | Markdown Mail Settings + |-------------------------------------------------------------------------- + | + | If you are using Markdown based email rendering, you may configure your + | theme and component paths here, allowing you to customize the design + | of the emails. Or, you may simply stick with the Laravel defaults! + | + */ + + 'markdown' => [ + 'theme' => 'default', + + 'paths' => [ + resource_path('views/vendor/mail'), + ], + ], + +]; diff --git a/config/queue.php b/config/queue.php new file mode 100644 index 0000000..a8bf551 --- /dev/null +++ b/config/queue.php @@ -0,0 +1,89 @@ + env('QUEUE_CONNECTION', 'sync'), + + /* + |-------------------------------------------------------------------------- + | Queue Connections + |-------------------------------------------------------------------------- + | + | Here you may configure the connection information for each server that + | is used by your application. A default configuration has been added + | for each back-end shipped with Laravel. You are free to add more. + | + | Drivers: "sync", "database", "beanstalkd", "sqs", "redis", "null" + | + */ + + 'connections' => [ + + 'sync' => [ + 'driver' => 'sync', + ], + + 'database' => [ + 'driver' => 'database', + 'table' => 'jobs', + 'queue' => 'default', + 'retry_after' => 90, + ], + + 'beanstalkd' => [ + 'driver' => 'beanstalkd', + 'host' => 'localhost', + 'queue' => 'default', + 'retry_after' => 90, + 'block_for' => 0, + ], + + 'sqs' => [ + 'driver' => 'sqs', + 'key' => env('AWS_ACCESS_KEY_ID'), + 'secret' => env('AWS_SECRET_ACCESS_KEY'), + 'prefix' => env('SQS_PREFIX', 'https://sqs.us-east-1.amazonaws.com/your-account-id'), + 'queue' => env('SQS_QUEUE', 'your-queue-name'), + 'suffix' => env('SQS_SUFFIX'), + 'region' => env('AWS_DEFAULT_REGION', 'us-east-1'), + ], + + 'redis' => [ + 'driver' => 'redis', + 'connection' => 'default', + 'queue' => env('REDIS_QUEUE', 'default'), + 'retry_after' => 90, + 'block_for' => null, + ], + + ], + + /* + |-------------------------------------------------------------------------- + | Failed Queue Jobs + |-------------------------------------------------------------------------- + | + | These options configure the behavior of failed queue job logging so you + | can control which database and table are used to store the jobs that + | have failed. You may change them to any database / table you wish. + | + */ + + 'failed' => [ + 'driver' => env('QUEUE_FAILED_DRIVER', 'database-uuids'), + 'database' => env('DB_CONNECTION', 'mysql'), + 'table' => 'failed_jobs', + ], + +]; diff --git a/config/repository.php b/config/repository.php new file mode 100644 index 0000000..5fe17d3 --- /dev/null +++ b/config/repository.php @@ -0,0 +1,247 @@ + [ + 'limit' => 15, + ], + + /* + |-------------------------------------------------------------------------- + | Fractal Presenter Config + |-------------------------------------------------------------------------- + | + + Available serializers: + ArraySerializer + DataArraySerializer + JsonApiSerializer + + */ + 'fractal' => [ + 'params' => [ + 'include' => 'include', + ], + 'serializer' => League\Fractal\Serializer\DataArraySerializer::class, + ], + + /* + |-------------------------------------------------------------------------- + | Cache Config + |-------------------------------------------------------------------------- + | + */ + 'cache' => [ + /* + |-------------------------------------------------------------------------- + | Cache Status + |-------------------------------------------------------------------------- + | + | Enable or disable cache + | + */ + 'enabled' => false, + + /* + |-------------------------------------------------------------------------- + | Cache Minutes + |-------------------------------------------------------------------------- + | + | Time of expiration cache + | + */ + 'minutes' => 30, + + /* + |-------------------------------------------------------------------------- + | Cache Repository + |-------------------------------------------------------------------------- + | + | Instance of Illuminate\Contracts\Cache\Repository + | + */ + 'repository' => 'cache', + + /* + |-------------------------------------------------------------------------- + | Cache Clean Listener + |-------------------------------------------------------------------------- + | + | + | + */ + 'clean' => [ + + /* + |-------------------------------------------------------------------------- + | Enable clear cache on repository changes + |-------------------------------------------------------------------------- + | + */ + 'enabled' => true, + + /* + |-------------------------------------------------------------------------- + | Actions in Repository + |-------------------------------------------------------------------------- + | + | create : Clear Cache on create Entry in repository + | update : Clear Cache on update Entry in repository + | delete : Clear Cache on delete Entry in repository + | + */ + 'on' => [ + 'create' => true, + 'update' => true, + 'delete' => true, + ], + ], + + 'params' => [ + /* + |-------------------------------------------------------------------------- + | Skip Cache Params + |-------------------------------------------------------------------------- + | + | + | Ex: http://prettus.local/?search=lorem&skipCache=true + | + */ + 'skipCache' => 'skipCache', + ], + + /* + |-------------------------------------------------------------------------- + | Methods Allowed + |-------------------------------------------------------------------------- + | + | methods cacheable : all, paginate, find, findByField, findWhere, getByCriteria + | + | Ex: + | + | 'only' =>['all','paginate'], + | + | or + | + | 'except' =>['find'], + */ + 'allowed' => [ + 'only' => null, + 'except' => null, + ], + ], + + /* + |-------------------------------------------------------------------------- + | Criteria Config + |-------------------------------------------------------------------------- + | + | Settings of request parameters names that will be used by Criteria + | + */ + 'criteria' => [ + /* + |-------------------------------------------------------------------------- + | Accepted Conditions + |-------------------------------------------------------------------------- + | + | Conditions accepted in consultations where the Criteria + | + | Ex: + | + | 'acceptedConditions'=>['=','like'] + | + | $query->where('foo','=','bar') + | $query->where('foo','like','bar') + | + */ + 'acceptedConditions' => [ + '=', + 'like', + 'in', + ], + /* + |-------------------------------------------------------------------------- + | Request Params + |-------------------------------------------------------------------------- + | + | Request parameters that will be used to filter the query in the repository + | + | Params : + | + | - search : Searched value + | Ex: http://prettus.local/?search=lorem + | + | - searchFields : Fields in which research should be carried out + | Ex: + | http://prettus.local/?search=lorem&searchFields=name;email + | http://prettus.local/?search=lorem&searchFields=name:like;email + | http://prettus.local/?search=lorem&searchFields=name:like + | + | - filter : Fields that must be returned to the response object + | Ex: + | http://prettus.local/?search=lorem&filter=id,name + | + | - orderBy : Order By + | Ex: + | http://prettus.local/?search=lorem&orderBy=id + | + | - sortedBy : Sort + | Ex: + | http://prettus.local/?search=lorem&orderBy=id&sortedBy=asc + | http://prettus.local/?search=lorem&orderBy=id&sortedBy=desc + | + | - searchJoin: Specifies the search method (AND / OR), by default the + | application searches each parameter with OR + | EX: + | http://prettus.local/?search=lorem&searchJoin=and + | http://prettus.local/?search=lorem&searchJoin=or + | + */ + 'params' => [ + 'search' => 'search', + 'searchFields' => 'searchFields', + 'filter' => 'filter', + 'orderBy' => 'orderBy', + 'sortedBy' => 'sortedBy', + 'with' => 'with', + 'searchJoin' => 'searchJoin', + 'withCount' => 'withCount', + ], + ], + /* + |-------------------------------------------------------------------------- + | Generator Config + |-------------------------------------------------------------------------- + | + */ + 'generator' => [ + 'basePath' => app()->path(), + 'rootNamespace' => 'App\\', + 'stubsOverridePath' => app()->path(), + 'paths' => [ + 'models' => 'Entities', + 'repositories' => 'Repositories', + 'interfaces' => 'Repositories', + 'transformers' => 'Transformers', + 'presenters' => 'Presenters', + 'validators' => 'Validators', + 'controllers' => 'Http/Controllers', + 'provider' => 'RepositoryServiceProvider', + 'criteria' => 'Criteria', + ], + ], +]; diff --git a/config/sanctum.php b/config/sanctum.php new file mode 100644 index 0000000..c6c6045 --- /dev/null +++ b/config/sanctum.php @@ -0,0 +1,65 @@ + explode(',', env('SANCTUM_STATEFUL_DOMAINS', sprintf( + '%s%s', + 'localhost,localhost:3000,127.0.0.1,127.0.0.1:8000,::1', + env('APP_URL') ? ','.parse_url(env('APP_URL'), PHP_URL_HOST) : '' + ))), + + /* + |-------------------------------------------------------------------------- + | Sanctum Guards + |-------------------------------------------------------------------------- + | + | This array contains the authentication guards that will be checked when + | Sanctum is trying to authenticate a request. If none of these guards + | are able to authenticate the request, Sanctum will use the bearer + | token that's present on an incoming request for authentication. + | + */ + + 'guard' => ['user'], + + /* + |-------------------------------------------------------------------------- + | Expiration Minutes + |-------------------------------------------------------------------------- + | + | This value controls the number of minutes until an issued token will be + | considered expired. If this value is null, personal access tokens do + | not expire. This won't tweak the lifetime of first-party sessions. + | + */ + + 'expiration' => null, + + /* + |-------------------------------------------------------------------------- + | Sanctum Middleware + |-------------------------------------------------------------------------- + | + | When authenticating your first-party SPA with Sanctum you may need to + | customize some of the middleware Sanctum uses while processing the + | request. You may change the middleware listed below as required. + | + */ + + 'middleware' => [ + 'verify_csrf_token' => App\Http\Middleware\VerifyCsrfToken::class, + 'encrypt_cookies' => App\Http\Middleware\EncryptCookies::class, + ], + +]; diff --git a/config/services.php b/config/services.php new file mode 100644 index 0000000..3215b42 --- /dev/null +++ b/config/services.php @@ -0,0 +1,33 @@ + [ + 'domain' => env('MAILGUN_DOMAIN'), + 'secret' => env('MAILGUN_SECRET'), + 'endpoint' => env('MAILGUN_ENDPOINT', 'api.mailgun.net'), + ], + + 'postmark' => [ + 'token' => env('POSTMARK_TOKEN'), + ], + + 'ses' => [ + 'key' => env('AWS_ACCESS_KEY_ID'), + 'secret' => env('AWS_SECRET_ACCESS_KEY'), + 'region' => env('AWS_DEFAULT_REGION', 'us-east-1'), + ], + +]; diff --git a/config/session.php b/config/session.php new file mode 100644 index 0000000..3c30e2c --- /dev/null +++ b/config/session.php @@ -0,0 +1,201 @@ + env('SESSION_DRIVER', 'file'), + + /* + |-------------------------------------------------------------------------- + | Session Lifetime + |-------------------------------------------------------------------------- + | + | Here you may specify the number of minutes that you wish the session + | to be allowed to remain idle before it expires. If you want them + | to immediately expire on the browser closing, set that option. + | + */ + + 'lifetime' => env('SESSION_LIFETIME', 120), + + 'expire_on_close' => false, + + /* + |-------------------------------------------------------------------------- + | Session Encryption + |-------------------------------------------------------------------------- + | + | This option allows you to easily specify that all of your session data + | should be encrypted before it is stored. All encryption will be run + | automatically by Laravel and you can use the Session like normal. + | + */ + + 'encrypt' => false, + + /* + |-------------------------------------------------------------------------- + | Session File Location + |-------------------------------------------------------------------------- + | + | When using the native session driver, we need a location where session + | files may be stored. A default has been set for you but a different + | location may be specified. This is only needed for file sessions. + | + */ + + 'files' => storage_path('framework/sessions'), + + /* + |-------------------------------------------------------------------------- + | Session Database Connection + |-------------------------------------------------------------------------- + | + | When using the "database" or "redis" session drivers, you may specify a + | connection that should be used to manage these sessions. This should + | correspond to a connection in your database configuration options. + | + */ + + 'connection' => env('SESSION_CONNECTION', null), + + /* + |-------------------------------------------------------------------------- + | Session Database Table + |-------------------------------------------------------------------------- + | + | When using the "database" session driver, you may specify the table we + | should use to manage the sessions. Of course, a sensible default is + | provided for you; however, you are free to change this as needed. + | + */ + + 'table' => 'sessions', + + /* + |-------------------------------------------------------------------------- + | Session Cache Store + |-------------------------------------------------------------------------- + | + | While using one of the framework's cache driven session backends you may + | list a cache store that should be used for these sessions. This value + | must match with one of the application's configured cache "stores". + | + | Affects: "apc", "dynamodb", "memcached", "redis" + | + */ + + 'store' => env('SESSION_STORE', null), + + /* + |-------------------------------------------------------------------------- + | Session Sweeping Lottery + |-------------------------------------------------------------------------- + | + | Some session drivers must manually sweep their storage location to get + | rid of old sessions from storage. Here are the chances that it will + | happen on a given request. By default, the odds are 2 out of 100. + | + */ + + 'lottery' => [2, 100], + + /* + |-------------------------------------------------------------------------- + | Session Cookie Name + |-------------------------------------------------------------------------- + | + | Here you may change the name of the cookie used to identify a session + | instance by ID. The name specified here will get used every time a + | new session cookie is created by the framework for every driver. + | + */ + + 'cookie' => env( + 'SESSION_COOKIE', + Str::slug(env('APP_NAME', 'laravel'), '_').'_session' + ), + + /* + |-------------------------------------------------------------------------- + | Session Cookie Path + |-------------------------------------------------------------------------- + | + | The session cookie path determines the path for which the cookie will + | be regarded as available. Typically, this will be the root path of + | your application but you are free to change this when necessary. + | + */ + + 'path' => '/', + + /* + |-------------------------------------------------------------------------- + | Session Cookie Domain + |-------------------------------------------------------------------------- + | + | Here you may change the domain of the cookie used to identify a session + | in your application. This will determine which domains the cookie is + | available to in your application. A sensible default has been set. + | + */ + + 'domain' => env('SESSION_DOMAIN') ?: null, + + /* + |-------------------------------------------------------------------------- + | HTTPS Only Cookies + |-------------------------------------------------------------------------- + | + | By setting this option to true, session cookies will only be sent back + | to the server if the browser has a HTTPS connection. This will keep + | the cookie from being sent to you if it can not be done securely. + | + */ + + 'secure' => false, + + /* + |-------------------------------------------------------------------------- + | HTTP Access Only + |-------------------------------------------------------------------------- + | + | Setting this value to true will prevent JavaScript from accessing the + | value of the cookie and the cookie will only be accessible through + | the HTTP protocol. You are free to modify this option if needed. + | + */ + + 'http_only' => true, + + /* + |-------------------------------------------------------------------------- + | Same-Site Cookies + |-------------------------------------------------------------------------- + | + | This option determines how your cookies behave when cross-site requests + | take place, and can be used to mitigate CSRF attacks. By default, we + | will set this value to "lax" since this is a secure default value. + | + | Supported: "lax", "strict", "none", null + | + */ + + 'same_site' => 'lax', + +]; diff --git a/config/tenancy.php b/config/tenancy.php new file mode 100644 index 0000000..bca00ca --- /dev/null +++ b/config/tenancy.php @@ -0,0 +1,201 @@ + App\Models\Tenant::class, + 'id_generator' => Stancl\Tenancy\UUIDGenerator::class, + + 'domain_model' => Domain::class, + + /** + * The list of domains hosting your central app. + * + * Only relevant if you're using the domain or subdomain identification middleware. + */ + 'central_domains' => [ + '127.0.0.1', + 'localhost', + 'localhost:8000', + 'growuppro.com.br', + ], + + /** + * Tenancy bootstrappers are executed when tenancy is initialized. + * Their responsibility is making Laravel features tenant-aware. + * + * To configure their behavior, see the config keys below. + */ + 'bootstrappers' => [ + Stancl\Tenancy\Bootstrappers\DatabaseTenancyBootstrapper::class, + Stancl\Tenancy\Bootstrappers\CacheTenancyBootstrapper::class, + Stancl\Tenancy\Bootstrappers\FilesystemTenancyBootstrapper::class, + Stancl\Tenancy\Bootstrappers\QueueTenancyBootstrapper::class, + // Stancl\Tenancy\Bootstrappers\RedisTenancyBootstrapper::class, // Note: phpredis is needed + ], + + /** + * Database tenancy config. Used by DatabaseTenancyBootstrapper. + */ + 'database' => [ + 'central_connection' => env('DB_CONNECTION', 'central'), + + /** + * Connection used as a "template" for the dynamically created tenant database connection. + * Note: don't name your template connection tenant. That name is reserved by package. + */ + 'template_tenant_connection' => null, + + /** + * Tenant database names are created like this: + * prefix + tenant_id + suffix. + */ + 'prefix' => 'tenant_', + 'suffix' => '', + + /** + * TenantDatabaseManagers are classes that handle the creation & deletion of tenant databases. + */ + 'managers' => [ + 'sqlite' => Stancl\Tenancy\TenantDatabaseManagers\SQLiteDatabaseManager::class, + 'mysql' => Stancl\Tenancy\TenantDatabaseManagers\MySQLDatabaseManager::class, + 'pgsql' => Stancl\Tenancy\TenantDatabaseManagers\PostgreSQLDatabaseManager::class, + + /** + * Use this database manager for MySQL to have a DB user created for each tenant database. + * You can customize the grants given to these users by changing the $grants property. + */ + // 'mysql' => Stancl\Tenancy\TenantDatabaseManagers\PermissionControlledMySQLDatabaseManager::class, + + /** + * Disable the pgsql manager above, and enable the one below if you + * want to separate tenant DBs by schemas rather than databases. + */ + // 'pgsql' => Stancl\Tenancy\TenantDatabaseManagers\PostgreSQLSchemaManager::class, // Separate by schema instead of database + ], + ], + + /** + * Cache tenancy config. Used by CacheTenancyBootstrapper. + * + * This works for all Cache facade calls, cache() helper + * calls and direct calls to injected cache stores. + * + * Each key in cache will have a tag applied on it. This tag is used to + * scope the cache both when writing to it and when reading from it. + * + * You can clear cache selectively by specifying the tag. + */ + 'cache' => [ + 'tag_base' => 'tenant', // This tag_base, followed by the tenant_id, will form a tag that will be applied on each cache call. + ], + + /** + * Filesystem tenancy config. Used by FilesystemTenancyBootstrapper. + * https://tenancyforlaravel.com/docs/v3/tenancy-bootstrappers/#filesystem-tenancy-boostrapper. + */ + 'filesystem' => [ + /** + * Each disk listed in the 'disks' array will be suffixed by the suffix_base, followed by the tenant_id. + */ + 'suffix_base' => 'tenant', + 'disks' => [ + 'local', + 'public', + // 's3', + ], + + /** + * Use this for local disks. + * + * See https://tenancyforlaravel.com/docs/v3/tenancy-bootstrappers/#filesystem-tenancy-boostrapper + */ + 'root_override' => [ + // Disks whose roots should be overridden after storage_path() is suffixed. + 'local' => '%storage_path%/app/', + 'public' => '%storage_path%/app/public/', + ], + + /** + * Should storage_path() be suffixed. + * + * Note: Disabling this will likely break local disk tenancy. Only disable this if you're using an external file storage service like S3. + * + * For the vast majority of applications, this feature should be enabled. But in some + * edge cases, it can cause issues (like using Passport with Vapor - see #196), so + * you may want to disable this if you are experiencing these edge case issues. + */ + 'suffix_storage_path' => true, + + /** + * By default, asset() calls are made multi-tenant too. You can use global_asset() and mix() + * for global, non-tenant-specific assets. However, you might have some issues when using + * packages that use asset() calls inside the tenant app. To avoid such issues, you can + * disable asset() helper tenancy and explicitly use tenant_asset() calls in places + * where you want to use tenant-specific assets (product images, avatars, etc). + */ + 'asset_helper_tenancy' => false, + ], + + /** + * Redis tenancy config. Used by RedisTenancyBootstrapper. + * + * Note: You need phpredis to use Redis tenancy. + * + * Note: You don't need to use this if you're using Redis only for cache. + * Redis tenancy is only relevant if you're making direct Redis calls, + * either using the Redis facade or by injecting it as a dependency. + */ + 'redis' => [ + 'prefix_base' => 'tenant', // Each key in Redis will be prepended by this prefix_base, followed by the tenant id. + 'prefixed_connections' => [ // Redis connections whose keys are prefixed, to separate one tenant's keys from another. + // 'default', + ], + ], + + /** + * Features are classes that provide additional functionality + * not needed for tenancy to be bootstrapped. They are run + * regardless of whether tenancy has been initialized. + * + * See the documentation page for each class to + * understand which ones you want to enable. + */ + 'features' => [ + // Stancl\Tenancy\Features\UserImpersonation::class, + // Stancl\Tenancy\Features\TelescopeTags::class, + Stancl\Tenancy\Features\UniversalRoutes::class, + // Stancl\Tenancy\Features\TenantConfig::class, // https://tenancyforlaravel.com/docs/v3/features/tenant-config + // Stancl\Tenancy\Features\CrossDomainRedirect::class, // https://tenancyforlaravel.com/docs/v3/features/cross-domain-redirect + // Stancl\Tenancy\Features\ViteBundler::class, + ], + + /** + * Should tenancy routes be registered. + * + * Tenancy routes include tenant asset routes. By default, this route is + * enabled. But it may be useful to disable them if you use external + * storage (e.g. S3 / Dropbox) or have a custom asset controller. + */ + 'routes' => true, + + /** + * Parameters used by the tenants:migrate command. + */ + 'migration_parameters' => [ + '--force' => true, // This needs to be true to run migrations in production. + '--path' => [database_path('migrations/tenant')], + '--realpath' => true, + ], + + /** + * Parameters used by the tenants:seed command. + */ + 'seeder_parameters' => [ + '--class' => 'DatabaseSeeder', // root seeder class + // '--force' => true, // This needs to be true to seed tenant databases in production + ], +]; diff --git a/config/tinker.php b/config/tinker.php new file mode 100644 index 0000000..c187942 --- /dev/null +++ b/config/tinker.php @@ -0,0 +1,50 @@ + [ + // App\Console\Commands\ExampleCommand::class, + ], + + /* + |-------------------------------------------------------------------------- + | Auto Aliased Classes + |-------------------------------------------------------------------------- + | + | Tinker will not automatically alias classes in your vendor namespaces + | but you may explicitly allow a subset of classes to get aliased by + | adding the names of each of those classes to the following list. + | + */ + + 'alias' => [ + // + ], + + /* + |-------------------------------------------------------------------------- + | Classes That Should Not Be Aliased + |-------------------------------------------------------------------------- + | + | Typically, Tinker automatically aliases classes as you require them in + | Tinker. However, you may wish to never alias certain classes, which + | you may accomplish by listing the classes in the following array. + | + */ + + 'dont_alias' => [ + 'App\Nova', + ], + +]; diff --git a/config/view.php b/config/view.php new file mode 100644 index 0000000..22b8a18 --- /dev/null +++ b/config/view.php @@ -0,0 +1,36 @@ + [ + resource_path('views'), + ], + + /* + |-------------------------------------------------------------------------- + | Compiled View Path + |-------------------------------------------------------------------------- + | + | This option determines where all the compiled Blade templates will be + | stored for your application. Typically, this is within the storage + | directory. However, as usual, you are free to change this value. + | + */ + + 'compiled' => env( + 'VIEW_COMPILED_PATH', + realpath(storage_path('framework/views')) + ), + +]; diff --git a/configurar-docker.sh b/configurar-docker.sh new file mode 100755 index 0000000..5d11977 --- /dev/null +++ b/configurar-docker.sh @@ -0,0 +1,173 @@ +#!/bin/bash +# Script completo para criar a imagem Docker do Krayin + +# ======================================== +# 1. CRIAR ESTRUTURA DE PASTAS +# ======================================== +mkdir -p docker + +# ======================================== +# 2. CRIAR docker/nginx.conf +# ======================================== +cat > docker/nginx.conf << 'EOF' +server { + listen 80; + server_name _; + root /var/www/html/public; + + add_header X-Frame-Options "SAMEORIGIN"; + add_header X-Content-Type-Options "nosniff"; + + index index.php; + + charset utf-8; + + location / { + try_files $uri $uri/ /index.php?$query_string; + } + + location = /favicon.ico { access_log off; log_not_found off; } + location = /robots.txt { access_log off; log_not_found off; } + + error_page 404 /index.php; + + location ~ \.php$ { + fastcgi_pass 127.0.0.1:9000; + fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name; + include fastcgi_params; + } + + location ~ /\.(?!well-known).* { + deny all; + } +} +EOF + +# ======================================== +# 3. CRIAR docker/supervisord.conf +# ======================================== +cat > docker/supervisord.conf << 'EOF' +[supervisord] +nodaemon=true +user=root + +[program:php-fpm] +command=/usr/local/sbin/php-fpm +autostart=true +autorestart=true +priority=5 +stdout_logfile=/dev/stdout +stdout_logfile_maxbytes=0 +stderr_logfile=/dev/stderr +stderr_logfile_maxbytes=0 + +[program:nginx] +command=/usr/sbin/nginx -g "daemon off;" +autostart=true +autorestart=true +priority=10 +stdout_logfile=/dev/stdout +stdout_logfile_maxbytes=0 +stderr_logfile=/dev/stderr +stderr_logfile_maxbytes=0 +EOF + +# ======================================== +# 4. CRIAR .dockerignore +# ======================================== +cat > .dockerignore << 'EOF' +.git +.gitignore +.env +node_modules +vendor +storage/logs/* +storage/framework/cache/* +storage/framework/sessions/* +storage/framework/views/* +bootstrap/cache/* +.DS_Store +Thumbs.db +EOF + +# ======================================== +# 5. CRIAR Dockerfile +# ======================================== +cat > Dockerfile << 'EOF' +FROM php:8.1-fpm + +# Instalar dependências do sistema +RUN apt-get update && apt-get install -y \ + git \ + curl \ + libpng-dev \ + libonig-dev \ + libxml2-dev \ + zip \ + unzip \ + libzip-dev \ + nginx \ + supervisor \ + && docker-php-ext-install pdo_mysql mbstring exif pcntl bcmath gd zip \ + && apt-get clean && rm -rf /var/lib/apt/lists/* + +# Instalar Composer +COPY --from=composer:latest /usr/bin/composer /usr/bin/composer + +# Criar diretório da aplicação +WORKDIR /var/www/html + +# Copiar arquivos do projeto +COPY . . + +# Instalar dependências do Composer +RUN composer install --no-dev --optimize-autoloader --no-interaction + +# Ajustar permissões +RUN chown -R www-data:www-data /var/www/html \ + && chmod -R 755 /var/www/html/storage \ + && chmod -R 755 /var/www/html/bootstrap/cache + +# Copiar configurações +COPY docker/nginx.conf /etc/nginx/sites-available/default +COPY docker/supervisord.conf /etc/supervisor/conf.d/supervisord.conf + +# Criar script de entrada +RUN echo '#!/bin/bash\n\ +php artisan config:cache\n\ +php artisan route:cache\n\ +php artisan view:cache\n\ +exec /usr/bin/supervisord -c /etc/supervisor/conf.d/supervisord.conf' > /entrypoint.sh \ + && chmod +x /entrypoint.sh + +EXPOSE 80 + +ENTRYPOINT ["/entrypoint.sh"] +EOF + +# ======================================== +# 6. CONSTRUIR A IMAGEM +# ======================================== +echo "Construindo a imagem Docker..." +docker build -t growup:latest . + +# ======================================== +# 7. SALVAR A IMAGEM (opcional) +# ======================================== +echo "Salvando a imagem em arquivo tar..." +docker save growup:latest -o growup-latest.tar + +echo "" +echo "========================================" +echo "IMAGEM CRIADA COM SUCESSO!" +echo "========================================" +echo "" +echo "Para usar no outro servidor:" +echo "1. Copie o arquivo growup-latest.tar para o servidor" +echo "2. Carregue a imagem: docker load -i growup-latest.tar" +echo "3. Use 'image: growup:latest' no seu docker-compose.yml" +echo "" +echo "Ou envie para um registry:" +echo "docker tag growup:latest seu-registry.com/growup:latest" +echo "docker push seu-registry.com/growup:latest" +echo "" diff --git a/database/.gitignore b/database/.gitignore new file mode 100644 index 0000000..97fc976 --- /dev/null +++ b/database/.gitignore @@ -0,0 +1,2 @@ +*.sqlite +*.sqlite-journal diff --git a/database/factories/UserFactory.php b/database/factories/UserFactory.php new file mode 100644 index 0000000..8556600 --- /dev/null +++ b/database/factories/UserFactory.php @@ -0,0 +1,47 @@ + $this->faker->name, + 'email' => $this->faker->unique()->safeEmail, + 'email_verified_at' => now(), + 'password' => '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', // password + 'remember_token' => Str::random(10), + ]; + } + + /** + * Indicate that the model's email address should be unverified. + * + * @return \Illuminate\Database\Eloquent\Factories\Factory + */ + public function unverified() + { + return $this->state(function (array $attributes) { + return [ + 'email_verified_at' => null, + ]; + }); + } +} diff --git a/database/migrations/2019_08_19_000000_create_failed_jobs_table.php b/database/migrations/2019_08_19_000000_create_failed_jobs_table.php new file mode 100644 index 0000000..1719198 --- /dev/null +++ b/database/migrations/2019_08_19_000000_create_failed_jobs_table.php @@ -0,0 +1,36 @@ +id(); + $table->string('uuid')->unique(); + $table->text('connection'); + $table->text('queue'); + $table->longText('payload'); + $table->longText('exception'); + $table->timestamp('failed_at')->useCurrent(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('failed_jobs'); + } +}; diff --git a/database/migrations/2019_09_15_000010_create_tenants_table.php b/database/migrations/2019_09_15_000010_create_tenants_table.php new file mode 100644 index 0000000..ec73065 --- /dev/null +++ b/database/migrations/2019_09_15_000010_create_tenants_table.php @@ -0,0 +1,37 @@ +string('id')->primary(); + + // your custom columns may go here + + $table->timestamps(); + $table->json('data')->nullable(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down(): void + { + Schema::dropIfExists('tenants'); + } +} diff --git a/database/migrations/2019_09_15_000020_create_domains_table.php b/database/migrations/2019_09_15_000020_create_domains_table.php new file mode 100644 index 0000000..77c1b88 --- /dev/null +++ b/database/migrations/2019_09_15_000020_create_domains_table.php @@ -0,0 +1,37 @@ +increments('id'); + $table->string('domain', 255)->unique(); + $table->string('tenant_id'); + + $table->timestamps(); + $table->foreign('tenant_id')->references('id')->on('tenants')->onUpdate('cascade')->onDelete('cascade'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down(): void + { + Schema::dropIfExists('domains'); + } +} diff --git a/database/migrations/2019_12_14_000001_create_personal_access_tokens_table.php b/database/migrations/2019_12_14_000001_create_personal_access_tokens_table.php new file mode 100644 index 0000000..e828ad8 --- /dev/null +++ b/database/migrations/2019_12_14_000001_create_personal_access_tokens_table.php @@ -0,0 +1,33 @@ +id(); + $table->morphs('tokenable'); + $table->string('name'); + $table->string('token', 64)->unique(); + $table->text('abilities')->nullable(); + $table->timestamp('last_used_at')->nullable(); + $table->timestamp('expires_at')->nullable(); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('personal_access_tokens'); + } +}; diff --git a/database/migrations/2020_05_15_000010_create_tenant_user_impersonation_tokens_table.php b/database/migrations/2020_05_15_000010_create_tenant_user_impersonation_tokens_table.php new file mode 100644 index 0000000..32597f3 --- /dev/null +++ b/database/migrations/2020_05_15_000010_create_tenant_user_impersonation_tokens_table.php @@ -0,0 +1,39 @@ +string('token', 128)->primary(); + $table->string('tenant_id'); + $table->string('user_id'); + $table->string('auth_guard'); + $table->string('redirect_url'); + $table->timestamp('created_at'); + + $table->foreign('tenant_id')->references('id')->on('tenants')->onUpdate('cascade')->onDelete('cascade'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down(): void + { + Schema::dropIfExists('tenant_user_impersonation_tokens'); + } +} diff --git a/database/migrations/2024_09_09_094040_create_job_batches_table.php b/database/migrations/2024_09_09_094040_create_job_batches_table.php new file mode 100644 index 0000000..226e640 --- /dev/null +++ b/database/migrations/2024_09_09_094040_create_job_batches_table.php @@ -0,0 +1,39 @@ +string('id')->primary(); + $table->string('name'); + $table->integer('total_jobs'); + $table->integer('pending_jobs'); + $table->integer('failed_jobs'); + $table->text('failed_job_ids'); + $table->mediumText('options')->nullable(); + $table->integer('cancelled_at')->nullable(); + $table->integer('created_at'); + $table->integer('finished_at')->nullable(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('job_batches'); + } +}; diff --git a/database/migrations/2024_09_09_094042_create_jobs_table.php b/database/migrations/2024_09_09_094042_create_jobs_table.php new file mode 100644 index 0000000..a786a89 --- /dev/null +++ b/database/migrations/2024_09_09_094042_create_jobs_table.php @@ -0,0 +1,36 @@ +bigIncrements('id'); + $table->string('queue')->index(); + $table->longText('payload'); + $table->unsignedTinyInteger('attempts'); + $table->unsignedInteger('reserved_at')->nullable(); + $table->unsignedInteger('available_at'); + $table->unsignedInteger('created_at'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('jobs'); + } +}; diff --git a/database/migrations/2026_02_02_000000_add_last_updated_by_to_tenants_table.php b/database/migrations/2026_02_02_000000_add_last_updated_by_to_tenants_table.php new file mode 100644 index 0000000..b8fc0ba --- /dev/null +++ b/database/migrations/2026_02_02_000000_add_last_updated_by_to_tenants_table.php @@ -0,0 +1,22 @@ +string('last_updated_by')->nullable(); + }); + } + + public function down() + { + Schema::table('tenants', function (Blueprint $table) { + $table->dropColumn('last_updated_by'); + }); + } +}; diff --git a/database/migrations/tenant/2021_03_12_060658_create_core_config_table.php b/database/migrations/tenant/2021_03_12_060658_create_core_config_table.php new file mode 100755 index 0000000..9c5f6cc --- /dev/null +++ b/database/migrations/tenant/2021_03_12_060658_create_core_config_table.php @@ -0,0 +1,33 @@ +increments('id'); + $table->string('code'); + $table->string('value'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('core_config'); + } +}; diff --git a/database/migrations/tenant/2021_03_12_074578_create_groups_table.php b/database/migrations/tenant/2021_03_12_074578_create_groups_table.php new file mode 100755 index 0000000..3efdeca --- /dev/null +++ b/database/migrations/tenant/2021_03_12_074578_create_groups_table.php @@ -0,0 +1,33 @@ +increments('id'); + $table->string('name'); + $table->string('description')->nullable(); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('groups'); + } +}; diff --git a/database/migrations/tenant/2021_03_12_074597_create_roles_table.php b/database/migrations/tenant/2021_03_12_074597_create_roles_table.php new file mode 100755 index 0000000..13e596a --- /dev/null +++ b/database/migrations/tenant/2021_03_12_074597_create_roles_table.php @@ -0,0 +1,35 @@ +increments('id'); + $table->string('name'); + $table->string('description')->nullable(); + $table->string('permission_type'); + $table->json('permissions')->nullable(); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('roles'); + } +}; diff --git a/database/migrations/tenant/2021_03_12_074857_create_users_table.php b/database/migrations/tenant/2021_03_12_074857_create_users_table.php new file mode 100644 index 0000000..3ce8d50 --- /dev/null +++ b/database/migrations/tenant/2021_03_12_074857_create_users_table.php @@ -0,0 +1,38 @@ +increments('id'); + $table->string('name'); + $table->string('email')->unique(); + $table->string('password')->nullable(); + $table->boolean('status')->default(0); + $table->integer('role_id')->unsigned(); + $table->foreign('role_id')->references('id')->on('roles')->onDelete('cascade'); + $table->rememberToken(); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('users'); + } +}; diff --git a/database/migrations/tenant/2021_03_12_074867_create_user_groups_table.php b/database/migrations/tenant/2021_03_12_074867_create_user_groups_table.php new file mode 100644 index 0000000..ef289d1 --- /dev/null +++ b/database/migrations/tenant/2021_03_12_074867_create_user_groups_table.php @@ -0,0 +1,34 @@ +integer('group_id')->unsigned(); + $table->foreign('group_id')->references('id')->on('groups')->onDelete('cascade'); + + $table->integer('user_id')->unsigned(); + $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('user_groups'); + } +}; diff --git a/database/migrations/tenant/2021_03_12_074957_create_user_password_resets_table.php b/database/migrations/tenant/2021_03_12_074957_create_user_password_resets_table.php new file mode 100755 index 0000000..83f3f4b --- /dev/null +++ b/database/migrations/tenant/2021_03_12_074957_create_user_password_resets_table.php @@ -0,0 +1,32 @@ +string('email')->index(); + $table->string('token'); + $table->timestamp('created_at')->nullable(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('user_password_resets'); + } +}; diff --git a/database/migrations/tenant/2021_04_02_080709_create_attributes_table.php b/database/migrations/tenant/2021_04_02_080709_create_attributes_table.php new file mode 100644 index 0000000..eb5d555 --- /dev/null +++ b/database/migrations/tenant/2021_04_02_080709_create_attributes_table.php @@ -0,0 +1,43 @@ +increments('id'); + $table->string('code'); + $table->string('name'); + $table->string('type'); + $table->string('lookup_type')->nullable(); + $table->string('entity_type'); + $table->integer('sort_order')->nullable(); + $table->string('validation')->nullable(); + $table->boolean('is_required')->default(0); + $table->boolean('is_unique')->default(0); + $table->boolean('quick_add')->default(0); + $table->boolean('is_user_defined')->default(1); + $table->unique(['code', 'entity_type']); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('attributes'); + } +}; diff --git a/database/migrations/tenant/2021_04_02_080837_create_attribute_options_table.php b/database/migrations/tenant/2021_04_02_080837_create_attribute_options_table.php new file mode 100644 index 0000000..015e07f --- /dev/null +++ b/database/migrations/tenant/2021_04_02_080837_create_attribute_options_table.php @@ -0,0 +1,34 @@ +increments('id'); + $table->string('name')->nullable(); + $table->integer('sort_order')->nullable(); + $table->integer('attribute_id')->unsigned(); + $table->foreign('attribute_id')->references('id')->on('attributes')->onDelete('cascade'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('attribute_options'); + } +}; diff --git a/database/migrations/tenant/2021_04_06_122751_create_attribute_values_table.php b/database/migrations/tenant/2021_04_06_122751_create_attribute_values_table.php new file mode 100644 index 0000000..79b4f9d --- /dev/null +++ b/database/migrations/tenant/2021_04_06_122751_create_attribute_values_table.php @@ -0,0 +1,44 @@ +increments('id'); + $table->string('entity_type')->default('leads'); + $table->text('text_value')->nullable(); + $table->boolean('boolean_value')->nullable(); + $table->integer('integer_value')->nullable(); + $table->double('float_value')->nullable(); + $table->datetime('datetime_value')->nullable(); + $table->date('date_value')->nullable(); + $table->json('json_value')->nullable(); + + $table->integer('entity_id')->unsigned(); + $table->integer('attribute_id')->unsigned(); + + $table->foreign('attribute_id')->references('id')->on('attributes')->onDelete('cascade'); + $table->unique(['entity_type', 'entity_id', 'attribute_id'], 'entity_type_attribute_value_index_unique'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('attribute_values'); + } +}; diff --git a/database/migrations/tenant/2021_04_09_051326_create_organizations_table.php b/database/migrations/tenant/2021_04_09_051326_create_organizations_table.php new file mode 100644 index 0000000..8a2e106 --- /dev/null +++ b/database/migrations/tenant/2021_04_09_051326_create_organizations_table.php @@ -0,0 +1,34 @@ +increments('id'); + $table->string('name'); + $table->json('address')->nullable(); + + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('organizations'); + } +}; diff --git a/database/migrations/tenant/2021_04_09_065617_create_persons_table.php b/database/migrations/tenant/2021_04_09_065617_create_persons_table.php new file mode 100644 index 0000000..fc98d3b --- /dev/null +++ b/database/migrations/tenant/2021_04_09_065617_create_persons_table.php @@ -0,0 +1,37 @@ +increments('id'); + $table->string('name'); + $table->json('emails'); + $table->json('contact_numbers')->nullable(); + + $table->integer('organization_id')->unsigned()->nullable(); + $table->foreign('organization_id')->references('id')->on('organizations')->onDelete('cascade'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('persons'); + } +}; diff --git a/database/migrations/tenant/2021_04_09_065617_create_products_table.php b/database/migrations/tenant/2021_04_09_065617_create_products_table.php new file mode 100644 index 0000000..4f0d465 --- /dev/null +++ b/database/migrations/tenant/2021_04_09_065617_create_products_table.php @@ -0,0 +1,36 @@ +increments('id'); + $table->string('sku')->unique(); + $table->string('name')->nullable(); + $table->string('description')->nullable(); + $table->integer('quantity')->default(0); + $table->decimal('price', 12, 4)->nullable(); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('products'); + } +}; diff --git a/database/migrations/tenant/2021_04_12_173232_create_countries_table.php b/database/migrations/tenant/2021_04_12_173232_create_countries_table.php new file mode 100644 index 0000000..274e574 --- /dev/null +++ b/database/migrations/tenant/2021_04_12_173232_create_countries_table.php @@ -0,0 +1,32 @@ +increments('id'); + $table->string('code'); + $table->string('name'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('countries'); + } +}; diff --git a/database/migrations/tenant/2021_04_12_173344_create_country_states_table.php b/database/migrations/tenant/2021_04_12_173344_create_country_states_table.php new file mode 100644 index 0000000..5939026 --- /dev/null +++ b/database/migrations/tenant/2021_04_12_173344_create_country_states_table.php @@ -0,0 +1,36 @@ +increments('id'); + $table->string('country_code'); + $table->string('code'); + $table->string('name'); + + $table->integer('country_id')->unsigned(); + $table->foreign('country_id')->references('id')->on('countries')->onDelete('cascade'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('country_states'); + } +}; diff --git a/database/migrations/tenant/2021_04_21_172825_create_lead_sources_table.php b/database/migrations/tenant/2021_04_21_172825_create_lead_sources_table.php new file mode 100644 index 0000000..a9752bf --- /dev/null +++ b/database/migrations/tenant/2021_04_21_172825_create_lead_sources_table.php @@ -0,0 +1,32 @@ +increments('id'); + $table->string('name'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('lead_sources'); + } +}; diff --git a/database/migrations/tenant/2021_04_21_172847_create_lead_types_table.php b/database/migrations/tenant/2021_04_21_172847_create_lead_types_table.php new file mode 100644 index 0000000..a3222aa --- /dev/null +++ b/database/migrations/tenant/2021_04_21_172847_create_lead_types_table.php @@ -0,0 +1,32 @@ +increments('id'); + $table->string('name'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('lead_types'); + } +}; diff --git a/database/migrations/tenant/2021_04_22_153258_create_lead_stages_table.php b/database/migrations/tenant/2021_04_22_153258_create_lead_stages_table.php new file mode 100644 index 0000000..0b3c70e --- /dev/null +++ b/database/migrations/tenant/2021_04_22_153258_create_lead_stages_table.php @@ -0,0 +1,34 @@ +increments('id'); + $table->string('code'); + $table->string('name'); + $table->boolean('is_user_defined')->default(1); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('lead_stages'); + } +}; diff --git a/database/migrations/tenant/2021_04_22_155706_create_lead_pipelines_table.php b/database/migrations/tenant/2021_04_22_155706_create_lead_pipelines_table.php new file mode 100644 index 0000000..785f1e1 --- /dev/null +++ b/database/migrations/tenant/2021_04_22_155706_create_lead_pipelines_table.php @@ -0,0 +1,33 @@ +increments('id'); + $table->string('name'); + $table->boolean('is_default')->default(0); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('lead_pipelines'); + } +}; diff --git a/database/migrations/tenant/2021_04_22_155838_create_lead_pipeline_stages_table.php b/database/migrations/tenant/2021_04_22_155838_create_lead_pipeline_stages_table.php new file mode 100644 index 0000000..45a41dd --- /dev/null +++ b/database/migrations/tenant/2021_04_22_155838_create_lead_pipeline_stages_table.php @@ -0,0 +1,38 @@ +increments('id'); + $table->integer('probability')->default(0); + $table->integer('sort_order')->default(0); + + $table->integer('lead_stage_id')->unsigned(); + $table->foreign('lead_stage_id')->references('id')->on('lead_stages')->onDelete('cascade'); + + $table->integer('lead_pipeline_id')->unsigned(); + $table->foreign('lead_pipeline_id')->references('id')->on('lead_pipelines')->onDelete('cascade'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('lead_pipeline_stages'); + } +}; diff --git a/database/migrations/tenant/2021_04_22_164215_create_leads_table.php b/database/migrations/tenant/2021_04_22_164215_create_leads_table.php new file mode 100644 index 0000000..a814a37 --- /dev/null +++ b/database/migrations/tenant/2021_04_22_164215_create_leads_table.php @@ -0,0 +1,56 @@ +increments('id'); + $table->string('title'); + $table->text('description')->nullable(); + $table->decimal('lead_value', 12, 4)->nullable(); + $table->boolean('status')->nullable(); + $table->text('lost_reason')->nullable(); + $table->datetime('closed_at')->nullable(); + + $table->integer('user_id')->unsigned(); + $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade'); + + $table->integer('person_id')->unsigned(); + $table->foreign('person_id')->references('id')->on('persons')->onDelete('cascade'); + + $table->integer('lead_source_id')->unsigned(); + $table->foreign('lead_source_id')->references('id')->on('lead_sources')->onDelete('cascade'); + + $table->integer('lead_type_id')->unsigned(); + $table->foreign('lead_type_id')->references('id')->on('lead_types')->onDelete('cascade'); + + $table->integer('lead_pipeline_id')->unsigned()->nullable(); + $table->foreign('lead_pipeline_id')->references('id')->on('lead_pipelines')->onDelete('cascade'); + + $table->integer('lead_stage_id')->unsigned(); + $table->foreign('lead_stage_id')->references('id')->on('lead_stages')->onDelete('cascade'); + + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('leads'); + } +}; diff --git a/database/migrations/tenant/2021_04_22_171805_create_lead_products_table.php b/database/migrations/tenant/2021_04_22_171805_create_lead_products_table.php new file mode 100644 index 0000000..6533410 --- /dev/null +++ b/database/migrations/tenant/2021_04_22_171805_create_lead_products_table.php @@ -0,0 +1,40 @@ +increments('id'); + $table->integer('quantity')->default(0); + $table->decimal('price', 12, 4)->nullable(); + $table->decimal('amount', 12, 4)->nullable(); + + $table->integer('lead_id')->unsigned(); + $table->foreign('lead_id')->references('id')->on('leads')->onDelete('cascade'); + + $table->integer('product_id')->unsigned(); + $table->foreign('product_id')->references('id')->on('products')->onDelete('cascade'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('lead_products'); + } +}; diff --git a/database/migrations/tenant/2021_05_12_150329_create_activities_table.php b/database/migrations/tenant/2021_05_12_150329_create_activities_table.php new file mode 100644 index 0000000..2375477 --- /dev/null +++ b/database/migrations/tenant/2021_05_12_150329_create_activities_table.php @@ -0,0 +1,41 @@ +increments('id'); + $table->string('title')->nullable(); + $table->string('type'); + $table->text('comment')->nullable(); + $table->json('additional')->nullable(); + $table->datetime('schedule_from')->nullable(); + $table->datetime('schedule_to')->nullable(); + $table->boolean('is_done')->default(0); + + $table->integer('user_id')->unsigned(); + $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('activities'); + } +}; diff --git a/database/migrations/tenant/2021_05_12_150329_create_lead_activities_table.php b/database/migrations/tenant/2021_05_12_150329_create_lead_activities_table.php new file mode 100644 index 0000000..9165a76 --- /dev/null +++ b/database/migrations/tenant/2021_05_12_150329_create_lead_activities_table.php @@ -0,0 +1,34 @@ +integer('activity_id')->unsigned(); + $table->foreign('activity_id')->references('id')->on('activities')->onDelete('cascade'); + + $table->integer('lead_id')->unsigned(); + $table->foreign('lead_id')->references('id')->on('leads')->onDelete('cascade'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('lead_activities'); + } +}; diff --git a/database/migrations/tenant/2021_05_15_151855_create_activity_files_table.php b/database/migrations/tenant/2021_05_15_151855_create_activity_files_table.php new file mode 100644 index 0000000..30d516c --- /dev/null +++ b/database/migrations/tenant/2021_05_15_151855_create_activity_files_table.php @@ -0,0 +1,37 @@ +increments('id'); + $table->string('name'); + $table->string('path'); + + $table->integer('activity_id')->unsigned(); + $table->foreign('activity_id')->references('id')->on('activities')->onDelete('cascade'); + + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('activity_files'); + } +}; diff --git a/database/migrations/tenant/2021_05_20_141230_create_tags_table.php b/database/migrations/tenant/2021_05_20_141230_create_tags_table.php new file mode 100644 index 0000000..f6e8b08 --- /dev/null +++ b/database/migrations/tenant/2021_05_20_141230_create_tags_table.php @@ -0,0 +1,37 @@ +increments('id'); + $table->string('name'); + $table->string('color')->nullable(); + + $table->integer('user_id')->unsigned(); + $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade'); + + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('tags'); + } +}; diff --git a/database/migrations/tenant/2021_05_20_141240_create_lead_tags_table.php b/database/migrations/tenant/2021_05_20_141240_create_lead_tags_table.php new file mode 100644 index 0000000..aa765eb --- /dev/null +++ b/database/migrations/tenant/2021_05_20_141240_create_lead_tags_table.php @@ -0,0 +1,34 @@ +integer('tag_id')->unsigned(); + $table->foreign('tag_id')->references('id')->on('tags')->onDelete('cascade'); + + $table->integer('lead_id')->unsigned(); + $table->foreign('lead_id')->references('id')->on('leads')->onDelete('cascade'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('lead_tags'); + } +}; diff --git a/database/migrations/tenant/2021_05_24_075618_create_emails_table.php b/database/migrations/tenant/2021_05_24_075618_create_emails_table.php new file mode 100644 index 0000000..187a1da --- /dev/null +++ b/database/migrations/tenant/2021_05_24_075618_create_emails_table.php @@ -0,0 +1,58 @@ +increments('id'); + $table->string('subject')->nullable(); + $table->string('source'); + $table->string('user_type'); + $table->string('name')->nullable(); + $table->text('reply')->nullable(); + $table->boolean('is_read')->default(0); + $table->json('folders')->nullable(); + $table->json('from')->nullable(); + $table->json('sender')->nullable(); + $table->json('reply_to')->nullable(); + $table->json('cc')->nullable(); + $table->json('bcc')->nullable(); + $table->string('unique_id')->nullable()->unique(); + $table->string('message_id')->unique(); + $table->json('reference_ids')->nullable(); + + $table->integer('person_id')->unsigned()->nullable(); + $table->foreign('person_id')->references('id')->on('persons')->onDelete('set null'); + + $table->integer('lead_id')->unsigned()->nullable(); + $table->foreign('lead_id')->references('id')->on('leads')->onDelete('set null'); + + $table->timestamps(); + }); + + Schema::table('emails', function (Blueprint $table) { + $table->integer('parent_id')->unsigned()->nullable(); + $table->foreign('parent_id')->references('id')->on('emails')->onDelete('cascade'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('emails'); + } +}; diff --git a/database/migrations/tenant/2021_05_25_072700_create_email_attachments_table.php b/database/migrations/tenant/2021_05_25_072700_create_email_attachments_table.php new file mode 100644 index 0000000..93f2251 --- /dev/null +++ b/database/migrations/tenant/2021_05_25_072700_create_email_attachments_table.php @@ -0,0 +1,40 @@ +increments('id'); + $table->string('name')->nullable(); + $table->string('path'); + $table->integer('size')->nullable(); + $table->string('content_type')->nullable(); + $table->string('content_id')->nullable(); + + $table->integer('email_id')->unsigned(); + $table->foreign('email_id')->references('id')->on('emails')->onDelete('cascade'); + + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('email_attachments'); + } +}; diff --git a/database/migrations/tenant/2021_06_07_162808_add_lead_view_permission_column_in_users_table.php b/database/migrations/tenant/2021_06_07_162808_add_lead_view_permission_column_in_users_table.php new file mode 100644 index 0000000..71875c4 --- /dev/null +++ b/database/migrations/tenant/2021_06_07_162808_add_lead_view_permission_column_in_users_table.php @@ -0,0 +1,32 @@ +string('view_permission')->after('status')->default('global')->nullable(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('users', function (Blueprint $table) { + $table->dropColumn('view_permission'); + }); + } +}; diff --git a/database/migrations/tenant/2021_07_01_230345_create_quotes_table.php b/database/migrations/tenant/2021_07_01_230345_create_quotes_table.php new file mode 100644 index 0000000..01dd071 --- /dev/null +++ b/database/migrations/tenant/2021_07_01_230345_create_quotes_table.php @@ -0,0 +1,52 @@ +increments('id'); + $table->string('subject'); + $table->string('description')->nullable(); + + $table->json('billing_address')->nullable(); + $table->json('shipping_address')->nullable(); + + $table->decimal('discount_percent', 12, 4)->default(0)->nullable(); + $table->decimal('discount_amount', 12, 4)->nullable(); + $table->decimal('tax_amount', 12, 4)->nullable(); + $table->decimal('adjustment_amount', 12, 4)->nullable(); + $table->decimal('sub_total', 12, 4)->nullable(); + $table->decimal('grand_total', 12, 4)->nullable(); + + $table->datetime('expired_at')->nullable(); + + $table->integer('person_id')->unsigned(); + $table->foreign('person_id')->references('id')->on('persons')->onDelete('cascade'); + + $table->integer('user_id')->unsigned(); + $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade'); + + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('quotes'); + } +}; diff --git a/database/migrations/tenant/2021_07_01_231317_create_quote_items_table.php b/database/migrations/tenant/2021_07_01_231317_create_quote_items_table.php new file mode 100644 index 0000000..9173c99 --- /dev/null +++ b/database/migrations/tenant/2021_07_01_231317_create_quote_items_table.php @@ -0,0 +1,49 @@ +increments('id'); + $table->string('sku')->nullable(); + $table->string('name')->nullable(); + $table->integer('quantity')->default(0)->nullable(); + $table->decimal('price', 12, 4)->default(0); + + $table->string('coupon_code')->nullable(); + $table->decimal('discount_percent', 12, 4)->default(0)->nullable(); + $table->decimal('discount_amount', 12, 4)->default(0)->nullable(); + + $table->decimal('tax_percent', 12, 4)->default(0)->nullable(); + $table->decimal('tax_amount', 12, 4)->default(0)->nullable(); + + $table->decimal('total', 12, 4)->default(0); + + $table->integer('product_id')->unsigned(); + $table->integer('quote_id')->unsigned(); + $table->foreign('quote_id')->references('id')->on('quotes')->onDelete('cascade'); + + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('quote_items'); + } +}; diff --git a/database/migrations/tenant/2021_07_02_201822_create_lead_quotes_table.php b/database/migrations/tenant/2021_07_02_201822_create_lead_quotes_table.php new file mode 100644 index 0000000..c2449df --- /dev/null +++ b/database/migrations/tenant/2021_07_02_201822_create_lead_quotes_table.php @@ -0,0 +1,34 @@ +integer('quote_id')->unsigned(); + $table->foreign('quote_id')->references('id')->on('quotes')->onDelete('cascade'); + + $table->integer('lead_id')->unsigned(); + $table->foreign('lead_id')->references('id')->on('leads')->onDelete('cascade'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('lead_quotes'); + } +}; diff --git a/database/migrations/tenant/2021_07_28_142453_create_activity_participants_table.php b/database/migrations/tenant/2021_07_28_142453_create_activity_participants_table.php new file mode 100644 index 0000000..ba72faa --- /dev/null +++ b/database/migrations/tenant/2021_07_28_142453_create_activity_participants_table.php @@ -0,0 +1,39 @@ +increments('id'); + + $table->integer('activity_id')->unsigned(); + $table->foreign('activity_id')->references('id')->on('activities')->onDelete('cascade'); + + $table->integer('user_id')->nullable()->unsigned(); + $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade'); + + $table->integer('person_id')->nullable()->unsigned(); + $table->foreign('person_id')->references('id')->on('persons')->onDelete('cascade'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('activity_participants'); + } +}; diff --git a/database/migrations/tenant/2021_08_26_133538_create_workflows_table.php b/database/migrations/tenant/2021_08_26_133538_create_workflows_table.php new file mode 100644 index 0000000..a6f9bac --- /dev/null +++ b/database/migrations/tenant/2021_08_26_133538_create_workflows_table.php @@ -0,0 +1,38 @@ +increments('id'); + $table->string('name'); + $table->string('description')->nullable(); + $table->string('entity_type'); + $table->string('event'); + $table->string('condition_type')->default('and'); + $table->json('conditions')->nullable(); + $table->json('actions')->nullable(); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('workflows'); + } +}; diff --git a/database/migrations/tenant/2021_09_03_172713_create_email_templates_table.php b/database/migrations/tenant/2021_09_03_172713_create_email_templates_table.php new file mode 100644 index 0000000..c39c258 --- /dev/null +++ b/database/migrations/tenant/2021_09_03_172713_create_email_templates_table.php @@ -0,0 +1,34 @@ +increments('id'); + $table->string('name'); + $table->string('subject'); + $table->text('content'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('email_templates'); + } +}; diff --git a/database/migrations/tenant/2021_09_22_194103_add_unique_index_to_name_in_organizations_table.php b/database/migrations/tenant/2021_09_22_194103_add_unique_index_to_name_in_organizations_table.php new file mode 100644 index 0000000..d383cd1 --- /dev/null +++ b/database/migrations/tenant/2021_09_22_194103_add_unique_index_to_name_in_organizations_table.php @@ -0,0 +1,32 @@ +unique('name'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('organizations', function (Blueprint $table) { + $table->dropUnique('organizations_name_unique'); + }); + } +}; diff --git a/database/migrations/tenant/2021_09_22_194622_add_unique_index_to_name_in_groups_table.php b/database/migrations/tenant/2021_09_22_194622_add_unique_index_to_name_in_groups_table.php new file mode 100644 index 0000000..b3bae07 --- /dev/null +++ b/database/migrations/tenant/2021_09_22_194622_add_unique_index_to_name_in_groups_table.php @@ -0,0 +1,32 @@ +unique('name'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('groups', function (Blueprint $table) { + $table->dropUnique('groups_name_unique'); + }); + } +}; diff --git a/database/migrations/tenant/2021_09_23_221138_add_column_expected_close_date_in_leads_table.php b/database/migrations/tenant/2021_09_23_221138_add_column_expected_close_date_in_leads_table.php new file mode 100644 index 0000000..e762fdd --- /dev/null +++ b/database/migrations/tenant/2021_09_23_221138_add_column_expected_close_date_in_leads_table.php @@ -0,0 +1,32 @@ +date('expected_close_date')->nullable(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('leads', function (Blueprint $table) { + $table->dropColumn('expected_close_date'); + }); + } +}; diff --git a/database/migrations/tenant/2021_09_30_135857_add_column_rotten_days_in_lead_pipelines_table.php b/database/migrations/tenant/2021_09_30_135857_add_column_rotten_days_in_lead_pipelines_table.php new file mode 100644 index 0000000..0086ba8 --- /dev/null +++ b/database/migrations/tenant/2021_09_30_135857_add_column_rotten_days_in_lead_pipelines_table.php @@ -0,0 +1,32 @@ +integer('rotten_days')->after('is_default')->default(30); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('lead_pipelines', function (Blueprint $table) { + $table->dropColumn('rotten_days'); + }); + } +}; diff --git a/database/migrations/tenant/2021_09_30_154222_alter_lead_pipeline_stages_table.php b/database/migrations/tenant/2021_09_30_154222_alter_lead_pipeline_stages_table.php new file mode 100644 index 0000000..d0c3a67 --- /dev/null +++ b/database/migrations/tenant/2021_09_30_154222_alter_lead_pipeline_stages_table.php @@ -0,0 +1,57 @@ +string('code')->after('id')->nullable(); + $table->string('name')->after('code')->nullable(); + }); + + DB::table('lead_pipeline_stages') + ->join('lead_stages', 'lead_pipeline_stages.lead_stage_id', '=', 'lead_stages.id') + ->update([ + 'lead_pipeline_stages.code' => DB::raw($tablePrefix.'lead_stages.code'), + 'lead_pipeline_stages.name' => DB::raw($tablePrefix.'lead_stages.name'), + ]); + + Schema::table('lead_pipeline_stages', function (Blueprint $table) use ($tablePrefix) { + $table->dropForeign($tablePrefix.'lead_pipeline_stages_lead_stage_id_foreign'); + $table->dropColumn('lead_stage_id'); + + $table->unique(['code', 'lead_pipeline_id']); + $table->unique(['name', 'lead_pipeline_id']); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('lead_pipeline_stages', function (Blueprint $table) { + $table->dropColumn('code'); + $table->dropColumn('name'); + + $table->integer('lead_stage_id')->unsigned(); + $table->foreign('lead_stage_id')->references('id')->on('lead_stages')->onDelete('cascade'); + + $table->dropUnique(['lead_pipeline_stages_code_lead_pipeline_id_unique', 'lead_pipeline_stages_name_lead_pipeline_id_unique']); + }); + } +}; diff --git a/database/migrations/tenant/2021_09_30_161722_alter_leads_table.php b/database/migrations/tenant/2021_09_30_161722_alter_leads_table.php new file mode 100644 index 0000000..4df62f5 --- /dev/null +++ b/database/migrations/tenant/2021_09_30_161722_alter_leads_table.php @@ -0,0 +1,50 @@ +integer('lead_pipeline_stage_id')->after('lead_pipeline_id')->unsigned()->nullable(); + $table->foreign('lead_pipeline_stage_id')->references('id')->on('lead_pipeline_stages')->onDelete('cascade'); + }); + + DB::table('leads') + ->update([ + 'leads.lead_pipeline_stage_id' => DB::raw($tablePrefix.'leads.lead_stage_id'), + ]); + + Schema::table('leads', function (Blueprint $table) use ($tablePrefix) { + $table->dropForeign($tablePrefix.'leads_lead_stage_id_foreign'); + $table->dropColumn('lead_stage_id'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('leads', function (Blueprint $table) { + $table->dropForeign(DB::getTablePrefix().'leads_lead_pipeline_stage_id_foreign'); + $table->dropColumn('lead_pipeline_stage_id'); + + $table->integer('lead_stage_id')->unsigned(); + $table->foreign('lead_stage_id')->references('id')->on('lead_stages')->onDelete('cascade'); + }); + } +}; diff --git a/database/migrations/tenant/2021_10_02_170105_insert_expected_closed_date_column_in_attributes_table.php b/database/migrations/tenant/2021_10_02_170105_insert_expected_closed_date_column_in_attributes_table.php new file mode 100644 index 0000000..061d1f7 --- /dev/null +++ b/database/migrations/tenant/2021_10_02_170105_insert_expected_closed_date_column_in_attributes_table.php @@ -0,0 +1,42 @@ +insert([ + [ + 'id' => '7', + 'code' => 'expected_close_date', + 'name' => 'Expected Close Date', + 'type' => 'date', + 'entity_type' => 'leads', + 'lookup_type' => null, + 'validation' => null, + 'sort_order' => '8', + 'is_required' => '0', + 'is_unique' => '0', + 'quick_add' => '1', + 'is_user_defined' => '0', + 'created_at' => Carbon::now(), + 'updated_at' => Carbon::now(), + ], + ]); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() {} +}; diff --git a/database/migrations/tenant/2021_11_12_171510_add_image_column_in_users_table.php b/database/migrations/tenant/2021_11_12_171510_add_image_column_in_users_table.php new file mode 100644 index 0000000..360de0c --- /dev/null +++ b/database/migrations/tenant/2021_11_12_171510_add_image_column_in_users_table.php @@ -0,0 +1,32 @@ +string('image')->nullable(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('users', function (Blueprint $table) { + $table->dropColumn('image'); + }); + } +}; diff --git a/database/migrations/tenant/2021_11_17_190943_add_location_column_in_activities_table.php b/database/migrations/tenant/2021_11_17_190943_add_location_column_in_activities_table.php new file mode 100644 index 0000000..53727e1 --- /dev/null +++ b/database/migrations/tenant/2021_11_17_190943_add_location_column_in_activities_table.php @@ -0,0 +1,32 @@ +string('location')->nullable(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('activities', function (Blueprint $table) { + $table->dropColumn('location'); + }); + } +}; diff --git a/database/migrations/tenant/2021_12_14_213049_create_web_forms_table.php b/database/migrations/tenant/2021_12_14_213049_create_web_forms_table.php new file mode 100644 index 0000000..837b8af --- /dev/null +++ b/database/migrations/tenant/2021_12_14_213049_create_web_forms_table.php @@ -0,0 +1,43 @@ +increments('id'); + $table->string('form_id')->unique(); + $table->string('title'); + $table->text('description')->nullable(); + $table->text('submit_button_label'); + $table->string('submit_success_action'); + $table->string('submit_success_content'); + $table->boolean('create_lead')->default(0); + $table->string('background_color')->nullable(); + $table->string('form_background_color')->nullable(); + $table->string('form_title_color')->nullable(); + $table->string('form_submit_button_color')->nullable(); + $table->string('attribute_label_color')->nullable(); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('web_forms'); + } +}; diff --git a/database/migrations/tenant/2021_12_14_214923_create_web_form_attributes_table.php b/database/migrations/tenant/2021_12_14_214923_create_web_form_attributes_table.php new file mode 100644 index 0000000..c038428 --- /dev/null +++ b/database/migrations/tenant/2021_12_14_214923_create_web_form_attributes_table.php @@ -0,0 +1,41 @@ +increments('id'); + $table->string('name')->nullable(); + $table->string('placeholder')->nullable(); + $table->boolean('is_required')->default(0); + $table->boolean('is_hidden')->default(0); + $table->integer('sort_order')->nullable(); + + $table->integer('attribute_id')->unsigned(); + $table->foreign('attribute_id')->references('id')->on('attributes')->onDelete('cascade'); + + $table->integer('web_form_id')->unsigned(); + $table->foreign('web_form_id')->references('id')->on('web_forms')->onDelete('cascade'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('web_form_attributes'); + } +}; diff --git a/database/migrations/tenant/2024_01_11_154640_create_imports_table.php b/database/migrations/tenant/2024_01_11_154640_create_imports_table.php new file mode 100644 index 0000000..0716e8a --- /dev/null +++ b/database/migrations/tenant/2024_01_11_154640_create_imports_table.php @@ -0,0 +1,45 @@ +increments('id'); + $table->string('state')->default('pending'); + $table->boolean('process_in_queue')->default(1); + $table->string('type'); + $table->string('action'); + $table->string('validation_strategy'); + $table->integer('allowed_errors')->default(0); + $table->integer('processed_rows_count')->default(0); + $table->integer('invalid_rows_count')->default(0); + $table->integer('errors_count')->default(0); + $table->json('errors')->nullable(); + $table->string('field_separator'); + $table->string('file_path'); + $table->string('error_file_path')->nullable(); + $table->json('summary')->nullable(); + + $table->datetime('started_at')->nullable(); + $table->datetime('completed_at')->nullable(); + + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('imports'); + } +}; diff --git a/database/migrations/tenant/2024_01_11_154741_create_import_batches_table.php b/database/migrations/tenant/2024_01_11_154741_create_import_batches_table.php new file mode 100644 index 0000000..0139541 --- /dev/null +++ b/database/migrations/tenant/2024_01_11_154741_create_import_batches_table.php @@ -0,0 +1,32 @@ +increments('id'); + $table->string('state')->default('pending'); + $table->json('data'); + $table->json('summary')->nullable(); + $table->integer('import_id')->unsigned(); + + $table->foreign('import_id')->references('id')->on('imports')->onDelete('cascade'); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('import_batches'); + } +}; diff --git a/database/migrations/tenant/2024_05_10_152848_create_saved_filters_table.php b/database/migrations/tenant/2024_05_10_152848_create_saved_filters_table.php new file mode 100644 index 0000000..de5d20b --- /dev/null +++ b/database/migrations/tenant/2024_05_10_152848_create_saved_filters_table.php @@ -0,0 +1,33 @@ +id(); + $table->integer('user_id')->unsigned(); + $table->string('name'); + $table->string('src'); + $table->json('applied'); + $table->timestamps(); + + $table->unique(['user_id', 'name', 'src']); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('datagrid_saved_filters'); + } +}; diff --git a/database/migrations/tenant/2024_06_21_160707_create_warehouses_table.php b/database/migrations/tenant/2024_06_21_160707_create_warehouses_table.php new file mode 100644 index 0000000..67f3d98 --- /dev/null +++ b/database/migrations/tenant/2024_06_21_160707_create_warehouses_table.php @@ -0,0 +1,33 @@ +increments('id'); + $table->string('name'); + $table->text('description')->nullable(); + $table->string('contact_name'); + $table->json('contact_emails'); + $table->json('contact_numbers'); + $table->json('contact_address'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('warehouses'); + } +}; diff --git a/database/migrations/tenant/2024_06_21_160735_create_warehouse_locations_table.php b/database/migrations/tenant/2024_06_21_160735_create_warehouse_locations_table.php new file mode 100644 index 0000000..e5c2f0b --- /dev/null +++ b/database/migrations/tenant/2024_06_21_160735_create_warehouse_locations_table.php @@ -0,0 +1,34 @@ +increments('id'); + $table->string('name'); + + $table->integer('warehouse_id')->unsigned(); + $table->foreign('warehouse_id')->references('id')->on('warehouses')->onDelete('cascade'); + + $table->unique(['warehouse_id', 'name']); + + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('warehouse_locations'); + } +}; diff --git a/database/migrations/tenant/2024_06_24_174241_insert_warehouse_attributes_in_attributes_table.php b/database/migrations/tenant/2024_06_24_174241_insert_warehouse_attributes_in_attributes_table.php new file mode 100644 index 0000000..b1d69d2 --- /dev/null +++ b/database/migrations/tenant/2024_06_24_174241_insert_warehouse_attributes_in_attributes_table.php @@ -0,0 +1,117 @@ +insert([ + [ + 'code' => 'name', + 'name' => trans('installer::app.seeders.attributes.warehouses.name'), + 'type' => 'text', + 'entity_type' => 'warehouses', + 'lookup_type' => null, + 'validation' => null, + 'sort_order' => '1', + 'is_required' => '1', + 'is_unique' => '0', + 'quick_add' => '1', + 'is_user_defined' => '0', + 'created_at' => $now, + 'updated_at' => $now, + ], [ + 'code' => 'description', + 'name' => trans('installer::app.seeders.attributes.warehouses.description'), + 'type' => 'textarea', + 'entity_type' => 'warehouses', + 'lookup_type' => null, + 'validation' => null, + 'sort_order' => '2', + 'is_required' => '0', + 'is_unique' => '0', + 'quick_add' => '1', + 'is_user_defined' => '0', + 'created_at' => $now, + 'updated_at' => $now, + ], [ + 'code' => 'contact_name', + 'name' => trans('installer::app.seeders.attributes.warehouses.contact-name'), + 'type' => 'text', + 'entity_type' => 'warehouses', + 'lookup_type' => null, + 'validation' => null, + 'sort_order' => '3', + 'is_required' => '1', + 'is_unique' => '0', + 'quick_add' => '1', + 'is_user_defined' => '0', + 'created_at' => $now, + 'updated_at' => $now, + ], [ + 'code' => 'contact_emails', + 'name' => trans('installer::app.seeders.attributes.warehouses.contact-emails'), + 'type' => 'email', + 'entity_type' => 'warehouses', + 'lookup_type' => null, + 'validation' => null, + 'sort_order' => '4', + 'is_required' => '1', + 'is_unique' => '1', + 'quick_add' => '1', + 'is_user_defined' => '0', + 'created_at' => $now, + 'updated_at' => $now, + ], [ + 'code' => 'contact_numbers', + 'name' => trans('installer::app.seeders.attributes.warehouses.contact-numbers'), + 'type' => 'phone', + 'entity_type' => 'warehouses', + 'lookup_type' => null, + 'validation' => 'numeric', + 'sort_order' => '5', + 'is_required' => '0', + 'is_unique' => '1', + 'quick_add' => '1', + 'is_user_defined' => '0', + 'created_at' => $now, + 'updated_at' => $now, + ], [ + 'code' => 'contact_address', + 'name' => trans('installer::app.seeders.attributes.warehouses.contact-address'), + 'type' => 'address', + 'entity_type' => 'warehouses', + 'lookup_type' => null, + 'validation' => null, + 'sort_order' => '6', + 'is_required' => '1', + 'is_unique' => '0', + 'quick_add' => '1', + 'is_user_defined' => '0', + 'created_at' => $now, + 'updated_at' => $now, + ], + ]); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('attributes', function (Blueprint $table) { + // + }); + } +}; diff --git a/database/migrations/tenant/2024_06_28_154009_create_product_inventories_table.php b/database/migrations/tenant/2024_06_28_154009_create_product_inventories_table.php new file mode 100644 index 0000000..7cba111 --- /dev/null +++ b/database/migrations/tenant/2024_06_28_154009_create_product_inventories_table.php @@ -0,0 +1,39 @@ +increments('id'); + $table->integer('in_stock')->default(0); + $table->integer('allocated')->default(0); + + $table->integer('product_id')->unsigned(); + $table->foreign('product_id')->references('id')->on('products')->onDelete('cascade'); + + $table->integer('warehouse_id')->unsigned()->nullable(); + $table->foreign('warehouse_id')->references('id')->on('warehouses')->onDelete('cascade'); + + $table->integer('warehouse_location_id')->unsigned()->nullable(); + $table->foreign('warehouse_location_id')->references('id')->on('warehouse_locations')->onDelete('SET NULL'); + + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('product_inventories'); + } +}; diff --git a/database/migrations/tenant/2024_07_24_150821_create_webhooks_table.php b/database/migrations/tenant/2024_07_24_150821_create_webhooks_table.php new file mode 100644 index 0000000..9554e90 --- /dev/null +++ b/database/migrations/tenant/2024_07_24_150821_create_webhooks_table.php @@ -0,0 +1,37 @@ +id(); + $table->string('name'); + $table->string('entity_type'); + $table->string('description')->nullable(); + $table->string('method'); + $table->string('end_point'); + $table->json('query_params')->nullable(); + $table->json('headers')->nullable(); + $table->string('payload_type'); + $table->string('raw_payload_type'); + $table->json('payload')->nullable(); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('webhooks'); + } +}; diff --git a/database/migrations/tenant/2024_07_31_092951_add_job_title_in_persons_table.php b/database/migrations/tenant/2024_07_31_092951_add_job_title_in_persons_table.php new file mode 100644 index 0000000..ca4514c --- /dev/null +++ b/database/migrations/tenant/2024_07_31_092951_add_job_title_in_persons_table.php @@ -0,0 +1,28 @@ +string('job_title')->nullable(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('persons', function (Blueprint $table) { + $table->dropColumn('job_title'); + }); + } +}; diff --git a/database/migrations/tenant/2024_07_31_093603_add_organization_sales_owner_attribute_in_attributes_table.php b/database/migrations/tenant/2024_07_31_093603_add_organization_sales_owner_attribute_in_attributes_table.php new file mode 100644 index 0000000..06b87e2 --- /dev/null +++ b/database/migrations/tenant/2024_07_31_093603_add_organization_sales_owner_attribute_in_attributes_table.php @@ -0,0 +1,40 @@ +insert([ + [ + 'code' => 'user_id', + 'name' => trans('installer::app.seeders.attributes.organizations.sales-owner'), + 'type' => 'lookup', + 'entity_type' => 'organizations', + 'lookup_type' => 'users', + 'validation' => null, + 'sort_order' => '5', + 'is_required' => '0', + 'is_unique' => '0', + 'quick_add' => '1', + 'is_user_defined' => '0', + 'created_at' => $now, + 'updated_at' => $now, + ], + ]); + } + + /** + * Reverse the migrations. + */ + public function down(): void {} +}; diff --git a/database/migrations/tenant/2024_07_31_093605_add_person_job_title_attribute_in_attributes_table.php b/database/migrations/tenant/2024_07_31_093605_add_person_job_title_attribute_in_attributes_table.php new file mode 100644 index 0000000..50dbe40 --- /dev/null +++ b/database/migrations/tenant/2024_07_31_093605_add_person_job_title_attribute_in_attributes_table.php @@ -0,0 +1,40 @@ +insert([ + [ + 'code' => 'job_title', + 'name' => trans('installer::app.seeders.attributes.persons.job-title'), + 'type' => 'text', + 'entity_type' => 'persons', + 'lookup_type' => null, + 'validation' => null, + 'sort_order' => '4', + 'is_required' => '0', + 'is_unique' => '0', + 'quick_add' => '1', + 'is_user_defined' => '0', + 'created_at' => $now, + 'updated_at' => $now, + ], + ]); + } + + /** + * Reverse the migrations. + */ + public function down(): void {} +}; diff --git a/database/migrations/tenant/2024_07_31_093605_add_person_sales_owner_attribute_in_attributes_table.php b/database/migrations/tenant/2024_07_31_093605_add_person_sales_owner_attribute_in_attributes_table.php new file mode 100644 index 0000000..3ecb3e5 --- /dev/null +++ b/database/migrations/tenant/2024_07_31_093605_add_person_sales_owner_attribute_in_attributes_table.php @@ -0,0 +1,40 @@ +insert([ + [ + 'code' => 'user_id', + 'name' => trans('installer::app.seeders.attributes.persons.sales-owner'), + 'type' => 'lookup', + 'entity_type' => 'persons', + 'lookup_type' => 'users', + 'validation' => null, + 'sort_order' => '5', + 'is_required' => '0', + 'is_unique' => '0', + 'quick_add' => '1', + 'is_user_defined' => '0', + 'created_at' => $now, + 'updated_at' => $now, + ], + ]); + } + + /** + * Reverse the migrations. + */ + public function down(): void {} +}; diff --git a/database/migrations/tenant/2024_08_06_145943_create_person_tags_table.php b/database/migrations/tenant/2024_08_06_145943_create_person_tags_table.php new file mode 100644 index 0000000..cd7c7dc --- /dev/null +++ b/database/migrations/tenant/2024_08_06_145943_create_person_tags_table.php @@ -0,0 +1,30 @@ +integer('tag_id')->unsigned(); + $table->foreign('tag_id')->references('id')->on('tags')->onDelete('cascade'); + + $table->integer('person_id')->unsigned(); + $table->foreign('person_id')->references('id')->on('persons')->onDelete('cascade'); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('person_tags'); + } +}; diff --git a/database/migrations/tenant/2024_08_06_161212_create_person_activities_table.php b/database/migrations/tenant/2024_08_06_161212_create_person_activities_table.php new file mode 100644 index 0000000..90917ef --- /dev/null +++ b/database/migrations/tenant/2024_08_06_161212_create_person_activities_table.php @@ -0,0 +1,30 @@ +integer('activity_id')->unsigned(); + $table->foreign('activity_id')->references('id')->on('activities')->onDelete('cascade'); + + $table->integer('person_id')->unsigned(); + $table->foreign('person_id')->references('id')->on('persons')->onDelete('cascade'); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('lead_activities'); + } +}; diff --git a/database/migrations/tenant/2024_08_10_100329_create_warehouse_activities_table.php b/database/migrations/tenant/2024_08_10_100329_create_warehouse_activities_table.php new file mode 100644 index 0000000..64cf879 --- /dev/null +++ b/database/migrations/tenant/2024_08_10_100329_create_warehouse_activities_table.php @@ -0,0 +1,34 @@ +integer('activity_id')->unsigned(); + $table->foreign('activity_id')->references('id')->on('activities')->onDelete('cascade'); + + $table->integer('warehouse_id')->unsigned(); + $table->foreign('warehouse_id')->references('id')->on('warehouses')->onDelete('cascade'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('warehouse_activities'); + } +}; diff --git a/database/migrations/tenant/2024_08_10_100340_create_warehouse_tags_table.php b/database/migrations/tenant/2024_08_10_100340_create_warehouse_tags_table.php new file mode 100644 index 0000000..9d50f5c --- /dev/null +++ b/database/migrations/tenant/2024_08_10_100340_create_warehouse_tags_table.php @@ -0,0 +1,34 @@ +integer('tag_id')->unsigned(); + $table->foreign('tag_id')->references('id')->on('tags')->onDelete('cascade'); + + $table->integer('warehouse_id')->unsigned(); + $table->foreign('warehouse_id')->references('id')->on('warehouses')->onDelete('cascade'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('warehouse_tags'); + } +}; diff --git a/database/migrations/tenant/2024_08_10_150329_create_product_activities_table.php b/database/migrations/tenant/2024_08_10_150329_create_product_activities_table.php new file mode 100644 index 0000000..bb1fce6 --- /dev/null +++ b/database/migrations/tenant/2024_08_10_150329_create_product_activities_table.php @@ -0,0 +1,34 @@ +integer('activity_id')->unsigned(); + $table->foreign('activity_id')->references('id')->on('activities')->onDelete('cascade'); + + $table->integer('product_id')->unsigned(); + $table->foreign('product_id')->references('id')->on('products')->onDelete('cascade'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('product_activities'); + } +}; diff --git a/database/migrations/tenant/2024_08_10_150340_create_product_tags_table.php b/database/migrations/tenant/2024_08_10_150340_create_product_tags_table.php new file mode 100644 index 0000000..6517e02 --- /dev/null +++ b/database/migrations/tenant/2024_08_10_150340_create_product_tags_table.php @@ -0,0 +1,34 @@ +integer('tag_id')->unsigned(); + $table->foreign('tag_id')->references('id')->on('tags')->onDelete('cascade'); + + $table->integer('product_id')->unsigned(); + $table->foreign('product_id')->references('id')->on('products')->onDelete('cascade'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('product_tags'); + } +}; diff --git a/database/migrations/tenant/2024_08_14_102116_add_user_id_column_in_persons_table.php b/database/migrations/tenant/2024_08_14_102116_add_user_id_column_in_persons_table.php new file mode 100644 index 0000000..069e669 --- /dev/null +++ b/database/migrations/tenant/2024_08_14_102116_add_user_id_column_in_persons_table.php @@ -0,0 +1,30 @@ +integer('user_id')->unsigned()->nullable(); + $table->foreign('user_id')->references('id')->on('users')->onDelete('set null'); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('persons', function (Blueprint $table) { + $table->dropForeign(['user_id']); + $table->dropColumn('user_id'); + }); + } +}; diff --git a/database/migrations/tenant/2024_08_14_102136_add_user_id_column_in_organizations_table.php b/database/migrations/tenant/2024_08_14_102136_add_user_id_column_in_organizations_table.php new file mode 100644 index 0000000..98f2910 --- /dev/null +++ b/database/migrations/tenant/2024_08_14_102136_add_user_id_column_in_organizations_table.php @@ -0,0 +1,30 @@ +integer('user_id')->unsigned()->nullable(); + $table->foreign('user_id')->references('id')->on('users')->onDelete('set null'); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('organizations', function (Blueprint $table) { + $table->dropForeign(['user_id']); + $table->dropColumn('user_id'); + }); + } +}; diff --git a/database/migrations/tenant/2024_08_21_153011_add_leads_stage_and_pipeline_attributes.php b/database/migrations/tenant/2024_08_21_153011_add_leads_stage_and_pipeline_attributes.php new file mode 100644 index 0000000..1136f84 --- /dev/null +++ b/database/migrations/tenant/2024_08_21_153011_add_leads_stage_and_pipeline_attributes.php @@ -0,0 +1,57 @@ +insert([ + [ + 'code' => 'lead_pipeline_id', + 'name' => trans('installer::app.seeders.attributes.leads.pipeline'), + 'type' => 'lookup', + 'entity_type' => 'leads', + 'lookup_type' => 'lead_pipelines', + 'validation' => null, + 'sort_order' => '9', + 'is_required' => '1', + 'is_unique' => '0', + 'quick_add' => '1', + 'is_user_defined' => '0', + 'created_at' => $now, + 'updated_at' => $now, + ], [ + 'code' => 'lead_pipeline_stage_id', + 'name' => trans('installer::app.seeders.attributes.leads.stage'), + 'type' => 'lookup', + 'entity_type' => 'leads', + 'lookup_type' => 'lead_pipeline_stages', + 'validation' => null, + 'sort_order' => '10', + 'is_required' => '1', + 'is_unique' => '0', + 'quick_add' => '1', + 'is_user_defined' => '0', + 'created_at' => $now, + 'updated_at' => $now, + ], + ]); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + // + } +}; diff --git a/database/migrations/tenant/2024_08_27_091619_create_email_tags_table.php b/database/migrations/tenant/2024_08_27_091619_create_email_tags_table.php new file mode 100644 index 0000000..45fd477 --- /dev/null +++ b/database/migrations/tenant/2024_08_27_091619_create_email_tags_table.php @@ -0,0 +1,30 @@ +integer('tag_id')->unsigned(); + $table->foreign('tag_id')->references('id')->on('tags')->onDelete('cascade'); + + $table->integer('email_id')->unsigned(); + $table->foreign('email_id')->references('id')->on('emails')->onDelete('cascade'); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('email_tags'); + } +}; diff --git a/database/migrations/tenant/2024_09_06_065808_alter_product_inventories_table.php b/database/migrations/tenant/2024_09_06_065808_alter_product_inventories_table.php new file mode 100644 index 0000000..05318a9 --- /dev/null +++ b/database/migrations/tenant/2024_09_06_065808_alter_product_inventories_table.php @@ -0,0 +1,26 @@ +dropForeign(['warehouse_location_id']); + + $table->foreign('warehouse_location_id')->references('id')->on('warehouse_locations')->onDelete('cascade'); + }); + } + + public function down() + { + Schema::table('product_inventories', function (Blueprint $table) { + $table->dropForeign(['warehouse_location_id']); + + $table->foreign('warehouse_location_id')->references('id')->on('warehouse_locations')->onDelete('set null'); + }); + } +}; diff --git a/database/migrations/tenant/2024_09_09_112201_add_unique_id_to_person_table.php b/database/migrations/tenant/2024_09_09_112201_add_unique_id_to_person_table.php new file mode 100644 index 0000000..d6a5b65 --- /dev/null +++ b/database/migrations/tenant/2024_09_09_112201_add_unique_id_to_person_table.php @@ -0,0 +1,41 @@ +string('unique_id')->nullable()->unique(); + }); + + $tableName = DB::getTablePrefix().'persons'; + + DB::statement(" + UPDATE {$tableName} + SET unique_id = CONCAT( + user_id, '|', + organization_id, '|', + JSON_UNQUOTE(JSON_EXTRACT(emails, '$[0].value')), '|', + JSON_UNQUOTE(JSON_EXTRACT(contact_numbers, '$[0].value')) + ) + "); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('persons', function (Blueprint $table) { + $table->dropColumn('unique_id'); + }); + } +}; diff --git a/database/migrations/tenant/2024_10_29_044744_create_marketing_events_table.php b/database/migrations/tenant/2024_10_29_044744_create_marketing_events_table.php new file mode 100644 index 0000000..b78e9ff --- /dev/null +++ b/database/migrations/tenant/2024_10_29_044744_create_marketing_events_table.php @@ -0,0 +1,30 @@ +increments('id'); + $table->string('name'); + $table->string('description'); + $table->date('date'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('marketing_events'); + } +}; diff --git a/database/migrations/tenant/2024_11_04_122500_create_marketing_campaigns_table.php b/database/migrations/tenant/2024_11_04_122500_create_marketing_campaigns_table.php new file mode 100644 index 0000000..34bea0b --- /dev/null +++ b/database/migrations/tenant/2024_11_04_122500_create_marketing_campaigns_table.php @@ -0,0 +1,32 @@ +increments('id'); + $table->string('name'); + $table->string('subject'); + $table->boolean('status')->default(0); + $table->string('type'); + $table->string('mail_to'); + $table->string('spooling')->nullable(); + $table->unsignedInteger('marketing_template_id')->nullable(); + $table->unsignedInteger('marketing_event_id')->nullable(); + $table->timestamps(); + + $table->foreign('marketing_template_id')->references('id')->on('email_templates')->onDelete('set null'); + $table->foreign('marketing_event_id')->references('id')->on('marketing_events')->onDelete('set null'); + }); + } + + public function down(): void + { + Schema::dropIfExists('marketing_campaigns'); + } +}; diff --git a/database/migrations/tenant/2024_11_29_120302_modify_foreign_keys_in_leads_table.php b/database/migrations/tenant/2024_11_29_120302_modify_foreign_keys_in_leads_table.php new file mode 100644 index 0000000..eb076bd --- /dev/null +++ b/database/migrations/tenant/2024_11_29_120302_modify_foreign_keys_in_leads_table.php @@ -0,0 +1,80 @@ +integer('user_id')->unsigned()->nullable()->change(); + $table->integer('person_id')->unsigned()->nullable()->change(); + $table->integer('lead_source_id')->unsigned()->nullable()->change(); + $table->integer('lead_type_id')->unsigned()->nullable()->change(); + + $table->dropForeign(['user_id']); + $table->dropForeign(['person_id']); + $table->dropForeign(['lead_source_id']); + $table->dropForeign(['lead_type_id']); + + $table->foreign('user_id') + ->references('id')->on('users') + ->onDelete('set null'); + + $table->foreign('person_id') + ->references('id')->on('persons') + ->onDelete('restrict'); + + $table->foreign('lead_source_id') + ->references('id')->on('lead_sources') + ->onDelete('restrict'); + + $table->foreign('lead_type_id') + ->references('id')->on('lead_types') + ->onDelete('restrict'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('leads', function (Blueprint $table) { + $table->dropForeign(['user_id']); + $table->dropForeign(['person_id']); + $table->dropForeign(['lead_source_id']); + $table->dropForeign(['lead_type_id']); + + $table->integer('user_id')->unsigned()->nullable()->change(); + $table->integer('person_id')->unsigned()->nullable(false)->change(); + $table->integer('lead_source_id')->unsigned()->nullable(false)->change(); + $table->integer('lead_type_id')->unsigned()->nullable(false)->change(); + + $table->foreign('user_id') + ->references('id')->on('users') + ->onDelete('cascade'); + + $table->foreign('person_id') + ->references('id')->on('persons') + ->onDelete('cascade'); + + $table->foreign('lead_source_id') + ->references('id')->on('lead_sources') + ->onDelete('cascade'); + + $table->foreign('lead_type_id') + ->references('id')->on('lead_types') + ->onDelete('cascade'); + }); + } +}; diff --git a/database/migrations/tenant/2025_01_17_151632_alter_activities_table.php b/database/migrations/tenant/2025_01_17_151632_alter_activities_table.php new file mode 100644 index 0000000..f36b8a1 --- /dev/null +++ b/database/migrations/tenant/2025_01_17_151632_alter_activities_table.php @@ -0,0 +1,52 @@ +dropForeign(['user_id']); + + $table->unsignedInteger('user_id')->nullable()->change(); + $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('activities', function (Blueprint $table) { + $tablePrefix = DB::getTablePrefix(); + + // Disable foreign key checks temporarily. + DB::statement('SET FOREIGN_KEY_CHECKS=0'); + + // Drop the foreign key constraint using raw SQL. + DB::statement('ALTER TABLE '.$tablePrefix.'activities DROP FOREIGN KEY activities_user_id_foreign'); + + // Drop the index. + DB::statement('ALTER TABLE '.$tablePrefix.'activities DROP INDEX activities_user_id_foreign'); + + // Change the column to be non-nullable. + $table->unsignedInteger('user_id')->nullable(false)->change(); + $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade'); + + // Re-enable foreign key checks. + DB::statement('SET FOREIGN_KEY_CHECKS=1'); + }); + } +}; diff --git a/database/migrations/tenant/2025_01_29_133500_update_text_column_type_in_core_config_table.php b/database/migrations/tenant/2025_01_29_133500_update_text_column_type_in_core_config_table.php new file mode 100644 index 0000000..2312701 --- /dev/null +++ b/database/migrations/tenant/2025_01_29_133500_update_text_column_type_in_core_config_table.php @@ -0,0 +1,28 @@ +text('value')->change(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('core_config', function (Blueprint $table) { + $table->string('value')->change(); + }); + } +}; diff --git a/database/migrations/tenant/2025_03_19_132236_update_organization_id_column_in_persons_table.php b/database/migrations/tenant/2025_03_19_132236_update_organization_id_column_in_persons_table.php new file mode 100644 index 0000000..bb26d4a --- /dev/null +++ b/database/migrations/tenant/2025_03_19_132236_update_organization_id_column_in_persons_table.php @@ -0,0 +1,32 @@ +dropForeign(['organization_id']); + + $table->foreign('organization_id')->references('id')->on('organizations')->onDelete('set null'); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('persons', function (Blueprint $table) { + $table->dropForeign(['organization_id']); + + $table->foreign('organization_id')->references('id')->on('organizations')->onDelete('cascade'); + }); + } +}; diff --git a/database/migrations/tenant/2025_07_01_133612_alter_lead_pipelines_table.php b/database/migrations/tenant/2025_07_01_133612_alter_lead_pipelines_table.php new file mode 100644 index 0000000..24f238c --- /dev/null +++ b/database/migrations/tenant/2025_07_01_133612_alter_lead_pipelines_table.php @@ -0,0 +1,30 @@ +string('name')->unique()->change(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('lead_pipelines', function (Blueprint $table) { + $table->dropUnique(['name']); + + $table->string('name')->change(); + }); + } +}; diff --git a/database/migrations/tenant/2025_07_02_191710_alter_attribute_values_table.php b/database/migrations/tenant/2025_07_02_191710_alter_attribute_values_table.php new file mode 100644 index 0000000..b0792b9 --- /dev/null +++ b/database/migrations/tenant/2025_07_02_191710_alter_attribute_values_table.php @@ -0,0 +1,39 @@ +string('unique_id')->nullable(); + }); + + $tablePrefix = DB::getTablePrefix(); + + DB::statement('UPDATE '.$tablePrefix."attribute_values SET unique_id = CONCAT(entity_id, '|', attribute_id)"); + + Schema::table('attribute_values', function (Blueprint $table) { + $table->unique('unique_id'); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('attribute_values', function (Blueprint $table) { + $table->dropUnique(['unique_id']); + + $table->dropColumn('unique_id'); + }); + } +}; diff --git a/database/migrations/tenant/2025_07_09_133553_alter_email_templates_table.php b/database/migrations/tenant/2025_07_09_133553_alter_email_templates_table.php new file mode 100644 index 0000000..0bee090 --- /dev/null +++ b/database/migrations/tenant/2025_07_09_133553_alter_email_templates_table.php @@ -0,0 +1,30 @@ +string('name')->unique()->change(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('email_templates', function (Blueprint $table) { + $table->dropUnique(['name']); + + $table->string('name')->change(); + }); + } +}; diff --git a/database/seeders/DatabaseSeeder.php b/database/seeders/DatabaseSeeder.php new file mode 100644 index 0000000..4b55b51 --- /dev/null +++ b/database/seeders/DatabaseSeeder.php @@ -0,0 +1,19 @@ +call(KrayinDatabaseSeeder::class); + } +} diff --git a/database/seeders/SuperAdminSeeder.php b/database/seeders/SuperAdminSeeder.php new file mode 100644 index 0000000..ca5da73 --- /dev/null +++ b/database/seeders/SuperAdminSeeder.php @@ -0,0 +1,24 @@ + 'admin@example.com'], + [ + 'name' => 'Super Admin', + 'password' => Hash::make('admin123'), + 'status' => 1, + // 'role_id' => 1, // Skip role_id if strictly checking email + ] + ); + } +} diff --git a/docker-compose.dev.yml b/docker-compose.dev.yml new file mode 100644 index 0000000..eef20d6 --- /dev/null +++ b/docker-compose.dev.yml @@ -0,0 +1,61 @@ +version: '3.8' + +services: + krayin: + build: . + container_name: krayin_app + restart: unless-stopped + ports: + - "8000:80" + volumes: + - .:/var/www/html + environment: + APP_ENV: local + APP_DEBUG: 'true' + APP_URL: http://localhost:8000 + DB_HOST: mysql + DB_PORT: 3306 + DB_DATABASE: laravel-crm + DB_USERNAME: root + DB_PASSWORD: '' + REDIS_HOST: redis + REDIS_PORT: 6379 + CACHE_DRIVER: redis + SESSION_DRIVER: redis + QUEUE_CONNECTION: redis + depends_on: + - mysql + - redis + networks: + - krayin_net + + mysql: + image: mysql:8.0 + container_name: krayin_mysql + restart: unless-stopped + environment: + MYSQL_DATABASE: laravel-crm + MYSQL_ALLOW_EMPTY_PASSWORD: 'yes' + volumes: + - mysql_data:/var/lib/mysql + ports: + - "3306:3306" + networks: + - krayin_net + + redis: + image: redis:alpine + container_name: krayin_redis + restart: unless-stopped + volumes: + - redis_data:/data + networks: + - krayin_net + +networks: + krayin_net: + driver: bridge + +volumes: + mysql_data: + redis_data: diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..03a6053 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,114 @@ +version: "3.7" + +########################################################## +# STACK COMPLETA: Krayin CRM + MySQL + Redis +########################################################## + +services: + + # ===== KRAYIN CRM ===== + krayin: + image: growup:latest # Sua imagem customizada + ports: + - "8090:80" # Ajuste a porta externa conforme necessário + volumes: + - krayin_data:/var/www/html/storage + - krayin_public:/var/www/html/public/storage + networks: + - network_public + environment: + - APP_ENV=production + - APP_DEBUG=false + - APP_URL=https://seudominio.com.br + - DB_CONNECTION=mysql + - DB_HOST=mysql + - DB_PORT=3306 + - DB_DATABASE=krayin + - DB_USERNAME=krayin + - DB_PASSWORD=Mfcd62!!Mfcd62!! + - REDIS_HOST=redis + - REDIS_PORT=6379 + depends_on: + - mysql + - redis + deploy: + mode: replicated + replicas: 1 + placement: + constraints: + - node.role == manager + + # ===== MYSQL ===== + mysql: + image: percona/percona-server:8.0 + environment: + - MYSQL_ROOT_PASSWORD=Mfcd62!!Mfcd62!! + - MYSQL_DATABASE=krayin + - MYSQL_USER=krayin + - MYSQL_PASSWORD=Mfcd62!!Mfcd62!! + - TZ=America/Sao_Paulo + networks: + - network_public + volumes: + - mysql_data:/var/lib/mysql + deploy: + placement: + constraints: + - node.role == manager + resources: + limits: + cpus: '1' + memory: 1024M + command: + [ + "--character-set-server=utf8mb4", + "--collation-server=utf8mb4_general_ci", + "--sql-mode=", + "--default-authentication-plugin=mysql_native_password", + "--max-allowed-packet=512MB", + "--expire_logs_days=7", + "--max_binlog_size=100M" + ] + + # ===== REDIS ===== + redis: + image: redis:latest + command: + [ + "redis-server", + "--appendonly", + "yes", + "--port", + "6379" + ] + volumes: + - redis_data:/data + networks: + - network_public + deploy: + placement: + constraints: + - node.role == manager + resources: + limits: + cpus: "0.5" + memory: 1024M + +networks: + network_public: + external: true + name: network_public + +volumes: + krayin_data: + external: true + name: krayin_data + krayin_public: + external: true + name: krayin_public + mysql_data: + external: true + name: mysql_data + redis_data: + external: true + name: redis_data diff --git a/docker-entrypoint.sh b/docker-entrypoint.sh new file mode 100644 index 0000000..8ddae8c --- /dev/null +++ b/docker-entrypoint.sh @@ -0,0 +1,105 @@ +#!/bin/bash +set -e + +echo "🚀 Iniciando Container v21 (Smart Seed + Key Fix)..." + +# 1. PERMISSÕES +mkdir -p storage/framework/sessions +mkdir -p storage/framework/views +mkdir -p storage/framework/cache +mkdir -p bootstrap/cache +chown -R www-data:www-data storage bootstrap/cache +chmod -R 775 storage + +# 2. AGUARDAR BANCO +DB_HOST=${DB_HOST:-mysql} +DB_PORT=${DB_PORT:-3306} + +echo "⏳ Aguardando Banco ($DB_HOST:$DB_PORT)..." +while ! nc -z $DB_HOST $DB_PORT; do + echo "zzZ... Banco indisponível. Tentando em 3s..." + sleep 3 +done +echo "✅ Banco OK!" + +# 3. PREPARAR .ENV E KEY +if [ ! -f .env ]; then + echo "⚠️ .env não encontrado. Criando a partir do exemplo..." + cp .env.example .env + echo "🔑 Gerando APP_KEY pela primeira vez..." + php artisan key:generate --force +fi + +# Verificação de Segurança da Key +if grep -q "APP_KEY=$" .env || grep -q "APP_KEY=\s*$" .env; then + echo "⚠️ APP_KEY encontrada vazia! Gerando nova chave..." + php artisan key:generate --force +fi + +# 4. CONFIGURAÇÃO DINÂMICA +echo "🇧🇷 Aplicando Configurações..." + +# URL +if [ ! -z "$APP_URL" ]; then + sed -i '/APP_URL=/d' .env + echo "APP_URL=$APP_URL" >> .env +fi + +# Locale e Timezone +sed -i 's/APP_LOCALE=en/APP_LOCALE=pt_BR/g' .env +sed -i 's/APP_CURRENCY=USD/APP_CURRENCY=BRL/g' .env +sed -i 's/APP_TIMEZONE=UTC/APP_TIMEZONE=America\/Sao_Paulo/g' .env +sed -i 's/APP_TIMEZONE=Asia\/Kolkata/APP_TIMEZONE=America\/Sao_Paulo/g' .env + +# Infra +sed -i 's/DB_HOST=127.0.0.1/DB_HOST=mysql/g' .env +sed -i 's/REDIS_HOST=127.0.0.1/REDIS_HOST=redis/g' .env +sed -i 's/MEMCACHED_HOST=127.0.0.1/MEMCACHED_HOST=memcached/g' .env + +# Segurança Session +sed -i '/SESSION_SECURE_COOKIE/d' .env +sed -i '/SESSION_SAME_SITE/d' .env + +if [ "$APP_ENV" = "local" ]; then + echo "SESSION_SECURE_COOKIE=false" >> .env +else + echo "SESSION_SECURE_COOKIE=true" >> .env +fi + +echo "SESSION_SAME_SITE=lax" >> .env +echo "SESSION_COOKIE=growup_session" >> .env +echo "SESSION_DOMAIN=" >> .env + +# 5. LIMPEZA DE CACHE +echo "🔥 Limpando caches..." +rm -f bootstrap/cache/config.php +rm -f bootstrap/cache/packages.php +rm -f bootstrap/cache/services.php +php artisan optimize:clear + +# 6. BANCO E SEED INTELIGENTE (A MUDANÇA ESTÁ AQUI) +echo "📦 Verificando Banco de Dados..." +php artisan migrate --force + +echo "🧐 Verificando existência de usuários..." +# Executa um script PHP rápido para contar usuários na tabela real +USER_COUNT=$(php -r "require __DIR__ . '/vendor/autoload.php'; \$app = require_once __DIR__ . '/bootstrap/app.php'; \$kernel = \$app->make(Illuminate\Contracts\Console\Kernel::class); \$kernel->bootstrap(); try { echo \Illuminate\Support\Facades\DB::table('users')->count(); } catch (\Exception \$e) { echo 0; }") + +echo "📊 Usuários encontrados: $USER_COUNT" + +if [ "$USER_COUNT" -eq "0" ]; then + echo "🌱 Tabela de usuários vazia. Rodando SEED OBRIGATÓRIO..." + php artisan db:seed --force + echo "✅ Seed concluído! Usuário padrão criado." +else + echo "⏩ Já existem usuários no banco ($USER_COUNT). Pulando Seed para evitar duplicidade." +fi + +# 7. OTIMIZAÇÃO FINAL +echo "⚡ Otimizando..." +php artisan optimize +php artisan view:cache +php artisan route:cache + +echo "🏁 Iniciando Apache..." +exec apache2-foreground diff --git a/fix-locale.php b/fix-locale.php new file mode 100644 index 0000000..3599e87 --- /dev/null +++ b/fix-locale.php @@ -0,0 +1,39 @@ +make(\Illuminate\Contracts\Console\Kernel::class)->bootstrap(); + +$tenantId = 'tenant1'; +$tenant = Tenant::find($tenantId); + +if (!$tenant) { + echo "Tenant $tenantId not found.\n"; + exit(1); +} + +tenancy()->initialize($tenant); + +$columns = Schema::getColumnListing('core_config'); +echo "Columns: " . implode(', ', $columns) . "\n"; + +// Update using only available columns +$data = ['value' => 'pt_BR']; +// If locale_code exists, set it? No, usually code key defines it. + +$keys = [ + 'general.general.locale.code', + 'app.locale' +]; + +foreach ($keys as $code) { + DB::table('core_config')->updateOrInsert( + ['code' => $code], + $data + ); + echo "Set $code to pt_BR\n"; +} \ No newline at end of file diff --git a/lang/en/auth.php b/lang/en/auth.php new file mode 100644 index 0000000..24e063b --- /dev/null +++ b/lang/en/auth.php @@ -0,0 +1,20 @@ + 'These credentials do not match our records.', + 'password' => 'The provided password is incorrect.', + 'throttle' => 'Too many login attempts. Please try again in :seconds seconds.', + +]; diff --git a/lang/en/pagination.php b/lang/en/pagination.php new file mode 100644 index 0000000..fcab34b --- /dev/null +++ b/lang/en/pagination.php @@ -0,0 +1,19 @@ + '« Previous', + 'next' => 'Next »', + +]; diff --git a/lang/en/passwords.php b/lang/en/passwords.php new file mode 100644 index 0000000..526795f --- /dev/null +++ b/lang/en/passwords.php @@ -0,0 +1,22 @@ + 'Your password has been reset!', + 'sent' => 'We have emailed your password reset link!', + 'throttled' => 'Please wait before retrying.', + 'token' => 'This password reset token is invalid.', + 'user' => "We can't find a user with that email address.", + +]; diff --git a/lang/en/validation.php b/lang/en/validation.php new file mode 100644 index 0000000..5226d4e --- /dev/null +++ b/lang/en/validation.php @@ -0,0 +1,152 @@ + 'The :attribute must be accepted.', + 'active_url' => 'The :attribute is not a valid URL.', + 'after' => 'The :attribute must be a date after :date.', + 'after_or_equal' => 'The :attribute must be a date after or equal to :date.', + 'alpha' => 'The :attribute may only contain letters.', + 'alpha_dash' => 'The :attribute may only contain letters, numbers, dashes and underscores.', + 'alpha_num' => 'The :attribute may only contain letters and numbers.', + 'array' => 'The :attribute must be an array.', + 'before' => 'The :attribute must be a date before :date.', + 'before_or_equal' => 'The :attribute must be a date before or equal to :date.', + 'between' => [ + 'numeric' => 'The :attribute must be between :min and :max.', + 'file' => 'The :attribute must be between :min and :max kilobytes.', + 'string' => 'The :attribute must be between :min and :max characters.', + 'array' => 'The :attribute must have between :min and :max items.', + ], + 'boolean' => 'The :attribute field must be true or false.', + 'confirmed' => 'The :attribute confirmation does not match.', + 'date' => 'The :attribute is not a valid date.', + 'date_equals' => 'The :attribute must be a date equal to :date.', + 'date_format' => 'The :attribute does not match the format :format.', + 'different' => 'The :attribute and :other must be different.', + 'digits' => 'The :attribute must be :digits digits.', + 'digits_between' => 'The :attribute must be between :min and :max digits.', + 'dimensions' => 'The :attribute has invalid image dimensions.', + 'distinct' => 'The :attribute field has a duplicate value.', + 'email' => 'The :attribute must be a valid email address.', + 'ends_with' => 'The :attribute must end with one of the following: :values.', + 'exists' => 'The selected :attribute is invalid.', + 'file' => 'The :attribute must be a file.', + 'filled' => 'The :attribute field must have a value.', + 'gt' => [ + 'numeric' => 'The :attribute must be greater than :value.', + 'file' => 'The :attribute must be greater than :value kilobytes.', + 'string' => 'The :attribute must be greater than :value characters.', + 'array' => 'The :attribute must have more than :value items.', + ], + 'gte' => [ + 'numeric' => 'The :attribute must be greater than or equal :value.', + 'file' => 'The :attribute must be greater than or equal :value kilobytes.', + 'string' => 'The :attribute must be greater than or equal :value characters.', + 'array' => 'The :attribute must have :value items or more.', + ], + 'image' => 'The :attribute must be an image.', + 'in' => 'The selected :attribute is invalid.', + 'in_array' => 'The :attribute field does not exist in :other.', + 'integer' => 'The :attribute must be an integer.', + 'ip' => 'The :attribute must be a valid IP address.', + 'ipv4' => 'The :attribute must be a valid IPv4 address.', + 'ipv6' => 'The :attribute must be a valid IPv6 address.', + 'json' => 'The :attribute must be a valid JSON string.', + 'lt' => [ + 'numeric' => 'The :attribute must be less than :value.', + 'file' => 'The :attribute must be less than :value kilobytes.', + 'string' => 'The :attribute must be less than :value characters.', + 'array' => 'The :attribute must have less than :value items.', + ], + 'lte' => [ + 'numeric' => 'The :attribute must be less than or equal :value.', + 'file' => 'The :attribute must be less than or equal :value kilobytes.', + 'string' => 'The :attribute must be less than or equal :value characters.', + 'array' => 'The :attribute must not have more than :value items.', + ], + 'max' => [ + 'numeric' => 'The :attribute may not be greater than :max.', + 'file' => 'The :attribute may not be greater than :max kilobytes.', + 'string' => 'The :attribute may not be greater than :max characters.', + 'array' => 'The :attribute may not have more than :max items.', + ], + 'mimes' => 'The :attribute must be a file of type: :values.', + 'mimetypes' => 'The :attribute must be a file of type: :values.', + 'min' => [ + 'numeric' => 'The :attribute must be at least :min.', + 'file' => 'The :attribute must be at least :min kilobytes.', + 'string' => 'The :attribute must be at least :min characters.', + 'array' => 'The :attribute must have at least :min items.', + ], + 'multiple_of' => 'The :attribute must be a multiple of :value.', + 'not_in' => 'The selected :attribute is invalid.', + 'not_regex' => 'The :attribute format is invalid.', + 'numeric' => 'The :attribute must be a number.', + 'password' => 'The password is incorrect.', + 'present' => 'The :attribute field must be present.', + 'regex' => 'The :attribute format is invalid.', + 'required' => 'The :attribute field is required.', + 'required_if' => 'The :attribute field is required when :other is :value.', + 'required_unless' => 'The :attribute field is required unless :other is in :values.', + 'required_with' => 'The :attribute field is required when :values is present.', + 'required_with_all' => 'The :attribute field is required when :values are present.', + 'required_without' => 'The :attribute field is required when :values is not present.', + 'required_without_all' => 'The :attribute field is required when none of :values are present.', + 'same' => 'The :attribute and :other must match.', + 'size' => [ + 'numeric' => 'The :attribute must be :size.', + 'file' => 'The :attribute must be :size kilobytes.', + 'string' => 'The :attribute must be :size characters.', + 'array' => 'The :attribute must contain :size items.', + ], + 'starts_with' => 'The :attribute must start with one of the following: :values.', + 'string' => 'The :attribute must be a string.', + 'timezone' => 'The :attribute must be a valid zone.', + 'unique' => 'The :attribute has already been taken.', + 'uploaded' => 'The :attribute failed to upload.', + 'url' => 'The :attribute format is invalid.', + 'uuid' => 'The :attribute must be a valid UUID.', + + /* + |-------------------------------------------------------------------------- + | Custom Validation Language Lines + |-------------------------------------------------------------------------- + | + | Here you may specify custom validation messages for attributes using the + | convention "attribute.rule" to name the lines. This makes it quick to + | specify a specific custom language line for a given attribute rule. + | + */ + + 'custom' => [ + 'attribute-name' => [ + 'rule-name' => 'custom-message', + ], + ], + + /* + |-------------------------------------------------------------------------- + | Custom Validation Attributes + |-------------------------------------------------------------------------- + | + | The following language lines are used to swap our attribute placeholder + | with something more reader friendly such as "E-Mail Address" instead + | of "email". This simply helps us make our message more expressive. + | + */ + + 'attributes' => [], + +]; diff --git a/package.json b/package.json new file mode 100644 index 0000000..f690541 --- /dev/null +++ b/package.json @@ -0,0 +1,13 @@ +{ + "private": true, + "type": "module", + "scripts": { + "dev": "vite", + "build": "vite build" + }, + "devDependencies": { + "axios": "^1.6.4", + "laravel-vite-plugin": "^1.0.0", + "vite": "^5.0.0" + } +} diff --git a/packages/Webkul/Activity/composer.json b/packages/Webkul/Activity/composer.json new file mode 100755 index 0000000..0cf8329 --- /dev/null +++ b/packages/Webkul/Activity/composer.json @@ -0,0 +1,28 @@ +{ + "name": "krayin/laravel-activity", + "license": "MIT", + "authors": [ + { + "name": "Jitendra Singh", + "email": "jitendra@webkul.com" + } + ], + "require": { + "krayin/laravel-core": "^1.0", + "krayin/laravel-user": "^1.0" + }, + "autoload": { + "psr-4": { + "Webkul\\Activity\\": "src/" + } + }, + "extra": { + "laravel": { + "providers": [ + "Webkul\\Activity\\Providers\\ActivityServiceProvider" + ], + "aliases": {} + } + }, + "minimum-stability": "dev" +} \ No newline at end of file diff --git a/packages/Webkul/Activity/src/Contracts/Activity.php b/packages/Webkul/Activity/src/Contracts/Activity.php new file mode 100644 index 0000000..9a88b87 --- /dev/null +++ b/packages/Webkul/Activity/src/Contracts/Activity.php @@ -0,0 +1,5 @@ +increments('id'); + $table->string('title')->nullable(); + $table->string('type'); + $table->text('comment')->nullable(); + $table->json('additional')->nullable(); + $table->datetime('schedule_from')->nullable(); + $table->datetime('schedule_to')->nullable(); + $table->boolean('is_done')->default(0); + + $table->integer('user_id')->unsigned(); + $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('activities'); + } +}; diff --git a/packages/Webkul/Activity/src/Database/Migrations/2021_05_15_151855_create_activity_files_table.php b/packages/Webkul/Activity/src/Database/Migrations/2021_05_15_151855_create_activity_files_table.php new file mode 100644 index 0000000..30d516c --- /dev/null +++ b/packages/Webkul/Activity/src/Database/Migrations/2021_05_15_151855_create_activity_files_table.php @@ -0,0 +1,37 @@ +increments('id'); + $table->string('name'); + $table->string('path'); + + $table->integer('activity_id')->unsigned(); + $table->foreign('activity_id')->references('id')->on('activities')->onDelete('cascade'); + + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('activity_files'); + } +}; diff --git a/packages/Webkul/Activity/src/Database/Migrations/2021_07_28_142453_create_activity_participants_table.php b/packages/Webkul/Activity/src/Database/Migrations/2021_07_28_142453_create_activity_participants_table.php new file mode 100644 index 0000000..ba72faa --- /dev/null +++ b/packages/Webkul/Activity/src/Database/Migrations/2021_07_28_142453_create_activity_participants_table.php @@ -0,0 +1,39 @@ +increments('id'); + + $table->integer('activity_id')->unsigned(); + $table->foreign('activity_id')->references('id')->on('activities')->onDelete('cascade'); + + $table->integer('user_id')->nullable()->unsigned(); + $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade'); + + $table->integer('person_id')->nullable()->unsigned(); + $table->foreign('person_id')->references('id')->on('persons')->onDelete('cascade'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('activity_participants'); + } +}; diff --git a/packages/Webkul/Activity/src/Database/Migrations/2021_11_17_190943_add_location_column_in_activities_table.php b/packages/Webkul/Activity/src/Database/Migrations/2021_11_17_190943_add_location_column_in_activities_table.php new file mode 100644 index 0000000..53727e1 --- /dev/null +++ b/packages/Webkul/Activity/src/Database/Migrations/2021_11_17_190943_add_location_column_in_activities_table.php @@ -0,0 +1,32 @@ +string('location')->nullable(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('activities', function (Blueprint $table) { + $table->dropColumn('location'); + }); + } +}; diff --git a/packages/Webkul/Activity/src/Database/Migrations/2025_01_17_151632_alter_activities_table.php b/packages/Webkul/Activity/src/Database/Migrations/2025_01_17_151632_alter_activities_table.php new file mode 100644 index 0000000..f36b8a1 --- /dev/null +++ b/packages/Webkul/Activity/src/Database/Migrations/2025_01_17_151632_alter_activities_table.php @@ -0,0 +1,52 @@ +dropForeign(['user_id']); + + $table->unsignedInteger('user_id')->nullable()->change(); + $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('activities', function (Blueprint $table) { + $tablePrefix = DB::getTablePrefix(); + + // Disable foreign key checks temporarily. + DB::statement('SET FOREIGN_KEY_CHECKS=0'); + + // Drop the foreign key constraint using raw SQL. + DB::statement('ALTER TABLE '.$tablePrefix.'activities DROP FOREIGN KEY activities_user_id_foreign'); + + // Drop the index. + DB::statement('ALTER TABLE '.$tablePrefix.'activities DROP INDEX activities_user_id_foreign'); + + // Change the column to be non-nullable. + $table->unsignedInteger('user_id')->nullable(false)->change(); + $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade'); + + // Re-enable foreign key checks. + DB::statement('SET FOREIGN_KEY_CHECKS=1'); + }); + } +}; diff --git a/packages/Webkul/Activity/src/Models/Activity.php b/packages/Webkul/Activity/src/Models/Activity.php new file mode 100644 index 0000000..5c866bf --- /dev/null +++ b/packages/Webkul/Activity/src/Models/Activity.php @@ -0,0 +1,111 @@ + 'datetime', + 'schedule_to' => 'datetime', + ]; + + /** + * The attributes that are mass assignable. + * + * @var array + */ + protected $fillable = [ + 'title', + 'type', + 'location', + 'comment', + 'additional', + 'schedule_from', + 'schedule_to', + 'is_done', + 'user_id', + ]; + + /** + * Get the user that owns the activity. + */ + public function user() + { + return $this->belongsTo(UserProxy::modelClass()); + } + + /** + * The participants that belong to the activity. + */ + public function participants() + { + return $this->hasMany(ParticipantProxy::modelClass()); + } + + /** + * Get the file associated with the activity. + */ + public function files() + { + return $this->hasMany(FileProxy::modelClass(), 'activity_id'); + } + + /** + * The leads that belong to the activity. + */ + public function leads() + { + return $this->belongsToMany(LeadProxy::modelClass(), 'lead_activities'); + } + + /** + * The Person that belong to the activity. + */ + public function persons() + { + return $this->belongsToMany(PersonProxy::modelClass(), 'person_activities'); + } + + /** + * The leads that belong to the activity. + */ + public function products() + { + return $this->belongsToMany(ProductProxy::modelClass(), 'product_activities'); + } + + /** + * The Warehouse that belong to the activity. + */ + public function warehouses() + { + return $this->belongsToMany(WarehouseProxy::modelClass(), 'warehouse_activities'); + } +} diff --git a/packages/Webkul/Activity/src/Models/ActivityProxy.php b/packages/Webkul/Activity/src/Models/ActivityProxy.php new file mode 100644 index 0000000..d748e53 --- /dev/null +++ b/packages/Webkul/Activity/src/Models/ActivityProxy.php @@ -0,0 +1,7 @@ +path); + } + + /** + * Get image url for the product image. + */ + public function getUrlAttribute() + { + return $this->url(); + } + + /** + * Get the activity that owns the file. + */ + public function activity() + { + return $this->belongsTo(ActivityProxy::modelClass()); + } + + /** + * @return array + */ + public function toArray() + { + $array = parent::toArray(); + + $array['url'] = $this->url; + + return $array; + } +} diff --git a/packages/Webkul/Activity/src/Models/FileProxy.php b/packages/Webkul/Activity/src/Models/FileProxy.php new file mode 100644 index 0000000..09ff947 --- /dev/null +++ b/packages/Webkul/Activity/src/Models/FileProxy.php @@ -0,0 +1,7 @@ +belongsTo(ActivityProxy::modelClass()); + } + + /** + * Get the user that owns the participant. + */ + public function user() + { + return $this->belongsTo(UserProxy::modelClass()); + } + + /** + * Get the person that owns the participant. + */ + public function person() + { + return $this->belongsTo(PersonProxy::modelClass()); + } +} diff --git a/packages/Webkul/Activity/src/Models/ParticipantProxy.php b/packages/Webkul/Activity/src/Models/ParticipantProxy.php new file mode 100644 index 0000000..c4433af --- /dev/null +++ b/packages/Webkul/Activity/src/Models/ParticipantProxy.php @@ -0,0 +1,7 @@ +loadMigrationsFrom(__DIR__.'/../Database/Migrations'); + } +} diff --git a/packages/Webkul/Activity/src/Providers/ModuleServiceProvider.php b/packages/Webkul/Activity/src/Providers/ModuleServiceProvider.php new file mode 100644 index 0000000..326d643 --- /dev/null +++ b/packages/Webkul/Activity/src/Providers/ModuleServiceProvider.php @@ -0,0 +1,14 @@ +fileRepository->create([ + 'name' => $data['name'] ?? $data['file']->getClientOriginalName(), + 'path' => $data['file']->store('activities/'.$activity->id), + 'activity_id' => $activity->id, + ]); + } + + if (! isset($data['participants'])) { + return $activity; + } + + foreach ($data['participants']['users'] ?? [] as $userId) { + $activity->participants()->create([ + 'user_id' => $userId, + ]); + } + + foreach ($data['participants']['persons'] ?? [] as $personId) { + $activity->participants()->create([ + 'person_id' => $personId, + ]); + } + + return $activity; + } + + /** + * Update pipeline. + * + * @param int $id + * @param string $attribute + * @return \Webkul\Activity\Contracts\Activity + */ + public function update(array $data, $id, $attribute = 'id') + { + $activity = parent::update($data, $id); + + if (isset($data['participants'])) { + $activity->participants()->delete(); + + foreach ($data['participants']['users'] ?? [] as $userId) { + /** + * In some cases, the component exists in an HTML form, and traditional HTML does not send an empty array. + * Therefore, we need to check for an empty string. + * This scenario occurs only when all participants are removed. + */ + if (empty($userId)) { + break; + } + + $activity->participants()->create([ + 'user_id' => $userId, + ]); + } + + foreach ($data['participants']['persons'] ?? [] as $personId) { + /** + * In some cases, the component exists in an HTML form, and traditional HTML does not send an empty array. + * Therefore, we need to check for an empty string. + * This scenario occurs only when all participants are removed. + */ + if (empty($personId)) { + break; + } + + $activity->participants()->create([ + 'person_id' => $personId, + ]); + } + } + + return $activity; + } + + /** + * @param string $dateRange + * @return mixed + */ + public function getActivities($dateRange) + { + $tablePrefix = \DB::getTablePrefix(); + + return $this->select( + 'activities.id', + 'activities.created_at', + 'activities.title', + 'activities.schedule_from as start', + 'activities.schedule_to as end', + 'users.name as user_name', + ) + ->addSelect(\DB::raw('IF('.$tablePrefix.'activities.is_done, "done", "") as class')) + ->leftJoin('activity_participants', 'activities.id', '=', 'activity_participants.activity_id') + ->leftJoin('users', 'activities.user_id', '=', 'users.id') + ->whereIn('type', ['call', 'meeting', 'lunch']) + ->whereBetween('activities.schedule_from', $dateRange) + ->where(function ($query) { + if ($userIds = bouncer()->getAuthorizedUserIds()) { + $query->whereIn('activities.user_id', $userIds) + ->orWhereIn('activity_participants.user_id', $userIds); + } + }) + ->distinct() + ->get(); + } + + /** + * @param string $startFrom + * @param string $endFrom + * @param array $participants + * @param int $id + * @return bool + */ + public function isDurationOverlapping($startFrom, $endFrom, $participants, $id) + { + $queryBuilder = $this->leftJoin('activity_participants', 'activities.id', '=', 'activity_participants.activity_id') + ->where(function ($query) use ($startFrom, $endFrom) { + $query->where([ + ['activities.schedule_from', '<=', $startFrom], + ['activities.schedule_to', '>=', $startFrom], + ])->orWhere([ + ['activities.schedule_from', '>=', $startFrom], + ['activities.schedule_from', '<=', $endFrom], + ]); + }) + ->where(function ($query) use ($participants) { + if (is_null($participants)) { + return; + } + + if (isset($participants['users'])) { + $query->orWhereIn('activity_participants.user_id', $participants['users']); + } + + if (isset($participants['persons'])) { + $query->orWhereIn('activity_participants.person_id', $participants['persons']); + } + }) + ->groupBy('activities.id'); + + if (! is_null($id)) { + $queryBuilder->where('activities.id', '!=', $id); + } + + return $queryBuilder->count() ? true : false; + } +} diff --git a/packages/Webkul/Activity/src/Repositories/FileRepository.php b/packages/Webkul/Activity/src/Repositories/FileRepository.php new file mode 100755 index 0000000..22bfeba --- /dev/null +++ b/packages/Webkul/Activity/src/Repositories/FileRepository.php @@ -0,0 +1,18 @@ +entity ?? $model, 'activities')) { + return; + } + + if (! $model instanceof AttributeValue) { + $activity = app(ActivityRepository::class)->create([ + 'type' => 'system', + 'title' => trans('admin::app.activities.created'), + 'is_done' => 1, + 'user_id' => auth()->check() + ? auth()->id() + : null, + ]); + + $model->activities()->attach($activity->id); + + return; + } + + static::logActivity($model); + }); + + static::updated(function ($model) { + if (! method_exists($model->entity ?? $model, 'activities')) { + return; + } + + static::logActivity($model); + }); + + static::deleting(function ($model) { + if (! method_exists($model->entity ?? $model, 'activities')) { + return; + } + + $model->activities()->delete(); + }); + } + + /** + * Create activity. + */ + protected static function logActivity($model) + { + $customAttributes = []; + + if (method_exists($model, 'getCustomAttributes')) { + $customAttributes = $model->getCustomAttributes()->pluck('code')->toArray(); + } + + $updatedAttributes = static::getUpdatedAttributes($model); + + foreach ($updatedAttributes as $attributeCode => $attributeData) { + if (in_array($attributeCode, $customAttributes)) { + continue; + } + + $attributeCode = $model->attribute?->name ?: $attributeCode; + + $activity = app(ActivityRepository::class)->create([ + 'type' => 'system', + 'title' => trans('admin::app.activities.updated', ['attribute' => $attributeCode]), + 'is_done' => 1, + 'additional' => json_encode([ + 'attribute' => $attributeCode, + 'new' => [ + 'value' => $attributeData['new'], + 'label' => static::getAttributeLabel($attributeData['new'], $model->attribute), + ], + 'old' => [ + 'value' => $attributeData['old'], + 'label' => static::getAttributeLabel($attributeData['old'], $model->attribute), + ], + ]), + 'user_id' => auth()->id(), + ]); + + if ($model instanceof AttributeValue) { + $model->entity->activities()->attach($activity->id); + } else { + $model->activities()->attach($activity->id); + } + } + } + + /** + * Get attribute label. + */ + protected static function getAttributeLabel($value, $attribute) + { + return app(AttributeValueRepository::class)->getAttributeLabel($value, $attribute); + } + + /** + * Create activity. + */ + protected static function getUpdatedAttributes($model) + { + $updatedAttributes = []; + + foreach ($model->getDirty() as $key => $value) { + if (in_array($key, [ + 'id', + 'attribute_id', + 'entity_id', + 'entity_type', + 'updated_at', + ])) { + continue; + } + + $newValue = static::decodeValueIfJson($value); + + $oldValue = static::decodeValueIfJson($model->getOriginal($key)); + + if ($newValue != $oldValue) { + $updatedAttributes[$key] = [ + 'new' => $newValue, + 'old' => $oldValue, + ]; + } + } + + return $updatedAttributes; + } + + /** + * Convert value if json. + */ + protected static function decodeValueIfJson($value) + { + if ( + ! is_array($value) + && json_decode($value, true) + ) { + $value = json_decode($value, true); + } + + if (! is_array($value)) { + return $value; + } + + static::ksortRecursive($value); + + return $value; + } + + /** + * Sort array recursively. + */ + protected static function ksortRecursive(&$array) + { + if (! is_array($array)) { + return; + } + + ksort($array); + + foreach ($array as &$value) { + if (! is_array($value)) { + continue; + } + + static::ksortRecursive($value); + } + } +} diff --git a/packages/Webkul/Admin/.gitignore b/packages/Webkul/Admin/.gitignore new file mode 100755 index 0000000..4d32a59 --- /dev/null +++ b/packages/Webkul/Admin/.gitignore @@ -0,0 +1,5 @@ +/node_modules +/package-lock.json +npm-debug.log +/playwright-report +/test-results \ No newline at end of file diff --git a/packages/Webkul/Admin/composer.json b/packages/Webkul/Admin/composer.json new file mode 100755 index 0000000..78f413c --- /dev/null +++ b/packages/Webkul/Admin/composer.json @@ -0,0 +1,35 @@ +{ + "name": "krayin/laravel-admin", + "license": "MIT", + "authors": [ + { + "name": "Jitendra Singh", + "email": "jitendra@webkul.com" + } + ], + "require": { + "krayin/laravel-attribute": "^1.0", + "krayin/laravel-contact": "^1.0", + "krayin/laravel-core": "^1.0", + "krayin/laravel-email": "^1.0", + "krayin/laravel-lead": "^1.0", + "krayin/laravel-product": "^1.0", + "krayin/laravel-tag": "^1.0", + "krayin/laravel-ui": "^1.0", + "krayin/laravel-user": "^1.0" + }, + "autoload": { + "psr-4": { + "Webkul\\Admin\\": "src/" + } + }, + "extra": { + "laravel": { + "providers": [ + "Webkul\\Admin\\Providers\\AdminServiceProvider" + ], + "aliases": {} + } + }, + "minimum-stability": "dev" +} \ No newline at end of file diff --git a/packages/Webkul/Admin/package.json b/packages/Webkul/Admin/package.json new file mode 100644 index 0000000..5fc9bf0 --- /dev/null +++ b/packages/Webkul/Admin/package.json @@ -0,0 +1,35 @@ +{ + "private": true, + "type": "module", + "scripts": { + "dev": "vite", + "build": "vite build" + }, + "devDependencies": { + "@playwright/test": "^1.50.1", + "@types/node": "^22.7.8", + "autoprefixer": "^10.4.16", + "axios": "^1.7.4", + "laravel-vite-plugin": "^1.0", + "postcss": "^8.4.23", + "tailwindcss": "^3.3.2", + "vite": "^5.4.12", + "vue": "^3.4.21" + }, + "dependencies": { + "@vee-validate/i18n": "^4.9.1", + "@vee-validate/rules": "^4.9.1", + "@vitejs/plugin-vue": "^4.2.3", + "chartjs-chart-funnel": "^4.2.1", + "dompurify": "^3.1.7", + "dotenv": "^16.4.7", + "flatpickr": "^4.6.13", + "mitt": "^3.0.1", + "playwright": "^1.48.1", + "readline-sync": "^1.4.10", + "vee-validate": "^4.9.1", + "vue-cal": "^4.9.0", + "vue-flatpickr": "^2.3.0", + "vuedraggable": "^4.1.0" + } +} diff --git a/packages/Webkul/Admin/postcss.config.cjs b/packages/Webkul/Admin/postcss.config.cjs new file mode 100644 index 0000000..818c656 --- /dev/null +++ b/packages/Webkul/Admin/postcss.config.cjs @@ -0,0 +1,3 @@ +module.exports = ({ env }) => ({ + plugins: [require("tailwindcss")(), require("autoprefixer")()], +}); diff --git a/packages/Webkul/Admin/src/Bouncer.php b/packages/Webkul/Admin/src/Bouncer.php new file mode 100755 index 0000000..b53610b --- /dev/null +++ b/packages/Webkul/Admin/src/Bouncer.php @@ -0,0 +1,60 @@ +guard('user')->check() && auth()->guard('user')->user()->role->permission_type == 'all') { + return true; + } else { + if (! auth()->guard('user')->check() || ! auth()->guard('user')->user()->hasPermission($permission)) { + return false; + } + } + + return true; + } + + /** + * Checks if user allowed or not for certain action + * + * @param string $permission + * @return void + */ + public static function allow($permission) + { + if (! auth()->guard('user')->check() || ! auth()->guard('user')->user()->hasPermission($permission)) { + abort(401, 'This action is unauthorized'); + } + } + + /** + * This function will return user ids of current user's groups + * + * @return array|null + */ + public function getAuthorizedUserIds() + { + $user = auth()->guard('user')->user(); + + if ($user->view_permission == 'global') { + return null; + } + + if ($user->view_permission == 'group') { + return app(UserRepository::class)->getCurrentUserGroupsUserIds(); + } else { + return [$user->id]; + } + } +} diff --git a/packages/Webkul/Admin/src/Config/acl.php b/packages/Webkul/Admin/src/Config/acl.php new file mode 100644 index 0000000..bb164d2 --- /dev/null +++ b/packages/Webkul/Admin/src/Config/acl.php @@ -0,0 +1,527 @@ + 'dashboard', + 'name' => 'admin::app.layouts.dashboard', + 'route' => 'admin.dashboard.index', + 'sort' => 1, + ], [ + 'key' => 'leads', + 'name' => 'admin::app.acl.leads', + 'route' => 'admin.leads.index', + 'sort' => 2, + ], [ + 'key' => 'leads.create', + 'name' => 'admin::app.acl.create', + 'route' => ['admin.leads.create', 'admin.leads.store'], + 'sort' => 1, + ], [ + 'key' => 'leads.view', + 'name' => 'admin::app.acl.view', + 'route' => 'admin.leads.view', + 'sort' => 2, + ], [ + 'key' => 'leads.edit', + 'name' => 'admin::app.acl.edit', + 'route' => ['admin.leads.edit', 'admin.leads.update', 'admin.leads.mass_update'], + 'sort' => 3, + ], [ + 'key' => 'leads.delete', + 'name' => 'admin::app.acl.delete', + 'route' => ['admin.leads.delete', 'admin.leads.mass_delete'], + 'sort' => 4, + ], [ + 'key' => 'quotes', + 'name' => 'admin::app.acl.quotes', + 'route' => 'admin.quotes.index', + 'sort' => 3, + ], [ + 'key' => 'quotes.create', + 'name' => 'admin::app.acl.create', + 'route' => ['admin.quotes.create', 'admin.quotes.store'], + 'sort' => 1, + ], [ + 'key' => 'quotes.edit', + 'name' => 'admin::app.acl.edit', + 'route' => ['admin.quotes.edit', 'admin.quotes.update'], + 'sort' => 2, + ], [ + 'key' => 'quotes.print', + 'name' => 'admin::app.acl.print', + 'route' => 'admin.quotes.print', + 'sort' => 3, + ], [ + 'key' => 'quotes.delete', + 'name' => 'admin::app.acl.delete', + 'route' => ['admin.quotes.delete', 'admin.quotes.mass_delete'], + 'sort' => 4, + ], [ + 'key' => 'mail', + 'name' => 'admin::app.acl.mail', + 'route' => 'admin.mail.index', + 'sort' => 4, + ], [ + 'key' => 'mail.inbox', + 'name' => 'admin::app.acl.inbox', + 'route' => 'admin.mail.index', + 'sort' => 1, + ], [ + 'key' => 'mail.draft', + 'name' => 'admin::app.acl.draft', + 'route' => 'admin.mail.index', + 'sort' => 2, + ], [ + 'key' => 'mail.outbox', + 'name' => 'admin::app.acl.outbox', + 'route' => 'admin.mail.index', + 'sort' => 3, + ], [ + 'key' => 'mail.sent', + 'name' => 'admin::app.acl.sent', + 'route' => 'admin.mail.index', + 'sort' => 4, + ], [ + 'key' => 'mail.trash', + 'name' => 'admin::app.acl.trash', + 'route' => 'admin.mail.index', + 'sort' => 5, + ], [ + 'key' => 'mail.compose', + 'name' => 'admin::app.acl.create', + 'route' => ['admin.mail.store'], + 'sort' => 6, + ], [ + 'key' => 'mail.view', + 'name' => 'admin::app.acl.view', + 'route' => 'admin.mail.view', + 'sort' => 7, + ], [ + 'key' => 'mail.edit', + 'name' => 'admin::app.acl.edit', + 'route' => 'admin.mail.update', + 'sort' => 8, + ], [ + 'key' => 'mail.delete', + 'name' => 'admin::app.acl.delete', + 'route' => ['admin.mail.delete', 'admin.mail.mass_delete'], + 'sort' => 9, + ], [ + 'key' => 'activities', + 'name' => 'admin::app.acl.activities', + 'route' => 'admin.activities.index', + 'sort' => 5, + ], [ + 'key' => 'activities.create', + 'name' => 'admin::app.acl.create', + 'route' => ['admin.activities.create', 'admin.activities.store'], + 'sort' => 1, + ], [ + 'key' => 'activities.edit', + 'name' => 'admin::app.acl.edit', + 'route' => ['admin.activities.edit', 'admin.activities.update', 'admin.activities.mass_update'], + 'sort' => 2, + ], [ + 'key' => 'activities.delete', + 'name' => 'admin::app.acl.delete', + 'route' => ['admin.activities.delete', 'admin.activities.mass_delete'], + 'sort' => 3, + ], [ + 'key' => 'contacts', + 'name' => 'admin::app.acl.contacts', + 'route' => 'admin.contacts.users.index', + 'sort' => 6, + ], [ + 'key' => 'contacts.persons', + 'name' => 'admin::app.acl.persons', + 'route' => 'admin.contacts.persons.index', + 'sort' => 1, + ], [ + 'key' => 'contacts.persons.create', + 'name' => 'admin::app.acl.create', + 'route' => ['admin.contacts.persons.create', 'admin.contacts.persons.store'], + 'sort' => 2, + ], [ + 'key' => 'contacts.persons.edit', + 'name' => 'admin::app.acl.edit', + 'route' => ['admin.contacts.persons.edit', 'admin.contacts.persons.update'], + 'sort' => 3, + ], [ + 'key' => 'contacts.persons.delete', + 'name' => 'admin::app.acl.delete', + 'route' => ['admin.contacts.persons.delete', 'admin.contacts.persons.mass_delete'], + 'sort' => 4, + ], [ + 'key' => 'contacts.persons.view', + 'name' => 'admin::app.acl.view', + 'route' => 'admin.contacts.persons.view', + 'sort' => 5, + ], [ + 'key' => 'contacts.organizations', + 'name' => 'admin::app.acl.organizations', + 'route' => 'admin.contacts.organizations.index', + 'sort' => 2, + ], [ + 'key' => 'contacts.organizations.create', + 'name' => 'admin::app.acl.create', + 'route' => ['admin.contacts.organizations.create', 'admin.contacts.organizations.store'], + 'sort' => 1, + ], [ + 'key' => 'contacts.organizations.edit', + 'name' => 'admin::app.acl.edit', + 'route' => ['admin.contacts.organizations.edit', 'admin.contacts.organizations.update'], + 'sort' => 2, + ], [ + 'key' => 'contacts.organizations.delete', + 'name' => 'admin::app.acl.delete', + 'route' => ['admin.contacts.organizations.delete', 'admin.contacts.organizations.mass_delete'], + 'sort' => 3, + ], [ + 'key' => 'products', + 'name' => 'admin::app.acl.products', + 'route' => 'admin.products.index', + 'sort' => 7, + ], [ + 'key' => 'products.create', + 'name' => 'admin::app.acl.create', + 'route' => ['admin.products.create', 'admin.products.store'], + 'sort' => 1, + ], [ + 'key' => 'products.edit', + 'name' => 'admin::app.acl.edit', + 'route' => ['admin.products.edit', 'admin.products.update'], + 'sort' => 2, + ], [ + 'key' => 'products.delete', + 'name' => 'admin::app.acl.delete', + 'route' => ['admin.products.delete', 'admin.products.mass_delete'], + 'sort' => 3, + ], [ + 'key' => 'products.view', + 'name' => 'admin::app.acl.view', + 'route' => 'admin.products.view', + 'sort' => 3, + ], [ + 'key' => 'settings', + 'name' => 'admin::app.acl.settings', + 'route' => 'admin.settings.index', + 'sort' => 8, + ], [ + 'key' => 'settings.user', + 'name' => 'admin::app.acl.user', + 'route' => ['admin.settings.groups.index', 'admin.settings.roles.index', 'admin.settings.users.index'], + 'sort' => 1, + ], [ + 'key' => 'settings.user.groups', + 'name' => 'admin::app.acl.groups', + 'route' => 'admin.settings.groups.index', + 'sort' => 1, + ], [ + 'key' => 'settings.user.groups.create', + 'name' => 'admin::app.acl.create', + 'route' => ['admin.settings.groups.create', 'admin.settings.groups.store'], + 'sort' => 1, + ], [ + 'key' => 'settings.user.groups.edit', + 'name' => 'admin::app.acl.edit', + 'route' => ['admin.settings.groups.edit', 'admin.settings.groups.update'], + 'sort' => 2, + ], [ + 'key' => 'settings.user.groups.delete', + 'name' => 'admin::app.acl.delete', + 'route' => 'admin.settings.groups.delete', + 'sort' => 3, + ], [ + 'key' => 'settings.user.roles', + 'name' => 'admin::app.acl.roles', + 'route' => 'admin.settings.roles.index', + 'sort' => 2, + ], [ + 'key' => 'settings.user.roles.create', + 'name' => 'admin::app.acl.create', + 'route' => ['admin.settings.roles.create', 'admin.settings.roles.store'], + 'sort' => 1, + ], [ + 'key' => 'settings.user.roles.edit', + 'name' => 'admin::app.acl.edit', + 'route' => ['admin.settings.roles.edit', 'admin.settings.roles.update'], + 'sort' => 2, + ], [ + 'key' => 'settings.user.roles.delete', + 'name' => 'admin::app.acl.delete', + 'route' => 'admin.settings.roles.delete', + 'sort' => 3, + ], [ + 'key' => 'settings.user.users', + 'name' => 'admin::app.acl.users', + 'route' => 'admin.settings.users.index', + 'sort' => 3, + ], [ + 'key' => 'settings.user.users.create', + 'name' => 'admin::app.acl.create', + 'route' => ['admin.settings.users.create', 'admin.settings.users.store'], + 'sort' => 1, + ], [ + 'key' => 'settings.user.users.edit', + 'name' => 'admin::app.acl.edit', + 'route' => ['admin.settings.users.edit', 'admin.settings.users.update', 'admin.settings.users.mass_update'], + 'sort' => 2, + ], [ + 'key' => 'settings.user.users.delete', + 'name' => 'admin::app.acl.delete', + 'route' => ['admin.settings.users.delete', 'admin.settings.users.mass_delete'], + 'sort' => 3, + ], [ + 'key' => 'settings.lead', + 'name' => 'admin::app.acl.lead', + 'route' => ['admin.settings.pipelines.index', 'admin.settings.sources.index', 'admin.settings.types.index'], + 'sort' => 2, + ], [ + 'key' => 'settings.lead.pipelines', + 'name' => 'admin::app.acl.pipelines', + 'route' => 'admin.settings.pipelines.index', + 'sort' => 1, + ], [ + 'key' => 'settings.lead.pipelines.create', + 'name' => 'admin::app.acl.create', + 'route' => ['admin.settings.pipelines.create', 'admin.settings.pipelines.store'], + 'sort' => 1, + ], [ + 'key' => 'settings.lead.pipelines.edit', + 'name' => 'admin::app.acl.edit', + 'route' => ['admin.settings.pipelines.edit', 'admin.settings.pipelines.update'], + 'sort' => 2, + ], [ + 'key' => 'settings.lead.pipelines.delete', + 'name' => 'admin::app.acl.delete', + 'route' => 'admin.settings.pipelines.delete', + 'sort' => 3, + ], [ + 'key' => 'settings.lead.sources', + 'name' => 'admin::app.acl.sources', + 'route' => 'admin.settings.sources.index', + 'sort' => 2, + ], [ + 'key' => 'settings.lead.sources.create', + 'name' => 'admin::app.acl.create', + 'route' => ['admin.settings.sources.store'], + 'sort' => 1, + ], [ + 'key' => 'settings.lead.sources.edit', + 'name' => 'admin::app.acl.edit', + 'route' => ['admin.settings.sources.edit', 'admin.settings.sources.update'], + 'sort' => 2, + ], [ + 'key' => 'settings.lead.sources.delete', + 'name' => 'admin::app.acl.delete', + 'route' => 'admin.settings.sources.delete', + 'sort' => 3, + ], [ + 'key' => 'settings.lead.types', + 'name' => 'admin::app.acl.types', + 'route' => 'admin.settings.types.index', + 'sort' => 3, + ], [ + 'key' => 'settings.lead.types.create', + 'name' => 'admin::app.acl.create', + 'route' => ['admin.settings.types.store'], + 'sort' => 1, + ], [ + 'key' => 'settings.lead.types.edit', + 'name' => 'admin::app.acl.edit', + 'route' => ['admin.settings.types.edit', 'admin.settings.types.update'], + 'sort' => 2, + ], [ + 'key' => 'settings.lead.types.delete', + 'name' => 'admin::app.acl.delete', + 'route' => 'admin.settings.types.delete', + 'sort' => 3, + ], [ + 'key' => 'settings.automation', + 'name' => 'admin::app.acl.automation', + 'route' => ['admin.settings.attributes.index', 'admin.settings.email_templates.index', 'admin.settings.workflows.index'], + 'sort' => 3, + ], [ + 'key' => 'settings.automation.attributes', + 'name' => 'admin::app.acl.attributes', + 'route' => 'admin.settings.attributes.index', + 'sort' => 1, + ], [ + 'key' => 'settings.automation.attributes.create', + 'name' => 'admin::app.acl.create', + 'route' => ['admin.settings.attributes.create', 'admin.settings.attributes.store'], + 'sort' => 1, + ], [ + 'key' => 'settings.automation.attributes.edit', + 'name' => 'admin::app.acl.edit', + 'route' => ['admin.settings.attributes.edit', 'admin.settings.attributes.update', 'admin.settings.attributes.mass_update'], + 'sort' => 2, + ], [ + 'key' => 'settings.automation.attributes.delete', + 'name' => 'admin::app.acl.delete', + 'route' => 'admin.settings.attributes.delete', + 'sort' => 3, + ], [ + 'key' => 'settings.automation.email_templates', + 'name' => 'admin::app.acl.email-templates', + 'route' => 'admin.settings.email_templates.index', + 'sort' => 7, + ], [ + 'key' => 'settings.automation.email_templates.create', + 'name' => 'admin::app.acl.create', + 'route' => ['admin.settings.email_templates.create', 'admin.settings.email_templates.store'], + 'sort' => 1, + ], [ + 'key' => 'settings.automation.email_templates.edit', + 'name' => 'admin::app.acl.edit', + 'route' => ['admin.settings.email_templates.edit', 'admin.settings.email_templates.update'], + 'sort' => 2, + ], [ + 'key' => 'settings.automation.email_templates.delete', + 'name' => 'admin::app.acl.delete', + 'route' => 'admin.settings.email_templates.delete', + 'sort' => 3, + ], [ + 'key' => 'settings.automation.workflows', + 'name' => 'admin::app.acl.workflows', + 'route' => 'admin.settings.workflows.index', + 'sort' => 2, + ], [ + 'key' => 'settings.automation.workflows.create', + 'name' => 'admin::app.acl.create', + 'route' => ['admin.settings.workflows.create', 'admin.settings.workflows.store'], + 'sort' => 1, + ], [ + 'key' => 'settings.automation.workflows.edit', + 'name' => 'admin::app.acl.edit', + 'route' => ['admin.settings.workflows.edit', 'admin.settings.workflows.update'], + 'sort' => 2, + ], [ + 'key' => 'settings.automation.workflows.delete', + 'name' => 'admin::app.acl.delete', + 'route' => 'admin.settings.workflows.delete', + 'sort' => 3, + ], [ + 'key' => 'settings.automation.events', + 'name' => 'admin::app.acl.event', + 'route' => 'admin.settings.marketing.events.index', + 'sort' => 2, + ], [ + 'key' => 'settings.automation.events.create', + 'name' => 'admin::app.acl.create', + 'route' => ['admin.settings.marketing.events.create', 'admin.settings.marketing.events.store'], + 'sort' => 1, + ], [ + 'key' => 'settings.automation.events.edit', + 'name' => 'admin::app.acl.edit', + 'route' => ['admin.settings.marketing.events.edit', 'admin.settings.marketing.events.update'], + 'sort' => 2, + ], [ + 'key' => 'settings.automation.events.delete', + 'name' => 'admin::app.acl.delete', + 'route' => ['admin.settings.marketing.events.delete', 'admin.settings.marketing.events.mass_delete'], + 'sort' => 3, + ], [ + 'key' => 'settings.automation.campaigns', + 'name' => 'admin::app.acl.campaigns', + 'route' => 'admin.settings.marketing.campaigns.index', + 'sort' => 2, + ], [ + 'key' => 'settings.automation.campaigns.create', + 'name' => 'admin::app.acl.create', + 'route' => ['admin.settings.marketing.campaigns.create', 'admin.settings.marketing.campaigns.store'], + 'sort' => 1, + ], [ + 'key' => 'settings.automation.campaigns.edit', + 'name' => 'admin::app.acl.edit', + 'route' => ['admin.settings.marketing.campaigns.edit', 'admin.settings.marketing.campaigns.update'], + 'sort' => 2, + ], [ + 'key' => 'settings.automation.campaigns.delete', + 'name' => 'admin::app.acl.delete', + 'route' => ['admin.settings.marketing.campaigns.delete', 'admin.settings.marketing.campaigns.mass_delete'], + 'sort' => 3, + ], [ + 'key' => 'settings.automation.webhooks', + 'name' => 'admin::app.acl.webhook', + 'route' => 'admin.settings.webhooks.index', + 'sort' => 1, + ], [ + 'key' => 'settings.automation.webhooks.create', + 'name' => 'admin::app.acl.create', + 'route' => ['admin.settings.webhooks.create', 'admin.settings.webhooks.store'], + 'sort' => 1, + ], [ + 'key' => 'settings.automation.webhooks.edit', + 'name' => 'admin::app.acl.edit', + 'route' => ['admin.settings.webhooks.edit', 'admin.settings.webhooks.update'], + 'sort' => 2, + ], [ + 'key' => 'settings.automation.webhooks.delete', + 'name' => 'admin::app.acl.delete', + 'route' => 'admin.settings.webhooks.delete', + 'sort' => 3, + ], [ + 'key' => 'settings.other_settings', + 'name' => 'admin::app.acl.other-settings', + 'route' => 'admin.settings.tags.index', + 'sort' => 4, + ], [ + 'key' => 'settings.other_settings.tags', + 'name' => 'admin::app.acl.tags', + 'route' => 'admin.settings.tags.index', + 'sort' => 1, + ], [ + 'key' => 'settings.other_settings.tags.create', + 'name' => 'admin::app.acl.create', + 'route' => ['admin.settings.tags.create', 'admin.settings.tags.store', 'admin.leads.tags.attach'], + 'sort' => 1, + ], [ + 'key' => 'settings.other_settings.tags.edit', + 'name' => 'admin::app.acl.edit', + 'route' => ['admin.settings.tags.edit', 'admin.settings.tags.update'], + 'sort' => 1, + ], [ + 'key' => 'settings.other_settings.tags.delete', + 'name' => 'admin::app.acl.delete', + 'route' => ['admin.settings.tags.delete', 'admin.settings.tags.mass_delete', 'admin.leads.tags.detach'], + 'sort' => 2, + ], + [ + 'key' => 'settings.data_transfer', + 'name' => 'admin::app.acl.data-transfer', + 'route' => 'admin.settings.data_transfer.imports.index', + 'sort' => 10, + ], [ + 'key' => 'settings.data_transfer.imports', + 'name' => 'admin::app.acl.imports', + 'route' => 'admin.settings.data_transfer.imports.index', + 'sort' => 1, + ], [ + 'key' => 'settings.data_transfer.imports.create', + 'name' => 'admin::app.acl.create', + 'route' => 'admin.settings.data_transfer.imports.create', + 'sort' => 1, + ], [ + 'key' => 'settings.data_transfer.imports.edit', + 'name' => 'admin::app.acl.edit', + 'route' => 'admin.settings.data_transfer.imports.edit', + 'sort' => 2, + ], [ + 'key' => 'settings.data_transfer.imports.delete', + 'name' => 'admin::app.acl.delete', + 'route' => 'admin.settings.data_transfer.imports.delete', + 'sort' => 3, + ], [ + 'key' => 'settings.data_transfer.imports.import', + 'name' => 'admin::app.acl.import', + 'route' => 'admin.settings.data_transfer.imports.imports', + 'sort' => 4, + ], + [ + 'key' => 'configuration', + 'name' => 'admin::app.acl.configuration', + 'route' => 'admin.configuration.index', + 'sort' => 9, + ], +]; diff --git a/packages/Webkul/Admin/src/Config/attribute_entity_types.php b/packages/Webkul/Admin/src/Config/attribute_entity_types.php new file mode 100644 index 0000000..a55b688 --- /dev/null +++ b/packages/Webkul/Admin/src/Config/attribute_entity_types.php @@ -0,0 +1,33 @@ + [ + 'name' => 'admin::app.leads.index.title', + 'repository' => 'Webkul\Lead\Repositories\LeadRepository', + ], + + 'persons' => [ + 'name' => 'admin::app.contacts.persons.index.title', + 'repository' => 'Webkul\Contact\Repositories\PersonRepository', + ], + + 'organizations' => [ + 'name' => 'admin::app.contacts.organizations.index.title', + 'repository' => 'Webkul\Contact\Repositories\OrganizationRepository', + ], + + 'products' => [ + 'name' => 'admin::app.products.index.title', + 'repository' => 'Webkul\Product\Repositories\ProductRepository', + ], + + 'quotes' => [ + 'name' => 'admin::app.quotes.index.title', + 'repository' => 'Webkul\Quote\Repositories\QuoteRepository', + ], + + 'warehouses' => [ + 'name' => 'admin::app.settings.warehouses.index.title', + 'repository' => 'Webkul\Warehouse\Repositories\WarehouseRepository', + ], +]; diff --git a/packages/Webkul/Admin/src/Config/attribute_lookups.php b/packages/Webkul/Admin/src/Config/attribute_lookups.php new file mode 100644 index 0000000..f1ba92d --- /dev/null +++ b/packages/Webkul/Admin/src/Config/attribute_lookups.php @@ -0,0 +1,54 @@ + [ + 'name' => 'Leads', + 'repository' => 'Webkul\Lead\Repositories\LeadRepository', + 'label_column' => 'title', + ], + + 'lead_sources' => [ + 'name' => 'Lead Sources', + 'repository' => 'Webkul\Lead\Repositories\SourceRepository', + ], + + 'lead_types' => [ + 'name' => 'Lead Types', + 'repository' => 'Webkul\Lead\Repositories\TypeRepository', + ], + + 'lead_pipelines' => [ + 'name' => 'Lead Pipelines', + 'repository' => 'Webkul\Lead\Repositories\PipelineRepository', + ], + + 'lead_pipeline_stages' => [ + 'name' => 'Lead Pipeline Stages', + 'repository' => 'Webkul\Lead\Repositories\StageRepository', + ], + + 'users' => [ + 'name' => 'Sales Owners', + 'repository' => 'Webkul\User\Repositories\UserRepository', + ], + + 'organizations' => [ + 'name' => 'Organizations', + 'repository' => 'Webkul\Contact\Repositories\OrganizationRepository', + ], + + 'persons' => [ + 'name' => 'Persons', + 'repository' => 'Webkul\Contact\Repositories\PersonRepository', + ], + + 'warehouses' => [ + 'name' => 'Warehouses', + 'repository' => 'Webkul\Warehouse\Repositories\WarehouseRepository', + ], + + 'locations' => [ + 'name' => 'Locations', + 'repository' => 'Webkul\Warehouse\Repositories\LocationRepository', + ], +]; diff --git a/packages/Webkul/Admin/src/Config/core_config.php b/packages/Webkul/Admin/src/Config/core_config.php new file mode 100644 index 0000000..9c843da --- /dev/null +++ b/packages/Webkul/Admin/src/Config/core_config.php @@ -0,0 +1,314 @@ + 'general', + 'name' => 'admin::app.configuration.index.general.title', + 'info' => 'admin::app.configuration.index.general.info', + 'sort' => 1, + ], [ + 'key' => 'general.general', + 'name' => 'admin::app.configuration.index.general.general.title', + 'info' => 'admin::app.configuration.index.general.general.info', + 'icon' => 'icon-setting', + 'sort' => 1, + ], [ + 'key' => 'general.general.locale_settings', + 'name' => 'admin::app.configuration.index.general.general.locale-settings.title', + 'info' => 'admin::app.configuration.index.general.general.locale-settings.title-info', + 'sort' => 1, + 'fields' => [ + [ + 'name' => 'locale', + 'title' => 'admin::app.configuration.index.general.general.locale-settings.title', + 'type' => 'select', + 'default' => 'en', + 'options' => 'Webkul\Core\Core@locales', + ], + ], + ], [ + 'key' => 'general.general.admin_logo', + 'name' => 'admin::app.configuration.index.general.general.admin-logo.title', + 'info' => 'admin::app.configuration.index.general.general.admin-logo.title-info', + 'sort' => 2, + 'fields' => [ + [ + 'name' => 'logo_image', + 'title' => 'admin::app.configuration.index.general.general.admin-logo.logo-image', + 'type' => 'image', + 'validation' => 'mimes:bmp,jpeg,jpg,png,webp,svg', + ], + ], + ], [ + 'key' => 'general.settings', + 'name' => 'admin::app.configuration.index.general.settings.title', + 'info' => 'admin::app.configuration.index.general.settings.info', + 'icon' => 'icon-configuration', + 'sort' => 2, + ], [ + 'key' => 'general.settings.footer', + 'name' => 'admin::app.configuration.index.general.settings.footer.title', + 'info' => 'admin::app.configuration.index.general.settings.footer.info', + 'sort' => 1, + 'fields' => [ + [ + 'name' => 'label', + 'title' => 'admin::app.configuration.index.general.settings.footer.powered-by', + 'type' => 'editor', + 'default' => 'Powered by Krayin, an open-source project by Webkul.', + 'tinymce' => true, + ], + ], + ], [ + 'key' => 'general.settings.menu', + 'name' => 'admin::app.configuration.index.general.settings.menu.title', + 'info' => 'admin::app.configuration.index.general.settings.menu.info', + 'sort' => 2, + 'fields' => [ + [ + 'name' => 'dashboard', + 'title' => 'admin::app.configuration.index.general.settings.menu.dashboard', + 'type' => 'text', + 'default' => 'Dashboard', + 'validation' => 'max:20', + ], [ + 'name' => 'leads', + 'title' => 'admin::app.configuration.index.general.settings.menu.leads', + 'type' => 'text', + 'default' => 'Leads', + 'validation' => 'max:20', + ], [ + 'name' => 'quotes', + 'title' => 'admin::app.configuration.index.general.settings.menu.quotes', + 'type' => 'text', + 'default' => 'Quotes', + 'validation' => 'max:20', + ], [ + 'name' => 'mail.mail', + 'title' => 'admin::app.configuration.index.general.settings.menu.mail', + 'type' => 'text', + 'default' => 'Mail', + 'validation' => 'max:20', + ], [ + 'name' => 'mail.inbox', + 'title' => 'admin::app.configuration.index.general.settings.menu.inbox', + 'type' => 'text', + 'default' => 'Inbox', + 'validation' => 'max:20', + ], [ + 'name' => 'mail.draft', + 'title' => 'admin::app.configuration.index.general.settings.menu.draft', + 'type' => 'text', + 'default' => 'Draft', + 'validation' => 'max:20', + ], [ + 'name' => 'mail.outbox', + 'title' => 'admin::app.configuration.index.general.settings.menu.outbox', + 'type' => 'text', + 'default' => 'Outbox', + 'validation' => 'max:20', + ], [ + 'name' => 'mail.sent', + 'title' => 'admin::app.configuration.index.general.settings.menu.sent', + 'type' => 'text', + 'default' => 'Sent', + 'validation' => 'max:20', + ], [ + 'name' => 'mail.trash', + 'title' => 'admin::app.configuration.index.general.settings.menu.trash', + 'type' => 'text', + 'default' => 'Trash', + 'validation' => 'max:20', + ], [ + 'name' => 'activities', + 'title' => 'admin::app.configuration.index.general.settings.menu.activities', + 'type' => 'text', + 'default' => 'Activities', + 'validation' => 'max:20', + ], [ + 'name' => 'contacts.contacts', + 'title' => 'admin::app.configuration.index.general.settings.menu.contacts', + 'type' => 'text', + 'default' => 'Contacts', + 'validation' => 'max:20', + ], [ + 'name' => 'contacts.persons', + 'title' => 'admin::app.configuration.index.general.settings.menu.persons', + 'type' => 'text', + 'default' => 'Persons', + 'validation' => 'max:20', + ], [ + 'name' => 'contacts.organizations', + 'title' => 'admin::app.configuration.index.general.settings.menu.organizations', + 'type' => 'text', + 'default' => 'Organizations', + 'validation' => 'max:20', + ], [ + 'name' => 'products', + 'title' => 'admin::app.configuration.index.general.settings.menu.products', + 'type' => 'text', + 'default' => 'Products', + 'validation' => 'max:20', + ], [ + 'name' => 'settings', + 'title' => 'admin::app.configuration.index.general.settings.menu.settings', + 'type' => 'text', + 'default' => 'Settings', + 'validation' => 'max:20', + ], [ + 'name' => 'configuration', + 'title' => 'admin::app.configuration.index.general.settings.menu.configuration', + 'type' => 'text', + 'default' => 'Configuration', + 'validation' => 'max:20', + ], + ], + ], [ + 'key' => 'general.settings.menu_color', + 'name' => 'admin::app.configuration.index.general.settings.menu-color.title', + 'info' => 'admin::app.configuration.index.general.settings.menu-color.info', + 'sort' => 3, + 'fields' => [ + [ + 'name' => 'brand_color', + 'title' => 'admin::app.configuration.index.general.settings.menu-color.brand-color', + 'type' => 'color', + 'default' => '#0E90D9', + ], + ], + ], [ + 'key' => 'general.magic_ai', + 'name' => 'admin::app.configuration.index.magic-ai.title', + 'info' => 'admin::app.configuration.index.magic-ai.info', + 'icon' => 'icon-setting', + 'sort' => 3, + ], [ + 'key' => 'general.magic_ai.settings', + 'name' => 'admin::app.configuration.index.magic-ai.settings.title', + 'info' => 'admin::app.configuration.index.magic-ai.settings.info', + 'sort' => 1, + 'fields' => [ + [ + 'name' => 'enable', + 'title' => 'admin::app.configuration.index.magic-ai.settings.enable', + 'type' => 'boolean', + 'channel_based' => true, + ], [ + 'name' => 'api_key', + 'title' => 'admin::app.configuration.index.magic-ai.settings.api-key', + 'type' => 'password', + 'depends' => 'enable:1', + 'validation' => 'required_if:enable,1', + 'info' => 'admin::app.configuration.index.magic-ai.settings.api-key-info', + ], [ + 'name' => 'model', + 'title' => 'admin::app.configuration.index.magic-ai.settings.models.title', + 'type' => 'select', + 'channel_based' => true, + 'depends' => 'enable:1', + 'options' => [ + [ + 'title' => 'admin::app.configuration.index.magic-ai.settings.models.gpt-4o', + 'value' => 'openai/chatgpt-4o-latest', + ], [ + 'title' => 'admin::app.configuration.index.magic-ai.settings.models.gpt-4o-mini', + 'value' => 'openai/gpt-4o-mini', + ], [ + 'title' => 'admin::app.configuration.index.magic-ai.settings.models.gemini-2-0-flash-001', + 'value' => 'google/gemini-2.0-flash-001', + ], [ + 'title' => 'admin::app.configuration.index.magic-ai.settings.models.deepseek-r1', + 'value' => 'deepseek/deepseek-r1-distill-llama-8b', + ], [ + 'title' => 'admin::app.configuration.index.magic-ai.settings.models.llama-3-2-3b-instruct', + 'value' => 'meta-llama/llama-3.2-3b-instruct', + ], [ + 'title' => 'admin::app.configuration.index.magic-ai.settings.models.grok-2-1212', + 'value' => 'x-ai/grok-2-1212', + ], + ], + ], [ + 'name' => 'other_model', + 'title' => 'admin::app.configuration.index.magic-ai.settings.other', + 'type' => 'text', + 'info' => 'admin::app.configuration.index.magic-ai.settings.other-model', + 'default' => null, + 'depends' => 'enable:1', + ], + ], + ], [ + 'key' => 'general.magic_ai.doc_generation', + 'name' => 'admin::app.configuration.index.magic-ai.settings.doc-generation', + 'info' => 'admin::app.configuration.index.magic-ai.settings.doc-generation-info', + 'sort' => 2, + 'fields' => [ + [ + 'name' => 'enabled', + 'title' => 'admin::app.configuration.index.magic-ai.settings.enable', + 'type' => 'boolean', + ], + ], + ], + + /** + * Email. + */ + [ + 'key' => 'email', + 'name' => 'admin::app.configuration.index.email.title', + 'info' => 'admin::app.configuration.index.email.info', + 'sort' => 2, + ], [ + 'key' => 'email.imap', + 'name' => 'admin::app.configuration.index.email.imap.title', + 'info' => 'admin::app.configuration.index.email.imap.info', + 'icon' => 'icon-setting', + 'sort' => 1, + ], [ + 'key' => 'email.imap.account', + 'name' => 'admin::app.configuration.index.email.imap.account.title', + 'info' => 'admin::app.configuration.index.email.imap.account.title-info', + 'sort' => 1, + 'fields' => [ + [ + 'name' => 'host', + 'title' => 'admin::app.configuration.index.email.imap.account.host', + 'type' => 'text', + 'default' => config('imap.accounts.default.host'), + ], + [ + 'name' => 'port', + 'title' => 'admin::app.configuration.index.email.imap.account.port', + 'type' => 'text', + 'default' => config('imap.accounts.default.port'), + ], + [ + 'name' => 'encryption', + 'title' => 'admin::app.configuration.index.email.imap.account.encryption', + 'type' => 'text', + 'default' => config('imap.accounts.default.encryption'), + ], + [ + 'name' => 'validate_cert', + 'title' => 'admin::app.configuration.index.email.imap.account.validate-cert', + 'type' => 'boolean', + 'default' => config('imap.accounts.default.validate_cert'), + ], + [ + 'name' => 'username', + 'title' => 'admin::app.configuration.index.email.imap.account.username', + 'type' => 'text', + 'default' => config('imap.accounts.default.username'), + ], + [ + 'name' => 'password', + 'title' => 'admin::app.configuration.index.email.imap.account.password', + 'type' => 'password', + 'default' => config('imap.accounts.default.password'), + ], + ], + ], +]; diff --git a/packages/Webkul/Admin/src/Config/menu.php b/packages/Webkul/Admin/src/Config/menu.php new file mode 100644 index 0000000..cab5a37 --- /dev/null +++ b/packages/Webkul/Admin/src/Config/menu.php @@ -0,0 +1,299 @@ + 'dashboard', + 'name' => 'admin::app.layouts.dashboard', + 'route' => 'admin.dashboard.index', + 'sort' => 1, + 'icon-class' => 'icon-dashboard', + ], + + /** + * Leads. + */ + [ + 'key' => 'leads', + 'name' => 'admin::app.layouts.leads', + 'route' => 'admin.leads.index', + 'sort' => 2, + 'icon-class' => 'icon-leads', + ], + + /** + * Quotes. + */ + [ + 'key' => 'quotes', + 'name' => 'admin::app.layouts.quotes', + 'route' => 'admin.quotes.index', + 'sort' => 3, + 'icon-class' => 'icon-quote', + ], + + /** + * Emails. + */ + [ + 'key' => 'mail', + 'name' => 'admin::app.layouts.mail.title', + 'route' => 'admin.mail.index', + 'params' => ['route' => 'inbox'], + 'sort' => 4, + 'icon-class' => 'icon-mail', + ], [ + 'key' => 'mail.inbox', + 'name' => 'admin::app.layouts.mail.inbox', + 'route' => 'admin.mail.index', + 'params' => ['route' => 'inbox'], + 'sort' => 2, + 'icon-class' => '', + ], [ + 'key' => 'mail.draft', + 'name' => 'admin::app.layouts.mail.draft', + 'route' => 'admin.mail.index', + 'params' => ['route' => 'draft'], + 'sort' => 3, + 'icon-class' => '', + ], [ + 'key' => 'mail.outbox', + 'name' => 'admin::app.layouts.mail.outbox', + 'route' => 'admin.mail.index', + 'params' => ['route' => 'outbox'], + 'sort' => 4, + 'icon-class' => '', + ], [ + 'key' => 'mail.sent', + 'name' => 'admin::app.layouts.mail.sent', + 'route' => 'admin.mail.index', + 'params' => ['route' => 'sent'], + 'sort' => 4, + 'icon-class' => '', + ], [ + 'key' => 'mail.trash', + 'name' => 'admin::app.layouts.mail.trash', + 'route' => 'admin.mail.index', + 'params' => ['route' => 'trash'], + 'sort' => 5, + 'icon-class' => '', + ], + // , [ + // 'key' => 'mail.setting', + // 'name' => 'admin::app.layouts.mail.setting', + // 'route' => 'admin.mail.index', + // 'params' => ['route' => 'setting'], + // 'sort' => 5, + // ] + + /** + * Activities. + */ + [ + 'key' => 'activities', + 'name' => 'admin::app.layouts.activities', + 'route' => 'admin.activities.index', + 'sort' => 5, + 'icon-class' => 'icon-activity', + ], + + /** + * Contacts. + */ + [ + 'key' => 'contacts', + 'name' => 'admin::app.layouts.contacts', + 'route' => 'admin.contacts.persons.index', + 'sort' => 6, + 'icon-class' => 'icon-contact', + ], [ + 'key' => 'contacts.persons', + 'name' => 'admin::app.layouts.persons', + 'route' => 'admin.contacts.persons.index', + 'sort' => 1, + 'icon-class' => '', + ], [ + 'key' => 'contacts.organizations', + 'name' => 'admin::app.layouts.organizations', + 'route' => 'admin.contacts.organizations.index', + 'sort' => 2, + 'icon-class' => '', + ], + + /** + * Products. + */ + [ + 'key' => 'products', + 'name' => 'admin::app.layouts.products', + 'route' => 'admin.products.index', + 'sort' => 7, + 'icon-class' => 'icon-product', + ], + + /** + * Settings. + */ + [ + 'key' => 'settings', + 'name' => 'admin::app.layouts.settings', + 'route' => 'admin.settings.index', + 'sort' => 8, + 'icon-class' => 'icon-setting', + ], [ + 'key' => 'settings.user', + 'name' => 'admin::app.layouts.user', + 'route' => 'admin.settings.groups.index', + 'info' => 'admin::app.layouts.user-info', + 'sort' => 1, + 'icon-class' => 'icon-settings-group', + ], [ + 'key' => 'settings.user.groups', + 'name' => 'admin::app.layouts.groups', + 'info' => 'admin::app.layouts.groups-info', + 'route' => 'admin.settings.groups.index', + 'sort' => 1, + 'icon-class' => 'icon-settings-group', + ], [ + 'key' => 'settings.user.roles', + 'name' => 'admin::app.layouts.roles', + 'info' => 'admin::app.layouts.roles-info', + 'route' => 'admin.settings.roles.index', + 'sort' => 2, + 'icon-class' => 'icon-role', + ], [ + 'key' => 'settings.user.users', + 'name' => 'admin::app.layouts.users', + 'info' => 'admin::app.layouts.users-info', + 'route' => 'admin.settings.users.index', + 'sort' => 3, + 'icon-class' => 'icon-user', + ], [ + 'key' => 'settings.lead', + 'name' => 'admin::app.layouts.lead', + 'info' => 'admin::app.layouts.lead-info', + 'route' => 'admin.settings.pipelines.index', + 'sort' => 2, + 'icon-class' => '', + ], [ + 'key' => 'settings.lead.pipelines', + 'name' => 'admin::app.layouts.pipelines', + 'info' => 'admin::app.layouts.pipelines-info', + 'route' => 'admin.settings.pipelines.index', + 'sort' => 1, + 'icon-class' => 'icon-settings-pipeline', + ], [ + 'key' => 'settings.lead.sources', + 'name' => 'admin::app.layouts.sources', + 'info' => 'admin::app.layouts.sources-info', + 'route' => 'admin.settings.sources.index', + 'sort' => 2, + 'icon-class' => 'icon-settings-sources', + ], [ + 'key' => 'settings.lead.types', + 'name' => 'admin::app.layouts.types', + 'info' => 'admin::app.layouts.types-info', + 'route' => 'admin.settings.types.index', + 'sort' => 3, + 'icon-class' => 'icon-settings-type', + ], [ + 'key' => 'settings.warehouse', + 'name' => 'admin::app.layouts.warehouse', + 'info' => 'admin::app.layouts.warehouses-info', + 'route' => 'admin.settings.pipelines.index', + 'icon-class' => '', + 'sort' => 2, + ], [ + 'key' => 'settings.warehouse.warehouses', + 'name' => 'admin::app.layouts.warehouses', + 'info' => 'admin::app.layouts.warehouses-info', + 'route' => 'admin.settings.warehouses.index', + 'sort' => 1, + 'icon-class' => 'icon-settings-warehouse', + ], [ + 'key' => 'settings.automation', + 'name' => 'admin::app.layouts.automation', + 'info' => 'admin::app.layouts.automation-info', + 'route' => 'admin.settings.attributes.index', + 'sort' => 3, + 'icon-class' => '', + ], [ + 'key' => 'settings.automation.attributes', + 'name' => 'admin::app.layouts.attributes', + 'info' => 'admin::app.layouts.attributes-info', + 'route' => 'admin.settings.attributes.index', + 'sort' => 1, + 'icon-class' => 'icon-attribute', + ], [ + 'key' => 'settings.automation.email_templates', + 'name' => 'admin::app.layouts.email-templates', + 'info' => 'admin::app.layouts.email-templates-info', + 'route' => 'admin.settings.email_templates.index', + 'sort' => 2, + 'icon-class' => 'icon-settings-mail', + ], [ + 'key' => 'settings.automation.events', + 'name' => 'admin::app.layouts.events', + 'info' => 'admin::app.layouts.events-info', + 'route' => 'admin.settings.marketing.events.index', + 'sort' => 2, + 'icon-class' => 'icon-calendar', + ], [ + 'key' => 'settings.automation.campaigns', + 'name' => 'admin::app.layouts.campaigns', + 'info' => 'admin::app.layouts.campaigns-info', + 'route' => 'admin.settings.marketing.campaigns.index', + 'sort' => 2, + 'icon-class' => 'icon-note', + ], [ + 'key' => 'settings.automation.webhooks', + 'name' => 'admin::app.layouts.webhooks', + 'info' => 'admin::app.layouts.webhooks-info', + 'route' => 'admin.settings.webhooks.index', + 'sort' => 2, + 'icon-class' => 'icon-settings-webhooks', + ], [ + 'key' => 'settings.automation.workflows', + 'name' => 'admin::app.layouts.workflows', + 'info' => 'admin::app.layouts.workflows-info', + 'route' => 'admin.settings.workflows.index', + 'sort' => 3, + 'icon-class' => 'icon-settings-flow', + ], + [ + 'key' => 'settings.automation.data_transfer', + 'name' => 'admin::app.layouts.data_transfer', + 'info' => 'admin::app.layouts.data_transfer_info', + 'route' => 'admin.settings.data_transfer.imports.index', + 'sort' => 4, + 'icon-class' => 'icon-download', + ], [ + 'key' => 'settings.other_settings', + 'name' => 'admin::app.layouts.other-settings', + 'info' => 'admin::app.layouts.other-settings-info', + 'route' => 'admin.settings.tags.index', + 'sort' => 4, + 'icon-class' => 'icon-settings', + ], [ + 'key' => 'settings.other_settings.tags', + 'name' => 'admin::app.layouts.tags', + 'info' => 'admin::app.layouts.tags-info', + 'route' => 'admin.settings.tags.index', + 'sort' => 1, + 'icon-class' => 'icon-settings-tag', + ], + + /** + * Configuration. + */ + [ + 'key' => 'configuration', + 'name' => 'admin::app.layouts.configuration', + 'route' => 'admin.configuration.index', + 'sort' => 9, + 'icon-class' => 'icon-configuration', + ], + +]; diff --git a/packages/Webkul/Admin/src/DataGrids/Activity/ActivityDataGrid.php b/packages/Webkul/Admin/src/DataGrids/Activity/ActivityDataGrid.php new file mode 100644 index 0000000..d481825 --- /dev/null +++ b/packages/Webkul/Admin/src/DataGrids/Activity/ActivityDataGrid.php @@ -0,0 +1,235 @@ +distinct() + ->select( + 'activities.*', + 'leads.id as lead_id', + 'leads.title as lead_title', + 'leads.lead_pipeline_id', + 'users.id as created_by_id', + 'users.name as created_by', + ) + ->leftJoin('activity_participants', 'activities.id', '=', 'activity_participants.activity_id') + ->leftJoin('lead_activities', 'activities.id', '=', 'lead_activities.activity_id') + ->leftJoin('leads', 'lead_activities.lead_id', '=', 'leads.id') + ->leftJoin('users', 'activities.user_id', '=', 'users.id') + ->whereIn('type', ['call', 'meeting', 'lunch']) + ->where(function ($query) { + if ($userIds = bouncer()->getAuthorizedUserIds()) { + $query->whereIn('activities.user_id', $userIds) + ->orWhereIn('activity_participants.user_id', $userIds); + } + })->groupBy('activities.id', 'leads.id', 'users.id'); + + $this->addFilter('id', 'activities.id'); + $this->addFilter('title', 'activities.title'); + $this->addFilter('schedule_from', 'activities.schedule_from'); + $this->addFilter('created_by', 'users.name'); + $this->addFilter('created_by_id', 'users.name'); + $this->addFilter('created_at', 'activities.created_at'); + $this->addFilter('lead_title', 'leads.title'); + + return $queryBuilder; + } + + /** + * Prepare columns. + */ + public function prepareColumns(): void + { + $this->addColumn([ + 'index' => 'id', + 'label' => trans('admin::app.activities.index.datagrid.id'), + 'type' => 'integer', + 'searchable' => true, + 'filterable' => true, + 'sortable' => true, + ]); + + $this->addColumn([ + 'index' => 'is_done', + 'label' => trans('admin::app.activities.index.datagrid.is_done'), + 'type' => 'string', + 'dropdown_options' => $this->getBooleanDropdownOptions('yes_no'), + 'searchable' => false, + 'closure' => fn ($row) => view('admin::activities.datagrid.is-done', compact('row'))->render(), + ]); + + $this->addColumn([ + 'index' => 'title', + 'label' => trans('admin::app.activities.index.datagrid.title'), + 'type' => 'string', + 'searchable' => true, + 'filterable' => true, + 'sortable' => true, + ]); + + $this->addColumn([ + 'index' => 'created_by_id', + 'label' => trans('admin::app.activities.index.datagrid.created_by'), + 'type' => 'string', + 'searchable' => false, + 'sortable' => true, + 'filterable' => true, + 'filterable_type' => 'searchable_dropdown', + 'filterable_options' => [ + 'repository' => UserRepository::class, + 'column' => [ + 'label' => 'name', + 'value' => 'name', + ], + ], + 'closure' => function ($row) { + $route = urldecode(route('admin.settings.users.index', ['id[eq]' => $row->created_by_id])); + + return "".$row->created_by.''; + }, + ]); + + $this->addColumn([ + 'index' => 'comment', + 'label' => trans('admin::app.activities.index.datagrid.comment'), + 'type' => 'string', + ]); + + $this->addColumn([ + 'index' => 'lead_title', + 'label' => trans('admin::app.activities.index.datagrid.lead'), + 'type' => 'string', + 'searchable' => true, + 'sortable' => true, + 'filterable' => true, + 'filterable_type' => 'searchable_dropdown', + 'filterable_options' => [ + 'repository' => LeadRepository::class, + 'column' => [ + 'label' => 'title', + 'value' => 'title', + ], + ], + 'closure' => function ($row) { + if ($row->lead_title == null) { + return "N/A"; + } + + $route = urldecode(route('admin.leads.view', $row->lead_id)); + + return "".$row->lead_title.''; + }, + ]); + + $this->addColumn([ + 'index' => 'type', + 'label' => trans('admin::app.activities.index.datagrid.type'), + 'type' => 'string', + 'searchable' => false, + 'filterable' => false, + 'sortable' => true, + 'closure' => fn ($row) => trans('admin::app.activities.index.datagrid.'.$row->type), + ]); + + $this->addColumn([ + 'index' => 'schedule_from', + 'label' => trans('admin::app.activities.index.datagrid.schedule_from'), + 'type' => 'date', + 'sortable' => true, + 'searchable' => true, + 'filterable' => true, + 'closure' => fn ($row) => core()->formatDate($row->schedule_from), + ]); + + $this->addColumn([ + 'index' => 'schedule_to', + 'label' => trans('admin::app.activities.index.datagrid.schedule_to'), + 'type' => 'date', + 'sortable' => true, + 'searchable' => true, + 'filterable' => true, + 'closure' => fn ($row) => core()->formatDate($row->schedule_to), + ]); + + $this->addColumn([ + 'index' => 'created_at', + 'label' => trans('admin::app.activities.index.datagrid.created_at'), + 'type' => 'date', + 'sortable' => true, + 'searchable' => true, + 'filterable' => true, + 'closure' => fn ($row) => core()->formatDate($row->created_at), + ]); + } + + /** + * Prepare actions. + */ + public function prepareActions(): void + { + if (bouncer()->hasPermission('activities.edit')) { + $this->addAction([ + 'index' => 'edit', + 'icon' => 'icon-edit', + 'title' => trans('admin::app.activities.index.datagrid.edit'), + 'method' => 'GET', + 'url' => fn ($row) => route('admin.activities.edit', $row->id), + ]); + } + + if (bouncer()->hasPermission('activities.delete')) { + $this->addAction([ + 'index' => 'delete', + 'icon' => 'icon-delete', + 'title' => trans('admin::app.activities.index.datagrid.update'), + 'method' => 'DELETE', + 'url' => fn ($row) => route('admin.activities.delete', $row->id), + ]); + } + } + + /** + * Prepare mass actions. + */ + public function prepareMassActions(): void + { + + $this->addMassAction([ + 'icon' => 'icon-delete', + 'title' => trans('admin::app.activities.index.datagrid.mass-delete'), + 'method' => 'POST', + 'url' => route('admin.activities.mass_delete'), + ]); + + $this->addMassAction([ + 'title' => trans('admin::app.activities.index.datagrid.mass-update'), + 'url' => route('admin.activities.mass_update'), + 'method' => 'POST', + 'options' => [ + [ + 'label' => trans('admin::app.activities.index.datagrid.done'), + 'value' => 1, + ], [ + 'label' => trans('admin::app.activities.index.datagrid.not-done'), + 'value' => 0, + ], + ], + ]); + } +} diff --git a/packages/Webkul/Admin/src/DataGrids/Contact/OrganizationDataGrid.php b/packages/Webkul/Admin/src/DataGrids/Contact/OrganizationDataGrid.php new file mode 100644 index 0000000..240d71b --- /dev/null +++ b/packages/Webkul/Admin/src/DataGrids/Contact/OrganizationDataGrid.php @@ -0,0 +1,124 @@ +addSelect( + 'organizations.id', + 'organizations.name', + 'organizations.address', + 'organizations.created_at' + ); + + if ($userIds = bouncer()->getAuthorizedUserIds()) { + $queryBuilder->whereIn('organizations.user_id', $userIds); + } + + $this->addFilter('id', 'organizations.id'); + + $this->addFilter('organization', 'organizations.name'); + } + + /** + * Add columns. + */ + public function prepareColumns(): void + { + $this->addColumn([ + 'index' => 'id', + 'label' => trans('admin::app.contacts.organizations.index.datagrid.id'), + 'type' => 'integer', + 'filterable' => true, + 'sortable' => true, + ]); + + $this->addColumn([ + 'index' => 'name', + 'label' => trans('admin::app.contacts.organizations.index.datagrid.name'), + 'type' => 'string', + 'sortable' => true, + 'filterable' => true, + ]); + + $this->addColumn([ + 'index' => 'persons_count', + 'label' => trans('admin::app.contacts.organizations.index.datagrid.persons-count'), + 'type' => 'string', + 'searchable' => false, + 'sortable' => false, + 'filterable' => false, + 'closure' => function ($row) { + $personsCount = $this->personRepository->findWhere(['organization_id' => $row->id])->count(); + + return $personsCount; + }, + ]); + + $this->addColumn([ + 'index' => 'created_at', + 'label' => trans('admin::app.settings.tags.index.datagrid.created-at'), + 'type' => 'date', + 'searchable' => true, + 'filterable' => true, + 'filterable_type' => 'date_range', + 'sortable' => true, + 'closure' => fn ($row) => core()->formatDate($row->created_at), + ]); + } + + /** + * Prepare actions. + */ + public function prepareActions(): void + { + if (bouncer()->hasPermission('contacts.organizations.edit')) { + $this->addAction([ + 'icon' => 'icon-edit', + 'title' => trans('admin::app.contacts.organizations.index.datagrid.edit'), + 'method' => 'GET', + 'url' => fn ($row) => route('admin.contacts.organizations.edit', $row->id), + ]); + } + + if (bouncer()->hasPermission('contacts.organizations.delete')) { + $this->addAction([ + 'icon' => 'icon-delete', + 'title' => trans('admin::app.contacts.organizations.index.datagrid.delete'), + 'method' => 'DELETE', + 'url' => fn ($row) => route('admin.contacts.organizations.delete', $row->id), + ]); + } + } + + /** + * Prepare mass actions. + */ + public function prepareMassActions(): void + { + $this->addMassAction([ + 'icon' => 'icon-delete', + 'title' => trans('admin::app.contacts.organizations.index.datagrid.delete'), + 'method' => 'PUT', + 'url' => route('admin.contacts.organizations.mass_delete'), + ]); + } +} diff --git a/packages/Webkul/Admin/src/DataGrids/Contact/PersonDataGrid.php b/packages/Webkul/Admin/src/DataGrids/Contact/PersonDataGrid.php new file mode 100644 index 0000000..3ddf66c --- /dev/null +++ b/packages/Webkul/Admin/src/DataGrids/Contact/PersonDataGrid.php @@ -0,0 +1,160 @@ +addSelect( + 'persons.id', + 'persons.name as person_name', + 'persons.emails', + 'persons.contact_numbers', + 'organizations.name as organization', + 'organizations.id as organization_id' + ) + ->leftJoin('organizations', 'persons.organization_id', '=', 'organizations.id'); + + if ($userIds = bouncer()->getAuthorizedUserIds()) { + $queryBuilder->whereIn('persons.user_id', $userIds); + } + + $this->addFilter('id', 'persons.id'); + $this->addFilter('person_name', 'persons.name'); + $this->addFilter('organization', 'organizations.name'); + + return $queryBuilder; + } + + /** + * Add columns. + */ + public function prepareColumns(): void + { + $this->addColumn([ + 'index' => 'id', + 'label' => trans('admin::app.contacts.persons.index.datagrid.id'), + 'type' => 'integer', + 'filterable' => true, + 'sortable' => true, + 'searchable' => true, + ]); + + $this->addColumn([ + 'index' => 'person_name', + 'label' => trans('admin::app.contacts.persons.index.datagrid.name'), + 'type' => 'string', + 'sortable' => true, + 'filterable' => true, + 'searchable' => true, + ]); + + $this->addColumn([ + 'index' => 'emails', + 'label' => trans('admin::app.contacts.persons.index.datagrid.emails'), + 'type' => 'string', + 'sortable' => false, + 'filterable' => true, + 'searchable' => true, + 'closure' => fn ($row) => collect(json_decode($row->emails, true) ?? [])->pluck('value')->join(', '), + ]); + + $this->addColumn([ + 'index' => 'contact_numbers', + 'label' => trans('admin::app.contacts.persons.index.datagrid.contact-numbers'), + 'type' => 'string', + 'sortable' => true, + 'filterable' => true, + 'searchable' => true, + 'closure' => fn ($row) => collect(json_decode($row->contact_numbers, true) ?? [])->pluck('value')->join(', '), + ]); + + $this->addColumn([ + 'index' => 'organization', + 'label' => trans('admin::app.contacts.persons.index.datagrid.organization-name'), + 'type' => 'string', + 'searchable' => true, + 'filterable' => true, + 'sortable' => true, + 'filterable_type' => 'searchable_dropdown', + 'filterable_options' => [ + 'repository' => OrganizationRepository::class, + 'column' => [ + 'label' => 'name', + 'value' => 'name', + ], + ], + ]); + } + + /** + * Prepare actions. + */ + public function prepareActions(): void + { + if (bouncer()->hasPermission('contacts.persons.view')) { + $this->addAction([ + 'icon' => 'icon-eye', + 'title' => trans('admin::app.contacts.persons.index.datagrid.view'), + 'method' => 'GET', + 'url' => function ($row) { + return route('admin.contacts.persons.view', $row->id); + }, + ]); + } + + if (bouncer()->hasPermission('contacts.persons.edit')) { + $this->addAction([ + 'icon' => 'icon-edit', + 'title' => trans('admin::app.contacts.persons.index.datagrid.edit'), + 'method' => 'GET', + 'url' => function ($row) { + return route('admin.contacts.persons.edit', $row->id); + }, + ]); + } + + if (bouncer()->hasPermission('contacts.persons.delete')) { + $this->addAction([ + 'icon' => 'icon-delete', + 'title' => trans('admin::app.contacts.persons.index.datagrid.delete'), + 'method' => 'DELETE', + 'url' => function ($row) { + return route('admin.contacts.persons.delete', $row->id); + }, + ]); + } + } + + /** + * Prepare mass actions. + */ + public function prepareMassActions(): void + { + if (bouncer()->hasPermission('contacts.persons.delete')) { + $this->addMassAction([ + 'icon' => 'icon-delete', + 'title' => trans('admin::app.contacts.persons.index.datagrid.delete'), + 'method' => 'POST', + 'url' => route('admin.contacts.persons.mass_delete'), + ]); + } + } +} diff --git a/packages/Webkul/Admin/src/DataGrids/Lead/LeadDataGrid.php b/packages/Webkul/Admin/src/DataGrids/Lead/LeadDataGrid.php new file mode 100644 index 0000000..21bccde --- /dev/null +++ b/packages/Webkul/Admin/src/DataGrids/Lead/LeadDataGrid.php @@ -0,0 +1,326 @@ +pipeline = $this->pipelineRepository->find(request('pipeline_id')); + } else { + $this->pipeline = $this->pipelineRepository->getDefaultPipeline(); + } + } + + /** + * Prepare query builder. + */ + public function prepareQueryBuilder(): Builder + { + $tablePrefix = DB::getTablePrefix(); + + $queryBuilder = DB::table('leads') + ->addSelect( + 'leads.id', + 'leads.title', + 'leads.status', + 'leads.lead_value', + 'leads.expected_close_date', + 'lead_sources.name as lead_source_name', + 'lead_types.name as lead_type_name', + 'leads.created_at', + 'lead_pipeline_stages.name as stage', + 'lead_tags.tag_id as tag_id', + 'users.id as user_id', + 'users.name as sales_person', + 'persons.id as person_id', + 'persons.name as person_name', + 'tags.name as tag_name', + 'lead_pipelines.rotten_days as pipeline_rotten_days', + 'lead_pipeline_stages.code as stage_code', + DB::raw('CASE WHEN DATEDIFF(NOW(),'.$tablePrefix.'leads.created_at) >='.$tablePrefix.'lead_pipelines.rotten_days THEN 1 ELSE 0 END as rotten_lead'), + ) + ->leftJoin('users', 'leads.user_id', '=', 'users.id') + ->leftJoin('persons', 'leads.person_id', '=', 'persons.id') + ->leftJoin('lead_types', 'leads.lead_type_id', '=', 'lead_types.id') + ->leftJoin('lead_pipeline_stages', 'leads.lead_pipeline_stage_id', '=', 'lead_pipeline_stages.id') + ->leftJoin('lead_sources', 'leads.lead_source_id', '=', 'lead_sources.id') + ->leftJoin('lead_pipelines', 'leads.lead_pipeline_id', '=', 'lead_pipelines.id') + ->leftJoin('lead_tags', 'leads.id', '=', 'lead_tags.lead_id') + ->leftJoin('tags', 'tags.id', '=', 'lead_tags.tag_id') + ->groupBy('leads.id') + ->where('leads.lead_pipeline_id', $this->pipeline->id); + + if ($userIds = bouncer()->getAuthorizedUserIds()) { + $queryBuilder->whereIn('leads.user_id', $userIds); + } + + if (! is_null(request()->input('rotten_lead.in'))) { + $queryBuilder->havingRaw($tablePrefix.'rotten_lead = '.request()->input('rotten_lead.in')); + } + + $this->addFilter('id', 'leads.id'); + $this->addFilter('user', 'leads.user_id'); + $this->addFilter('sales_person', 'users.name'); + $this->addFilter('lead_source_name', 'lead_sources.id'); + $this->addFilter('lead_type_name', 'lead_types.id'); + $this->addFilter('person_name', 'persons.name'); + $this->addFilter('type', 'lead_pipeline_stages.code'); + $this->addFilter('stage', 'lead_pipeline_stages.id'); + $this->addFilter('tag_name', 'tags.name'); + $this->addFilter('expected_close_date', 'leads.expected_close_date'); + $this->addFilter('created_at', 'leads.created_at'); + $this->addFilter('rotten_lead', DB::raw('DATEDIFF(NOW(), '.$tablePrefix.'leads.created_at) >= '.$tablePrefix.'lead_pipelines.rotten_days')); + + return $queryBuilder; + } + + /** + * Prepare columns. + */ + public function prepareColumns(): void + { + $this->addColumn([ + 'index' => 'id', + 'label' => trans('admin::app.leads.index.datagrid.id'), + 'type' => 'integer', + 'sortable' => true, + 'filterable' => true, + ]); + + $this->addColumn([ + 'index' => 'sales_person', + 'label' => trans('admin::app.leads.index.datagrid.sales-person'), + 'type' => 'string', + 'searchable' => false, + 'sortable' => true, + 'filterable' => true, + 'filterable_type' => 'searchable_dropdown', + 'filterable_options' => [ + 'repository' => UserRepository::class, + 'column' => [ + 'label' => 'name', + 'value' => 'name', + ], + ], + ]); + + $this->addColumn([ + 'index' => 'title', + 'label' => trans('admin::app.leads.index.datagrid.subject'), + 'type' => 'string', + 'searchable' => true, + 'sortable' => true, + ]); + + $this->addColumn([ + 'index' => 'lead_source_name', + 'label' => trans('admin::app.leads.index.datagrid.source'), + 'type' => 'string', + 'searchable' => false, + 'sortable' => true, + 'filterable' => true, + 'filterable_type' => 'dropdown', + 'filterable_options' => $this->sourceRepository->all(['name as label', 'id as value'])->toArray(), + ]); + + $this->addColumn([ + 'index' => 'lead_value', + 'label' => trans('admin::app.leads.index.datagrid.lead-value'), + 'type' => 'string', + 'sortable' => true, + 'searchable' => false, + 'filterable' => true, + 'closure' => fn ($row) => core()->formatBasePrice($row->lead_value, 2), + ]); + + $this->addColumn([ + 'index' => 'lead_type_name', + 'label' => trans('admin::app.leads.index.datagrid.lead-type'), + 'type' => 'string', + 'searchable' => false, + 'sortable' => true, + 'filterable' => true, + 'filterable_type' => 'dropdown', + 'filterable_options' => $this->typeRepository->all(['name as label', 'id as value'])->toArray(), + ]); + + $this->addColumn([ + 'index' => 'tag_name', + 'label' => trans('admin::app.leads.index.datagrid.tag-name'), + 'type' => 'string', + 'searchable' => false, + 'sortable' => true, + 'filterable' => true, + 'filterable_type' => 'searchable_dropdown', + 'closure' => fn ($row) => $row->tag_name ?? '--', + 'filterable_options' => [ + 'repository' => TagRepository::class, + 'column' => [ + 'label' => 'name', + 'value' => 'name', + ], + ], + ]); + + $this->addColumn([ + 'index' => 'person_name', + 'label' => trans('admin::app.leads.index.datagrid.contact-person'), + 'type' => 'string', + 'searchable' => false, + 'sortable' => true, + 'filterable' => true, + 'filterable_type' => 'searchable_dropdown', + 'filterable_options' => [ + 'repository' => \Webkul\Contact\Repositories\PersonRepository::class, + 'column' => [ + 'label' => 'name', + 'value' => 'name', + ], + ], + 'closure' => function ($row) { + $route = route('admin.contacts.persons.view', $row->person_id); + + return "".$row->person_name.''; + }, + ]); + + $this->addColumn([ + 'index' => 'stage', + 'label' => trans('admin::app.leads.index.datagrid.stage'), + 'type' => 'string', + 'searchable' => false, + 'sortable' => true, + 'filterable' => true, + 'filterable_type' => 'dropdown', + 'filterable_options' => $this->pipeline->stages->pluck('name', 'id') + ->map(function ($name, $id) { + return ['value' => $id, 'label' => $name]; + }) + ->values() + ->all(), + ]); + + $this->addColumn([ + 'index' => 'rotten_lead', + 'label' => trans('admin::app.leads.index.datagrid.rotten-lead'), + 'type' => 'string', + 'sortable' => true, + 'searchable' => false, + 'closure' => function ($row) { + if (! $row->rotten_lead) { + return trans('admin::app.leads.index.datagrid.no'); + } + + if (in_array($row->stage_code, ['won', 'lost'])) { + return trans('admin::app.leads.index.datagrid.no'); + } + + return trans('admin::app.leads.index.datagrid.yes'); + }, + ]); + + $this->addColumn([ + 'index' => 'expected_close_date', + 'label' => trans('admin::app.leads.index.datagrid.date-to'), + 'type' => 'date', + 'searchable' => false, + 'sortable' => true, + 'filterable' => true, + 'filterable_type' => 'date_range', + 'closure' => function ($row) { + if (! $row->expected_close_date) { + return '--'; + } + + return $row->expected_close_date; + }, + ]); + + $this->addColumn([ + 'index' => 'created_at', + 'label' => trans('admin::app.leads.index.datagrid.created-at'), + 'type' => 'date', + 'searchable' => false, + 'sortable' => true, + 'filterable' => true, + 'filterable_type' => 'date_range', + ]); + } + + /** + * Prepare actions. + */ + public function prepareActions(): void + { + if (bouncer()->hasPermission('leads.view')) { + $this->addAction([ + 'icon' => 'icon-eye', + 'title' => trans('admin::app.leads.index.datagrid.view'), + 'method' => 'GET', + 'url' => fn ($row) => route('admin.leads.view', $row->id), + ]); + } + + if (bouncer()->hasPermission('leads.delete')) { + $this->addAction([ + 'icon' => 'icon-delete', + 'title' => trans('admin::app.leads.index.datagrid.delete'), + 'method' => 'delete', + 'url' => fn ($row) => route('admin.leads.delete', $row->id), + ]); + } + } + + /** + * Prepare mass actions. + */ + public function prepareMassActions(): void + { + $this->addMassAction([ + 'icon' => 'icon-delete', + 'title' => trans('admin::app.leads.index.datagrid.mass-delete'), + 'method' => 'POST', + 'url' => route('admin.leads.mass_delete'), + ]); + + $this->addMassAction([ + 'title' => trans('admin::app.leads.index.datagrid.mass-update'), + 'url' => route('admin.leads.mass_update'), + 'method' => 'POST', + 'options' => $this->pipeline->stages->map(fn ($stage) => [ + 'label' => $stage->name, + 'value' => $stage->id, + ])->toArray(), + ]); + } +} diff --git a/packages/Webkul/Admin/src/DataGrids/Mail/EmailDataGrid.php b/packages/Webkul/Admin/src/DataGrids/Mail/EmailDataGrid.php new file mode 100644 index 0000000..dd0ccf8 --- /dev/null +++ b/packages/Webkul/Admin/src/DataGrids/Mail/EmailDataGrid.php @@ -0,0 +1,212 @@ +select( + 'emails.id', + 'emails.name', + 'emails.from', + 'emails.subject', + 'emails.reply', + 'emails.is_read', + 'emails.created_at', + 'tags.name as tags', + DB::raw('COUNT(DISTINCT '.DB::getTablePrefix().'email_attachments.id) as attachments') + ) + ->leftJoin('email_attachments', 'emails.id', '=', 'email_attachments.email_id') + ->leftJoin('email_tags', 'emails.id', '=', 'email_tags.email_id') + ->leftJoin('tags', 'tags.id', '=', 'email_tags.tag_id') + ->groupBy('emails.id') + ->where('folders', 'like', '%"'.request('route').'"%') + ->whereNull('parent_id'); + + $this->addFilter('id', 'emails.id'); + $this->addFilter('name', 'emails.name'); + $this->addFilter('tags', 'tags.name'); + $this->addFilter('created_at', 'emails.created_at'); + + return $queryBuilder; + } + + /** + * Prepare Columns. + */ + public function prepareColumns(): void + { + $this->addColumn([ + 'index' => 'attachments', + 'label' => trans('admin::app.mail.index.datagrid.attachments'), + 'type' => 'string', + 'searchable' => false, + 'filterable' => false, + 'sortable' => false, + 'closure' => fn ($row) => $row->attachments ? '' : '', + ]); + + $this->addColumn([ + 'index' => 'name', + 'label' => trans('admin::app.mail.index.datagrid.from'), + 'type' => 'string', + 'sortable' => true, + 'searchable' => true, + 'filterable' => true, + 'closure' => function ($row) { + return $row->name + ? trim($row->name, '"') + : trim($row->from, '"'); + }, + ]); + + $this->addColumn([ + 'index' => 'subject', + 'label' => trans('admin::app.mail.index.datagrid.subject'), + 'type' => 'string', + 'sortable' => true, + 'searchable' => true, + 'filterable' => true, + ]); + + $this->addColumn([ + 'index' => 'reply', + 'label' => trans('admin::app.mail.index.datagrid.content'), + 'type' => 'string', + 'sortable' => true, + 'searchable' => true, + 'filterable' => true, + ]); + + $this->addColumn([ + 'index' => 'tags', + 'label' => trans('admin::app.mail.index.datagrid.tags'), + 'type' => 'string', + 'searchable' => false, + 'sortable' => true, + 'filterable' => true, + 'filterable_type' => 'searchable_dropdown', + 'closure' => function ($row) { + if ($email = app(EmailRepository::class)->find($row->id)) { + return $email->tags; + } + + return '--'; + }, + 'filterable_options' => [ + 'repository' => TagRepository::class, + 'column' => [ + 'label' => 'name', + 'value' => 'name', + ], + ], + ]); + + $this->addColumn([ + 'index' => 'created_at', + 'label' => trans('admin::app.mail.index.datagrid.date'), + 'type' => 'date', + 'searchable' => true, + 'filterable' => true, + 'filterable_type' => 'date_range', + 'sortable' => true, + 'closure' => function ($row) { + return Carbon::parse($row->created_at)->isToday() + ? Carbon::parse($row->created_at)->format('h:i A') + : Carbon::parse($row->created_at)->format('M d'); + }, + ]); + } + + /** + * Prepare actions. + */ + public function prepareActions(): void + { + if (bouncer()->hasPermission('mail.view')) { + $this->addAction([ + 'index' => 'edit', + 'icon' => request('route') == 'draft' + ? 'icon-edit' + : 'icon-eye', + 'title' => request('route') == 'draft' + ? trans('admin::app.mail.index.datagrid.edit') + : trans('admin::app.mail.index.datagrid.view'), + 'method' => 'GET', + 'params' => [ + 'type' => request('route') == 'trash' + ? 'delete' + : 'trash', + ], + 'url' => fn ($row) => route('admin.mail.view', [request('route'), $row->id]), + ]); + } + + if (bouncer()->hasPermission('mail.delete')) { + $this->addAction([ + 'index' => 'delete', + 'icon' => 'icon-delete', + 'title' => trans('admin::app.mail.index.datagrid.delete'), + 'method' => 'DELETE', + 'params' => [ + 'type' => request('route') == 'trash' + ? 'delete' + : 'trash', + ], + 'url' => fn ($row) => route('admin.mail.delete', $row->id), + ]); + } + } + + /** + * Prepare mass actions. + */ + public function prepareMassActions(): void + { + if (request('route') == 'trash') { + $this->addMassAction([ + 'title' => trans('admin::app.mail.index.datagrid.move-to-inbox'), + 'method' => 'POST', + 'url' => route('admin.mail.mass_update', ['folders' => ['inbox']]), + 'options' => [ + [ + 'value' => 'trash', + 'label' => trans('admin::app.mail.index.datagrid.move-to-inbox'), + ], + ], + ]); + } + + $this->addMassAction([ + 'icon' => 'icon-delete', + 'title' => request('route') == 'trash' + ? trans('admin::app.mail.index.datagrid.delete') + : trans('admin::app.mail.index.datagrid.move-to-trash'), + 'method' => 'POST', + 'url' => route('admin.mail.mass_delete', [ + 'type' => request('route') == 'trash' + ? 'delete' + : 'trash', + ]), + ]); + } +} diff --git a/packages/Webkul/Admin/src/DataGrids/Product/ProductDataGrid.php b/packages/Webkul/Admin/src/DataGrids/Product/ProductDataGrid.php new file mode 100644 index 0000000..1044535 --- /dev/null +++ b/packages/Webkul/Admin/src/DataGrids/Product/ProductDataGrid.php @@ -0,0 +1,169 @@ +leftJoin('product_inventories', 'products.id', '=', 'product_inventories.product_id') + ->leftJoin('product_tags', 'products.id', '=', 'product_tags.product_id') + ->leftJoin('tags', 'tags.id', '=', 'product_tags.tag_id') + ->select( + 'products.id', + 'products.sku', + 'products.name', + 'products.price', + 'tags.name as tag_name', + ) + ->addSelect(DB::raw('SUM('.$tablePrefix.'product_inventories.in_stock) as total_in_stock')) + ->addSelect(DB::raw('SUM('.$tablePrefix.'product_inventories.allocated) as total_allocated')) + ->addSelect(DB::raw('SUM('.$tablePrefix.'product_inventories.in_stock - '.$tablePrefix.'product_inventories.allocated) as total_on_hand')) + ->groupBy('products.id'); + + if (request()->route('id')) { + $queryBuilder->where('product_inventories.warehouse_id', request()->route('id')); + } + + $this->addFilter('id', 'products.id'); + $this->addFilter('total_in_stock', DB::raw('SUM('.$tablePrefix.'product_inventories.in_stock')); + $this->addFilter('total_allocated', DB::raw('SUM('.$tablePrefix.'product_inventories.allocated')); + $this->addFilter('total_on_hand', DB::raw('SUM('.$tablePrefix.'product_inventories.in_stock - '.$tablePrefix.'product_inventories.allocated')); + $this->addFilter('tag_name', 'tags.name'); + + return $queryBuilder; + } + + /** + * Add columns. + */ + public function prepareColumns(): void + { + $this->addColumn([ + 'index' => 'sku', + 'label' => trans('admin::app.products.index.datagrid.sku'), + 'type' => 'string', + 'sortable' => true, + 'searchable' => true, + 'filterable' => true, + ]); + + $this->addColumn([ + 'index' => 'name', + 'label' => trans('admin::app.products.index.datagrid.name'), + 'type' => 'string', + 'sortable' => true, + 'searchable' => true, + 'filterable' => true, + ]); + + $this->addColumn([ + 'index' => 'price', + 'label' => trans('admin::app.products.index.datagrid.price'), + 'type' => 'string', + 'sortable' => true, + 'searchable' => true, + 'filterable' => true, + 'closure' => fn ($row) => round($row->price, 2), + ]); + + $this->addColumn([ + 'index' => 'total_in_stock', + 'label' => trans('admin::app.products.index.datagrid.in-stock'), + 'type' => 'string', + 'sortable' => true, + ]); + + $this->addColumn([ + 'index' => 'total_allocated', + 'label' => trans('admin::app.products.index.datagrid.allocated'), + 'type' => 'string', + 'sortable' => true, + ]); + + $this->addColumn([ + 'index' => 'total_on_hand', + 'label' => trans('admin::app.products.index.datagrid.on-hand'), + 'type' => 'string', + 'sortable' => true, + ]); + + $this->addColumn([ + 'index' => 'tag_name', + 'label' => trans('admin::app.products.index.datagrid.tag-name'), + 'type' => 'string', + 'searchable' => false, + 'sortable' => true, + 'filterable' => true, + 'filterable_type' => 'searchable_dropdown', + 'closure' => fn ($row) => $row->tag_name ?? '--', + 'filterable_options' => [ + 'repository' => TagRepository::class, + 'column' => [ + 'label' => 'name', + 'value' => 'name', + ], + ], + ]); + } + + /** + * Prepare actions. + */ + public function prepareActions(): void + { + if (bouncer()->hasPermission('products.view')) { + $this->addAction([ + 'index' => 'view', + 'icon' => 'icon-eye', + 'title' => trans('admin::app.products.index.datagrid.view'), + 'method' => 'GET', + 'url' => fn ($row) => route('admin.products.view', $row->id), + ]); + } + + if (bouncer()->hasPermission('products.edit')) { + $this->addAction([ + 'index' => 'edit', + 'icon' => 'icon-edit', + 'title' => trans('admin::app.products.index.datagrid.edit'), + 'method' => 'GET', + 'url' => fn ($row) => route('admin.products.edit', $row->id), + ]); + } + + if (bouncer()->hasPermission('products.delete')) { + $this->addAction([ + 'index' => 'delete', + 'icon' => 'icon-delete', + 'title' => trans('admin::app.products.index.datagrid.delete'), + 'method' => 'DELETE', + 'url' => fn ($row) => route('admin.products.delete', $row->id), + ]); + } + } + + /** + * Prepare mass actions. + */ + public function prepareMassActions(): void + { + $this->addMassAction([ + 'icon' => 'icon-delete', + 'title' => trans('admin::app.products.index.datagrid.delete'), + 'method' => 'POST', + 'url' => route('admin.products.mass_delete'), + ]); + } +} diff --git a/packages/Webkul/Admin/src/DataGrids/Quote/QuoteDataGrid.php b/packages/Webkul/Admin/src/DataGrids/Quote/QuoteDataGrid.php new file mode 100644 index 0000000..914db49 --- /dev/null +++ b/packages/Webkul/Admin/src/DataGrids/Quote/QuoteDataGrid.php @@ -0,0 +1,229 @@ +addSelect( + 'quotes.id', + 'quotes.subject', + 'quotes.expired_at', + 'quotes.sub_total', + 'quotes.discount_amount', + 'quotes.tax_amount', + 'quotes.adjustment_amount', + 'quotes.grand_total', + 'quotes.created_at', + 'users.id as user_id', + 'users.name as sales_person', + 'persons.id as person_id', + 'persons.name as person_name', + 'quotes.expired_at as expired_quotes' + ) + ->leftJoin('users', 'quotes.user_id', '=', 'users.id') + ->leftJoin('persons', 'quotes.person_id', '=', 'persons.id'); + + if ($userIds = bouncer()->getAuthorizedUserIds()) { + $queryBuilder->whereIn('quotes.user_id', $userIds); + } + + $this->addFilter('id', 'quotes.id'); + $this->addFilter('user', 'quotes.user_id'); + $this->addFilter('sales_person', 'users.name'); + $this->addFilter('person_name', 'persons.name'); + $this->addFilter('expired_at', 'quotes.expired_at'); + $this->addFilter('created_at', 'quotes.created_at'); + + if (request()->input('expired_quotes.in') == 1) { + $this->addFilter('expired_quotes', DB::raw('DATEDIFF(NOW(), '.$tablePrefix.'quotes.expired_at) >= '.$tablePrefix.'NOW()')); + } else { + $this->addFilter('expired_quotes', DB::raw('DATEDIFF(NOW(), '.$tablePrefix.'quotes.expired_at) < '.$tablePrefix.'NOW()')); + } + + return $queryBuilder; + } + + /** + * Prepare columns. + */ + public function prepareColumns(): void + { + $this->addColumn([ + 'index' => 'subject', + 'label' => trans('admin::app.quotes.index.datagrid.subject'), + 'type' => 'string', + 'filterable' => true, + 'sortable' => true, + ]); + + $this->addColumn([ + 'index' => 'sales_person', + 'label' => trans('admin::app.quotes.index.datagrid.sales-person'), + 'type' => 'string', + 'sortable' => true, + 'filterable' => true, + 'filterable_type' => 'searchable_dropdown', + 'filterable_options' => [ + 'repository' => \Webkul\User\Repositories\UserRepository::class, + 'column' => [ + 'label' => 'name', + 'value' => 'name', + ], + ], + ]); + + $this->addColumn([ + 'index' => 'person_name', + 'label' => trans('admin::app.quotes.index.datagrid.person'), + 'type' => 'string', + 'sortable' => true, + 'filterable' => true, + 'filterable_type' => 'searchable_dropdown', + 'filterable_options' => [ + 'repository' => \Webkul\Contact\Repositories\PersonRepository::class, + 'column' => [ + 'label' => 'name', + 'value' => 'name', + ], + ], + 'closure' => function ($row) { + $route = route('admin.contacts.persons.view', $row->person_id); + + return "".$row->person_name.''; + }, + ]); + + $this->addColumn([ + 'index' => 'sub_total', + 'label' => trans('admin::app.quotes.index.datagrid.subtotal'), + 'type' => 'string', + 'sortable' => true, + 'filterable' => true, + 'closure' => fn ($row) => core()->formatBasePrice($row->sub_total, 2), + ]); + + $this->addColumn([ + 'index' => 'discount_amount', + 'label' => trans('admin::app.quotes.index.datagrid.discount'), + 'type' => 'string', + 'sortable' => true, + 'filterable' => true, + 'closure' => fn ($row) => core()->formatBasePrice($row->discount_amount, 2), + ]); + + $this->addColumn([ + 'index' => 'tax_amount', + 'label' => trans('admin::app.quotes.index.datagrid.tax'), + 'type' => 'string', + 'filterable' => true, + 'sortable' => true, + 'closure' => fn ($row) => core()->formatBasePrice($row->tax_amount, 2), + ]); + + $this->addColumn([ + 'index' => 'adjustment_amount', + 'label' => trans('admin::app.quotes.index.datagrid.adjustment'), + 'type' => 'string', + 'sortable' => true, + 'filterable' => false, + 'closure' => fn ($row) => core()->formatBasePrice($row->adjustment_amount, 2), + ]); + + $this->addColumn([ + 'index' => 'grand_total', + 'label' => trans('admin::app.quotes.index.datagrid.grand-total'), + 'type' => 'string', + 'sortable' => true, + 'filterable' => true, + 'closure' => fn ($row) => core()->formatBasePrice($row->grand_total, 2), + ]); + + $this->addColumn([ + 'index' => 'expired_at', + 'label' => trans('admin::app.quotes.index.datagrid.expired-at'), + 'type' => 'date', + 'searchable' => false, + 'sortable' => true, + 'filterable' => true, + 'closure' => fn ($row) => core()->formatDate($row->expired_at, 'd M Y'), + ]); + + $this->addColumn([ + 'index' => 'created_at', + 'label' => trans('admin::app.quotes.index.datagrid.created-at'), + 'type' => 'date', + 'searchable' => false, + 'sortable' => true, + 'filterable' => true, + 'closure' => fn ($row) => core()->formatDate($row->created_at), + ]); + } + + /** + * Prepare actions. + */ + public function prepareActions(): void + { + if (bouncer()->hasPermission('quotes.edit')) { + $this->addAction([ + 'index' => 'edit', + 'icon' => 'icon-edit', + 'title' => trans('admin::app.quotes.index.datagrid.edit'), + 'method' => 'GET', + 'url' => fn ($row) => route('admin.quotes.edit', $row->id), + ]); + } + + if (bouncer()->hasPermission('quotes.print')) { + $this->addAction([ + 'index' => 'print', + 'icon' => 'icon-print', + 'title' => trans('admin::app.quotes.index.datagrid.print'), + 'method' => 'GET', + 'url' => fn ($row) => route('admin.quotes.print', $row->id), + ]); + } + + if (bouncer()->hasPermission('quotes.delete')) { + $this->addAction([ + 'index' => 'delete', + 'icon' => 'icon-delete', + 'title' => trans('admin::app.quotes.index.datagrid.delete'), + 'method' => 'DELETE', + 'url' => fn ($row) => route('admin.quotes.delete', $row->id), + ]); + } + } + + /** + * Prepare mass actions. + */ + public function prepareMassActions(): void + { + $this->addMassAction([ + 'icon' => 'icon-delete', + 'title' => trans('admin::app.quotes.index.datagrid.delete'), + 'method' => 'POST', + 'url' => route('admin.quotes.mass_delete'), + ]); + + $this->addMassAction([ + 'icon' => 'icon-delete', + 'title' => trans('admin::app.quotes.index.datagrid.delete'), + 'method' => 'POST', + 'url' => route('admin.quotes.mass_delete'), + ]); + } +} diff --git a/packages/Webkul/Admin/src/DataGrids/Settings/AttributeDataGrid.php b/packages/Webkul/Admin/src/DataGrids/Settings/AttributeDataGrid.php new file mode 100644 index 0000000..bbbeeb9 --- /dev/null +++ b/packages/Webkul/Admin/src/DataGrids/Settings/AttributeDataGrid.php @@ -0,0 +1,153 @@ +select( + 'attributes.id', + 'attributes.code', + 'attributes.name', + 'attributes.type', + 'attributes.entity_type', + 'attributes.is_user_defined as attribute_type' + ) + ->where('entity_type', '<>', 'locations'); + + $this->addFilter('id', 'attributes.id'); + $this->addFilter('type', 'attributes.type'); + $this->addFilter('attribute_type', 'attributes.is_user_defined'); + + return $queryBuilder; + } + + /** + * Prepare columns. + */ + public function prepareColumns(): void + { + $this->addColumn([ + 'index' => 'id', + 'label' => trans('admin::app.settings.attributes.index.datagrid.id'), + 'type' => 'string', + 'filterable' => true, + 'sortable' => true, + ]); + + $this->addColumn([ + 'index' => 'code', + 'label' => trans('admin::app.settings.attributes.index.datagrid.code'), + 'type' => 'string', + 'sortable' => true, + 'searchable' => true, + 'filterable' => true, + ]); + + $this->addColumn([ + 'index' => 'name', + 'label' => trans('admin::app.settings.attributes.index.datagrid.name'), + 'type' => 'string', + 'sortable' => true, + 'searchable' => true, + 'filterable' => true, + ]); + + $this->addColumn([ + 'index' => 'entity_type', + 'label' => trans('admin::app.settings.attributes.index.datagrid.entity-type'), + 'type' => 'string', + 'sortable' => true, + 'searchable' => false, + 'filterable' => true, + 'filterable_type' => 'dropdown', + 'filterable_options' => app(AttributeRepository::class) + ->select('entity_type as label', 'entity_type as value') + ->distinct() + ->get() + ->map(function ($item) { + $item->label = trans('admin::app.settings.attributes.index.datagrid.entity-types.'.$item->label); + + return $item; + }) + ->toArray(), + 'closure' => fn ($row) => ucfirst($row->entity_type), + ]); + + $this->addColumn([ + 'index' => 'type', + 'label' => trans('admin::app.settings.attributes.index.datagrid.type'), + 'type' => 'string', + 'sortable' => true, + 'filterable' => true, + 'filterable_type' => 'dropdown', + 'filterable_options' => app(AttributeRepository::class) + ->select('type as label', 'type as value') + ->distinct() + ->get() + ->map(function ($item) { + $item->label = trans('admin::app.settings.attributes.index.datagrid.types.'.$item->label); + + return $item; + }) + ->toArray(), + ]); + + $this->addColumn([ + 'index' => 'attribute_type', + 'label' => trans('admin::app.settings.attributes.index.datagrid.is-default'), + 'type' => 'boolean', + 'searchable' => true, + 'filterable' => false, + 'sortable' => true, + 'closure' => fn ($value) => trans('admin::app.settings.attributes.index.datagrid.'.($value->attribute_type ? 'no' : 'yes')), + ]); + } + + /** + * Prepare actions. + */ + public function prepareActions(): void + { + if (bouncer()->hasPermission('settings.automation.attributes.edit')) { + $this->addAction([ + 'icon' => 'icon-edit', + 'title' => trans('admin::app.settings.attributes.index.datagrid.edit'), + 'method' => 'GET', + 'url' => fn ($row) => route('admin.settings.attributes.edit', $row->id), + ]); + } + + if (bouncer()->hasPermission('settings.automation.attributes.delete')) { + $this->addAction([ + 'icon' => 'icon-delete', + 'title' => trans('admin::app.settings.attributes.index.datagrid.delete'), + 'method' => 'DELETE', + 'url' => fn ($row) => route('admin.settings.attributes.delete', $row->id), + ]); + } + } + + /** + * Prepare mass actions. + */ + public function prepareMassActions(): void + { + $this->addMassAction([ + 'icon' => 'icon-delete', + 'title' => trans('admin::app.settings.attributes.index.datagrid.delete'), + 'method' => 'POST', + 'url' => route('admin.settings.attributes.mass_delete'), + ]); + } +} diff --git a/packages/Webkul/Admin/src/DataGrids/Settings/DataTransfer/ImportDataGrid.php b/packages/Webkul/Admin/src/DataGrids/Settings/DataTransfer/ImportDataGrid.php new file mode 100644 index 0000000..f2539d3 --- /dev/null +++ b/packages/Webkul/Admin/src/DataGrids/Settings/DataTransfer/ImportDataGrid.php @@ -0,0 +1,161 @@ +select( + 'id', + 'state', + 'file_path', + 'error_file_path', + 'started_at', + 'completed_at', + 'type', + 'summary', + ); + } + + /** + * Prepare Columns. + */ + public function prepareColumns(): void + { + $this->addColumn([ + 'index' => 'id', + 'label' => trans('admin::app.settings.data-transfer.imports.index.datagrid.id'), + 'type' => 'integer', + 'filterable' => true, + 'sortable' => true, + ]); + + $this->addColumn([ + 'index' => 'type', + 'label' => trans('admin::app.settings.data-transfer.imports.index.datagrid.type'), + 'type' => 'string', + 'filterable' => true, + 'sortable' => true, + ]); + + $this->addColumn([ + 'index' => 'state', + 'label' => trans('admin::app.settings.data-transfer.imports.index.datagrid.state'), + 'type' => 'string', + 'filterable' => true, + 'sortable' => true, + ]); + + $this->addColumn([ + 'index' => 'file_path', + 'label' => trans('admin::app.settings.data-transfer.imports.index.datagrid.uploaded-file'), + 'type' => 'string', + 'closure' => function ($row) { + return ''.$row->file_path.''; + }, + ]); + + $this->addColumn([ + 'index' => 'error_file_path', + 'label' => trans('admin::app.settings.data-transfer.imports.index.datagrid.error-file'), + 'type' => 'string', + 'closure' => function ($row) { + if (empty($row->error_file_path)) { + return ''; + } + + return ''.$row->error_file_path.''; + }, + ]); + + $this->addColumn([ + 'index' => 'started_at', + 'label' => trans('admin::app.settings.data-transfer.imports.index.datagrid.started-at'), + 'type' => 'date', + 'filterable' => true, + 'filterable_type' => 'date_range', + 'sortable' => true, + ]); + + $this->addColumn([ + 'index' => 'completed_at', + 'label' => trans('admin::app.settings.data-transfer.imports.index.datagrid.completed-at'), + 'type' => 'date', + 'filterable' => true, + 'filterable_type' => 'date_range', + 'sortable' => true, + ]); + + $this->addColumn([ + 'index' => 'summary', + 'label' => trans('admin::app.settings.data-transfer.imports.index.datagrid.summary'), + 'type' => 'string', + 'closure' => function ($row) { + if (empty($row->summary)) { + return ''; + } + + $summary = json_decode($row->summary, true); + + $stats = []; + + foreach ($summary as $type => $value) { + $stats[] = trans('admin::app.settings.data-transfer.imports.index.datagrid.'.$type).': '.$summary[$type]; + } + + return implode(', ', $stats); + }, + ]); + } + + /** + * Prepare actions. + */ + public function prepareActions(): void + { + if (bouncer()->hasPermission('settings.data_transfer.imports.import')) { + $this->addAction([ + 'index' => 'import', + 'icon' => 'icon-import', + 'title' => trans('admin::app.settings.data-transfer.imports.index.datagrid.import'), + 'method' => 'GET', + 'url' => function ($row) { + return route('admin.settings.data_transfer.imports.import', $row->id); + }, + ]); + } + + if (bouncer()->hasPermission('settings.data_transfer.imports.edit')) { + $this->addAction([ + 'index' => 'edit', + 'icon' => 'icon-edit', + 'title' => trans('admin::app.settings.data-transfer.imports.index.datagrid.edit'), + 'method' => 'GET', + 'url' => function ($row) { + return route('admin.settings.data_transfer.imports.edit', $row->id); + }, + ]); + } + + if (bouncer()->hasPermission('settings.data_transfer.imports.delete')) { + $this->addAction([ + 'index' => 'delete', + 'icon' => 'icon-delete', + 'title' => trans('admin::app.settings.data-transfer.imports.index.datagrid.delete'), + 'method' => 'DELETE', + 'url' => function ($row) { + return route('admin.settings.data_transfer.imports.delete', $row->id); + }, + ]); + } + } +} diff --git a/packages/Webkul/Admin/src/DataGrids/Settings/EmailTemplateDataGrid.php b/packages/Webkul/Admin/src/DataGrids/Settings/EmailTemplateDataGrid.php new file mode 100644 index 0000000..eaa3cd2 --- /dev/null +++ b/packages/Webkul/Admin/src/DataGrids/Settings/EmailTemplateDataGrid.php @@ -0,0 +1,87 @@ +addSelect( + 'email_templates.id', + 'email_templates.name', + 'email_templates.subject', + ); + + $this->addFilter('id', 'email_templates.id'); + + return $queryBuilder; + } + + /** + * Add columns. + * + * @return void + */ + public function prepareColumns() + { + $this->addColumn([ + 'index' => 'id', + 'label' => trans('admin::app.settings.email-template.index.datagrid.id'), + 'type' => 'string', + 'sortable' => true, + 'searchable' => true, + 'filterable' => true, + ]); + + $this->addColumn([ + 'index' => 'name', + 'label' => trans('admin::app.settings.email-template.index.datagrid.name'), + 'type' => 'string', + 'sortable' => true, + 'searchable' => true, + 'filterable' => true, + ]); + + $this->addColumn([ + 'index' => 'subject', + 'label' => trans('admin::app.settings.email-template.index.datagrid.subject'), + 'type' => 'string', + 'sortable' => true, + ]); + } + + /** + * Prepare actions. + * + * @return void + */ + public function prepareActions() + { + if (bouncer()->hasPermission('settings.automation.email_templates.edit')) { + $this->addAction([ + 'index' => 'delete', + 'icon' => 'icon-edit', + 'title' => trans('admin::app.settings.email-template.index.datagrid.edit'), + 'method' => 'GET', + 'url' => fn ($row) => route('admin.settings.email_templates.edit', $row->id), + ]); + } + + if (bouncer()->hasPermission('settings.automation.email_templates.delete')) { + $this->addAction([ + 'index' => 'delete', + 'icon' => 'icon-delete', + 'title' => trans('admin::app.settings.email-template.index.datagrid.delete'), + 'method' => 'DELETE', + 'url' => fn ($row) => route('admin.settings.email_templates.delete', $row->id), + ]); + } + } +} diff --git a/packages/Webkul/Admin/src/DataGrids/Settings/GroupDataGrid.php b/packages/Webkul/Admin/src/DataGrids/Settings/GroupDataGrid.php new file mode 100644 index 0000000..0d6e266 --- /dev/null +++ b/packages/Webkul/Admin/src/DataGrids/Settings/GroupDataGrid.php @@ -0,0 +1,84 @@ +addSelect( + 'groups.id', + 'groups.name', + 'groups.description' + ); + + $this->addFilter('id', 'groups.id'); + + return $queryBuilder; + } + + /** + * Prepare columns. + */ + public function prepareColumns(): void + { + $this->addColumn([ + 'index' => 'id', + 'label' => trans('admin::app.settings.groups.index.datagrid.id'), + 'type' => 'string', + 'searchable' => true, + 'filterable' => true, + 'sortable' => true, + ]); + + $this->addColumn([ + 'index' => 'name', + 'type' => 'string', + 'label' => trans('admin::app.settings.groups.index.datagrid.name'), + 'searchable' => true, + 'filterable' => true, + 'sortable' => true, + ]); + + $this->addColumn([ + 'index' => 'description', + 'label' => trans('admin::app.settings.groups.index.datagrid.description'), + 'type' => 'string', + 'sortable' => false, + ]); + } + + /** + * Prepare actions. + */ + public function prepareActions(): void + { + if (bouncer()->hasPermission('settings.user.groups.edit')) { + $this->addAction([ + 'index' => 'edit', + 'icon' => 'icon-edit', + 'title' => trans('admin::app.settings.groups.index.datagrid.edit'), + 'method' => 'GET', + 'url' => fn ($row) => route('admin.settings.groups.edit', $row->id), + ]); + } + + if (bouncer()->hasPermission('settings.user.groups.delete')) { + $this->addAction([ + 'index' => 'delete', + 'icon' => 'icon-delete', + 'title' => trans('admin::app.settings.groups.index.datagrid.delete'), + 'method' => 'DELETE', + 'url' => fn ($row) => route('admin.settings.groups.delete', $row->id), + ]); + } + } +} diff --git a/packages/Webkul/Admin/src/DataGrids/Settings/Marketing/CampaignDatagrid.php b/packages/Webkul/Admin/src/DataGrids/Settings/Marketing/CampaignDatagrid.php new file mode 100644 index 0000000..9f77f01 --- /dev/null +++ b/packages/Webkul/Admin/src/DataGrids/Settings/Marketing/CampaignDatagrid.php @@ -0,0 +1,110 @@ +addSelect( + 'marketing_campaigns.id', + 'marketing_campaigns.name', + 'marketing_campaigns.subject', + 'marketing_campaigns.status', + ); + + $this->addFilter('id', 'marketing_campaigns.id'); + + return $queryBuilder; + } + + /** + * Add columns. + * + * @return void + */ + public function prepareColumns() + { + $this->addColumn([ + 'index' => 'id', + 'label' => trans('admin::app.settings.marketing.campaigns.index.datagrid.id'), + 'type' => 'string', + 'sortable' => true, + 'searchable' => true, + 'filterable' => true, + ]); + + $this->addColumn([ + 'index' => 'name', + 'label' => trans('admin::app.settings.marketing.campaigns.index.datagrid.name'), + 'type' => 'string', + 'sortable' => true, + 'searchable' => true, + 'filterable' => true, + ]); + + $this->addColumn([ + 'index' => 'subject', + 'label' => trans('admin::app.settings.marketing.campaigns.index.datagrid.subject'), + 'type' => 'string', + 'sortable' => true, + ]); + + $this->addColumn([ + 'index' => 'status', + 'label' => trans('admin::app.settings.marketing.campaigns.index.datagrid.status'), + 'type' => 'string', + 'sortable' => true, + ]); + } + + /** + * Prepare actions. + * + * @return void + */ + public function prepareActions() + { + if (bouncer()->hasPermission('settings.automation.campaigns.edit')) { + $this->addAction([ + 'index' => 'edit', + 'icon' => 'icon-edit', + 'title' => trans('admin::app.settings.marketing.campaigns.index.datagrid.edit'), + 'method' => 'GET', + 'url' => fn ($row) => route('admin.settings.marketing.campaigns.edit', $row->id), + ]); + } + + if (bouncer()->hasPermission('settings.automation.campaigns.delete')) { + $this->addAction([ + 'index' => 'delete', + 'icon' => 'icon-delete', + 'title' => trans('admin::app.settings.marketing.campaigns.index.datagrid.delete'), + 'method' => 'DELETE', + 'url' => fn ($row) => route('admin.settings.marketing.campaigns.delete', $row->id), + ]); + } + } + + /** + * Prepare mass actions. + */ + public function prepareMassActions(): void + { + if (bouncer()->hasPermission('settings.automation.campaigns.mass_delete')) { + $this->addMassAction([ + 'icon' => 'icon-delete', + 'title' => trans('admin::app.settings.marketing.campaigns.index.datagrid.delete'), + 'method' => 'POST', + 'url' => route('admin.settings.marketing.campaigns.mass_delete'), + ]); + } + } +} diff --git a/packages/Webkul/Admin/src/DataGrids/Settings/Marketing/EventDataGrid.php b/packages/Webkul/Admin/src/DataGrids/Settings/Marketing/EventDataGrid.php new file mode 100644 index 0000000..446d041 --- /dev/null +++ b/packages/Webkul/Admin/src/DataGrids/Settings/Marketing/EventDataGrid.php @@ -0,0 +1,110 @@ +addSelect( + 'marketing_events.id', + 'marketing_events.name', + 'marketing_events.description', + 'marketing_events.date', + ); + + $this->addFilter('id', 'marketing_events.id'); + + return $queryBuilder; + } + + /** + * Add columns. + * + * @return void + */ + public function prepareColumns() + { + $this->addColumn([ + 'index' => 'id', + 'label' => trans('admin::app.settings.marketing.events.index.datagrid.id'), + 'type' => 'string', + 'sortable' => true, + 'searchable' => true, + 'filterable' => true, + ]); + + $this->addColumn([ + 'index' => 'name', + 'label' => trans('admin::app.settings.marketing.events.index.datagrid.name'), + 'type' => 'string', + 'sortable' => true, + 'searchable' => true, + 'filterable' => true, + ]); + + $this->addColumn([ + 'index' => 'description', + 'label' => trans('admin::app.settings.marketing.events.index.datagrid.description'), + 'type' => 'string', + 'sortable' => true, + ]); + + $this->addColumn([ + 'index' => 'date', + 'label' => trans('admin::app.settings.marketing.events.index.datagrid.date'), + 'type' => 'string', + 'sortable' => true, + ]); + } + + /** + * Prepare actions. + * + * @return void + */ + public function prepareActions() + { + if (bouncer()->hasPermission('settings.automation.events.edit')) { + $this->addAction([ + 'index' => 'edit', + 'icon' => 'icon-edit', + 'title' => trans('admin::app.settings.marketing.events.index.datagrid.edit'), + 'method' => 'GET', + 'url' => fn ($row) => route('admin.settings.marketing.events.edit', $row->id), + ]); + } + + if (bouncer()->hasPermission('settings.automation.events.delete')) { + $this->addAction([ + 'index' => 'delete', + 'icon' => 'icon-delete', + 'title' => trans('admin::app.settings.marketing.events.index.datagrid.delete'), + 'method' => 'DELETE', + 'url' => fn ($row) => route('admin.settings.marketing.events.delete', $row->id), + ]); + } + } + + /** + * Prepare mass actions. + */ + public function prepareMassActions(): void + { + if (bouncer()->hasPermission('settings.automation.events.delete')) { + $this->addMassAction([ + 'icon' => 'icon-delete', + 'title' => trans('admin::app.settings.marketing.events.index.datagrid.delete'), + 'method' => 'POST', + 'url' => route('admin.settings.marketing.events.mass_delete'), + ]); + } + } +} diff --git a/packages/Webkul/Admin/src/DataGrids/Settings/PipelineDataGrid.php b/packages/Webkul/Admin/src/DataGrids/Settings/PipelineDataGrid.php new file mode 100644 index 0000000..9dc68af --- /dev/null +++ b/packages/Webkul/Admin/src/DataGrids/Settings/PipelineDataGrid.php @@ -0,0 +1,93 @@ +addSelect( + 'lead_pipelines.id', + 'lead_pipelines.name', + 'lead_pipelines.rotten_days', + 'lead_pipelines.is_default', + ); + + $this->addFilter('id', 'lead_pipelines.id'); + + return $queryBuilder; + } + + /** + * Prepare columns. + */ + public function prepareColumns(): void + { + $this->addColumn([ + 'index' => 'id', + 'label' => trans('admin::app.settings.pipelines.index.datagrid.id'), + 'type' => 'string', + 'sortable' => true, + ]); + + $this->addColumn([ + 'index' => 'name', + 'label' => trans('admin::app.settings.pipelines.index.datagrid.name'), + 'type' => 'string', + 'searchable' => true, + 'filterable' => true, + 'sortable' => true, + ]); + + $this->addColumn([ + 'index' => 'rotten_days', + 'label' => trans('admin::app.settings.pipelines.index.datagrid.rotten-days'), + 'type' => 'string', + 'sortable' => true, + ]); + + $this->addColumn([ + 'index' => 'is_default', + 'label' => trans('admin::app.settings.pipelines.index.datagrid.is-default'), + 'type' => 'boolean', + 'searchable' => true, + 'filterable' => true, + 'sortable' => true, + 'closure' => fn ($value) => trans('admin::app.settings.pipelines.index.datagrid.'.($value->is_default ? 'yes' : 'no')), + ]); + } + + /** + * Prepare actions. + */ + public function prepareActions(): void + { + if (bouncer()->hasPermission('settings.lead.pipelines.edit')) { + $this->addAction([ + 'index' => 'edit', + 'icon' => 'icon-edit', + 'title' => trans('admin::app.settings.pipelines.index.datagrid.edit'), + 'method' => 'GET', + 'url' => fn ($row) => route('admin.settings.pipelines.edit', $row->id), + ]); + } + + if (bouncer()->hasPermission('settings.lead.pipelines.delete')) { + $this->addAction([ + 'index' => 'delete', + 'icon' => 'icon-delete', + 'title' => trans('admin::app.settings.pipelines.index.datagrid.delete'), + 'method' => 'DELETE', + 'url' => fn ($row) => route('admin.settings.pipelines.delete', $row->id), + ]); + } + } +} diff --git a/packages/Webkul/Admin/src/DataGrids/Settings/RoleDataGrid.php b/packages/Webkul/Admin/src/DataGrids/Settings/RoleDataGrid.php new file mode 100644 index 0000000..557c709 --- /dev/null +++ b/packages/Webkul/Admin/src/DataGrids/Settings/RoleDataGrid.php @@ -0,0 +1,102 @@ +addSelect( + 'roles.id', + 'roles.name', + 'roles.description', + 'roles.permission_type' + ); + + $this->addFilter('id', 'roles.id'); + $this->addFilter('name', 'roles.name'); + + return $queryBuilder; + } + + /** + * Prepare Columns. + */ + public function prepareColumns(): void + { + $this->addColumn([ + 'index' => 'id', + 'label' => trans('admin::app.settings.roles.index.datagrid.id'), + 'type' => 'string', + 'filterable' => true, + 'sortable' => true, + ]); + + $this->addColumn([ + 'index' => 'name', + 'label' => trans('admin::app.settings.roles.index.datagrid.name'), + 'type' => 'string', + 'filterable' => true, + 'sortable' => true, + ]); + + $this->addColumn([ + 'index' => 'description', + 'label' => trans('admin::app.settings.roles.index.datagrid.description'), + 'type' => 'string', + 'sortable' => false, + ]); + + $this->addColumn([ + 'index' => 'permission_type', + 'label' => trans('admin::app.settings.roles.index.datagrid.permission-type'), + 'type' => 'string', + 'searchable' => true, + 'filterable' => true, + 'filterable_type' => 'dropdown', + 'filterable_options' => [ + [ + 'label' => trans('admin::app.settings.roles.index.datagrid.custom'), + 'value' => 'custom', + ], + [ + 'label' => trans('admin::app.settings.roles.index.datagrid.all'), + 'value' => 'all', + ], + ], + 'sortable' => true, + ]); + } + + /** + * Prepare actions. + */ + public function prepareActions(): void + { + if (bouncer()->hasPermission('settings.user.roles.edit')) { + $this->addAction([ + 'icon' => 'icon-edit', + 'title' => trans('admin::app.settings.roles.index.datagrid.edit'), + 'method' => 'GET', + 'url' => fn ($row) => route('admin.settings.roles.edit', $row->id), + ]); + } + + if (bouncer()->hasPermission('settings.user.roles.delete')) { + $this->addAction([ + 'icon' => 'icon-delete', + 'title' => trans('admin::app.settings.roles.index.datagrid.delete'), + 'method' => 'DELETE', + 'url' => fn ($row) => route('admin.settings.roles.delete', $row->id), + ]); + } + } +} diff --git a/packages/Webkul/Admin/src/DataGrids/Settings/SourceDataGrid.php b/packages/Webkul/Admin/src/DataGrids/Settings/SourceDataGrid.php new file mode 100644 index 0000000..9a8af03 --- /dev/null +++ b/packages/Webkul/Admin/src/DataGrids/Settings/SourceDataGrid.php @@ -0,0 +1,74 @@ +addSelect( + 'lead_sources.id', + 'lead_sources.name' + ); + + $this->addFilter('id', 'lead_sources.id'); + + return $queryBuilder; + } + + /** + * Prepare Columns. + */ + public function prepareColumns(): void + { + $this->addColumn([ + 'index' => 'id', + 'label' => trans('admin::app.settings.sources.index.datagrid.id'), + 'type' => 'string', + 'sortable' => true, + ]); + + $this->addColumn([ + 'index' => 'name', + 'label' => trans('admin::app.settings.sources.index.datagrid.name'), + 'type' => 'string', + 'searchable' => true, + 'filterable' => true, + 'sortable' => true, + ]); + } + + /** + * Prepare actions. + */ + public function prepareActions(): void + { + if (bouncer()->hasPermission('settings.lead.sources.edit')) { + $this->addAction([ + 'index' => 'edit', + 'icon' => 'icon-edit', + 'title' => trans('admin::app.settings.sources.index.datagrid.edit'), + 'method' => 'GET', + 'url' => fn ($row) => route('admin.settings.sources.edit', $row->id), + ]); + } + + if (bouncer()->hasPermission('settings.lead.sources.delete')) { + $this->addAction([ + 'index' => 'delete', + 'icon' => 'icon-delete', + 'title' => trans('admin::app.settings.sources.index.datagrid.delete'), + 'method' => 'DELETE', + 'url' => fn ($row) => route('admin.settings.sources.delete', $row->id), + ]); + } + } +} diff --git a/packages/Webkul/Admin/src/DataGrids/Settings/TagDataGrid.php b/packages/Webkul/Admin/src/DataGrids/Settings/TagDataGrid.php new file mode 100644 index 0000000..f41a88d --- /dev/null +++ b/packages/Webkul/Admin/src/DataGrids/Settings/TagDataGrid.php @@ -0,0 +1,124 @@ +addSelect( + 'tags.id', + 'tags.name', + 'tags.color', + 'tags.created_at', + 'users.name as user_name', + ) + ->leftJoin('users', 'tags.user_id', '=', 'users.id'); + + if ($userIds = bouncer()->getAuthorizedUserIds()) { + $queryBuilder->whereIn('tags.user_id', $userIds); + } + + $this->addFilter('id', 'tags.id'); + $this->addFilter('name', 'tags.name'); + $this->addFilter('created_at', 'tags.created_at'); + $this->addFilter('user_name', 'users.id'); + + return $queryBuilder; + } + + /** + * Prepare Columns. + */ + public function prepareColumns(): void + { + $this->addColumn([ + 'index' => 'id', + 'label' => trans('admin::app.settings.tags.index.datagrid.id'), + 'type' => 'string', + 'searchable' => true, + 'sortable' => true, + 'filterable' => true, + ]); + + $this->addColumn([ + 'index' => 'name', + 'label' => trans('admin::app.settings.tags.index.datagrid.name'), + 'type' => 'string', + 'searchable' => true, + 'sortable' => true, + 'filterable' => true, + ]); + + $this->addColumn([ + 'index' => 'user_name', + 'label' => trans('admin::app.settings.tags.index.datagrid.users'), + 'type' => 'string', + 'searchable' => true, + 'sortable' => true, + 'filterable' => true, + ]); + + $this->addColumn([ + 'index' => 'created_at', + 'label' => trans('admin::app.settings.tags.index.datagrid.created-at'), + 'type' => 'date', + 'searchable' => true, + 'filterable' => true, + 'sortable' => true, + 'filterable_type' => 'date_range', + 'closure' => fn ($row) => core()->formatDate($row->created_at), + ]); + } + + /** + * Prepare actions. + */ + public function prepareActions(): void + { + if (bouncer()->hasPermission('settings.other_settings.tags.edit')) { + $this->addAction([ + 'index' => 'edit', + 'icon' => 'icon-edit', + 'title' => trans('admin::app.settings.tags.index.datagrid.edit'), + 'method' => 'GET', + 'url' => function ($row) { + return route('admin.settings.tags.edit', $row->id); + }, + ]); + } + + if (bouncer()->hasPermission('settings.other_settings.tags.delete')) { + $this->addAction([ + 'index' => 'delete', + 'icon' => 'icon-delete', + 'title' => trans('admin::app.settings.tags.index.datagrid.delete'), + 'method' => 'DELETE', + 'url' => function ($row) { + return route('admin.settings.tags.delete', $row->id); + }, + ]); + } + } + + /** + * Prepare mass actions. + */ + public function prepareMassActions(): void + { + $this->addMassAction([ + 'icon' => 'icon-delete', + 'title' => trans('admin::app.settings.tags.index.datagrid.delete'), + 'method' => 'POST', + 'url' => route('admin.settings.tags.mass_delete'), + ]); + } +} diff --git a/packages/Webkul/Admin/src/DataGrids/Settings/TypeDataGrid.php b/packages/Webkul/Admin/src/DataGrids/Settings/TypeDataGrid.php new file mode 100644 index 0000000..42b08ac --- /dev/null +++ b/packages/Webkul/Admin/src/DataGrids/Settings/TypeDataGrid.php @@ -0,0 +1,74 @@ +addSelect( + 'lead_types.id', + 'lead_types.name' + ); + + $this->addFilter('id', 'lead_types.id'); + + return $queryBuilder; + } + + /** + * Prepare Columns. + */ + public function prepareColumns(): void + { + $this->addColumn([ + 'index' => 'id', + 'label' => trans('admin::app.settings.types.index.datagrid.id'), + 'type' => 'string', + 'filterable' => true, + 'sortable' => true, + ]); + + $this->addColumn([ + 'index' => 'name', + 'label' => trans('admin::app.settings.types.index.datagrid.name'), + 'type' => 'string', + 'filterable' => true, + 'sortable' => true, + ]); + } + + /** + * Prepare Actions. + */ + public function prepareActions(): void + { + if (bouncer()->hasPermission('settings.lead.types.edit')) { + $this->addAction([ + 'index' => 'edit', + 'icon' => 'icon-edit', + 'title' => trans('admin::app.settings.roles.index.datagrid.edit'), + 'method' => 'GET', + 'url' => fn ($row) => route('admin.settings.types.update', $row->id), + ]); + } + + if (bouncer()->hasPermission('settings.lead.types.delete')) { + $this->addAction([ + 'index' => 'delete', + 'icon' => 'icon-delete', + 'title' => trans('admin::app.settings.roles.index.datagrid.delete'), + 'method' => 'DELETE', + 'url' => fn ($row) => route('admin.settings.types.delete', $row->id), + ]); + } + } +} diff --git a/packages/Webkul/Admin/src/DataGrids/Settings/UserDataGrid.php b/packages/Webkul/Admin/src/DataGrids/Settings/UserDataGrid.php new file mode 100644 index 0000000..41e71a6 --- /dev/null +++ b/packages/Webkul/Admin/src/DataGrids/Settings/UserDataGrid.php @@ -0,0 +1,146 @@ +distinct() + ->addSelect( + 'id', + 'name', + 'email', + 'image', + 'status', + 'created_at' + ) + ->leftJoin('user_groups', 'id', '=', 'user_groups.user_id'); + + if ($userIds = bouncer()->getAuthorizedUserIds()) { + $queryBuilder->whereIn('id', $userIds); + } + + return $queryBuilder; + } + + /** + * Add columns. + */ + public function prepareColumns(): void + { + $this->addColumn([ + 'index' => 'id', + 'label' => trans('admin::app.settings.users.index.datagrid.id'), + 'type' => 'string', + 'sortable' => true, + ]); + + $this->addColumn([ + 'index' => 'name', + 'label' => trans('admin::app.settings.users.index.datagrid.name'), + 'type' => 'string', + 'sortable' => true, + 'searchable' => true, + 'filterable' => true, + 'closure' => function ($row) { + return [ + 'image' => $row->image ? Storage::url($row->image) : null, + 'name' => $row->name, + ]; + }, + ]); + + $this->addColumn([ + 'index' => 'email', + 'label' => trans('admin::app.settings.users.index.datagrid.email'), + 'type' => 'string', + 'sortable' => true, + 'searchable' => true, + 'filterable' => true, + ]); + + $this->addColumn([ + 'index' => 'status', + 'label' => trans('admin::app.settings.users.index.datagrid.status'), + 'type' => 'boolean', + 'filterable' => true, + 'sortable' => true, + 'searchable' => true, + ]); + + $this->addColumn([ + 'index' => 'created_at', + 'label' => trans('admin::app.settings.users.index.datagrid.created-at'), + 'type' => 'date', + 'sortable' => true, + 'searchable' => true, + 'filterable_type' => 'date_range', + 'filterable' => true, + ]); + } + + /** + * Prepare actions. + */ + public function prepareActions(): void + { + if (bouncer()->hasPermission('settings.user.users.edit')) { + $this->addAction([ + 'index' => 'edit', + 'icon' => 'icon-edit', + 'title' => trans('admin::app.settings.users.index.datagrid.edit'), + 'method' => 'GET', + 'url' => fn ($row) => route('admin.settings.users.edit', $row->id), + ]); + } + + if (bouncer()->hasPermission('settings.user.users.delete')) { + $this->addAction([ + 'index' => 'delete', + 'icon' => 'icon-delete', + 'title' => trans('admin::app.settings.users.index.datagrid.delete'), + 'method' => 'DELETE', + 'url' => fn ($row) => route('admin.settings.users.delete', $row->id), + ]); + } + } + + /** + * Prepare mass actions. + */ + public function prepareMassActions(): void + { + $this->addMassAction([ + 'icon' => 'icon-delete', + 'title' => trans('admin::app.settings.users.index.datagrid.delete'), + 'method' => 'POST', + 'url' => route('admin.settings.users.mass_delete'), + ]); + + $this->addMassAction([ + 'title' => trans('admin::app.settings.users.index.datagrid.update-status'), + 'method' => 'POST', + 'url' => route('admin.settings.users.mass_update'), + 'options' => [ + [ + 'label' => trans('admin::app.settings.users.index.datagrid.active'), + 'value' => 1, + ], + [ + 'label' => trans('admin::app.settings.users.index.datagrid.inactive'), + 'value' => 0, + ], + ], + ]); + } +} diff --git a/packages/Webkul/Admin/src/DataGrids/Settings/WarehouseDataGrid.php b/packages/Webkul/Admin/src/DataGrids/Settings/WarehouseDataGrid.php new file mode 100644 index 0000000..64b78d4 --- /dev/null +++ b/packages/Webkul/Admin/src/DataGrids/Settings/WarehouseDataGrid.php @@ -0,0 +1,153 @@ +leftJoin('product_inventories', 'warehouses.id', '=', 'product_inventories.warehouse_id') + ->select( + 'warehouses.id', + 'warehouses.name', + 'warehouses.contact_name', + 'warehouses.contact_emails', + 'warehouses.contact_numbers', + 'warehouses.created_at', + ) + ->addSelect(DB::raw('count(DISTINCT '.DB::getTablePrefix().'product_inventories.product_id) as products')) + ->groupBy('warehouses.id'); + + $this->addFilter('id', 'warehouses.id'); + $this->addFilter('created_at', 'warehouses.created_at'); + + return $queryBuilder; + } + + /** + * Add columns. + */ + public function prepareColumns(): void + { + $this->addColumn([ + 'index' => 'id', + 'label' => trans('admin::app.settings.warehouses.index.datagrid.id'), + 'type' => 'string', + 'sortable' => true, + 'filterable' => true, + ]); + + $this->addColumn([ + 'index' => 'name', + 'label' => trans('admin::app.settings.warehouses.index.datagrid.name'), + 'type' => 'string', + 'sortable' => true, + 'filterable' => true, + ]); + + $this->addColumn([ + 'index' => 'contact_name', + 'label' => trans('admin::app.settings.warehouses.index.datagrid.contact-name'), + 'type' => 'string', + 'searchable' => true, + 'filterable' => true, + 'sortable' => true, + ]); + + $this->addColumn([ + 'index' => 'contact_emails', + 'label' => trans('admin::app.settings.warehouses.index.datagrid.contact-emails'), + 'type' => 'string', + 'searchable' => true, + 'filterable' => true, + 'sortable' => true, + 'closure' => function ($row) { + $emails = json_decode($row->contact_emails, true); + + if ($emails) { + return collect($emails)->pluck('value')->join(', '); + } + }, + ]); + + $this->addColumn([ + 'index' => 'contact_numbers', + 'label' => trans('admin::app.settings.warehouses.index.datagrid.contact-numbers'), + 'type' => 'string', + 'sortable' => false, + 'closure' => function ($row) { + $numbers = json_decode($row->contact_numbers, true); + + if ($numbers) { + return collect($numbers)->pluck('value')->join(', '); + } + }, + ]); + + $this->addColumn([ + 'index' => 'products', + 'label' => trans('admin::app.settings.warehouses.index.datagrid.products'), + 'type' => 'string', + 'sortable' => true, + 'filterable' => false, + ]); + + $this->addColumn([ + 'index' => 'created_at', + 'label' => trans('admin::app.settings.warehouses.index.datagrid.created-at'), + 'type' => 'date', + 'searchable' => true, + 'filterable' => true, + 'filterable_type' => 'date_range', + 'sortable' => true, + 'closure' => function ($row) { + return core()->formatDate($row->created_at); + }, + ]); + } + + /** + * Prepare actions. + * + * @return void + */ + public function prepareActions() + { + $this->addAction([ + 'icon' => 'icon-eye', + 'title' => trans('admin::app.settings.warehouses.index.datagrid.view'), + 'method' => 'GET', + 'url' => function ($row) { + return route('admin.settings.warehouses.view', $row->id); + }, + ]); + + $this->addAction([ + 'icon' => 'icon-edit', + 'title' => trans('admin::app.settings.warehouses.index.datagrid.edit'), + 'method' => 'GET', + 'url' => function ($row) { + return route('admin.settings.warehouses.edit', $row->id); + }, + ]); + + $this->addAction([ + 'icon' => 'icon-delete', + 'title' => trans('admin::app.settings.warehouses.index.datagrid.delete'), + 'method' => 'DELETE', + 'url' => function ($row) { + return route('admin.settings.warehouses.delete', $row->id); + }, + ]); + } +} diff --git a/packages/Webkul/Admin/src/DataGrids/Settings/WebhookDataGrid.php b/packages/Webkul/Admin/src/DataGrids/Settings/WebhookDataGrid.php new file mode 100644 index 0000000..233f640 --- /dev/null +++ b/packages/Webkul/Admin/src/DataGrids/Settings/WebhookDataGrid.php @@ -0,0 +1,96 @@ +addSelect( + 'webhooks.id', + 'webhooks.name', + 'webhooks.entity_type', + 'webhooks.end_point', + ); + + $this->addFilter('id', 'webhooks.id'); + + return $queryBuilder; + } + + /** + * Prepare Columns. + */ + public function prepareColumns(): void + { + $this->addColumn([ + 'index' => 'id', + 'label' => trans('admin::app.settings.webhooks.index.datagrid.id'), + 'type' => 'string', + 'searchable' => true, + 'filterable' => true, + 'sortable' => true, + ]); + + $this->addColumn([ + 'index' => 'name', + 'label' => trans('admin::app.settings.webhooks.index.datagrid.name'), + 'type' => 'string', + 'searchable' => true, + 'filterable' => true, + 'sortable' => true, + ]); + + $this->addColumn([ + 'index' => 'entity_type', + 'label' => trans('admin::app.settings.webhooks.index.datagrid.entity-type'), + 'type' => 'string', + 'searchable' => true, + 'filterable' => true, + 'sortable' => true, + ]); + + $this->addColumn([ + 'index' => 'end_point', + 'label' => trans('admin::app.settings.webhooks.index.datagrid.end-point'), + 'type' => 'string', + 'searchable' => true, + 'filterable' => true, + 'sortable' => true, + ]); + } + + /** + * Prepare actions. + */ + public function prepareActions(): void + { + if (bouncer()->hasPermission('settings.automation.webhooks.edit')) { + $this->addAction([ + 'index' => 'edit', + 'icon' => 'icon-edit', + 'title' => trans('admin::app.settings.webhooks.index.datagrid.edit'), + 'method' => 'GET', + 'url' => fn ($row) => route('admin.settings.webhooks.edit', $row->id), + ]); + } + + if (bouncer()->hasPermission('settings.automation.webhooks.delete')) { + $this->addAction([ + 'index' => 'delete', + 'icon' => 'icon-delete', + 'title' => trans('admin::app.settings.webhooks.index.datagrid.delete'), + 'method' => 'DELETE', + 'url' => fn ($row) => route('admin.settings.webhooks.delete', $row->id), + ]); + } + } +} diff --git a/packages/Webkul/Admin/src/DataGrids/Settings/WorkflowDataGrid.php b/packages/Webkul/Admin/src/DataGrids/Settings/WorkflowDataGrid.php new file mode 100644 index 0000000..d6ceac5 --- /dev/null +++ b/packages/Webkul/Admin/src/DataGrids/Settings/WorkflowDataGrid.php @@ -0,0 +1,76 @@ +addSelect( + 'workflows.id', + 'workflows.name' + ); + + $this->addFilter('id', 'workflows.id'); + + return $queryBuilder; + } + + /** + * Prepare Columns. + */ + public function prepareColumns(): void + { + $this->addColumn([ + 'index' => 'id', + 'label' => trans('admin::app.settings.workflows.index.datagrid.id'), + 'type' => 'string', + 'searchable' => true, + 'filterable' => true, + 'sortable' => true, + ]); + + $this->addColumn([ + 'index' => 'name', + 'label' => trans('admin::app.settings.workflows.index.datagrid.name'), + 'type' => 'string', + 'searchable' => true, + 'filterable' => true, + 'sortable' => true, + ]); + } + + /** + * Prepare actions. + */ + public function prepareActions(): void + { + if (bouncer()->hasPermission('settings.automation.workflows.edit')) { + $this->addAction([ + 'index' => 'edit', + 'icon' => 'icon-edit', + 'title' => trans('admin::app.settings.workflows.index.datagrid.edit'), + 'method' => 'GET', + 'url' => fn ($row) => route('admin.settings.workflows.edit', $row->id), + ]); + } + + if (bouncer()->hasPermission('settings.automation.workflows.delete')) { + $this->addAction([ + 'index' => 'delete', + 'icon' => 'icon-delete', + 'title' => trans('admin::app.settings.workflows.index.datagrid.delete'), + 'method' => 'DELETE', + 'url' => fn ($row) => route('admin.settings.workflows.delete', $row->id), + ]); + } + } +} diff --git a/packages/Webkul/Admin/src/Database/Migrations/2021_06_07_162808_add_lead_view_permission_column_in_users_table.php b/packages/Webkul/Admin/src/Database/Migrations/2021_06_07_162808_add_lead_view_permission_column_in_users_table.php new file mode 100644 index 0000000..71875c4 --- /dev/null +++ b/packages/Webkul/Admin/src/Database/Migrations/2021_06_07_162808_add_lead_view_permission_column_in_users_table.php @@ -0,0 +1,32 @@ +string('view_permission')->after('status')->default('global')->nullable(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('users', function (Blueprint $table) { + $table->dropColumn('view_permission'); + }); + } +}; diff --git a/packages/Webkul/Admin/src/Database/Migrations/2021_10_02_170105_insert_expected_closed_date_column_in_attributes_table.php b/packages/Webkul/Admin/src/Database/Migrations/2021_10_02_170105_insert_expected_closed_date_column_in_attributes_table.php new file mode 100644 index 0000000..061d1f7 --- /dev/null +++ b/packages/Webkul/Admin/src/Database/Migrations/2021_10_02_170105_insert_expected_closed_date_column_in_attributes_table.php @@ -0,0 +1,42 @@ +insert([ + [ + 'id' => '7', + 'code' => 'expected_close_date', + 'name' => 'Expected Close Date', + 'type' => 'date', + 'entity_type' => 'leads', + 'lookup_type' => null, + 'validation' => null, + 'sort_order' => '8', + 'is_required' => '0', + 'is_unique' => '0', + 'quick_add' => '1', + 'is_user_defined' => '0', + 'created_at' => Carbon::now(), + 'updated_at' => Carbon::now(), + ], + ]); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() {} +}; diff --git a/packages/Webkul/Admin/src/Exceptions/Handler.php b/packages/Webkul/Admin/src/Exceptions/Handler.php new file mode 100755 index 0000000..be4dc59 --- /dev/null +++ b/packages/Webkul/Admin/src/Exceptions/Handler.php @@ -0,0 +1,117 @@ +jsonErrorMessages = [ + '404' => trans('admin::app.common.resource-not-found'), + '403' => trans('admin::app.common.forbidden-error'), + '401' => trans('admin::app.common.unauthenticated'), + '500' => trans('admin::app.common.internal-server-error'), + ]; + } + + /** + * Render an exception into an HTTP response. + * + * @param \Illuminate\Http\Request $request + * @return \Illuminate\Http\Response + */ + public function render($request, Throwable $exception) + { + if (! config('app.debug')) { + return $this->renderCustomResponse($exception); + } + + return parent::render($request, $exception); + } + + /** + * Convert an authentication exception into a response. + * + * @param \Illuminate\Http\Request $request + * @return \Illuminate\Http\Response + */ + protected function unauthenticated($request, AuthenticationException $exception) + { + if ($request->expectsJson()) { + return response()->json(['message' => $this->jsonErrorMessages[401]], 401); + } + + return redirect()->guest(route('customer.session.index')); + } + + /** + * Render custom HTTP response. + * + * @return \Illuminate\Http\Response|null + */ + private function renderCustomResponse(Throwable $exception) + { + if ($exception instanceof HttpException) { + $statusCode = in_array($exception->getStatusCode(), [401, 403, 404, 503]) + ? $exception->getStatusCode() + : 500; + + return $this->response($statusCode); + } + + if ($exception instanceof ValidationException) { + return parent::render(request(), $exception); + } + + if ($exception instanceof ModelNotFoundException) { + return $this->response(404); + } elseif ($exception instanceof PDOException || $exception instanceof \ParseError) { + return $this->response(500); + } else { + return $this->response(500); + } + } + + /** + * Return custom response. + * + * @param string $path + * @param string $errorCode + * @return mixed + */ + private function response($errorCode) + { + if (request()->expectsJson()) { + return response()->json([ + 'message' => isset($this->jsonErrorMessages[$errorCode]) + ? $this->jsonErrorMessages[$errorCode] + : trans('admin::app.common.something-went-wrong'), + ], $errorCode); + } + + return response()->view('admin::errors.index', compact('errorCode')); + } +} diff --git a/packages/Webkul/Admin/src/Facades/Bouncer.php b/packages/Webkul/Admin/src/Facades/Bouncer.php new file mode 100755 index 0000000..b62fed9 --- /dev/null +++ b/packages/Webkul/Admin/src/Facades/Bouncer.php @@ -0,0 +1,18 @@ + $this->leadReporting->getTotalWonLeadValueProgress(), + 'total_lost_revenue' => $this->leadReporting->getTotalLostLeadValueProgress(), + ]; + } + + /** + * Returns the overall statistics. + */ + public function getOverAllStats(): array + { + return [ + 'total_leads' => $this->leadReporting->getTotalLeadsProgress(), + 'average_lead_value' => $this->leadReporting->getAverageLeadValueProgress(), + 'average_leads_per_day' => $this->leadReporting->getAverageLeadsPerDayProgress(), + 'total_quotations' => $this->quoteReporting->getTotalQuotesProgress(), + 'total_persons' => $this->personReporting->getTotalPersonsProgress(), + 'total_organizations' => $this->organizationReporting->getTotalOrganizationsProgress(), + ]; + } + + /** + * Returns leads statistics. + */ + public function getTotalLeadsStats(): array + { + return [ + 'all' => [ + 'over_time' => $this->leadReporting->getTotalLeadsOverTime(), + ], + + 'won' => [ + 'over_time' => $this->leadReporting->getTotalWonLeadsOverTime(), + ], + 'lost' => [ + 'over_time' => $this->leadReporting->getTotalLostLeadsOverTime(), + ], + ]; + } + + /** + * Returns leads revenue statistics by sources. + */ + public function getLeadsStatsBySources(): mixed + { + return $this->leadReporting->getTotalWonLeadValueBySources(); + } + + /** + * Returns leads revenue statistics by types. + */ + public function getLeadsStatsByTypes(): mixed + { + return $this->leadReporting->getTotalWonLeadValueByTypes(); + } + + /** + * Returns open leads statistics by states. + */ + public function getOpenLeadsByStates(): mixed + { + return $this->leadReporting->getOpenLeadsByStates(); + } + + /** + * Returns top selling products statistics. + */ + public function getTopSellingProducts(): Collection + { + return $this->productReporting->getTopSellingProductsByRevenue(5); + } + + /** + * Returns top selling products statistics. + */ + public function getTopPersons(): Collection + { + return $this->personReporting->getTopCustomersByRevenue(5); + } + + /** + * Get the start date. + * + * @return \Carbon\Carbon + */ + public function getStartDate(): Carbon + { + return $this->leadReporting->getStartDate(); + } + + /** + * Get the end date. + * + * @return \Carbon\Carbon + */ + public function getEndDate(): Carbon + { + return $this->leadReporting->getEndDate(); + } + + /** + * Returns date range + */ + public function getDateRange(): string + { + return $this->getStartDate()->format('d M').' - '.$this->getEndDate()->format('d M'); + } +} diff --git a/packages/Webkul/Admin/src/Helpers/Reporting/AbstractReporting.php b/packages/Webkul/Admin/src/Helpers/Reporting/AbstractReporting.php new file mode 100644 index 0000000..56fd1bd --- /dev/null +++ b/packages/Webkul/Admin/src/Helpers/Reporting/AbstractReporting.php @@ -0,0 +1,343 @@ +setStartDate(request()->date('start')); + + $this->setEndDate(request()->date('end')); + } + + /** + * Set the start date or default to 30 days ago if not provided. + * + * @param \Carbon\Carbon|null $startDate + * @return void + */ + public function setStartDate(?Carbon $startDate = null): self + { + $this->startDate = $startDate ? $startDate->startOfDay() : now()->subDays(30)->startOfDay(); + + $this->setLastStartDate(); + + return $this; + } + + /** + * Sets the end date to the provided date's end of day, or to the current + * date if not provided or if the provided date is in the future. + * + * @param \Carbon\Carbon|null $endDate + * @return void + */ + public function setEndDate(?Carbon $endDate = null): self + { + $this->endDate = ($endDate && $endDate->endOfDay() <= now()) ? $endDate->endOfDay() : now(); + + $this->setLastEndDate(); + + return $this; + } + + /** + * Get the start date. + * + * @return \Carbon\Carbon + */ + public function getStartDate(): Carbon + { + return $this->startDate; + } + + /** + * Get the end date. + * + * @return \Carbon\Carbon + */ + public function getEndDate(): Carbon + { + return $this->endDate; + } + + /** + * Sets the start date for the last period. + */ + private function setLastStartDate(): void + { + if (! isset($this->startDate)) { + $this->setStartDate(request()->date('start')); + } + + if (! isset($this->endDate)) { + $this->setEndDate(request()->date('end')); + } + + $this->lastStartDate = $this->startDate->clone()->subDays($this->startDate->diffInDays($this->endDate)); + } + + /** + * Sets the end date for the last period. + */ + private function setLastEndDate(): void + { + $this->lastEndDate = $this->startDate->clone(); + } + + /** + * Get the last start date. + * + * @return \Carbon\Carbon + */ + public function getLastStartDate(): Carbon + { + return $this->lastStartDate; + } + + /** + * Get the last end date. + * + * @return \Carbon\Carbon + */ + public function getLastEndDate(): Carbon + { + return $this->lastEndDate; + } + + /** + * Calculate the percentage change between previous and current values. + * + * @param float|int $previous + * @param float|int $current + */ + public function getPercentageChange($previous, $current): float|int + { + if (! $previous) { + return $current ? 100 : 0; + } + + return ($current - $previous) / $previous * 100; + } + + /** + * Returns time intervals. + * + * @param \Carbon\Carbon $startDate + * @param \Carbon\Carbon $endDate + * @param string $period + * @return array + */ + public function getTimeInterval($startDate, $endDate, $dateColumn, $period) + { + if ($period == 'auto') { + $totalMonths = $startDate->diffInMonths($endDate) + 1; + + /** + * If the difference between the start and end date is more than 5 months + */ + $intervals = $this->getMonthsInterval($startDate, $endDate); + + if (! empty($intervals)) { + return [ + 'group_column' => "MONTH($dateColumn)", + 'intervals' => $intervals, + ]; + } + + /** + * If the difference between the start and end date is more than 6 weeks + */ + $intervals = $this->getWeeksInterval($startDate, $endDate); + + if (! empty($intervals)) { + return [ + 'group_column' => "WEEK($dateColumn)", + 'intervals' => $intervals, + ]; + } + + /** + * If the difference between the start and end date is less than 6 weeks + */ + return [ + 'group_column' => "DAYOFYEAR($dateColumn)", + 'intervals' => $this->getDaysInterval($startDate, $endDate), + ]; + } else { + $datePeriod = CarbonPeriod::create($this->startDate, "1 $period", $this->endDate); + + if ($period == 'year') { + $formatter = '?'; + } elseif ($period == 'month') { + $formatter = '?-?'; + } else { + $formatter = '?-?-?'; + } + + $groupColumn = 'DATE_FORMAT('.$dateColumn.', "'.Str::replaceArray('?', ['%Y', '%m', '%d'], $formatter).'")'; + + $intervals = []; + + foreach ($datePeriod as $date) { + $formattedDate = $date->format(Str::replaceArray('?', ['Y', 'm', 'd'], $formatter)); + + $intervals[] = [ + 'filter' => $formattedDate, + 'start' => $formattedDate, + ]; + } + + return [ + 'group_column' => $groupColumn, + 'intervals' => $intervals, + ]; + } + } + + /** + * Returns time intervals. + * + * @param \Carbon\Carbon $startDate + * @param \Carbon\Carbon $endDate + * @return array + */ + public function getMonthsInterval($startDate, $endDate) + { + $intervals = []; + + $totalMonths = $startDate->diffInMonths($endDate) + 1; + + /** + * If the difference between the start and end date is less than 5 months + */ + if ($totalMonths <= 5) { + return $intervals; + } + + for ($i = 0; $i < $totalMonths; $i++) { + $intervalStartDate = clone $startDate; + + $intervalStartDate->addMonths($i); + + $start = $intervalStartDate->startOfDay(); + + $end = ($totalMonths - 1 == $i) + ? $endDate + : $intervalStartDate->addMonth()->subDay()->endOfDay(); + + $intervals[] = [ + 'filter' => $start->month, + 'start' => $start->format('d M'), + 'end' => $end->format('d M'), + ]; + } + + return $intervals; + } + + /** + * Returns time intervals. + * + * @param \Carbon\Carbon $startDate + * @param \Carbon\Carbon $endDate + * @return array + */ + public function getWeeksInterval($startDate, $endDate) + { + $intervals = []; + + $startWeekDay = Carbon::createFromTimeString(core()->xWeekRange($startDate, 0).' 00:00:01'); + + $endWeekDay = Carbon::createFromTimeString(core()->xWeekRange($endDate, 1).' 23:59:59'); + + $totalWeeks = $startWeekDay->diffInWeeks($endWeekDay); + + /** + * If the difference between the start and end date is less than 6 weeks + */ + if ($totalWeeks <= 6) { + return $intervals; + } + + for ($i = 0; $i < $totalWeeks; $i++) { + $intervalStartDate = clone $startDate; + + $intervalStartDate->addWeeks($i); + + $start = $i == 0 + ? $startDate + : Carbon::createFromTimeString(core()->xWeekRange($intervalStartDate, 0).' 00:00:01'); + + $end = ($totalWeeks - 1 == $i) + ? $endDate + : Carbon::createFromTimeString(core()->xWeekRange($intervalStartDate->subDay(), 1).' 23:59:59'); + + $intervals[] = [ + 'filter' => $start->week, + 'start' => $start->format('d M'), + 'end' => $end->format('d M'), + ]; + } + + return $intervals; + } + + /** + * Returns time intervals. + * + * @param \Carbon\Carbon $startDate + * @param \Carbon\Carbon $endDate + * @return array + */ + public function getDaysInterval($startDate, $endDate) + { + $intervals = []; + + $totalDays = $startDate->diffInDays($endDate) + 1; + + for ($i = 0; $i < $totalDays; $i++) { + $intervalStartDate = clone $startDate; + + $intervalStartDate->addDays($i); + + $intervals[] = [ + 'filter' => $intervalStartDate->dayOfYear, + 'start' => $intervalStartDate->startOfDay()->format('d M'), + 'end' => $intervalStartDate->endOfDay()->format('d M'), + ]; + } + + return $intervals; + } +} diff --git a/packages/Webkul/Admin/src/Helpers/Reporting/Activity.php b/packages/Webkul/Admin/src/Helpers/Reporting/Activity.php new file mode 100644 index 0000000..4c5cc72 --- /dev/null +++ b/packages/Webkul/Admin/src/Helpers/Reporting/Activity.php @@ -0,0 +1,5 @@ +allStageIds = $this->stageRepository->pluck('id')->toArray(); + + $this->wonStageIds = $this->stageRepository->where('code', 'won')->pluck('id')->toArray(); + + $this->lostStageIds = $this->stageRepository->where('code', 'lost')->pluck('id')->toArray(); + + parent::__construct(); + } + + /** + * Returns current customers over time + * + * @param string $period + */ + public function getTotalLeadsOverTime($period = 'auto'): array + { + $this->stageIds = $this->allStageIds; + + $period = $this->determinePeriod($period); + + return $this->getOverTimeStats($this->startDate, $this->endDate, 'leads.id', 'created_at', $period); + } + + /** + * Returns current customers over time + * + * @param string $period + */ + public function getTotalWonLeadsOverTime($period = 'auto'): array + { + $this->stageIds = $this->wonStageIds; + + $period = $this->determinePeriod($period); + + return $this->getOverTimeStats($this->startDate, $this->endDate, 'leads.id', 'closed_at', $period); + } + + /** + * Returns current customers over time + * + * @param string $period + */ + public function getTotalLostLeadsOverTime($period = 'auto'): array + { + $this->stageIds = $this->lostStageIds; + + $period = $this->determinePeriod($period); + + return $this->getOverTimeStats($this->startDate, $this->endDate, 'leads.id', 'closed_at', $period); + } + + /** + * Determine the appropriate period based on date range + * + * @param string $period + */ + protected function determinePeriod($period = 'auto'): string + { + if ($period !== 'auto') { + return $period; + } + + $diffInDays = $this->startDate->diffInDays($this->endDate); + $diffInMonths = $this->startDate->diffInMonths($this->endDate); + $diffInYears = $this->startDate->diffInYears($this->endDate); + + if ($diffInYears > 3) { + return 'year'; + } elseif ($diffInMonths > 6) { + return 'month'; + } elseif ($diffInDays > 60) { + return 'week'; + } else { + return 'day'; + } + } + + /** + * Retrieves total leads and their progress. + */ + public function getTotalLeadsProgress(): array + { + return [ + 'previous' => $previous = $this->getTotalLeads($this->lastStartDate, $this->lastEndDate), + 'current' => $current = $this->getTotalLeads($this->startDate, $this->endDate), + 'progress' => $this->getPercentageChange($previous, $current), + ]; + } + + /** + * Retrieves total leads by date + * + * @param \Carbon\Carbon $startDate + * @param \Carbon\Carbon $endDate + */ + public function getTotalLeads($startDate, $endDate): int + { + return $this->leadRepository + ->resetModel() + ->whereBetween('created_at', [$startDate, $endDate]) + ->count(); + } + + /** + * Retrieves average leads per day and their progress. + */ + public function getAverageLeadsPerDayProgress(): array + { + return [ + 'previous' => $previous = $this->getAverageLeadsPerDay($this->lastStartDate, $this->lastEndDate), + 'current' => $current = $this->getAverageLeadsPerDay($this->startDate, $this->endDate), + 'progress' => $this->getPercentageChange($previous, $current), + ]; + } + + /** + * Retrieves average leads per day + * + * @param \Carbon\Carbon $startDate + * @param \Carbon\Carbon $endDate + */ + public function getAverageLeadsPerDay($startDate, $endDate): float + { + $days = $startDate->diffInDays($endDate); + + if ($days == 0) { + return 0; + } + + return $this->getTotalLeads($startDate, $endDate) / $days; + } + + /** + * Retrieves total lead value and their progress. + */ + public function getTotalLeadValueProgress(): array + { + return [ + 'previous' => $previous = $this->getTotalLeadValue($this->lastStartDate, $this->lastEndDate), + 'current' => $current = $this->getTotalLeadValue($this->startDate, $this->endDate), + 'formatted_total' => core()->formatBasePrice($current), + 'progress' => $this->getPercentageChange($previous, $current), + ]; + } + + /** + * Retrieves total lead value + * + * @param \Carbon\Carbon $startDate + * @param \Carbon\Carbon $endDate + */ + public function getTotalLeadValue($startDate, $endDate): float + { + return $this->leadRepository + ->resetModel() + ->whereBetween('created_at', [$startDate, $endDate]) + ->sum('lead_value'); + } + + /** + * Retrieves average lead value and their progress. + */ + public function getAverageLeadValueProgress(): array + { + return [ + 'previous' => $previous = $this->getAverageLeadValue($this->lastStartDate, $this->lastEndDate), + 'current' => $current = $this->getAverageLeadValue($this->startDate, $this->endDate), + 'formatted_total' => core()->formatBasePrice($current), + 'progress' => $this->getPercentageChange($previous, $current), + ]; + } + + /** + * Retrieves average lead value + * + * @param \Carbon\Carbon $startDate + * @param \Carbon\Carbon $endDate + */ + public function getAverageLeadValue($startDate, $endDate): float + { + return $this->leadRepository + ->resetModel() + ->whereBetween('created_at', [$startDate, $endDate]) + ->avg('lead_value') ?? 0; + } + + /** + * Retrieves total won lead value and their progress. + */ + public function getTotalWonLeadValueProgress(): array + { + return [ + 'previous' => $previous = $this->getTotalWonLeadValue($this->lastStartDate, $this->lastEndDate), + 'current' => $current = $this->getTotalWonLeadValue($this->startDate, $this->endDate), + 'formatted_total' => core()->formatBasePrice($current), + 'progress' => $this->getPercentageChange($previous, $current), + ]; + } + + /** + * Retrieves average won lead value + * + * @param \Carbon\Carbon $startDate + * @param \Carbon\Carbon $endDate + * @return array + */ + public function getTotalWonLeadValue($startDate, $endDate): ?float + { + return $this->leadRepository + ->resetModel() + ->whereIn('lead_pipeline_stage_id', $this->wonStageIds) + ->whereBetween('created_at', [$startDate, $endDate]) + ->sum('lead_value'); + } + + /** + * Retrieves average lost lead value and their progress. + */ + public function getTotalLostLeadValueProgress(): array + { + return [ + 'previous' => $previous = $this->getTotalLostLeadValue($this->lastStartDate, $this->lastEndDate), + 'current' => $current = $this->getTotalLostLeadValue($this->startDate, $this->endDate), + 'formatted_total' => core()->formatBasePrice($current), + 'progress' => $this->getPercentageChange($previous, $current), + ]; + } + + /** + * Retrieves average lost lead value + * + * @param \Carbon\Carbon $startDate + * @param \Carbon\Carbon $endDate + * @return array + */ + public function getTotalLostLeadValue($startDate, $endDate): ?float + { + return $this->leadRepository + ->resetModel() + ->whereIn('lead_pipeline_stage_id', $this->lostStageIds) + ->whereBetween('created_at', [$startDate, $endDate]) + ->sum('lead_value'); + } + + /** + * Retrieves total lead value by sources. + */ + public function getTotalWonLeadValueBySources() + { + return $this->leadRepository + ->resetModel() + ->select( + 'lead_sources.name', + DB::raw('SUM(lead_value) as total') + ) + ->leftJoin('lead_sources', 'leads.lead_source_id', '=', 'lead_sources.id') + ->whereIn('lead_pipeline_stage_id', $this->wonStageIds) + ->whereBetween('leads.created_at', [$this->startDate, $this->endDate]) + ->groupBy('lead_source_id') + ->get(); + } + + /** + * Retrieves total lead value by types. + */ + public function getTotalWonLeadValueByTypes() + { + return $this->leadRepository + ->resetModel() + ->select( + 'lead_types.name', + DB::raw('SUM(lead_value) as total') + ) + ->leftJoin('lead_types', 'leads.lead_type_id', '=', 'lead_types.id') + ->whereIn('lead_pipeline_stage_id', $this->wonStageIds) + ->whereBetween('leads.created_at', [$this->startDate, $this->endDate]) + ->groupBy('lead_type_id') + ->get(); + } + + /** + * Retrieves open leads by states. + */ + public function getOpenLeadsByStates() + { + return $this->leadRepository + ->resetModel() + ->select( + 'lead_pipeline_stages.name', + DB::raw('COUNT(lead_value) as total') + ) + ->leftJoin('lead_pipeline_stages', 'leads.lead_pipeline_stage_id', '=', 'lead_pipeline_stages.id') + ->whereNotIn('lead_pipeline_stage_id', $this->wonStageIds) + ->whereNotIn('lead_pipeline_stage_id', $this->lostStageIds) + ->whereBetween('leads.created_at', [$this->startDate, $this->endDate]) + ->groupBy('lead_pipeline_stage_id') + ->orderByDesc('total') + ->get(); + } + + /** + * Returns over time stats. + * + * @param \Carbon\Carbon $startDate + * @param \Carbon\Carbon $endDate + * @param string $valueColumn + * @param string $dateColumn + * @param string $period + */ + public function getOverTimeStats($startDate, $endDate, $valueColumn, $dateColumn = 'created_at', $period = 'auto'): array + { + $period = $this->determinePeriod($period); + + $intervals = $this->generateTimeIntervals($startDate, $endDate, $period); + + $groupColumn = $this->getGroupColumn($dateColumn, $period); + + $query = $this->leadRepository + ->resetModel() + ->select( + DB::raw("$groupColumn AS date"), + DB::raw('COUNT(DISTINCT id) AS count'), + DB::raw('SUM('.\DB::getTablePrefix()."$valueColumn) AS total") + ) + ->whereIn('lead_pipeline_stage_id', $this->stageIds) + ->whereBetween($dateColumn, [$startDate, $endDate]) + ->groupBy(DB::raw($groupColumn)) + ->orderBy(DB::raw($groupColumn)); + + $results = $query->get(); + $resultLookup = $results->keyBy('date'); + + $stats = []; + + foreach ($intervals as $interval) { + $result = $resultLookup->get($interval['key']); + + $stats[] = [ + 'label' => $interval['label'], + 'count' => $result ? (int) $result->count : 0, + 'total' => $result ? (float) $result->total : 0, + ]; + } + + return $stats; + } + + /** + * Generate time intervals based on period + */ + protected function generateTimeIntervals(Carbon $startDate, Carbon $endDate, string $period): array + { + $intervals = []; + $current = $startDate->copy(); + + while ($current <= $endDate) { + $interval = [ + 'key' => $this->formatDateForGrouping($current, $period), + 'label' => $this->formatDateForLabel($current, $period), + ]; + + $intervals[] = $interval; + + switch ($period) { + case 'day': + $current->addDay(); + + break; + case 'week': + $current->addWeek(); + + break; + case 'month': + $current->addMonth(); + + break; + case 'year': + $current->addYear(); + + break; + } + } + + return $intervals; + } + + /** + * Get the SQL group column based on period + */ + protected function getGroupColumn(string $dateColumn, string $period): string + { + switch ($period) { + case 'day': + return "DATE($dateColumn)"; + case 'week': + return "DATE_FORMAT($dateColumn, '%Y-%u')"; + case 'month': + return "DATE_FORMAT($dateColumn, '%Y-%m')"; + case 'year': + return "YEAR($dateColumn)"; + default: + return "DATE($dateColumn)"; + } + } + + /** + * Format date for grouping key + */ + protected function formatDateForGrouping(Carbon $date, string $period): string + { + switch ($period) { + case 'day': + return $date->format('Y-m-d'); + case 'week': + return $date->format('Y-W'); + case 'month': + return $date->format('Y-m'); + case 'year': + return $date->format('Y'); + default: + return $date->format('Y-m-d'); + } + } + + /** + * Format date for display label + */ + protected function formatDateForLabel(Carbon $date, string $period): string + { + switch ($period) { + case 'day': + return $date->format('M d'); + case 'week': + return 'Week '.$date->format('W, Y'); + case 'month': + return $date->format('M Y'); + case 'year': + return $date->format('Y'); + default: + return $date->format('M d'); + } + } +} diff --git a/packages/Webkul/Admin/src/Helpers/Reporting/Organization.php b/packages/Webkul/Admin/src/Helpers/Reporting/Organization.php new file mode 100644 index 0000000..4ede2ec --- /dev/null +++ b/packages/Webkul/Admin/src/Helpers/Reporting/Organization.php @@ -0,0 +1,80 @@ + $previous = $this->getTotalOrganizations($this->lastStartDate, $this->lastEndDate), + 'current' => $current = $this->getTotalOrganizations($this->startDate, $this->endDate), + 'progress' => $this->getPercentageChange($previous, $current), + ]; + } + + /** + * Retrieves total organizations by date + * + * @param \Carbon\Carbon $startDate + * @param \Carbon\Carbon $endDate + */ + public function getTotalOrganizations($startDate, $endDate): int + { + return $this->organizationRepository + ->resetModel() + ->whereBetween('created_at', [$startDate, $endDate]) + ->count(); + } + + /** + * Gets top customers by revenue. + * + * @param int $limit + */ + public function getTopOrganizationsByRevenue($limit = null): Collection + { + $tablePrefix = DB::getTablePrefix(); + + $items = $this->organizationRepository + ->resetModel() + ->leftJoin('persons', 'organizations.id', '=', 'persons.organization_id') + ->leftJoin('leads', 'persons.id', '=', 'leads.person_id') + ->select('*', 'persons.id as id') + ->addSelect(DB::raw('SUM('.$tablePrefix.'leads.lead_value) as revenue')) + ->whereBetween('leads.closed_at', [$this->startDate, $this->endDate]) + ->having(DB::raw('SUM('.$tablePrefix.'leads.lead_value)'), '>', 0) + ->groupBy('organization_id') + ->orderBy('revenue', 'DESC') + ->limit($limit) + ->get(); + + $items = $items->map(function ($item) { + return [ + 'id' => $item->id, + 'name' => $item->name, + 'revenue' => $item->revenue, + 'formatted_revenue' => core()->formatBasePrice($item->revenue), + ]; + }); + + return $items; + } +} diff --git a/packages/Webkul/Admin/src/Helpers/Reporting/Person.php b/packages/Webkul/Admin/src/Helpers/Reporting/Person.php new file mode 100644 index 0000000..91b891d --- /dev/null +++ b/packages/Webkul/Admin/src/Helpers/Reporting/Person.php @@ -0,0 +1,81 @@ + $previous = $this->getTotalPersons($this->lastStartDate, $this->lastEndDate), + 'current' => $current = $this->getTotalPersons($this->startDate, $this->endDate), + 'progress' => $this->getPercentageChange($previous, $current), + ]; + } + + /** + * Retrieves total persons by date + * + * @param \Carbon\Carbon $startDate + * @param \Carbon\Carbon $endDate + */ + public function getTotalPersons($startDate, $endDate): int + { + return $this->personRepository + ->resetModel() + ->whereBetween('created_at', [$startDate, $endDate]) + ->count(); + } + + /** + * Gets top customers by revenue. + * + * @param int $limit + */ + public function getTopCustomersByRevenue($limit = null): Collection + { + $tablePrefix = DB::getTablePrefix(); + + $items = $this->personRepository + ->resetModel() + ->leftJoin('leads', 'persons.id', '=', 'leads.person_id') + ->select('*', 'persons.id as id') + ->addSelect(DB::raw('SUM('.$tablePrefix.'leads.lead_value) as revenue')) + ->whereBetween('leads.closed_at', [$this->startDate, $this->endDate]) + ->having(DB::raw('SUM('.$tablePrefix.'leads.lead_value)'), '>', 0) + ->groupBy('person_id') + ->orderBy('revenue', 'DESC') + ->limit($limit) + ->get(); + + $items = $items->map(function ($item) { + return [ + 'id' => $item->id, + 'name' => $item->name, + 'emails' => $item->emails, + 'contact_numbers' => $item->contact_numbers, + 'revenue' => $item->revenue, + 'formatted_revenue' => core()->formatBasePrice($item->revenue), + ]; + }); + + return $items; + } +} diff --git a/packages/Webkul/Admin/src/Helpers/Reporting/Product.php b/packages/Webkul/Admin/src/Helpers/Reporting/Product.php new file mode 100644 index 0000000..f695b46 --- /dev/null +++ b/packages/Webkul/Admin/src/Helpers/Reporting/Product.php @@ -0,0 +1,94 @@ +productRepository + ->resetModel() + ->with('product') + ->leftJoin('leads', 'lead_products.lead_id', '=', 'leads.id') + ->leftJoin('products', 'lead_products.product_id', '=', 'products.id') + ->select('*') + ->addSelect(DB::raw('SUM('.$tablePrefix.'lead_products.amount) as revenue')) + ->whereBetween('leads.closed_at', [$this->startDate, $this->endDate]) + ->having(DB::raw('SUM('.$tablePrefix.'lead_products.amount)'), '>', 0) + ->groupBy('product_id') + ->orderBy('revenue', 'DESC') + ->limit($limit) + ->get(); + + $items = $items->map(function ($item) { + return [ + 'id' => $item->product_id, + 'name' => $item->name, + 'price' => $item->product?->price, + 'formatted_price' => core()->formatBasePrice($item->price), + 'revenue' => $item->revenue, + 'formatted_revenue' => core()->formatBasePrice($item->revenue), + ]; + }); + + return $items; + } + + /** + * Gets top-selling products by quantity. + * + * @param int $limit + */ + public function getTopSellingProductsByQuantity($limit = null): Collection + { + $tablePrefix = DB::getTablePrefix(); + + $items = $this->productRepository + ->resetModel() + ->with('product') + ->leftJoin('leads', 'lead_products.lead_id', '=', 'leads.id') + ->leftJoin('products', 'lead_products.product_id', '=', 'products.id') + ->select('*') + ->addSelect(DB::raw('SUM('.$tablePrefix.'lead_products.quantity) as total_qty_ordered')) + ->whereBetween('leads.closed_at', [$this->startDate, $this->endDate]) + ->having(DB::raw('SUM('.$tablePrefix.'lead_products.quantity)'), '>', 0) + ->groupBy('product_id') + ->orderBy('total_qty_ordered', 'DESC') + ->limit($limit) + ->get(); + + $items = $items->map(function ($item) { + return [ + 'id' => $item->product_id, + 'name' => $item->name, + 'price' => $item->product?->price, + 'formatted_price' => core()->formatBasePrice($item->price), + 'total_qty_ordered' => $item->total_qty_ordered, + ]; + }); + + return $items; + } +} diff --git a/packages/Webkul/Admin/src/Helpers/Reporting/Quote.php b/packages/Webkul/Admin/src/Helpers/Reporting/Quote.php new file mode 100644 index 0000000..fada058 --- /dev/null +++ b/packages/Webkul/Admin/src/Helpers/Reporting/Quote.php @@ -0,0 +1,44 @@ + $previous = $this->getTotalQuotes($this->lastStartDate, $this->lastEndDate), + 'current' => $current = $this->getTotalQuotes($this->startDate, $this->endDate), + 'progress' => $this->getPercentageChange($previous, $current), + ]; + } + + /** + * Retrieves total quotes by date + * + * @param \Carbon\Carbon $startDate + * @param \Carbon\Carbon $endDate + */ + public function getTotalQuotes($startDate, $endDate): int + { + return $this->quoteRepository + ->resetModel() + ->whereBetween('created_at', [$startDate, $endDate]) + ->count(); + } +} diff --git a/packages/Webkul/Admin/src/Http/Controllers/Activity/ActivityController.php b/packages/Webkul/Admin/src/Http/Controllers/Activity/ActivityController.php new file mode 100755 index 0000000..02a7369 --- /dev/null +++ b/packages/Webkul/Admin/src/Http/Controllers/Activity/ActivityController.php @@ -0,0 +1,261 @@ +has('view_type')) { + return datagrid(ActivityDataGrid::class)->process(); + } + + $startDate = request()->get('startDate') + ? Carbon::createFromTimeString(request()->get('startDate').' 00:00:01') + : Carbon::now()->startOfWeek()->format('Y-m-d H:i:s'); + + $endDate = request()->get('endDate') + ? Carbon::createFromTimeString(request()->get('endDate').' 23:59:59') + : Carbon::now()->endOfWeek()->format('Y-m-d H:i:s'); + + $activities = $this->activityRepository->getActivities([$startDate, $endDate])->toArray(); + + return response()->json([ + 'activities' => $activities, + ]); + } + + /** + * Store a newly created resource in storage. + */ + public function store(): RedirectResponse|JsonResponse + { + $this->validate(request(), [ + 'type' => 'required', + 'comment' => 'required_if:type,note', + 'schedule_from' => 'required_unless:type,note,file', + 'schedule_to' => 'required_unless:type,note,file', + 'file' => 'required_if:type,file', + ]); + + if (request('type') === 'meeting') { + /** + * Check if meeting is overlapping with other meetings. + */ + $isOverlapping = $this->activityRepository->isDurationOverlapping( + request()->input('schedule_from'), + request()->input('schedule_to'), + request()->input('participants'), + request()->input('id') + ); + + if ($isOverlapping) { + if (request()->ajax()) { + return response()->json([ + 'message' => trans('admin::app.activities.overlapping-error'), + ], 400); + } + + session()->flash('success', trans('admin::app.activities.overlapping-error')); + + return redirect()->back(); + } + } + + Event::dispatch('activity.create.before'); + + $activity = $this->activityRepository->create(array_merge(request()->all(), [ + 'is_done' => request('type') == 'note' ? 1 : 0, + 'user_id' => auth()->guard('user')->user()->id, + ])); + + Event::dispatch('activity.create.after', $activity); + + if (request()->ajax()) { + return response()->json([ + 'data' => new ActivityResource($activity), + 'message' => trans('admin::app.activities.create-success'), + ]); + } + + session()->flash('success', trans('admin::app.activities.create-success')); + + return redirect()->back(); + } + + /** + * Show the form for editing the specified resource. + */ + public function edit(int $id): View + { + $activity = $this->activityRepository->findOrFail($id); + + $leadId = old('lead_id') ?? optional($activity->leads()->first())->id; + + $lookUpEntityData = $this->attributeRepository->getLookUpEntity('leads', $leadId); + + return view('admin::activities.edit', compact('activity', 'lookUpEntityData')); + } + + /** + * Update the specified resource in storage. + */ + public function update($id): RedirectResponse|JsonResponse + { + Event::dispatch('activity.update.before', $id); + + $data = request()->all(); + + $activity = $this->activityRepository->update($data, $id); + + /** + * We will not use `empty` directly here because `lead_id` can be a blank string + * from the activity form. However, on the activity view page, we are only updating the + * `is_done` field, so `lead_id` will not be present in that case. + */ + if (isset($data['lead_id'])) { + $activity->leads()->sync( + ! empty($data['lead_id']) + ? [$data['lead_id']] + : [] + ); + } + + Event::dispatch('activity.update.after', $activity); + + if (request()->ajax()) { + return response()->json([ + 'data' => new ActivityResource($activity), + 'message' => trans('admin::app.activities.update-success'), + ]); + } + + session()->flash('success', trans('admin::app.activities.update-success')); + + return redirect()->route('admin.activities.index'); + } + + /** + * Mass Update the specified resources. + */ + public function massUpdate(MassUpdateRequest $massUpdateRequest): JsonResponse + { + $activities = $this->activityRepository->findWhereIn('id', $massUpdateRequest->input('indices')); + + foreach ($activities as $activity) { + Event::dispatch('activity.update.before', $activity->id); + + $activity = $this->activityRepository->update([ + 'is_done' => $massUpdateRequest->input('value'), + ], $activity->id); + + Event::dispatch('activity.update.after', $activity); + } + + return response()->json([ + 'message' => trans('admin::app.activities.mass-update-success'), + ]); + } + + /** + * Download file from storage. + */ + public function download(int $id): StreamedResponse + { + try { + $file = $this->fileRepository->findOrFail($id); + + return Storage::download($file->path); + } catch (\Exception $exception) { + abort(404); + } + } + + /* + * Remove the specified resource from storage. + */ + public function destroy(int $id): JsonResponse + { + $activity = $this->activityRepository->findOrFail($id); + + try { + Event::dispatch('activity.delete.before', $id); + + $activity?->delete($id); + + Event::dispatch('activity.delete.after', $id); + + return response()->json([ + 'message' => trans('admin::app.activities.destroy-success'), + ], 200); + } catch (\Exception $exception) { + return response()->json([ + 'message' => trans('admin::app.activities.destroy-failed'), + ], 400); + } + } + + /** + * Mass Delete the specified resources. + */ + public function massDestroy(MassDestroyRequest $massDestroyRequest): JsonResponse + { + $activities = $this->activityRepository->findWhereIn('id', $massDestroyRequest->input('indices')); + + try { + foreach ($activities as $activity) { + Event::dispatch('activity.delete.before', $activity->id); + + $this->activityRepository->delete($activity->id); + + Event::dispatch('activity.delete.after', $activity->id); + } + + return response()->json([ + 'message' => trans('admin::app.activities.mass-destroy-success'), + ]); + } catch (\Exception $exception) { + return response()->json([ + 'message' => trans('admin::app.activities.mass-delete-failed'), + ], 400); + } + } +} diff --git a/packages/Webkul/Admin/src/Http/Controllers/Configuration/ConfigurationController.php b/packages/Webkul/Admin/src/Http/Controllers/Configuration/ConfigurationController.php new file mode 100644 index 0000000..4d12b11 --- /dev/null +++ b/packages/Webkul/Admin/src/Http/Controllers/Configuration/ConfigurationController.php @@ -0,0 +1,84 @@ +route('slug') + && request()->route('slug2') + ) { + return view('admin::configuration.edit'); + } + + return view('admin::configuration.index'); + } + + /** + * Store a newly created resource in storage. + */ + public function store(ConfigurationForm $request): RedirectResponse + { + Event::dispatch('core.configuration.save.before'); + + $this->configurationRepository->create($request->all()); + + Event::dispatch('core.configuration.save.after'); + + session()->flash('success', trans('admin::app.configuration.index.save-success')); + + return redirect()->back(); + } + + /** + * download the file for the specified resource. + * + * @return \Illuminate\Http\Response + */ + public function download() + { + $path = request()->route()->parameters()['path']; + + $fileName = 'configuration/'.$path; + + $config = $this->configurationRepository->findOneByField('value', $fileName); + + return Storage::download($config['value']); + } + + /** + * Search for configurations. + */ + public function search(): JsonResponse + { + $results = $this->configurationRepository->search( + system_config()->getItems(), + request()->query('query') + ); + + return new JsonResponse([ + 'data' => $results, + ]); + } +} diff --git a/packages/Webkul/Admin/src/Http/Controllers/Contact/OrganizationController.php b/packages/Webkul/Admin/src/Http/Controllers/Contact/OrganizationController.php new file mode 100644 index 0000000..6845a6c --- /dev/null +++ b/packages/Webkul/Admin/src/Http/Controllers/Contact/OrganizationController.php @@ -0,0 +1,130 @@ +request->add(['entity_type' => 'organizations']); + } + + /** + * Display a listing of the resource. + */ + public function index(): View|JsonResponse + { + if (request()->ajax()) { + return datagrid(OrganizationDataGrid::class)->process(); + } + + return view('admin::contacts.organizations.index'); + } + + /** + * Show the form for creating a new resource. + */ + public function create(): View + { + return view('admin::contacts.organizations.create'); + } + + /** + * Store a newly created resource in storage. + */ + public function store(AttributeForm $request): RedirectResponse + { + Event::dispatch('contacts.organization.create.before'); + + $organization = $this->organizationRepository->create(request()->all()); + + Event::dispatch('contacts.organization.create.after', $organization); + + session()->flash('success', trans('admin::app.contacts.organizations.index.create-success')); + + return redirect()->route('admin.contacts.organizations.index'); + } + + /** + * Show the form for editing the specified resource. + */ + public function edit(int $id): View + { + $organization = $this->organizationRepository->findOrFail($id); + + return view('admin::contacts.organizations.edit', compact('organization')); + } + + /** + * Update the specified resource in storage. + */ + public function update(AttributeForm $request, int $id): RedirectResponse + { + Event::dispatch('contacts.organization.update.before', $id); + + $organization = $this->organizationRepository->update(request()->all(), $id); + + Event::dispatch('contacts.organization.update.after', $organization); + + session()->flash('success', trans('admin::app.contacts.organizations.index.update-success')); + + return redirect()->route('admin.contacts.organizations.index'); + } + + /** + * Remove the specified resource from storage. + */ + public function destroy(int $id): JsonResponse + { + try { + Event::dispatch('contact.organization.delete.before', $id); + + $this->organizationRepository->delete($id); + + Event::dispatch('contact.organization.delete.after', $id); + + return response()->json([ + 'message' => trans('admin::app.contacts.organizations.index.delete-success'), + ], 200); + } catch (\Exception $exception) { + return response()->json([ + 'message' => trans('admin::app.contacts.organizations.index.delete-failed'), + ], 400); + } + } + + /** + * Mass Delete the specified resources. + */ + public function massDestroy(MassDestroyRequest $massDestroyRequest): JsonResponse + { + $organizations = $this->organizationRepository->findWhereIn('id', $massDestroyRequest->input('indices')); + + foreach ($organizations as $organization) { + Event::dispatch('contact.organization.delete.before', $organization); + + $this->organizationRepository->delete($organization->id); + + Event::dispatch('contact.organization.delete.after', $organization); + } + + return response()->json([ + 'message' => trans('admin::app.contacts.organizations.index.delete-success'), + ]); + } +} diff --git a/packages/Webkul/Admin/src/Http/Controllers/Contact/Persons/ActivityController.php b/packages/Webkul/Admin/src/Http/Controllers/Contact/Persons/ActivityController.php new file mode 100644 index 0000000..49292c5 --- /dev/null +++ b/packages/Webkul/Admin/src/Http/Controllers/Contact/Persons/ActivityController.php @@ -0,0 +1,88 @@ +activityRepository + ->leftJoin('person_activities', 'activities.id', '=', 'person_activities.activity_id') + ->where('person_activities.person_id', $id) + ->get(); + + return ActivityResource::collection($this->concatEmailAsActivities($id, $activities)); + } + + /** + * Store a newly created resource in storage. + */ + public function concatEmailAsActivities($personId, $activities) + { + $emails = DB::table('emails as child') + ->select('child.*') + ->join('emails as parent', 'child.parent_id', '=', 'parent.id') + ->where('parent.person_id', $personId) + ->union(DB::table('emails as parent')->where('parent.person_id', $personId)) + ->get(); + + return $activities->concat($emails->map(function ($email) { + return (object) [ + 'id' => $email->id, + 'parent_id' => $email->parent_id, + 'title' => $email->subject, + 'type' => 'email', + 'is_done' => 1, + 'comment' => $email->reply, + 'schedule_from' => null, + 'schedule_to' => null, + 'user' => auth()->guard('user')->user(), + 'participants' => [], + 'location' => null, + 'additional' => [ + 'folders' => json_decode($email->folders), + 'from' => json_decode($email->from), + 'to' => json_decode($email->reply_to), + 'cc' => json_decode($email->cc), + 'bcc' => json_decode($email->bcc), + ], + 'files' => $this->attachmentRepository->findWhere(['email_id' => $email->id])->map(function ($attachment) { + return (object) [ + 'id' => $attachment->id, + 'name' => $attachment->name, + 'path' => $attachment->path, + 'url' => $attachment->url, + 'created_at' => $attachment->created_at, + 'updated_at' => $attachment->updated_at, + ]; + }), + 'created_at' => $email->created_at, + 'updated_at' => $email->updated_at, + ]; + }))->sortByDesc('id')->sortByDesc('created_at'); + } +} diff --git a/packages/Webkul/Admin/src/Http/Controllers/Contact/Persons/PersonController.php b/packages/Webkul/Admin/src/Http/Controllers/Contact/Persons/PersonController.php new file mode 100644 index 0000000..656f64c --- /dev/null +++ b/packages/Webkul/Admin/src/Http/Controllers/Contact/Persons/PersonController.php @@ -0,0 +1,235 @@ +request->add(['entity_type' => 'persons']); + } + + /** + * Display a listing of the resource. + */ + public function index() + { + if (request()->ajax()) { + return datagrid(PersonDataGrid::class)->process(); + } + + return view('admin::contacts.persons.index'); + } + + /** + * Show the form for creating a new resource. + */ + public function create(): View + { + return view('admin::contacts.persons.create'); + } + + /** + * Store a newly created resource in storage. + */ + public function store(AttributeForm $request): RedirectResponse|JsonResponse + { + Event::dispatch('contacts.person.create.before'); + + $person = $this->personRepository->create($request->all()); + + Event::dispatch('contacts.person.create.after', $person); + + if (request()->ajax()) { + return response()->json([ + 'data' => $person, + 'message' => trans('admin::app.contacts.persons.index.create-success'), + ]); + } + + session()->flash('success', trans('admin::app.contacts.persons.index.create-success')); + + return redirect()->route('admin.contacts.persons.index'); + } + + /** + * Display the specified resource. + */ + public function show(int $id): View + { + $person = $this->personRepository->findOrFail($id); + + return view('admin::contacts.persons.view', compact('person')); + } + + /** + * Show the form for editing the specified resource. + */ + public function edit(int $id): View + { + $person = $this->personRepository->findOrFail($id); + + return view('admin::contacts.persons.edit', compact('person')); + } + + /** + * Update the specified resource in storage. + */ + public function update(AttributeForm $request, int $id): RedirectResponse|JsonResponse + { + Event::dispatch('contacts.person.update.before', $id); + + $person = $this->personRepository->update($request->all(), $id); + + Event::dispatch('contacts.person.update.after', $person); + + if (request()->ajax()) { + return response()->json([ + 'data' => $person, + 'message' => trans('admin::app.contacts.persons.index.update-success'), + ], 200); + } + + session()->flash('success', trans('admin::app.contacts.persons.index.update-success')); + + return redirect()->route('admin.contacts.persons.index'); + } + + /** + * Search person results. + */ + public function search(): JsonResource + { + if ($userIds = bouncer()->getAuthorizedUserIds()) { + $persons = $this->personRepository + ->pushCriteria(app(RequestCriteria::class)) + ->findWhereIn('user_id', $userIds); + } else { + $persons = $this->personRepository + ->pushCriteria(app(RequestCriteria::class)) + ->all(); + } + + return PersonResource::collection($persons); + } + + /** + * Remove the specified resource from storage. + */ + public function destroy(int $id): JsonResponse + { + $person = $this->personRepository->findOrFail($id); + + if ( + $person->leads + && $person->leads->count() > 0 + ) { + return response()->json([ + 'message' => trans('admin::app.contacts.persons.index.delete-failed'), + ], 400); + } + + try { + Event::dispatch('contacts.person.delete.before', $person); + + $person->delete(); + + Event::dispatch('contacts.person.delete.after', $person); + + return response()->json([ + 'message' => trans('admin::app.contacts.persons.index.delete-success'), + ], 200); + + } catch (Exception $exception) { + return response()->json([ + 'message' => trans('admin::app.contacts.persons.index.delete-failed'), + ], 400); + } + } + + /** + * Mass destroy the specified resources from storage. + */ + public function massDestroy(MassDestroyRequest $request): JsonResponse + { + try { + $persons = $this->personRepository->findWhereIn('id', $request->input('indices', [])); + + $deletedCount = 0; + + $blockedCount = 0; + + foreach ($persons as $person) { + if ( + $person->leads + && $person->leads->count() > 0 + ) { + $blockedCount++; + + continue; + } + + Event::dispatch('contact.person.delete.before', $person); + + $this->personRepository->delete($person->id); + + Event::dispatch('contact.person.delete.after', $person); + + $deletedCount++; + } + + $statusCode = 200; + + switch (true) { + case $deletedCount > 0 && $blockedCount === 0: + $message = trans('admin::app.contacts.persons.index.all-delete-success'); + + break; + + case $deletedCount > 0 && $blockedCount > 0: + $message = trans('admin::app.contacts.persons.index.partial-delete-warning'); + + break; + + case $deletedCount === 0 && $blockedCount > 0: + $message = trans('admin::app.contacts.persons.index.none-delete-warning'); + + $statusCode = 400; + + break; + + default: + $message = trans('admin::app.contacts.persons.index.no-selection'); + + $statusCode = 400; + + break; + } + + return response()->json(['message' => $message], $statusCode); + } catch (Exception $exception) { + return response()->json([ + 'message' => trans('admin::app.contacts.persons.index.delete-failed'), + ], 400); + } + } +} diff --git a/packages/Webkul/Admin/src/Http/Controllers/Contact/Persons/TagController.php b/packages/Webkul/Admin/src/Http/Controllers/Contact/Persons/TagController.php new file mode 100644 index 0000000..232b1ec --- /dev/null +++ b/packages/Webkul/Admin/src/Http/Controllers/Contact/Persons/TagController.php @@ -0,0 +1,56 @@ +personRepository->find($id); + + if (! $person->tags->contains(request()->input('tag_id'))) { + $person->tags()->attach(request()->input('tag_id')); + } + + Event::dispatch('persons.tag.create.after', $person); + + return response()->json([ + 'message' => trans('admin::app.contacts.persons.view.tags.create-success'), + ]); + } + + /** + * Remove the specified resource from storage. + */ + public function detach(int $personId): JsonResponse + { + Event::dispatch('persons.tag.delete.before', $personId); + + $person = $this->personRepository->find($personId); + + $person->tags()->detach(request()->input('tag_id')); + + Event::dispatch('persons.tag.delete.after', $person); + + return response()->json([ + 'message' => trans('admin::app.contacts.persons.view.tags.destroy-success'), + ]); + } +} diff --git a/packages/Webkul/Admin/src/Http/Controllers/Controller.php b/packages/Webkul/Admin/src/Http/Controllers/Controller.php new file mode 100755 index 0000000..0254c13 --- /dev/null +++ b/packages/Webkul/Admin/src/Http/Controllers/Controller.php @@ -0,0 +1,23 @@ +route('admin.session.create'); + } +} diff --git a/packages/Webkul/Admin/src/Http/Controllers/DashboardController.php b/packages/Webkul/Admin/src/Http/Controllers/DashboardController.php new file mode 100755 index 0000000..cc4d1d9 --- /dev/null +++ b/packages/Webkul/Admin/src/Http/Controllers/DashboardController.php @@ -0,0 +1,59 @@ + 'getOverAllStats', + 'revenue-stats' => 'getRevenueStats', + 'total-leads' => 'getTotalLeadsStats', + 'revenue-by-sources' => 'getLeadsStatsBySources', + 'revenue-by-types' => 'getLeadsStatsByTypes', + 'top-selling-products' => 'getTopSellingProducts', + 'top-persons' => 'getTopPersons', + 'open-leads-by-states' => 'getOpenLeadsByStates', + ]; + + /** + * Create a new controller instance. + * + * @return void + */ + public function __construct(protected Dashboard $dashboardHelper) {} + + /** + * Display a listing of the resource. + * + * @return \Illuminate\View\View + */ + public function index() + { + return view('admin::dashboard.index')->with([ + 'startDate' => $this->dashboardHelper->getStartDate(), + 'endDate' => $this->dashboardHelper->getEndDate(), + ]); + } + + /** + * Display a listing of the resource. + * + * @return \Illuminate\Http\JsonResponse + */ + public function stats() + { + $stats = $this->dashboardHelper->{$this->typeFunctions[request()->query('type')]}(); + + return response()->json([ + 'statistics' => $stats, + 'date_range' => $this->dashboardHelper->getDateRange(), + ]); + } +} diff --git a/packages/Webkul/Admin/src/Http/Controllers/DataGrid/SavedFilterController.php b/packages/Webkul/Admin/src/Http/Controllers/DataGrid/SavedFilterController.php new file mode 100644 index 0000000..c0aabde --- /dev/null +++ b/packages/Webkul/Admin/src/Http/Controllers/DataGrid/SavedFilterController.php @@ -0,0 +1,117 @@ +guard()->user()->id; + + $this->validate(request(), [ + 'name' => 'required|unique:datagrid_saved_filters,name,NULL,id,src,'.request('src').',user_id,'.$userId, + ]); + + Event::dispatch('datagrid.saved_filter.create.before'); + + $savedFilter = $this->savedFilterRepository->create([ + 'user_id' => $userId, + 'name' => request('name'), + 'src' => request('src'), + 'applied' => request('applied'), + ]); + + Event::dispatch('datagrid.saved_filter.create.after', $savedFilter); + + return response()->json([ + 'data' => $savedFilter, + 'message' => trans('admin::app.components.datagrid.toolbar.filter.saved-success'), + ]); + } + + /** + * Retrieves the saved filters. + */ + public function get() + { + $savedFilters = $this->savedFilterRepository->findWhere([ + 'src' => request()->get('src'), + 'user_id' => auth()->guard()->user()->id, + ]); + + return response()->json(['data' => $savedFilters]); + } + + /** + * Update the saved filter. + */ + public function update(int $id) + { + $userId = auth()->guard()->user()->id; + + $this->validate(request(), [ + 'name' => 'required|unique:datagrid_saved_filters,name,'.$id.',id,src,'.request('src').',user_id,'.$userId, + ]); + + $savedFilter = $this->savedFilterRepository->findOneWhere([ + 'id' => $id, + 'user_id' => auth()->guard()->user()->id, + ]); + + if (! $savedFilter) { + return response()->json([], 404); + } + + Event::dispatch('datagrid.saved_filter.update.before', $id); + + $updatedFilter = $this->savedFilterRepository->update(request()->only([ + 'name', + 'src', + 'applied', + ]), $id); + + Event::dispatch('datagrid.saved_filter.update.after', $updatedFilter); + + return response()->json([ + 'data' => $updatedFilter, + 'message' => trans('admin::app.components.datagrid.toolbar.filter.updated-success'), + ]); + } + + /** + * Delete the saved filter. + */ + public function destroy(int $id) + { + Event::dispatch('datagrid.saved_filter.delete.before', $id); + + $success = $this->savedFilterRepository->deleteWhere([ + 'id' => $id, + 'user_id' => auth()->guard()->user()->id, + ]); + + Event::dispatch('datagrid.saved_filter.delete.after', $id); + + if (! $success) { + return response()->json([ + 'message' => trans('admin::app.components.datagrid.toolbar.filter.delete-error'), + ]); + } + + return response()->json([ + 'message' => trans('admin::app.components.datagrid.toolbar.filter.delete-success'), + ]); + } +} diff --git a/packages/Webkul/Admin/src/Http/Controllers/DataGridController.php b/packages/Webkul/Admin/src/Http/Controllers/DataGridController.php new file mode 100644 index 0000000..9693f84 --- /dev/null +++ b/packages/Webkul/Admin/src/Http/Controllers/DataGridController.php @@ -0,0 +1,42 @@ +validate(request(), [ + 'datagrid_id' => ['required'], + 'column' => ['required'], + 'search' => ['required', 'min:2'], + ]); + + /** + * Preparing the datagrid instance and only columns. + */ + $datagrid = app(Crypt::decryptString($params['datagrid_id'])); + $datagrid->prepareColumns(); + + /** + * Finding the first column from the collection. + */ + $column = collect($datagrid->getColumns())->map(fn ($column) => $column->toArray())->where('index', $params['column'])->firstOrFail(); + + /** + * Fetching on the basis of column options. + */ + return app($column['filterable_options']['repository']) + ->select([$column['filterable_options']['column']['label'].' as label', $column['filterable_options']['column']['value'].' as value']) + ->where($column['filterable_options']['column']['label'], 'LIKE', '%'.$params['search'].'%') + ->get(); + } +} diff --git a/packages/Webkul/Admin/src/Http/Controllers/Lead/ActivityController.php b/packages/Webkul/Admin/src/Http/Controllers/Lead/ActivityController.php new file mode 100644 index 0000000..f12e144 --- /dev/null +++ b/packages/Webkul/Admin/src/Http/Controllers/Lead/ActivityController.php @@ -0,0 +1,88 @@ +activityRepository + ->leftJoin('lead_activities', 'activities.id', '=', 'lead_activities.activity_id') + ->where('lead_activities.lead_id', $id) + ->get(); + + return ActivityResource::collection($this->concatEmailAsActivities($id, $activities)); + } + + /** + * Store a newly created resource in storage. + */ + public function concatEmailAsActivities($leadId, $activities) + { + $emails = DB::table('emails as child') + ->select('child.*') + ->join('emails as parent', 'child.parent_id', '=', 'parent.id') + ->where('parent.lead_id', $leadId) + ->union(DB::table('emails as parent')->where('parent.lead_id', $leadId)) + ->get(); + + return $activities->concat($emails->map(function ($email) { + return (object) [ + 'id' => $email->id, + 'parent_id' => $email->parent_id, + 'title' => $email->subject, + 'type' => 'email', + 'is_done' => 1, + 'comment' => $email->reply, + 'schedule_from' => null, + 'schedule_to' => null, + 'user' => auth()->guard('user')->user(), + 'participants' => [], + 'location' => null, + 'additional' => [ + 'folders' => json_decode($email->folders), + 'from' => json_decode($email->from), + 'to' => json_decode($email->reply_to), + 'cc' => json_decode($email->cc), + 'bcc' => json_decode($email->bcc), + ], + 'files' => $this->attachmentRepository->findWhere(['email_id' => $email->id])->map(function ($attachment) { + return (object) [ + 'id' => $attachment->id, + 'name' => $attachment->name, + 'path' => $attachment->path, + 'url' => $attachment->url, + 'created_at' => $attachment->created_at, + 'updated_at' => $attachment->updated_at, + ]; + }), + 'created_at' => $email->created_at, + 'updated_at' => $email->updated_at, + ]; + }))->sortByDesc('id')->sortByDesc('created_at'); + } +} diff --git a/packages/Webkul/Admin/src/Http/Controllers/Lead/EmailController.php b/packages/Webkul/Admin/src/Http/Controllers/Lead/EmailController.php new file mode 100644 index 0000000..d13de16 --- /dev/null +++ b/packages/Webkul/Admin/src/Http/Controllers/Lead/EmailController.php @@ -0,0 +1,83 @@ +getContent(), true); + + return response()->json([ + 'data' => $this->transformToActivity($response['data']), + 'message' => $response['message'], + ]); + + return $response; + } + + /** + * Store a newly created resource in storage. + * + * @param int $id + * @return \Illuminate\Http\Response + */ + public function detach($id) + { + Event::dispatch('email.update.before', request()->input('email_id')); + + $email = $this->emailRepository->update([ + 'lead_id' => null, + ], request()->input('email_id')); + + Event::dispatch('email.update.after', $email); + + return response()->json([ + 'message' => trans('admin::app.mail.update-success'), + ]); + } + + /** + * Transform the email data to activity resource. + * + * @param array $data + * @return \Webkul\Admin\Http\Resources\ActivityResource + */ + public function transformToActivity($data) + { + return new ActivityResource((object) [ + 'id' => $data['id'], + 'parent_id' => $data['parent_id'], + 'title' => $data['subject'], + 'type' => 'email', + 'is_done' => 1, + 'comment' => $data['reply'], + 'schedule_from' => null, + 'schedule_to' => null, + 'user' => auth()->guard('user')->user(), + 'participants' => [], + 'location' => null, + 'additional' => json_encode([ + 'folders' => $data['folders'], + 'from' => $data['from'], + 'to' => $data['reply_to'], + 'cc' => $data['cc'], + 'bcc' => $data['bcc'], + ]), + 'files' => array_map(function ($attachment) { + return (object) $attachment; + }, $data['attachments']), + 'created_at' => $data['created_at'], + 'updated_at' => $data['updated_at'], + ]); + } +} diff --git a/packages/Webkul/Admin/src/Http/Controllers/Lead/LeadController.php b/packages/Webkul/Admin/src/Http/Controllers/Lead/LeadController.php new file mode 100755 index 0000000..0b258fd --- /dev/null +++ b/packages/Webkul/Admin/src/Http/Controllers/Lead/LeadController.php @@ -0,0 +1,734 @@ +request->add(['entity_type' => 'leads']); + } + + /** + * Display a listing of the resource. + */ + public function index() + { + if (request()->ajax()) { + return datagrid(LeadDataGrid::class)->process(); + } + + if (request('pipeline_id')) { + $pipeline = $this->pipelineRepository->find(request('pipeline_id')); + } else { + $pipeline = $this->pipelineRepository->getDefaultPipeline(); + } + + return view('admin::leads.index', [ + 'pipeline' => $pipeline, + 'columns' => $this->getKanbanColumns(), + ]); + } + + /** + * Returns a listing of the resource. + */ + public function get(): JsonResponse + { + if (request()->query('pipeline_id')) { + $pipeline = $this->pipelineRepository->find(request()->query('pipeline_id')); + } else { + $pipeline = $this->pipelineRepository->getDefaultPipeline(); + } + + if ($stageId = request()->query('pipeline_stage_id')) { + $stages = $pipeline->stages->where('id', request()->query('pipeline_stage_id')); + } else { + $stages = $pipeline->stages; + } + + foreach ($stages as $stage) { + /** + * We have to create a new instance of the lead repository every time, which is + * why we're not using the injected one. + */ + $query = app(LeadRepository::class) + ->pushCriteria(app(RequestCriteria::class)) + ->where([ + 'lead_pipeline_id' => $pipeline->id, + 'lead_pipeline_stage_id' => $stage->id, + ]); + + if ($userIds = bouncer()->getAuthorizedUserIds()) { + $query->whereIn('leads.user_id', $userIds); + } + + $stage->lead_value = (clone $query)->sum('lead_value'); + + $data[$stage->sort_order] = (new StageResource($stage))->jsonSerialize(); + + $data[$stage->sort_order]['leads'] = [ + 'data' => LeadResource::collection($paginator = $query->with([ + 'tags', + 'type', + 'source', + 'user', + 'person', + 'person.organization', + 'pipeline', + 'pipeline.stages', + 'stage', + 'attribute_values', + ])->paginate(10)), + + 'meta' => [ + 'current_page' => $paginator->currentPage(), + 'from' => $paginator->firstItem(), + 'last_page' => $paginator->lastPage(), + 'per_page' => $paginator->perPage(), + 'to' => $paginator->lastItem(), + 'total' => $paginator->total(), + ], + ]; + } + + return response()->json($data); + } + + /** + * Show the form for creating a new resource. + */ + public function create(): View + { + return view('admin::leads.create'); + } + + /** + * Store a newly created resource in storage. + */ + public function store(LeadForm $request): RedirectResponse|JsonResponse + { + Event::dispatch('lead.create.before'); + + $data = request()->all(); + + $data['status'] = 1; + + if (! empty($data['lead_pipeline_stage_id'])) { + $stage = $this->stageRepository->findOrFail($data['lead_pipeline_stage_id']); + + $data['lead_pipeline_id'] = $stage->lead_pipeline_id; + } else { + if (empty($data['lead_pipeline_id'])) { + $pipeline = $this->pipelineRepository->getDefaultPipeline(); + + $data['lead_pipeline_id'] = $pipeline->id; + } else { + $pipeline = $this->pipelineRepository->findOrFail($data['lead_pipeline_id']); + } + + $stage = $pipeline->stages()->first(); + + $data['lead_pipeline_stage_id'] = $stage->id; + } + + if (in_array($stage->code, ['won', 'lost'])) { + $data['closed_at'] = Carbon::now(); + } + + $lead = $this->leadRepository->create($data); + + if (request()->ajax()) { + return response()->json([ + 'message' => trans('admin::app.leads.create-success'), + 'data' => new LeadResource($lead), + ]); + } + + Event::dispatch('lead.create.after', $lead); + + session()->flash('success', trans('admin::app.leads.create-success')); + + if (! empty($data['lead_pipeline_id'])) { + $params['pipeline_id'] = $data['lead_pipeline_id']; + } + + return redirect()->route('admin.leads.index', $params ?? []); + } + + /** + * Show the form for editing the specified resource. + */ + public function edit(int $id): View + { + $lead = $this->leadRepository->findOrFail($id); + + return view('admin::leads.edit', compact('lead')); + } + + /** + * Display a resource. + */ + public function view(int $id) + { + $lead = $this->leadRepository->findOrFail($id); + + $userIds = bouncer()->getAuthorizedUserIds(); + + if ( + $userIds + && ! in_array($lead->user_id, $userIds) + ) { + return redirect()->route('admin.leads.index'); + } + + return view('admin::leads.view', compact('lead')); + } + + /** + * Update the specified resource in storage. + */ + public function update(LeadForm $request, int $id): RedirectResponse|JsonResponse + { + Event::dispatch('lead.update.before', $id); + + $data = $request->all(); + + if (isset($data['lead_pipeline_stage_id'])) { + $stage = $this->stageRepository->findOrFail($data['lead_pipeline_stage_id']); + + $data['lead_pipeline_id'] = $stage->lead_pipeline_id; + } else { + $pipeline = $this->pipelineRepository->getDefaultPipeline(); + + $stage = $pipeline->stages()->first(); + + $data['lead_pipeline_id'] = $pipeline->id; + + $data['lead_pipeline_stage_id'] = $stage->id; + } + + $lead = $this->leadRepository->update($data, $id); + + Event::dispatch('lead.update.after', $lead); + + if (request()->ajax()) { + return response()->json([ + 'message' => trans('admin::app.leads.update-success'), + ]); + } + + session()->flash('success', trans('admin::app.leads.update-success')); + + if (request()->has('closed_at')) { + return redirect()->back(); + } else { + return redirect()->route('admin.leads.index', $data['lead_pipeline_id']); + } + } + + /** + * Update the lead attributes. + */ + public function updateAttributes(int $id) + { + $data = request()->all(); + + $attributes = $this->attributeRepository->findWhere([ + 'entity_type' => 'leads', + ['code', 'NOTIN', ['title', 'description']], + ]); + + Event::dispatch('lead.update.before', $id); + + $lead = $this->leadRepository->update($data, $id, $attributes); + + Event::dispatch('lead.update.after', $lead); + + return response()->json([ + 'message' => trans('admin::app.leads.update-success'), + ]); + } + + /** + * Update the lead stage. + */ + public function updateStage(int $id) + { + $this->validate(request(), [ + 'lead_pipeline_stage_id' => 'required', + ]); + + $lead = $this->leadRepository->findOrFail($id); + + $stage = $lead->pipeline->stages() + ->where('id', request()->input('lead_pipeline_stage_id')) + ->firstOrFail(); + + Event::dispatch('lead.update.before', $id); + + $payload = request()->merge([ + 'entity_type' => 'leads', + 'lead_pipeline_stage_id' => $stage->id, + ])->only([ + 'closed_at', + 'lost_reason', + 'lead_pipeline_stage_id', + 'entity_type', + ]); + + $lead = $this->leadRepository->update($payload, $id, ['lead_pipeline_stage_id']); + + Event::dispatch('lead.update.after', $lead); + + return response()->json([ + 'message' => trans('admin::app.leads.update-success'), + ]); + } + + /** + * Search person results. + */ + public function search(): AnonymousResourceCollection + { + if ($userIds = bouncer()->getAuthorizedUserIds()) { + $results = $this->leadRepository + ->pushCriteria(app(RequestCriteria::class)) + ->findWhereIn('user_id', $userIds); + } else { + $results = $this->leadRepository + ->pushCriteria(app(RequestCriteria::class)) + ->all(); + } + + return LeadResource::collection($results); + } + + /** + * Remove the specified resource from storage. + */ + public function destroy(int $id): JsonResponse + { + $this->leadRepository->findOrFail($id); + + try { + Event::dispatch('lead.delete.before', $id); + + $this->leadRepository->delete($id); + + Event::dispatch('lead.delete.after', $id); + + return response()->json([ + 'message' => trans('admin::app.leads.destroy-success'), + ]); + } catch (\Exception $exception) { + return response()->json([ + 'message' => trans('admin::app.leads.destroy-failed'), + ], 400); + } + } + + /** + * Mass update the specified resources. + */ + public function massUpdate(MassUpdateRequest $massUpdateRequest): JsonResponse + { + $leads = $this->leadRepository->findWhereIn('id', $massUpdateRequest->input('indices')); + + try { + foreach ($leads as $lead) { + Event::dispatch('lead.update.before', $lead->id); + + $lead = $this->leadRepository->find($lead->id); + + $lead?->update(['lead_pipeline_stage_id' => $massUpdateRequest->input('value')]); + + Event::dispatch('lead.update.before', $lead->id); + } + + return response()->json([ + 'message' => trans('admin::app.leads.update-success'), + ]); + } catch (\Exception $th) { + return response()->json([ + 'message' => trans('admin::app.leads.update-failed'), + ], 400); + } + } + + /** + * Mass delete the specified resources. + */ + public function massDestroy(MassDestroyRequest $massDestroyRequest): JsonResponse + { + $leads = $this->leadRepository->findWhereIn('id', $massDestroyRequest->input('indices')); + + try { + foreach ($leads as $lead) { + Event::dispatch('lead.delete.before', $lead->id); + + $this->leadRepository->delete($lead->id); + + Event::dispatch('lead.delete.after', $lead->id); + } + + return response()->json([ + 'message' => trans('admin::app.leads.destroy-success'), + ]); + } catch (\Exception $exception) { + return response()->json([ + 'message' => trans('admin::app.leads.destroy-failed'), + ]); + } + } + + /** + * Attach product to lead. + */ + public function addProduct(int $leadId): JsonResponse + { + $product = $this->productRepository->updateOrCreate( + [ + 'lead_id' => $leadId, + 'product_id' => request()->input('product_id'), + ], + array_merge( + request()->all(), + [ + 'lead_id' => $leadId, + 'amount' => request()->input('price') * request()->input('quantity'), + ], + ) + ); + + return response()->json([ + 'data' => $product, + 'message' => trans('admin::app.leads.update-success'), + ]); + } + + /** + * Remove product attached to lead. + */ + public function removeProduct(int $id): JsonResponse + { + try { + Event::dispatch('lead.product.delete.before', $id); + + $this->productRepository->deleteWhere([ + 'lead_id' => $id, + 'product_id' => request()->input('product_id'), + ]); + + Event::dispatch('lead.product.delete.after', $id); + + return response()->json([ + 'message' => trans('admin::app.leads.destroy-success'), + ]); + } catch (\Exception $exception) { + return response()->json([ + 'message' => trans('admin::app.leads.destroy-failed'), + ]); + } + } + + /** + * Kanban lookup. + */ + public function kanbanLookup() + { + $params = $this->validate(request(), [ + 'column' => ['required'], + 'search' => ['required', 'min:2'], + ]); + + /** + * Finding the first column from the collection. + */ + $column = collect($this->getKanbanColumns())->where('index', $params['column'])->firstOrFail(); + + /** + * Fetching on the basis of column options. + */ + return app($column['filterable_options']['repository']) + ->select([$column['filterable_options']['column']['label'].' as label', $column['filterable_options']['column']['value'].' as value']) + ->where($column['filterable_options']['column']['label'], 'LIKE', '%'.$params['search'].'%') + ->get() + ->map + ->only('label', 'value'); + } + + /** + * Get columns for the kanban view. + */ + private function getKanbanColumns(): array + { + return [ + [ + 'index' => 'id', + 'label' => trans('admin::app.leads.index.kanban.columns.id'), + 'type' => 'integer', + 'searchable' => false, + 'search_field' => 'in', + 'filterable' => true, + 'filterable_type' => null, + 'filterable_options' => [], + 'allow_multiple_values' => true, + 'sortable' => true, + 'visibility' => true, + ], + [ + 'index' => 'lead_value', + 'label' => trans('admin::app.leads.index.kanban.columns.lead-value'), + 'type' => 'string', + 'searchable' => false, + 'search_field' => 'in', + 'filterable' => true, + 'filterable_type' => null, + 'filterable_options' => [], + 'allow_multiple_values' => true, + 'sortable' => true, + 'visibility' => true, + ], + [ + 'index' => 'user_id', + 'label' => trans('admin::app.leads.index.kanban.columns.sales-person'), + 'type' => 'string', + 'searchable' => false, + 'search_field' => 'in', + 'filterable' => true, + 'filterable_type' => 'searchable_dropdown', + 'filterable_options' => [ + 'repository' => UserRepository::class, + 'column' => [ + 'label' => 'name', + 'value' => 'id', + ], + ], + 'allow_multiple_values' => true, + 'sortable' => true, + 'visibility' => true, + ], + [ + 'index' => 'person.id', + 'label' => trans('admin::app.leads.index.kanban.columns.contact-person'), + 'type' => 'string', + 'searchable' => false, + 'search_field' => 'in', + 'filterable' => true, + 'filterable_options' => [], + 'allow_multiple_values' => true, + 'sortable' => true, + 'visibility' => true, + 'filterable_type' => 'searchable_dropdown', + 'filterable_options' => [ + 'repository' => PersonRepository::class, + 'column' => [ + 'label' => 'name', + 'value' => 'id', + ], + ], + ], + [ + 'index' => 'lead_type_id', + 'label' => trans('admin::app.leads.index.kanban.columns.lead-type'), + 'type' => 'string', + 'searchable' => false, + 'search_field' => 'in', + 'filterable' => true, + 'filterable_type' => 'dropdown', + 'filterable_options' => $this->typeRepository->all(['name as label', 'id as value'])->toArray(), + 'allow_multiple_values' => true, + 'sortable' => true, + 'visibility' => true, + ], + [ + 'index' => 'lead_source_id', + 'label' => trans('admin::app.leads.index.kanban.columns.source'), + 'type' => 'string', + 'searchable' => false, + 'search_field' => 'in', + 'filterable' => true, + 'filterable_type' => 'dropdown', + 'filterable_options' => $this->sourceRepository->all(['name as label', 'id as value'])->toArray(), + 'allow_multiple_values' => true, + 'sortable' => true, + 'visibility' => true, + ], + [ + 'index' => 'tags.name', + 'label' => trans('admin::app.leads.index.kanban.columns.tags'), + 'type' => 'string', + 'searchable' => false, + 'search_field' => 'in', + 'filterable' => true, + 'filterable_options' => [], + 'allow_multiple_values' => true, + 'sortable' => true, + 'visibility' => true, + 'filterable_type' => 'searchable_dropdown', + 'filterable_options' => [ + 'repository' => TagRepository::class, + 'column' => [ + 'label' => 'name', + 'value' => 'name', + ], + ], + ], + ]; + } + + /** + * Create lead with specified AI. + */ + public function createByAI() + { + $leadData = []; + + $errorMessages = []; + + foreach (request()->file('files') as $file) { + $lead = $this->processFile($file); + + if ( + isset($lead['status']) + && $lead['status'] === 'error' + ) { + $errorMessages[] = $lead['message']; + } else { + $leadData[] = $lead; + } + } + + if (isset($errorMessages[0]['code'])) { + return response()->json(MagicAI::errorHandler($errorMessages[0]['message'])); + } + + if ( + empty($leadData) + && ! empty($errorMessages) + ) { + return response()->json(MagicAI::errorHandler(implode(', ', $errorMessages)), 400); + } + + if (empty($leadData)) { + return response()->json(MagicAI::errorHandler(trans('admin::app.leads.no-valid-files')), 400); + } + + return response()->json([ + 'message' => trans('admin::app.leads.create-success'), + 'leads' => $this->createLeads($leadData), + ]); + } + + /** + * Process file. + * + * @param mixed $file + */ + private function processFile($file) + { + $validator = Validator::make( + ['file' => $file], + ['file' => 'required|extensions:'.str_replace(' ', '', self::SUPPORTED_TYPES)] + ); + + if ($validator->fails()) { + return MagicAI::errorHandler($validator->errors()->first()); + } + + $base64Pdf = base64_encode(file_get_contents($file->getRealPath())); + + $extractedData = MagicAIService::extractDataFromFile($base64Pdf); + + $lead = MagicAI::mapAIDataToLead($extractedData); + + return $lead; + } + + /** + * Create multiple leads. + */ + private function createLeads($rawLeads): array + { + $leads = []; + + foreach ($rawLeads as $rawLead) { + Event::dispatch('lead.create.before'); + + foreach ($rawLead['person']['emails'] as $email) { + $person = $this->personRepository + ->whereJsonContains('emails', [['value' => $email['value']]]) + ->first(); + + if ($person) { + $rawLead['person']['id'] = $person->id; + + break; + } + } + + $pipeline = $this->pipelineRepository->getDefaultPipeline(); + + $stage = $pipeline->stages()->first(); + + $lead = $this->leadRepository->create(array_merge($rawLead, [ + 'lead_pipeline_id' => $pipeline->id, + 'lead_pipeline_stage_id' => $stage->id, + ])); + + Event::dispatch('lead.create.after', $lead); + + $leads[] = $lead; + } + + return $leads; + } +} diff --git a/packages/Webkul/Admin/src/Http/Controllers/Lead/QuoteController.php b/packages/Webkul/Admin/src/Http/Controllers/Lead/QuoteController.php new file mode 100644 index 0000000..e189c0e --- /dev/null +++ b/packages/Webkul/Admin/src/Http/Controllers/Lead/QuoteController.php @@ -0,0 +1,66 @@ +leadRepository->find($id); + + if (! $lead->quotes->contains(request('id'))) { + $lead->quotes()->attach(request('id')); + } + + Event::dispatch('leads.quote.create.after', $lead); + + return response()->json([ + 'message' => trans('admin::app.leads.quote-create-success'), + ], 200); + } + + /** + * Remove the specified resource from storage. + * + * @param int $leadId + * @param int $tagId + * @return \Illuminate\Http\Response + */ + public function delete($leadId) + { + Event::dispatch('leads.quote.delete.before', $leadId); + + $lead = $this->leadRepository->find($leadId); + + $lead->quotes()->detach(request('quote_id')); + + Event::dispatch('leads.quote.delete.after', $lead); + + return response()->json([ + 'message' => trans('admin::app.leads.view.quotes.destroy-success'), + ], 200); + } +} diff --git a/packages/Webkul/Admin/src/Http/Controllers/Lead/TagController.php b/packages/Webkul/Admin/src/Http/Controllers/Lead/TagController.php new file mode 100644 index 0000000..4558394 --- /dev/null +++ b/packages/Webkul/Admin/src/Http/Controllers/Lead/TagController.php @@ -0,0 +1,61 @@ +leadRepository->find($id); + + if (! $lead->tags->contains(request()->input('tag_id'))) { + $lead->tags()->attach(request()->input('tag_id')); + } + + Event::dispatch('leads.tag.create.after', $lead); + + return response()->json([ + 'message' => trans('admin::app.leads.view.tags.create-success'), + ]); + } + + /** + * Remove the specified resource from storage. + * + * @param int $leadId + * @return \Illuminate\Http\Response + */ + public function detach($leadId) + { + Event::dispatch('leads.tag.delete.before', $leadId); + + $lead = $this->leadRepository->find($leadId); + + $lead->tags()->detach(request()->input('tag_id')); + + Event::dispatch('leads.tag.delete.after', $lead); + + return response()->json([ + 'message' => trans('admin::app.leads.view.tags.destroy-success'), + ]); + } +} diff --git a/packages/Webkul/Admin/src/Http/Controllers/Mail/EmailController.php b/packages/Webkul/Admin/src/Http/Controllers/Mail/EmailController.php new file mode 100644 index 0000000..3cd8aab --- /dev/null +++ b/packages/Webkul/Admin/src/Http/Controllers/Mail/EmailController.php @@ -0,0 +1,336 @@ +route('admin.mail.index', ['route' => 'inbox']); + } + + if (! bouncer()->hasPermission('mail.'.request('route'))) { + abort(401, 'This action is unauthorized'); + } + + switch (request('route')) { + case 'compose': + return view('admin::mail.compose'); + + default: + if (request()->ajax()) { + return datagrid(EmailDataGrid::class)->process(); + } + + return view('admin::mail.index'); + } + } + + /** + * Display a resource. + * + * @return \Illuminate\View\View + */ + public function view() + { + $email = $this->emailRepository + ->with(['emails', 'attachments', 'emails.attachments', 'lead', 'lead.person', 'lead.tags', 'lead.source', 'lead.type', 'person']) + ->findOrFail(request('id')); + + if ($userIds = bouncer()->getAuthorizedUserIds()) { + $results = $this->leadRepository->findWhere([ + ['id', '=', $email->lead_id], + ['user_id', 'IN', $userIds], + ]); + } else { + $results = $this->leadRepository->findWhere([ + ['id', '=', $email->lead_id], + ]); + } + + if (empty($results->toArray())) { + unset($email->lead_id); + } + + if (request('route') == 'draft') { + return response()->json([ + 'data' => new EmailResource($email), + ]); + } + + return view('admin::mail.view', compact('email')); + } + + /** + * Store a newly created resource in storage. + * + * @return \Illuminate\Http\Response + */ + public function store() + { + $this->validate(request(), [ + 'reply_to' => 'required|array|min:1', + 'reply_to.*' => 'email', + 'reply' => 'required', + ]); + + Event::dispatch('email.create.before'); + + $email = $this->emailRepository->create(request()->all()); + + if (! request('is_draft')) { + try { + Mail::send(new Email($email)); + + $this->emailRepository->update([ + 'folders' => ['sent'], + ], $email->id); + } catch (\Exception $e) { + } + } + + Event::dispatch('email.create.after', $email); + + if (request()->ajax()) { + return response()->json([ + 'data' => new EmailResource($email), + 'message' => trans('admin::app.mail.create-success'), + ]); + } + + if (request('is_draft')) { + session()->flash('success', trans('admin::app.mail.saved-to-draft')); + + return redirect()->route('admin.mail.index', ['route' => 'draft']); + } + + session()->flash('success', trans('admin::app.mail.create-success')); + + return redirect()->route('admin.mail.index', ['route' => 'sent']); + } + + /** + * Update the specified resource in storage. + * + * @param int $id + * @return \Illuminate\Http\Response + */ + public function update($id) + { + Event::dispatch('email.update.before', $id); + + $data = request()->all(); + + if (! is_null(request('is_draft'))) { + $data['folders'] = request('is_draft') ? ['draft'] : ['outbox']; + } + + $email = $this->emailRepository->update($data, request('id') ?? $id); + + Event::dispatch('email.update.after', $email); + + if (! is_null(request('is_draft')) && ! request('is_draft')) { + try { + Mail::send(new Email($email)); + + $this->emailRepository->update([ + 'folders' => ['inbox', 'sent'], + ], $email->id); + } catch (\Exception $e) { + } + } + + if (! is_null(request('is_draft'))) { + if (request('is_draft')) { + session()->flash('success', trans('admin::app.mail.saved-to-draft')); + + return redirect()->route('admin.mail.index', ['route' => 'draft']); + } else { + session()->flash('success', trans('admin::app.mail.create-success')); + + return redirect()->route('admin.mail.index', ['route' => 'inbox']); + } + } + + if (request()->ajax()) { + return response()->json([ + 'data' => new EmailResource($email->refresh()), + 'message' => trans('admin::app.mail.update-success'), + ]); + } + + session()->flash('success', trans('admin::app.mail.update-success')); + + return redirect()->back(); + } + + /** + * Run process inbound parse email. + * + * @return \Illuminate\Http\Response + */ + public function inboundParse(InboundEmailProcessor $inboundEmailProcessor) + { + $inboundEmailProcessor->processMessage(request('email')); + + return response()->json([], 200); + } + + /** + * Download file from storage + * + * @param int $id + * @return \Illuminate\View\View + */ + public function download($id) + { + $attachment = $this->attachmentRepository->findOrFail($id); + + try { + return Storage::download($attachment->path); + } catch (\Exception $e) { + session()->flash('error', $e->getMessage()); + + return redirect()->back(); + } + } + + /** + * Mass Update the specified resources. + */ + public function massUpdate(MassUpdateRequest $massUpdateRequest): JsonResponse + { + $emails = $this->emailRepository->findWhereIn('id', $massUpdateRequest->input('indices')); + + try { + foreach ($emails as $email) { + Event::dispatch('email.update.before', $email->id); + + $this->emailRepository->update([ + 'folders' => request('folders'), + ], $email->id); + + Event::dispatch('email.update.after', $email->id); + } + + return response()->json([ + 'message' => trans('admin::app.mail.mass-update-success'), + ]); + } catch (Exception) { + return response()->json([ + 'message' => trans('admin::app.mail.mass-update-success'), + ], 400); + } + } + + /** + * Remove the specified resource from storage. + */ + public function destroy(int $id): JsonResponse|RedirectResponse + { + $email = $this->emailRepository->findOrFail($id); + + try { + Event::dispatch('email.'.request('type').'.before', $id); + + $parentId = $email->parent_id; + + if (request('type') == 'trash') { + $this->emailRepository->update([ + 'folders' => ['trash'], + ], $id); + } else { + $this->emailRepository->delete($id); + } + + Event::dispatch('email.'.request('type').'.after', $id); + + if (request()->ajax()) { + return response()->json([ + 'message' => trans('admin::app.mail.delete-success'), + ], 200); + } + + session()->flash('success', trans('admin::app.mail.delete-success')); + + if ($parentId) { + return redirect()->back(); + } + + return redirect()->route('admin.mail.index', ['route' => 'inbox']); + } catch (\Exception $exception) { + if (request()->ajax()) { + return response()->json([ + 'message' => trans('admin::app.mail.delete-failed'), + ], 400); + } + + session()->flash('error', trans('admin::app.mail.delete-failed')); + + return redirect()->back(); + } + } + + /** + * Mass Delete the specified resources. + */ + public function massDestroy(MassDestroyRequest $massDestroyRequest): JsonResponse + { + $mails = $this->emailRepository->findWhereIn('id', $massDestroyRequest->input('indices')); + + try { + foreach ($mails as $email) { + Event::dispatch('email.'.$massDestroyRequest->input('type').'.before', $email->id); + + if ($massDestroyRequest->input('type') == 'trash') { + $this->emailRepository->update(['folders' => ['trash']], $email->id); + } else { + $this->emailRepository->delete($email->id); + } + + Event::dispatch('email.'.$massDestroyRequest->input('type').'.after', $email->id); + } + + return response()->json([ + 'message' => trans('admin::app.mail.delete-success'), + ]); + } catch (\Exception $e) { + return response()->json([ + 'message' => trans('admin::app.mail.delete-success'), + ]); + } + } +} diff --git a/packages/Webkul/Admin/src/Http/Controllers/Mail/TagController.php b/packages/Webkul/Admin/src/Http/Controllers/Mail/TagController.php new file mode 100644 index 0000000..29877e4 --- /dev/null +++ b/packages/Webkul/Admin/src/Http/Controllers/Mail/TagController.php @@ -0,0 +1,56 @@ +emailRepository->find($id); + + if (! $mail->tags->contains(request()->input('tag_id'))) { + $mail->tags()->attach(request()->input('tag_id')); + } + + Event::dispatch('mails.tag.create.after', $mail); + + return response()->json([ + 'message' => trans('admin::app.mail.view.tags.create-success'), + ]); + } + + /** + * Remove the specified resource from storage. + */ + public function detach(int $mailId): JsonResponse + { + Event::dispatch('mails.tag.delete.before', $mailId); + + $mail = $this->emailRepository->find($mailId); + + $mail->tags()->detach(request()->input('tag_id')); + + Event::dispatch('mails.tag.delete.after', $mail); + + return response()->json([ + 'message' => trans('admin::app.mail.view.tags.destroy-success'), + ]); + } +} diff --git a/packages/Webkul/Admin/src/Http/Controllers/Products/ActivityController.php b/packages/Webkul/Admin/src/Http/Controllers/Products/ActivityController.php new file mode 100644 index 0000000..e342b33 --- /dev/null +++ b/packages/Webkul/Admin/src/Http/Controllers/Products/ActivityController.php @@ -0,0 +1,45 @@ +activityRepository + ->leftJoin('product_activities', 'activities.id', '=', 'product_activities.activity_id') + ->where('product_activities.product_id', $id) + ->get(); + + return ActivityResource::collection($this->concatEmail($activities)); + } + + /** + * Store a newly created resource in storage. + */ + public function concatEmail($activities) + { + return $activities->sortByDesc('id')->sortByDesc('created_at'); + } +} diff --git a/packages/Webkul/Admin/src/Http/Controllers/Products/ProductController.php b/packages/Webkul/Admin/src/Http/Controllers/Products/ProductController.php new file mode 100644 index 0000000..58edcf2 --- /dev/null +++ b/packages/Webkul/Admin/src/Http/Controllers/Products/ProductController.php @@ -0,0 +1,216 @@ +request->add(['entity_type' => 'products']); + } + + /** + * Display a listing of the resource. + */ + public function index(): View|JsonResponse + { + if (request()->ajax()) { + return datagrid(ProductDataGrid::class)->process(); + } + + return view('admin::products.index'); + } + + /** + * Show the form for creating a new resource. + */ + public function create(): View + { + return view('admin::products.create'); + } + + /** + * Store a newly created resource in storage. + * + * @return \Illuminate\Http\Response + */ + public function store(AttributeForm $request) + { + Event::dispatch('product.create.before'); + + $product = $this->productRepository->create($request->all()); + + Event::dispatch('product.create.after', $product); + + session()->flash('success', trans('admin::app.products.index.create-success')); + + return redirect()->route('admin.products.index'); + } + + /** + * Show the form for viewing the specified resource. + */ + public function view(int $id): View + { + $product = $this->productRepository->findOrFail($id); + + return view('admin::products.view', compact('product')); + } + + /** + * Show the form for editing the specified resource. + */ + public function edit(int $id): View|JsonResponse + { + $product = $this->productRepository->findOrFail($id); + + $inventories = $product->inventories() + ->with('location') + ->get() + ->map(function ($inventory) { + return [ + 'id' => $inventory->id, + 'name' => $inventory->location->name, + 'warehouse_id' => $inventory->warehouse_id, + 'warehouse_location_id' => $inventory->warehouse_location_id, + 'in_stock' => $inventory->in_stock, + 'allocated' => $inventory->allocated, + ]; + }); + + return view('admin::products.edit', compact('product', 'inventories')); + } + + /** + * Update the specified resource in storage. + */ + public function update(AttributeForm $request, int $id) + { + Event::dispatch('product.update.before', $id); + + $product = $this->productRepository->update($request->all(), $id); + + Event::dispatch('product.update.after', $product); + + if (request()->ajax()) { + return response()->json([ + 'message' => trans('admin::app.products.index.update-success'), + ]); + } + + session()->flash('success', trans('admin::app.products.index.update-success')); + + return redirect()->route('admin.products.index'); + } + + /** + * Store a newly created resource in storage. + */ + public function storeInventories(int $id, ?int $warehouseId = null): JsonResponse + { + $this->validate(request(), [ + 'inventories' => 'array', + 'inventories.*.warehouse_location_id' => 'required', + 'inventories.*.warehouse_id' => 'required', + 'inventories.*.in_stock' => 'required|integer|min:0', + 'inventories.*.allocated' => 'required|integer|min:0', + ]); + + $product = $this->productRepository->findOrFail($id); + + Event::dispatch('product.update.before', $id); + + $this->productRepository->saveInventories(request()->all(), $id, $warehouseId); + + Event::dispatch('product.update.after', $product); + + return new JsonResponse([ + 'message' => trans('admin::app.products.index.update-success'), + ], 200); + } + + /** + * Search product results + */ + public function search(): JsonResource + { + $products = $this->productRepository + ->pushCriteria(app(RequestCriteria::class)) + ->orderBy('created_at', 'desc') + ->take(5) + ->get(); + + return ProductResource::collection($products); + } + + /** + * Returns product inventories grouped by warehouse. + */ + public function warehouses(int $id): JsonResponse + { + $warehouses = $this->productRepository->getInventoriesGroupedByWarehouse($id); + + return response()->json(array_values($warehouses)); + } + + /** + * Remove the specified resource from storage. + */ + public function destroy(int $id): JsonResponse + { + $product = $this->productRepository->findOrFail($id); + + try { + Event::dispatch('settings.products.delete.before', $id); + + $product->delete($id); + + Event::dispatch('settings.products.delete.after', $id); + + return new JsonResponse([ + 'message' => trans('admin::app.products.index.delete-success'), + ], 200); + } catch (\Exception $exception) { + return new JsonResponse([ + 'message' => trans('admin::app.products.index.delete-failed'), + ], 400); + } + } + + /** + * Mass Delete the specified resources. + */ + public function massDestroy(MassDestroyRequest $massDestroyRequest): JsonResponse + { + $indices = $massDestroyRequest->input('indices'); + + foreach ($indices as $index) { + Event::dispatch('product.delete.before', $index); + + $this->productRepository->delete($index); + + Event::dispatch('product.delete.after', $index); + } + + return new JsonResponse([ + 'message' => trans('admin::app.products.index.delete-success'), + ]); + } +} diff --git a/packages/Webkul/Admin/src/Http/Controllers/Products/TagController.php b/packages/Webkul/Admin/src/Http/Controllers/Products/TagController.php new file mode 100644 index 0000000..9a6beea --- /dev/null +++ b/packages/Webkul/Admin/src/Http/Controllers/Products/TagController.php @@ -0,0 +1,61 @@ +productRepository->findOrFail($id); + + if (! $product->tags->contains(request()->input('tag_id'))) { + $product->tags()->attach(request()->input('tag_id')); + } + + Event::dispatch('products.tag.create.after', $product); + + return response()->json([ + 'message' => trans('admin::app.leads.view.tags.create-success'), + ]); + } + + /** + * Remove the specified resource from storage. + * + * @param int $productId + * @return \Illuminate\Http\Response + */ + public function detach($productId) + { + Event::dispatch('products.tag.delete.before', $productId); + + $product = $this->productRepository->find($productId); + + $product->tags()->detach(request()->input('tag_id')); + + Event::dispatch('products.tag.delete.after', $product); + + return response()->json([ + 'message' => trans('admin::app.leads.view.tags.destroy-success'), + ]); + } +} diff --git a/packages/Webkul/Admin/src/Http/Controllers/Quote/QuoteController.php b/packages/Webkul/Admin/src/Http/Controllers/Quote/QuoteController.php new file mode 100644 index 0000000..6747798 --- /dev/null +++ b/packages/Webkul/Admin/src/Http/Controllers/Quote/QuoteController.php @@ -0,0 +1,198 @@ +request->add(['entity_type' => 'quotes']); + } + + /** + * Display a listing of the resource. + */ + public function index(): View|JsonResponse + { + if (request()->ajax()) { + return datagrid(QuoteDataGrid::class)->process(); + } + + return view('admin::quotes.index'); + } + + /** + * Show the form for creating a new resource. + */ + public function create(): View + { + $lead = $this->leadRepository->find(request('id')); + + return view('admin::quotes.create', compact('lead')); + } + + /** + * Store a newly created resource in storage. + */ + public function store(AttributeForm $request): RedirectResponse + { + Event::dispatch('quote.create.before'); + + $quote = $this->quoteRepository->create($request->all()); + + $leadId = request('lead_id'); + + if ($leadId) { + $lead = $this->leadRepository->find($leadId); + + $lead->quotes()->attach($quote->id); + } + + Event::dispatch('quote.create.after', $quote); + + session()->flash('success', trans('admin::app.quotes.index.create-success')); + + return request()->query('from') === 'lead' && $leadId + ? redirect()->route('admin.leads.view', ['id' => $leadId, 'from' => 'quotes']) + : redirect()->route('admin.quotes.index'); + } + + /** + * Show the form for editing the specified resource. + */ + public function edit(int $id): View + { + $quote = $this->quoteRepository->findOrFail($id); + + return view('admin::quotes.edit', compact('quote')); + } + + /** + * Update the specified resource in storage. + */ + public function update(AttributeForm $request, int $id): RedirectResponse + { + Event::dispatch('quote.update.before', $id); + + $quote = $this->quoteRepository->update($request->all(), $id); + + $quote->leads()->detach(); + + $leadId = request('lead_id'); + + if ($leadId) { + $lead = $this->leadRepository->find($leadId); + + $lead->quotes()->attach($quote->id); + } + + Event::dispatch('quote.update.after', $quote); + + session()->flash('success', trans('admin::app.quotes.index.update-success')); + + return request()->query('from') === 'lead' && $leadId + ? redirect()->route('admin.leads.view', ['id' => $leadId, 'from' => 'quotes']) + : redirect()->route('admin.quotes.index'); + } + + /** + * Search the quotes. + */ + public function search(): AnonymousResourceCollection + { + $quotes = $this->quoteRepository + ->pushCriteria(app(RequestCriteria::class)) + ->all(); + + return QuoteResource::collection($quotes); + } + + /** + * Remove the specified resource from storage. + */ + public function destroy(int $id): JsonResponse + { + $this->quoteRepository->findOrFail($id); + + try { + Event::dispatch('quote.delete.before', $id); + + $this->quoteRepository->delete($id); + + Event::dispatch('quote.delete.after', $id); + + return response()->json([ + 'message' => trans('admin::app.quotes.index.delete-success'), + ], 200); + } catch (\Exception $exception) { + return response()->json([ + 'message' => trans('admin::app.quotes.index.delete-failed'), + ], 400); + } + } + + /** + * Mass Delete the specified resources. + */ + public function massDestroy(MassDestroyRequest $massDestroyRequest): JsonResponse + { + $quotes = $this->quoteRepository->findWhereIn('id', $massDestroyRequest->input('indices')); + + try { + foreach ($quotes as $quotes) { + Event::dispatch('quote.delete.before', $quotes->id); + + $this->quoteRepository->delete($quotes->id); + + Event::dispatch('quote.delete.after', $quotes->id); + } + + return response()->json([ + 'message' => trans('admin::app.quotes.index.delete-success'), + ]); + } catch (\Exception $exception) { + return response()->json([ + 'message' => trans('admin::app.quotes.index.delete-failed'), + ], 400); + } + } + + /** + * Print and download the for the specified resource. + */ + public function print($id): Response|StreamedResponse + { + $quote = $this->quoteRepository->findOrFail($id); + + return $this->downloadPDF( + view('admin::quotes.pdf', compact('quote'))->render(), + 'Quote_'.$quote->subject.'_'.$quote->created_at->format('d-m-Y') + ); + } +} diff --git a/packages/Webkul/Admin/src/Http/Controllers/Settings/AttributeController.php b/packages/Webkul/Admin/src/Http/Controllers/Settings/AttributeController.php new file mode 100644 index 0000000..1f00526 --- /dev/null +++ b/packages/Webkul/Admin/src/Http/Controllers/Settings/AttributeController.php @@ -0,0 +1,236 @@ +ajax()) { + return datagrid(AttributeDataGrid::class)->process(); + } + + return view('admin::settings.attributes.index'); + } + + /** + * Show the form for creating a new resource. + */ + public function create(): View + { + return view('admin::settings.attributes.create'); + } + + /** + * Store a newly created resource in storage. + */ + public function store(): RedirectResponse + { + $this->validate(request(), [ + 'code' => ['required', 'unique:attributes,code,NULL,NULL,entity_type,'.request('entity_type'), new Code], + 'name' => 'required', + 'type' => 'required', + ]); + + Event::dispatch('settings.attribute.create.before'); + + request()->request->add(['quick_add' => 1]); + + $attribute = $this->attributeRepository->create(request()->all()); + + Event::dispatch('settings.attribute.create.after', $attribute); + + session()->flash('success', trans('admin::app.settings.attributes.index.create-success')); + + return redirect()->route('admin.settings.attributes.index'); + } + + /** + * Show the form for editing the specified resource. + */ + public function edit(int $id): View + { + $attribute = $this->attributeRepository->findOrFail($id); + + return view('admin::settings.attributes.edit', compact('attribute')); + } + + /** + * Update the specified resource in storage. + */ + public function update($id): RedirectResponse + { + $this->validate(request(), [ + 'code' => ['required', 'unique:attributes,code,NULL,NULL,entity_type,'.$id, new Code], + 'name' => 'required', + 'type' => 'required', + ]); + + Event::dispatch('settings.attribute.update.before', $id); + + $attribute = $this->attributeRepository->update(request()->all(), $id); + + Event::dispatch('settings.attribute.update.after', $attribute); + + session()->flash('success', trans('admin::app.settings.attributes.index.update-success')); + + return redirect()->route('admin.settings.attributes.index'); + } + + /** + * Remove the specified resource from storage. + */ + public function destroy(int $id): JsonResponse + { + $attribute = $this->attributeRepository->findOrFail($id); + + if (! $attribute->is_user_defined) { + return response()->json([ + 'message' => trans('admin::app.settings.attributes.index.user-define-error'), + ], 400); + } + + try { + Event::dispatch('settings.attribute.delete.before', $id); + + $this->attributeRepository->delete($id); + + Event::dispatch('settings.attribute.delete.after', $id); + + return response()->json([ + 'status' => true, + 'message' => trans('admin::app.settings.attributes.index.delete-success'), + ], 200); + } catch (\Exception $exception) { + return response()->json([ + 'message' => trans('admin::app.settings.attributes.index.delete-failed'), + ], 400); + } + } + + /** + * Check unique validation. + * + * @return void + */ + public function checkUniqueValidation() + { + $attribute = $this->attributeRepository->findOneWhere([ + 'code' => request('attribute_code'), + ]); + + return response()->json([ + 'validated' => $this->attributeValueRepository->isValueUnique( + request('entity_id'), + request('entity_type'), + $attribute, + request('attribute_value'), + ), + ]); + } + + /** + * Search attribute lookup results + */ + public function lookup($lookup): JsonResponse + { + $results = $this->attributeRepository->getLookUpOptions($lookup, request()->input('query')); + + return response()->json($results); + } + + /** + * Search attribute lookup results + */ + public function lookupEntity(string $lookup): JsonResponse + { + $result = $this->attributeRepository->getLookUpEntity($lookup, request()->input('query')); + + return response()->json($result); + } + + /** + * Mass Delete the specified resources. + */ + public function massDestroy(MassDestroyRequest $massDestroyRequest): JsonResponse + { + $count = 0; + + $attributes = $this->attributeRepository->findWhereIn('id', $massDestroyRequest->input('indices')); + + foreach ($attributes as $attribute) { + $attribute = $this->attributeRepository->find($attribute->id); + + if (! $attribute->is_user_defined) { + continue; + } + + Event::dispatch('settings.attribute.delete.before', $attribute->id); + + $this->attributeRepository->delete($attribute->id); + + Event::dispatch('settings.attribute.delete.after', $attribute->id); + + $count++; + } + + if (! $count) { + return response()->json([ + 'message' => trans('admin::app.settings.attributes.index.mass-delete-failed'), + ], 400); + } + + return response()->json([ + 'message' => trans('admin::app.settings.attributes.index.delete-success'), + ]); + } + + /** + * Get attribute options associated with attribute. + * + * @return \Illuminate\View\View + */ + public function getAttributeOptions(int $id) + { + $attribute = $this->attributeRepository->findOrFail($id); + + return $attribute->options()->orderBy('sort_order')->get(); + } + + /** + * Download image or file + */ + public function download() + { + if (! request('path')) { + return false; + } + + return Storage::download(request('path')); + } +} diff --git a/packages/Webkul/Admin/src/Http/Controllers/Settings/DataTransfer/ImportController.php b/packages/Webkul/Admin/src/Http/Controllers/Settings/DataTransfer/ImportController.php new file mode 100755 index 0000000..242d54a --- /dev/null +++ b/packages/Webkul/Admin/src/Http/Controllers/Settings/DataTransfer/ImportController.php @@ -0,0 +1,491 @@ +ajax()) { + return datagrid(ImportDataGrid::class)->process(); + } + + return view('admin::settings.data-transfer.imports.index'); + } + + /** + * Show the form for creating a new resource. + */ + public function create(): View + { + return view('admin::settings.data-transfer.imports.create'); + } + + /** + * Store a newly created resource in storage. + */ + public function store(): RedirectResponse + { + $importers = array_keys(config('importers')); + + $this->validate(request(), [ + 'type' => 'required|in:'.implode(',', $importers), + 'action' => 'required:in:append,delete', + 'validation_strategy' => 'required:in:stop-on-errors,skip-errors', + 'allowed_errors' => 'required|integer|min:0', + 'field_separator' => 'required', + 'file' => 'required|mimes:csv,xls,xlsx,txt', + ]); + + Event::dispatch('data_transfer.imports.create.before'); + + $data = request()->only([ + 'type', + 'action', + 'process_in_queue', + 'validation_strategy', + 'validation_strategy', + 'allowed_errors', + 'field_separator', + ]); + + if (! isset($data['process_in_queue'])) { + $data['process_in_queue'] = false; + } else { + $data['process_in_queue'] = true; + } + + $import = $this->importRepository->create( + array_merge( + [ + 'file_path' => request()->file('file')->storeAs( + 'imports', + time().'-'.request()->file('file')->getClientOriginalName(), + 'public' + ), + ], + $data + ) + ); + + Event::dispatch('data_transfer.imports.create.after', $import); + + session()->flash('success', trans('admin::app.settings.data-transfer.imports.create-success')); + + return redirect()->route('admin.settings.data_transfer.imports.import', $import->id); + } + + /** + * Show the form for editing a new resource. + */ + public function edit(int $id): View + { + $import = $this->importRepository->findOrFail($id); + + return view('admin::settings.data-transfer.imports.edit', compact('import')); + } + + /** + * Update a resource in storage. + */ + public function update(int $id): RedirectResponse + { + $importers = array_keys(config('importers')); + + $import = $this->importRepository->findOrFail($id); + + $this->validate(request(), [ + 'type' => 'required|in:'.implode(',', $importers), + 'action' => 'required:in:append,delete', + 'validation_strategy' => 'required:in:stop-on-errors,skip-errors', + 'allowed_errors' => 'required|integer|min:0', + 'field_separator' => 'required', + 'file' => 'mimes:csv,xls,xlsx,txt', + ]); + + Event::dispatch('data_transfer.imports.update.before'); + + $data = array_merge( + request()->only([ + 'type', + 'action', + 'process_in_queue', + 'validation_strategy', + 'validation_strategy', + 'allowed_errors', + 'field_separator', + ]), + [ + 'state' => 'pending', + 'processed_rows_count' => 0, + 'invalid_rows_count' => 0, + 'errors_count' => 0, + 'errors' => null, + 'error_file_path' => null, + 'started_at' => null, + 'completed_at' => null, + 'summary' => null, + ] + ); + + Storage::disk('public')->delete($import->error_file_path ?? ''); + + if (request()->file('file') && request()->file('file')->isValid()) { + Storage::disk('public')->delete($import->file_path); + + $data['file_path'] = request()->file('file')->storeAs( + 'imports', + time().'-'.request()->file('file')->getClientOriginalName(), + 'public' + ); + } + + if (! isset($data['process_in_queue'])) { + $data['process_in_queue'] = false; + } + + $import = $this->importRepository->update($data, $import->id); + + Event::dispatch('data_transfer.imports.update.after', $import); + + session()->flash('success', trans('admin::app.settings.data-transfer.imports.update-success')); + + return redirect()->route('admin.settings.data_transfer.imports.import', $import->id); + } + + /** + * Remove the specified resource from storage. + */ + public function destroy(int $id): JsonResponse + { + $import = $this->importRepository->findOrFail($id); + + try { + Storage::disk('public')->delete($import->file_path); + + Storage::disk('public')->delete($import->error_file_path ?? ''); + + $this->importRepository->delete($id); + + return response()->json([ + 'message' => trans('admin::app.settings.data-transfer.imports.delete-success'), + ]); + } catch (\Exception $e) { + } + + return response()->json([ + 'message' => trans('admin::app.settings.data-transfer.imports.delete-failed'), + ], 500); + } + + /** + * Show the form for creating a new resource. + */ + public function import(int $id): View + { + $import = $this->importRepository->findOrFail($id); + + $isValid = $this->importHelper + ->setImport($import) + ->isValid(); + + if ($import->state == Import::STATE_LINKING) { + if ($this->importHelper->isIndexingRequired()) { + $state = Import::STATE_INDEXING; + } else { + $state = Import::STATE_COMPLETED; + } + } elseif ($import->state == Import::STATE_INDEXING) { + $state = Import::STATE_COMPLETED; + } else { + $state = Import::STATE_COMPLETED; + } + + $stats = $this->importHelper->stats($state); + + $import->unsetRelations(); + + return view('admin::settings.data-transfer.imports.import', compact('import', 'isValid', 'stats')); + } + + /** + * Store a newly created resource in storage. + */ + public function validateImport(int $id): JsonResponse + { + $import = $this->importRepository->findOrFail($id); + + $isValid = $this->importHelper + ->setImport($import) + ->validate(); + + return new JsonResponse([ + 'is_valid' => $isValid, + 'import' => $this->importHelper->getImport()->unsetRelations(), + ]); + } + + /** + * Store a newly created resource in storage. + */ + public function start(int $id): JsonResponse + { + $import = $this->importRepository->findOrFail($id); + + if (! $import->processed_rows_count) { + return new JsonResponse([ + 'message' => trans('admin::app.settings.data-transfer.imports.nothing-to-import'), + ], 400); + } + + $this->importHelper->setImport($import); + + if (! $this->importHelper->isValid()) { + return new JsonResponse([ + 'message' => trans('admin::app.settings.data-transfer.imports.not-valid'), + ], 400); + } + + if ( + $import->process_in_queue + && config('queue.default') == 'sync' + ) { + return new JsonResponse([ + 'message' => trans('admin::app.settings.data-transfer.imports.setup-queue-error'), + ], 400); + } + + /** + * Set the import state to processing + */ + if ($import->state == Import::STATE_VALIDATED) { + $this->importHelper->started(); + } + + /** + * Get the first pending batch to import + */ + $importBatch = $import->batches->where('state', Import::STATE_PENDING)->first(); + + if ($importBatch) { + /** + * Start the import process + */ + try { + if ($import->process_in_queue) { + $this->importHelper->start(); + } else { + $this->importHelper->start($importBatch); + } + } catch (\Exception $e) { + return new JsonResponse([ + 'message' => $e->getMessage(), + ], 400); + } + } else { + if ($this->importHelper->isLinkingRequired()) { + $this->importHelper->linking(); + } elseif ($this->importHelper->isIndexingRequired()) { + $this->importHelper->indexing(); + } else { + $this->importHelper->completed(); + } + } + + return new JsonResponse([ + 'stats' => $this->importHelper->stats(Import::STATE_PROCESSED), + 'import' => $this->importHelper->getImport()->unsetRelations(), + ]); + } + + /** + * Store a newly created resource in storage. + */ + public function link(int $id): JsonResponse + { + $import = $this->importRepository->findOrFail($id); + + if (! $import->processed_rows_count) { + return new JsonResponse([ + 'message' => trans('admin::app.settings.data-transfer.imports.nothing-to-import'), + ], 400); + } + + $this->importHelper->setImport($import); + + if (! $this->importHelper->isValid()) { + return new JsonResponse([ + 'message' => trans('admin::app.settings.data-transfer.imports.not-valid'), + ], 400); + } + + /** + * Set the import state to linking + */ + if ($import->state == Import::STATE_PROCESSED) { + $this->importHelper->linking(); + } + + /** + * Get the first processing batch to link + */ + $importBatch = $import->batches->where('state', Import::STATE_PROCESSED)->first(); + + /** + * Set the import state to linking/completed + */ + if ($importBatch) { + /** + * Start the resource linking process + */ + try { + $this->importHelper->link($importBatch); + } catch (\Exception $e) { + return new JsonResponse([ + 'message' => $e->getMessage(), + ], 400); + } + } else { + if ($this->importHelper->isIndexingRequired()) { + $this->importHelper->indexing(); + } else { + $this->importHelper->completed(); + } + } + + return new JsonResponse([ + 'stats' => $this->importHelper->stats(Import::STATE_LINKED), + 'import' => $this->importHelper->getImport()->unsetRelations(), + ]); + } + + /** + * Store a newly created resource in storage. + */ + public function indexData(int $id): JsonResponse + { + $import = $this->importRepository->findOrFail($id); + + if (! $import->processed_rows_count) { + return new JsonResponse([ + 'message' => trans('admin::app.settings.data-transfer.imports.nothing-to-import'), + ], 400); + } + + $this->importHelper->setImport($import); + + if (! $this->importHelper->isValid()) { + return new JsonResponse([ + 'message' => trans('admin::app.settings.data-transfer.imports.not-valid'), + ], 400); + } + + /** + * Set the import state to linking + */ + if ($import->state == Import::STATE_LINKED) { + $this->importHelper->indexing(); + } + + /** + * Get the first processing batch to link + */ + $importBatch = $import->batches->where('state', Import::STATE_LINKED)->first(); + + /** + * Set the import state to linking/completed + */ + if ($importBatch) { + /** + * Start the resource linking process + */ + try { + $this->importHelper->index($importBatch); + } catch (\Exception $e) { + return new JsonResponse([ + 'message' => $e->getMessage(), + ], 400); + } + } else { + /** + * Set the import state to completed + */ + $this->importHelper->completed(); + } + + return new JsonResponse([ + 'stats' => $this->importHelper->stats(Import::STATE_INDEXED), + 'import' => $this->importHelper->getImport()->unsetRelations(), + ]); + } + + /** + * Returns import stats + */ + public function stats(int $id, string $state = Import::STATE_PROCESSED): JsonResponse + { + $import = $this->importRepository->findOrFail($id); + + $stats = $this->importHelper + ->setImport($import) + ->stats($state); + + return new JsonResponse([ + 'stats' => $stats, + 'import' => $this->importHelper->getImport()->unsetRelations(), + ]); + } + + /** + * Download import error report + */ + public function downloadSample(string $type) + { + $importer = config('importers.'.$type); + + return Storage::download($importer['sample_path']); + } + + /** + * Download import error report + */ + public function download(int $id) + { + $import = $this->importRepository->findOrFail($id); + + return Storage::disk('public')->download($import->file_path); + } + + /** + * Download import error report + */ + public function downloadErrorReport(int $id) + { + $import = $this->importRepository->findOrFail($id); + + return Storage::disk('public')->download($import->file_path); + } +} diff --git a/packages/Webkul/Admin/src/Http/Controllers/Settings/EmailTemplateController.php b/packages/Webkul/Admin/src/Http/Controllers/Settings/EmailTemplateController.php new file mode 100755 index 0000000..8ae99c6 --- /dev/null +++ b/packages/Webkul/Admin/src/Http/Controllers/Settings/EmailTemplateController.php @@ -0,0 +1,133 @@ +ajax()) { + return datagrid(EmailTemplateDataGrid::class)->process(); + } + + return view('admin::settings.email-templates.index'); + } + + /** + * Show the form for creating a new resource. + * + * @return \Illuminate\View\View + */ + public function create() + { + $placeholders = $this->workflowEntityHelper->getEmailTemplatePlaceholders(); + + return view('admin::settings.email-templates.create', compact('placeholders')); + } + + /** + * Store a newly created email templates in storage. + */ + public function store(): RedirectResponse + { + $this->validate(request(), [ + 'name' => 'required|unique:email_templates,name', + 'subject' => 'required', + 'content' => 'required', + ]); + + Event::dispatch('settings.email_templates.create.before'); + + $emailTemplate = $this->emailTemplateRepository->create(request()->all()); + + Event::dispatch('settings.email_templates.create.after', $emailTemplate); + + session()->flash('success', trans('admin::app.settings.email-template.index.create-success')); + + return redirect()->route('admin.settings.email_templates.index'); + } + + /** + * Show the form for editing the specified email template. + */ + public function edit(int $id): View + { + $emailTemplate = $this->emailTemplateRepository->findOrFail($id); + + $placeholders = $this->workflowEntityHelper->getEmailTemplatePlaceholders(); + + return view('admin::settings.email-templates.edit', compact('emailTemplate', 'placeholders')); + } + + /** + * Update the specified email template in storage. + */ + public function update(int $id): RedirectResponse + { + $this->validate(request(), [ + 'name' => 'required|unique:email_templates,name,'.$id, + 'subject' => 'required', + 'content' => 'required', + ]); + + Event::dispatch('settings.email_templates.update.before', $id); + + $emailTemplate = $this->emailTemplateRepository->update(request()->all(), $id); + + Event::dispatch('settings.email_templates.update.after', $emailTemplate); + + session()->flash('success', trans('admin::app.settings.email-template.index.update-success')); + + return redirect()->route('admin.settings.email_templates.index'); + } + + /** + * Remove the specified email template from storage. + */ + public function destroy(int $id): JsonResponse + { + $emailTemplate = $this->emailTemplateRepository->findOrFail($id); + + try { + Event::dispatch('settings.email_templates.delete.before', $id); + + $emailTemplate->delete($id); + + Event::dispatch('settings.email_templates.delete.after', $id); + + return response()->json([ + 'message' => trans('admin::app.settings.email-template.index.delete-success'), + ], 200); + } catch (\Exception $exception) { + return response()->json([ + 'message' => trans('admin::app.settings.email-template.index.delete-failed'), + ], 400); + } + + return response()->json([ + 'message' => trans('admin::app.settings.email-template.index.delete-failed'), + ], 400); + } +} diff --git a/packages/Webkul/Admin/src/Http/Controllers/Settings/GroupController.php b/packages/Webkul/Admin/src/Http/Controllers/Settings/GroupController.php new file mode 100755 index 0000000..ab44e99 --- /dev/null +++ b/packages/Webkul/Admin/src/Http/Controllers/Settings/GroupController.php @@ -0,0 +1,127 @@ +ajax()) { + return datagrid(GroupDataGrid::class)->process(); + } + + return view('admin::settings.groups.index'); + } + + /** + * Store a newly created resource in storage. + */ + public function store(): JsonResponse + { + $this->validate(request(), [ + 'name' => 'required|unique:groups,name|max:50', + 'description' => 'required|max:250', + ]); + + Event::dispatch('settings.group.create.before'); + + $group = $this->groupRepository->create(request()->only([ + 'name', + 'description', + ])); + + Event::dispatch('settings.group.create.after', $group); + + return new JsonResponse([ + 'data' => $group, + 'message' => trans('admin::app.settings.groups.index.create-success'), + ]); + } + + /** + * Show the form for editing the specified resource. + */ + public function edit(int $id): JsonResource + { + $group = $this->groupRepository->findOrFail($id); + + return new JsonResource([ + 'data' => $group, + ]); + } + + /** + * Update the specified resource in storage. + */ + public function update(int $id): JsonResponse + { + $this->validate(request(), [ + 'name' => 'required|max:50|unique:groups,name,'.$id, + 'description' => 'required|max:250', + ]); + + Event::dispatch('settings.group.update.before', $id); + + $group = $this->groupRepository->update(request()->only([ + 'name', + 'description', + ]), $id); + + Event::dispatch('settings.group.update.after', $group); + + return new JsonResponse([ + 'data' => $group, + 'message' => trans('admin::app.settings.groups.index.update-success'), + ]); + } + + /** + * Remove the specified resource from storage. + * + * @return \Illuminate\Http\Response + */ + public function destroy(int $id): JsonResponse + { + $group = $this->groupRepository->findOrFail($id); + + if ($group->users()->exists()) { + return response()->json([ + 'message' => trans('admin::app.settings.groups.index.delete-failed-associated-users'), + ], 400); + } + + try { + Event::dispatch('settings.group.delete.before', $id); + + $group->delete($id); + + Event::dispatch('settings.group.delete.after', $id); + + return new JsonResponse([ + 'message' => trans('admin::app.settings.groups.index.destroy-success'), + ], 200); + } catch (\Exception $exception) { + return new JsonResponse([ + 'message' => trans('admin::app.settings.groups.index.delete-failed'), + ], 400); + } + } +} diff --git a/packages/Webkul/Admin/src/Http/Controllers/Settings/LocationController.php b/packages/Webkul/Admin/src/Http/Controllers/Settings/LocationController.php new file mode 100644 index 0000000..c783637 --- /dev/null +++ b/packages/Webkul/Admin/src/Http/Controllers/Settings/LocationController.php @@ -0,0 +1,79 @@ +locationRepository + ->pushCriteria(app(RequestCriteria::class)) + ->all(); + + return response()->json([ + 'data' => $results, + ]); + } + + /** + * Store a newly created resource in storage. + */ + public function store(AttributeForm $request): JsonResponse + { + Event::dispatch('settings.location.create.before'); + + $location = $this->locationRepository->create(request()->all()); + + Event::dispatch('settings.location.create.after', $location); + + return new JsonResponse([ + 'data' => $location, + 'message' => trans('admin::app.settings.warehouses.view.locations.create-success'), + ]); + } + + /** + * Remove the specified resource from storage. + * + * @return \Illuminate\Http\Response + */ + public function destroy(int $id): JsonResponse + { + $this->locationRepository->findOrFail($id); + + try { + Event::dispatch('settings.location.delete.before', $id); + + $this->locationRepository->delete($id); + + Event::dispatch('settings.location.delete.after', $id); + + return new JsonResponse([ + 'message' => trans('admin::app.settings.warehouses.view.locations.delete-success'), + ], 200); + } catch (\Exception $exception) { + return new JsonResponse([ + 'message' => trans('admin::app.settings.warehouses.view.locations.delete-failed'), + ], 400); + } + } +} diff --git a/packages/Webkul/Admin/src/Http/Controllers/Settings/Marketing/CampaignsController.php b/packages/Webkul/Admin/src/Http/Controllers/Settings/Marketing/CampaignsController.php new file mode 100644 index 0000000..1958c1e --- /dev/null +++ b/packages/Webkul/Admin/src/Http/Controllers/Settings/Marketing/CampaignsController.php @@ -0,0 +1,157 @@ +isXmlHttpRequest()) { + return datagrid(CampaignDatagrid::class)->process(); + } + + return view('admin::settings.marketing.campaigns.index'); + } + + /** + * Get marketing events. + */ + public function getEvents(): JsonResponse + { + $events = $this->eventRepository->get(['id', 'name']); + + return response()->json([ + 'data' => $events, + ]); + } + + /** + * Get Email Templates. + */ + public function getEmailTemplates(): JsonResponse + { + $emailTemplates = $this->emailTemplateRepository->get(['id', 'name']); + + return response()->json([ + 'data' => $emailTemplates, + ]); + } + + /** + * Store a newly created marketing campaign in storage. + */ + public function store(): JsonResponse + { + $validatedData = $this->validate(request(), [ + 'name' => 'required|string|max:255', + 'subject' => 'required|string|max:255', + 'marketing_template_id' => 'required|exists:email_templates,id', + 'marketing_event_id' => 'required|exists:marketing_events,id', + 'status' => 'sometimes|required|in:0,1', + ]); + + Event::dispatch('settings.marketing.campaigns.create.before'); + + $marketingCampaign = $this->campaignRepository->create($validatedData); + + Event::dispatch('settings.marketing.campaigns.create.after', $marketingCampaign); + + return response()->json([ + 'message' => trans('admin::app.settings.marketing.campaigns.index.create-success'), + ]); + } + + /** + * Show the specified Resource. + */ + public function show(int $id): JsonResponse + { + $campaign = $this->campaignRepository->findOrFail($id); + + return response()->json([ + 'data' => $campaign, + ]); + } + + /** + * Update the specified marketing campaign in storage. + */ + public function update(int $id): JsonResponse + { + $validatedData = $this->validate(request(), [ + 'name' => 'required|string|max:255', + 'subject' => 'required|string|max:255', + 'marketing_template_id' => 'required|exists:email_templates,id', + 'marketing_event_id' => 'required|exists:marketing_events,id', + 'status' => 'sometimes|required|in:0,1', + ]); + + Event::dispatch('settings.marketing.campaigns.update.before', $id); + + $marketingCampaign = $this->campaignRepository->update($validatedData, $id); + + Event::dispatch('settings.marketing.campaigns.update.after', $marketingCampaign); + + return response()->json([ + 'message' => trans('admin::app.settings.marketing.campaigns.index.update-success'), + ]); + } + + /** + * Remove the specified marketing campaign from storage. + */ + public function destroy(int $id): JsonResponse + { + Event::dispatch('settings.marketing.campaigns.delete.before', $id); + + $this->campaignRepository->delete($id); + + Event::dispatch('settings.marketing.campaigns.delete.after', $id); + + return response()->json([ + 'message' => trans('admin::app.settings.marketing.campaigns.index.delete-success'), + ]); + } + + /** + * Remove the specified marketing campaigns from storage. + */ + public function massDestroy(MassDestroyRequest $massDestroyRequest): JsonResponse + { + $campaigns = $this->campaignRepository->findWhereIn('id', $massDestroyRequest->input('indices')); + + foreach ($campaigns as $campaign) { + Event::dispatch('settings.marketing.campaigns.delete.before', $campaign); + + $this->campaignRepository->delete($campaign->id); + + Event::dispatch('settings.marketing.campaigns.delete.after', $campaign); + } + + return response()->json([ + 'message' => trans('admin::app.settings.marketing.campaigns.index.mass-delete-success'), + ]); + } +} diff --git a/packages/Webkul/Admin/src/Http/Controllers/Settings/Marketing/EventController.php b/packages/Webkul/Admin/src/Http/Controllers/Settings/Marketing/EventController.php new file mode 100644 index 0000000..7fe5896 --- /dev/null +++ b/packages/Webkul/Admin/src/Http/Controllers/Settings/Marketing/EventController.php @@ -0,0 +1,169 @@ +ajax()) { + return datagrid(EventDataGrid::class)->process(); + } + + return view('admin::settings.marketing.events.index'); + } + + /** + * Store a newly created marketing event in storage. + */ + public function store(): JsonResponse + { + $validatedData = $this->validate(request(), [ + 'name' => 'required|max:60', + 'description' => 'required', + 'date' => 'required|date|after_or_equal:today', + ]); + + Event::dispatch('settings.marketing.events.create.before'); + + $marketingEvent = $this->eventRepository->create($validatedData); + + Event::dispatch('settings.marketing.events.create.after', $marketingEvent); + + return response()->json([ + 'message' => trans('admin::app.settings.marketing.events.index.create-success'), + 'data' => $marketingEvent, + ]); + } + + /** + * Update the specified marketing event in storage. + */ + public function update(int $id): JsonResponse + { + $validatedData = $this->validate(request(), [ + 'name' => 'required|max:60', + 'description' => 'required', + 'date' => 'required|date|after_or_equal:today', + ]); + + Event::dispatch('settings.marketing.events.update.before', $id); + + $marketingEvent = $this->eventRepository->update($validatedData, $id); + + Event::dispatch('settings.marketing.events.update.after', $marketingEvent); + + return response()->json([ + 'message' => trans('admin::app.settings.marketing.events.index.update-success'), + 'data' => $marketingEvent, + ]); + } + + /** + * Remove the specified marketing event from storage. + */ + public function destroy(int $id): JsonResponse + { + $event = $this->eventRepository->findOrFail($id); + + if ($event->campaigns->isNotEmpty()) { + return response()->json([ + 'message' => trans('admin::app.settings.marketing.events.index.delete-failed-associated-campaigns'), + ], 422); + } + + Event::dispatch('settings.marketing.events.delete.before', $event); + + $this->eventRepository->delete($event->id); + + Event::dispatch('settings.marketing.events.delete.after', $event); + + return response()->json([ + 'message' => trans('admin::app.settings.marketing.events.index.delete-success'), + ]); + } + + /** + * Remove the specified marketing events from storage. + */ + public function massDestroy(MassDestroyRequest $request): JsonResponse + { + try { + $events = $this->eventRepository->findWhereIn('id', $request->input('indices', [])); + + $deletedCount = 0; + + $blockedCount = 0; + + foreach ($events as $event) { + if ( + $event->campaigns + && $event->campaigns->isNotEmpty() + ) { + $blockedCount++; + + continue; + } + + Event::dispatch('settings.marketing.events.delete.before', $event); + + $this->eventRepository->delete($event->id); + + Event::dispatch('settings.marketing.events.delete.after', $event); + + $deletedCount++; + } + + $statusCode = 200; + + switch (true) { + case $deletedCount > 0 && $blockedCount === 0: + $message = trans('admin::app.settings.marketing.events.index.mass-delete-success'); + + break; + + case $deletedCount > 0 && $blockedCount > 0: + $message = trans('admin::app.settings.marketing.events.index.partial-delete-warning'); + + break; + + case $deletedCount === 0 && $blockedCount > 0: + $message = trans('admin::app.settings.marketing.events.index.none-delete-warning'); + + $statusCode = 400; + + break; + + default: + $message = trans('admin::app.settings.marketing.events.index.no-selection'); + + $statusCode = 400; + + break; + } + + return response()->json(['message' => $message], $statusCode); + } catch (Exception $e) { + return response()->json([ + 'message' => trans('admin::app.settings.marketing.events.index.mass-delete-failed'), + ], 400); + } + } +} diff --git a/packages/Webkul/Admin/src/Http/Controllers/Settings/PipelineController.php b/packages/Webkul/Admin/src/Http/Controllers/Settings/PipelineController.php new file mode 100644 index 0000000..6d9cf73 --- /dev/null +++ b/packages/Webkul/Admin/src/Http/Controllers/Settings/PipelineController.php @@ -0,0 +1,152 @@ +ajax()) { + return datagrid(PipelineDataGrid::class)->process(); + } + + return view('admin::settings.pipelines.index'); + } + + /** + * Show the form for creating a new resource. + */ + public function create(): View + { + return view('admin::settings.pipelines.create'); + } + + /** + * Store a newly created resource in storage. + */ + public function store(PipelineForm $request): RedirectResponse + { + $request->validated(); + + $request->merge([ + 'is_default' => request()->has('is_default') ? 1 : 0, + ]); + + Event::dispatch('settings.pipeline.create.before'); + + $pipeline = $this->pipelineRepository->create($request->all()); + + Event::dispatch('settings.pipeline.create.after', $pipeline); + + session()->flash('success', trans('admin::app.settings.pipelines.index.create-success')); + + return redirect()->route('admin.settings.pipelines.index'); + } + + /** + * Show the form for editing the specified resource. + */ + public function edit(int $id): View + { + $pipeline = $this->pipelineRepository->findOrFail($id); + + return view('admin::settings.pipelines.edit', compact('pipeline')); + } + + /** + * Update the specified resource in storage. + */ + public function update(PipelineForm $request, int $id): RedirectResponse + { + $request->validated(); + + $isDefault = request()->has('is_default') ? 1 : 0; + + if (! $isDefault) { + $defaultCount = $this->pipelineRepository->findWhere(['is_default' => 1])->count(); + + $pipeline = $this->pipelineRepository->find($id); + + if ( + $defaultCount === 1 + && $pipeline->is_default + ) { + session()->flash('error', trans('admin::app.settings.pipelines.index.default-required')); + + return redirect()->back(); + } + } + + $request->merge(['is_default' => $isDefault]); + + Event::dispatch('settings.pipeline.update.before', $id); + + $pipeline = $this->pipelineRepository->update($request->all(), $id); + + Event::dispatch('settings.pipeline.update.after', $pipeline); + + session()->flash('success', trans('admin::app.settings.pipelines.index.update-success')); + + return redirect()->route('admin.settings.pipelines.index'); + } + + /** + * Remove the specified resource from storage. + */ + public function destroy($id): JsonResponse + { + $pipeline = $this->pipelineRepository->findOrFail($id); + + if ($pipeline->is_default) { + return response()->json([ + 'message' => trans('admin::app.settings.pipelines.index.default-delete-error'), + ], 400); + } else { + $defaultPipeline = $this->pipelineRepository->getDefaultPipeline(); + + $pipeline->leads()->update([ + 'lead_pipeline_id' => $defaultPipeline->id, + 'lead_pipeline_stage_id' => $defaultPipeline->stages()->first()->id, + ]); + } + + try { + Event::dispatch('settings.pipeline.delete.before', $id); + + $this->pipelineRepository->delete($id); + + Event::dispatch('settings.pipeline.delete.after', $id); + + return response()->json([ + 'message' => trans('admin::app.settings.pipelines.index.delete-success'), + ], 200); + } catch (\Exception $exception) { + return response()->json([ + 'message' => trans('admin::app.settings.pipelines.index.delete-failed'), + ], 400); + } + + return response()->json([ + 'message' => trans('admin::app.settings.pipelines.index.delete-failed'), + ], 400); + } +} diff --git a/packages/Webkul/Admin/src/Http/Controllers/Settings/RoleController.php b/packages/Webkul/Admin/src/Http/Controllers/Settings/RoleController.php new file mode 100755 index 0000000..cc703ca --- /dev/null +++ b/packages/Webkul/Admin/src/Http/Controllers/Settings/RoleController.php @@ -0,0 +1,168 @@ +ajax()) { + return datagrid(RoleDataGrid::class)->process(); + } + + return view('admin::settings.roles.index'); + } + + /** + * Show the form for creating a new resource. + */ + public function create(): View + { + return view('admin::settings.roles.create'); + } + + /** + * Store a newly created resource in storage. + */ + public function store(): RedirectResponse + { + $this->validate(request(), [ + 'name' => 'required', + 'permission_type' => 'required|in:all,custom', + 'description' => 'required', + ]); + + if (request('permission_type') == 'custom') { + $this->validate(request(), [ + 'permissions' => 'required', + ]); + } + + Event::dispatch('settings.role.create.before'); + + $data = request()->only([ + 'name', + 'description', + 'permission_type', + 'permissions', + ]); + + $role = $this->roleRepository->create($data); + + Event::dispatch('settings.role.create.after', $role); + + session()->flash('success', trans('admin::app.settings.roles.index.create-success')); + + return redirect()->route('admin.settings.roles.index'); + } + + /** + * Show the form for editing the specified resource. + */ + public function edit(int $id): View + { + $role = $this->roleRepository->findOrFail($id); + + return view('admin::settings.roles.edit', compact('role')); + } + + /** + * Update the specified resource in storage. + */ + public function update(int $id): RedirectResponse + { + $this->validate(request(), [ + 'name' => 'required', + 'permission_type' => 'required|in:all,custom', + 'description' => 'required', + 'permissions' => 'required_if:permission_type,custom', + ]); + + Event::dispatch('settings.role.update.before', $id); + + $data = array_merge(request()->only([ + 'name', + 'description', + 'permission_type', + ]), [ + 'permissions' => request()->has('permissions') ? request('permissions') : [], + ]); + + $role = $this->roleRepository->update($data, $id); + + Event::dispatch('settings.role.update.after', $role); + + session()->flash('success', trans('admin::app.settings.roles.index.update-success')); + + return redirect()->back(); + } + + /** + * Remove the specified resource from storage. + */ + public function destroy(int $id): JsonResponse + { + $response = [ + 'responseCode' => 400, + ]; + + $role = $this->roleRepository->findOrFail($id); + + if ($role->users && $role->users->count() >= 1) { + $response['message'] = trans('admin::app.settings.roles.index.being-used'); + + session()->flash('error', $response['message']); + } elseif ($this->roleRepository->count() == 1) { + $response['message'] = trans('admin::app.settings.roles.index.last-delete-error'); + + session()->flash('error', $response['message']); + } else { + try { + Event::dispatch('settings.role.delete.before', $id); + + if (auth()->guard('user')->user()->role_id == $id) { + $response['message'] = trans('admin::app.settings.roles.index.current-role-delete-error'); + } else { + $this->roleRepository->delete($id); + + Event::dispatch('settings.role.delete.after', $id); + + $message = trans('admin::app.settings.roles.index.delete-success'); + + $response = [ + 'responseCode' => 200, + 'message' => $message, + ]; + + session()->flash('success', $message); + } + } catch (\Exception $exception) { + $message = $exception->getMessage(); + + $response['message'] = $message; + + session()->flash('error', $message); + } + } + + return response()->json($response, $response['responseCode']); + } +} diff --git a/packages/Webkul/Admin/src/Http/Controllers/Settings/SettingController.php b/packages/Webkul/Admin/src/Http/Controllers/Settings/SettingController.php new file mode 100644 index 0000000..ac1d7ea --- /dev/null +++ b/packages/Webkul/Admin/src/Http/Controllers/Settings/SettingController.php @@ -0,0 +1,97 @@ +query('query')); + + if (empty($query)) { + return response()->json(['data' => []]); + } + + $results = $this->searchMenuItems($this->getSettingsConfig(), $query); + + return response()->json([ + 'data' => $results->values(), + ]); + } + + /** + * Recursively search through menu items and children. + * + * @param Collection $menuItems + * @return Collection> + */ + protected function searchMenuItems(Collection $menuItems, string $query): Collection + { + $results = collect(); + + foreach ($menuItems as $item) { + if ($this->matchesQuery($item, $query)) { + $results->push([ + 'name' => $item->getName(), + 'url' => $item->getUrl(), + 'icon' => $item->getIcon(), + 'key' => $item->getKey(), + ]); + } + + if ($item->haveChildren()) { + $childResults = $this->searchMenuItems($item->getChildren(), $query); + + $results = $results->merge($childResults); + } + } + + return $results; + } + + /** + * Determine if the menu item matches the query. + */ + protected function matchesQuery(MenuItem $item, string $query): bool + { + $query = strtolower($query); + $url = strtolower($item->getUrl()); + + if ( + ! $url + || ! str_contains($url, $query) + ) { + return false; + } + + return true; + } + + /** + * Get the settings configuration. + */ + protected function getSettingsConfig(): Collection + { + return menu() + ->getItems('admin') + ->filter(fn (MenuItem $item) => $item->getKey() === 'settings'); + } +} diff --git a/packages/Webkul/Admin/src/Http/Controllers/Settings/SourceController.php b/packages/Webkul/Admin/src/Http/Controllers/Settings/SourceController.php new file mode 100755 index 0000000..861016c --- /dev/null +++ b/packages/Webkul/Admin/src/Http/Controllers/Settings/SourceController.php @@ -0,0 +1,117 @@ +ajax()) { + return datagrid(SourceDataGrid::class)->process(); + } + + return view('admin::settings.sources.index'); + } + + /** + * Store a newly created resource in storage. + */ + public function store(): JsonResponse + { + $this->validate(request(), [ + 'name' => ['required', 'unique:lead_sources,name'], + ]); + + Event::dispatch('settings.source.create.before'); + + $source = $this->sourceRepository->create(request()->only(['name'])); + + Event::dispatch('settings.source.create.after', $source); + + return new JsonResponse([ + 'data' => $source, + 'message' => trans('admin::app.settings.sources.index.create-success'), + ]); + } + + /** + * Show the form for editing the specified resource. + */ + public function edit(int $id): View|JsonResponse + { + $source = $this->sourceRepository->findOrFail($id); + + return new JsonResponse([ + 'data' => $source, + ]); + } + + /** + * Update the specified resource in storage. + */ + public function update(int $id): JsonResponse + { + $this->validate(request(), [ + 'name' => 'required|unique:lead_sources,name,'.$id, + ]); + + Event::dispatch('settings.source.update.before', $id); + + $source = $this->sourceRepository->update(request()->only(['name']), $id); + + Event::dispatch('settings.source.update.after', $source); + + return new JsonResponse([ + 'data' => $source, + 'message' => trans('admin::app.settings.sources.index.update-success'), + ]); + } + + /** + * Remove the specified resource from storage. + */ + public function destroy(int $id): JsonResponse + { + $source = $this->sourceRepository->findOrFail($id); + + if ($source->leads()->count() > 0) { + return new JsonResponse([ + 'message' => trans('admin::app.settings.sources.index.delete-failed-associated-leads'), + ], 400); + } + + try { + Event::dispatch('settings.source.delete.before', $id); + + $source->delete(); + + Event::dispatch('settings.source.delete.after', $id); + + return new JsonResponse([ + 'message' => trans('admin::app.settings.sources.index.delete-success'), + ], 200); + } catch (Exception $exception) { + return new JsonResponse([ + 'message' => trans('admin::app.settings.sources.index.delete-failed'), + ], 400); + } + } +} diff --git a/packages/Webkul/Admin/src/Http/Controllers/Settings/TagController.php b/packages/Webkul/Admin/src/Http/Controllers/Settings/TagController.php new file mode 100755 index 0000000..ed4b3bc --- /dev/null +++ b/packages/Webkul/Admin/src/Http/Controllers/Settings/TagController.php @@ -0,0 +1,161 @@ +ajax()) { + return datagrid(TagDataGrid::class)->process(); + } + + return view('admin::settings.tags.index'); + } + + /** + * Store a newly created resource in storage. + */ + public function store(): JsonResponse + { + $this->validate(request(), [ + 'name' => ['required', 'unique:tags,name', 'max:50'], + ]); + + Event::dispatch('settings.tag.create.before'); + + $tag = $this->tagRepository->create(array_merge(request()->only([ + 'name', + 'color', + ]), [ + 'user_id' => auth()->guard('user')->user()->id, + ])); + + Event::dispatch('settings.tag.create.after', $tag); + + return new JsonResponse([ + 'data' => new TagResource($tag), + 'message' => trans('admin::app.settings.tags.index.create-success'), + ]); + } + + /** + * Show the form for editing the specified tag. + */ + public function edit(int $id): View|JsonResponse + { + $tag = $this->tagRepository->findOrFail($id); + + return new JsonResponse([ + 'data' => $tag, + ]); + } + + /** + * Update the specified tag in storage. + */ + public function update(int $id): JsonResponse + { + $this->validate(request(), [ + 'name' => 'required|max:50|unique:tags,name,'.$id, + ]); + + Event::dispatch('settings.tag.update.before', $id); + + $tag = $this->tagRepository->update(request()->only([ + 'name', + 'color', + ]), $id); + + Event::dispatch('settings.tag.update.after', $tag); + + return new JsonResponse([ + 'data' => new TagResource($tag), + 'message' => trans('admin::app.settings.tags.index.update-success'), + ]); + } + + /** + * Remove the specified type from storage. + */ + public function destroy(int $id): JsonResponse + { + $tag = $this->tagRepository->findOrFail($id); + + try { + Event::dispatch('settings.tag.delete.before', $id); + + $tag->delete($id); + + Event::dispatch('settings.tag.delete.after', $id); + + return new JsonResponse([ + 'message' => trans('admin::app.settings.tags.index.delete-success'), + ], 200); + } catch (\Exception $exception) { + return new JsonResponse([ + 'message' => trans('admin::app.settings.tags.index.delete-failed'), + ], 400); + } + } + + /** + * Search tag results + * + * @return \Illuminate\Http\Response + */ + public function search() + { + $tags = $this->tagRepository + ->pushCriteria(app(RequestCriteria::class)) + ->all(); + + return TagResource::collection($tags); + } + + /** + * Mass Delete the specified resources. + */ + public function massDestroy(MassDestroyRequest $massDestroyRequest): JsonResponse + { + $indices = $massDestroyRequest->input('indices'); + + try { + foreach ($indices as $index) { + Event::dispatch('settings.tag.delete.before', $index); + + $this->tagRepository->delete($index); + + Event::dispatch('settings.tag.delete.after', $index); + } + + return new JsonResponse([ + 'message' => trans('admin::app.customers.reviews.index.datagrid.mass-delete-success'), + ], 200); + } catch (\Exception $e) { + return new JsonResponse([ + 'message' => $e->getMessage(), + ], 500); + } + } +} diff --git a/packages/Webkul/Admin/src/Http/Controllers/Settings/TypeController.php b/packages/Webkul/Admin/src/Http/Controllers/Settings/TypeController.php new file mode 100755 index 0000000..a14203d --- /dev/null +++ b/packages/Webkul/Admin/src/Http/Controllers/Settings/TypeController.php @@ -0,0 +1,110 @@ +ajax()) { + return datagrid(TypeDataGrid::class)->process(); + } + + return view('admin::settings.types.index'); + } + + /** + * Store a newly created type in storage. + */ + public function store(): JsonResponse + { + $this->validate(request(), [ + 'name' => ['required', 'unique:lead_types,name'], + ]); + + Event::dispatch('settings.type.create.before'); + + $type = $this->typeRepository->create(request()->only(['name'])); + + Event::dispatch('settings.type.create.after', $type); + + return new JsonResponse([ + 'data' => $type, + 'message' => trans('admin::app.settings.types.index.create-success'), + ]); + } + + /** + * Show the form for editing the specified type. + */ + public function edit(int $id): View|JsonResponse + { + $type = $this->typeRepository->findOrFail($id); + + return new JsonResponse([ + 'data' => $type, + ]); + } + + /** + * Update the specified type in storage. + */ + public function update(int $id): JsonResponse + { + $this->validate(request(), [ + 'name' => 'required|unique:lead_types,name,'.$id, + ]); + + Event::dispatch('settings.type.update.before', $id); + + $type = $this->typeRepository->update(request()->only(['name']), $id); + + Event::dispatch('settings.type.update.after', $type); + + return new JsonResponse([ + 'data' => $type, + 'message' => trans('admin::app.settings.types.index.update-success'), + ]); + } + + /** + * Remove the specified type from storage. + */ + public function destroy(int $id): JsonResponse + { + $type = $this->typeRepository->findOrFail($id); + + try { + Event::dispatch('settings.type.delete.before', $id); + + $type->delete($id); + + Event::dispatch('settings.type.delete.after', $id); + + return new JsonResponse([ + 'message' => trans('admin::app.settings.types.index.delete-success'), + ], 200); + } catch (\Exception $exception) { + return new JsonResponse([ + 'message' => trans('admin::app.settings.types.index.delete-failed'), + ], 400); + } + } +} diff --git a/packages/Webkul/Admin/src/Http/Controllers/Settings/UserController.php b/packages/Webkul/Admin/src/Http/Controllers/Settings/UserController.php new file mode 100755 index 0000000..8d9943d --- /dev/null +++ b/packages/Webkul/Admin/src/Http/Controllers/Settings/UserController.php @@ -0,0 +1,260 @@ +ajax()) { + return datagrid(UserDataGrid::class)->process(); + } + + $roles = $this->roleRepository->all(); + + $groups = $this->groupRepository->all(); + + return view('admin::settings.users.index', compact('roles', 'groups')); + } + + /** + * Store a newly created resource in storage. + */ + public function store(): View|JsonResponse + { + $this->validate(request(), [ + 'email' => 'required|email|unique:users,email', + 'name' => 'required', + 'password' => 'nullable', + 'confirm_password' => 'nullable|required_with:password|same:password', + 'role_id' => 'required', + 'status' => 'boolean|in:0,1', + 'view_permission' => 'string|in:global,group,individual', + ]); + + $data = request()->all(); + + if ( + isset($data['password']) + && $data['password'] + ) { + $data['password'] = bcrypt($data['password']); + } + + Event::dispatch('settings.user.create.before'); + + $admin = $this->userRepository->create($data); + + $admin->groups()->sync($data['groups'] ?? []); + + try { + Mail::queue(new UserCreatedNotification($admin)); + } catch (\Exception $e) { + report($e); + } + + Event::dispatch('settings.user.create.after', $admin); + + return new JsonResponse([ + 'data' => $admin, + 'message' => trans('admin::app.settings.users.index.create-success'), + ]); + } + + /** + * Show the form for editing the specified resource. + */ + public function edit(int $id): View|JsonResponse + { + $admin = $this->userRepository->with(['role', 'groups'])->findOrFail($id); + + return new JsonResponse([ + 'data' => $admin, + ]); + } + + /** + * Update the specified resource in storage. + */ + public function update(int $id): JsonResponse + { + $this->validate(request(), [ + 'email' => 'required|email|unique:users,email,'.$id, + 'name' => 'required|string', + 'password' => 'nullable|string|min:6', + 'confirm_password' => 'nullable|required_with:password|same:password', + 'role_id' => 'required|integer|exists:roles,id', + 'status' => 'nullable|boolean|in:0,1', + 'view_permission' => 'required|string|in:global,group,individual', + ]); + + $data = request()->all(); + + if (empty($data['password'])) { + $data = Arr::except($data, ['password', 'confirm_password']); + } else { + $data['password'] = bcrypt($data['password']); + } + + $authUser = auth()->guard('user')->user(); + + if ($authUser->id == $id) { + $data['status'] = true; + } + + Event::dispatch('settings.user.update.before', $id); + + $admin = $this->userRepository->update($data, $id); + + $admin->groups()->sync($data['groups'] ?? []); + + Event::dispatch('settings.user.update.after', $admin); + + return new JsonResponse([ + 'data' => $admin, + 'message' => trans('admin::app.settings.users.index.update-success'), + ]); + } + + /** + * Search user results. + */ + public function search(): JsonResource + { + $users = $this->userRepository + ->pushCriteria(app(RequestCriteria::class)) + ->all(); + + return UserResource::collection($users); + } + + /** + * Destroy specified user. + */ + public function destroy(int $id): JsonResponse + { + if ($this->userRepository->count() == 1) { + return new JsonResponse([ + 'message' => trans('admin::app.settings.users.index.last-delete-error'), + ], 400); + } + + try { + Event::dispatch('user.admin.delete.before', $id); + + $this->userRepository->delete($id); + + Event::dispatch('user.admin.delete.after', $id); + + return new JsonResponse([ + 'message' => trans('admin::app.settings.users.index.delete-success'), + ], 200); + } catch (\Exception $e) { + } + + return new JsonResponse([ + 'message' => trans('admin::app.settings.users.index.delete-failed'), + ], 500); + } + + /** + * Mass Update the specified resources. + */ + public function massUpdate(MassUpdateRequest $massDestroyRequest): JsonResponse + { + $count = 0; + + $users = $this->userRepository->findWhereIn('id', $massDestroyRequest->input('indices')); + + foreach ($users as $users) { + if (auth()->guard('user')->user()->id == $users->id) { + continue; + } + + Event::dispatch('settings.user.update.before', $users->id); + + $this->userRepository->update([ + 'status' => $massDestroyRequest->input('value'), + ], $users->id); + + Event::dispatch('settings.user.update.after', $users->id); + + $count++; + } + + if (! $count) { + return response()->json([ + 'message' => trans('admin::app.settings.users.index.mass-update-failed'), + ], 400); + } + + return response()->json([ + 'message' => trans('admin::app.settings.users.index.mass-update-success'), + ]); + } + + /** + * Mass Delete the specified resources. + */ + public function massDestroy(MassDestroyRequest $massDestroyRequest): JsonResponse + { + $count = 0; + + $users = $this->userRepository->findWhereIn('id', $massDestroyRequest->input('indices')); + + foreach ($users as $user) { + if (auth()->guard('user')->user()->id == $user->id) { + continue; + } + + Event::dispatch('settings.user.delete.before', $user->id); + + $this->userRepository->delete($user->id); + + Event::dispatch('settings.user.delete.after', $user->id); + + $count++; + } + + if (! $count) { + return response()->json([ + 'message' => trans('admin::app.settings.users.index.mass-delete-failed'), + ], 400); + } + + return response()->json([ + 'message' => trans('admin::app.settings.users.index.mass-delete-success'), + ]); + } +} diff --git a/packages/Webkul/Admin/src/Http/Controllers/Settings/Warehouse/ActivityController.php b/packages/Webkul/Admin/src/Http/Controllers/Settings/Warehouse/ActivityController.php new file mode 100644 index 0000000..5f710ba --- /dev/null +++ b/packages/Webkul/Admin/src/Http/Controllers/Settings/Warehouse/ActivityController.php @@ -0,0 +1,45 @@ +activityRepository + ->leftJoin('warehouse_activities', 'activities.id', '=', 'warehouse_activities.activity_id') + ->where('warehouse_activities.warehouse_id', $id) + ->get(); + + return ActivityResource::collection($this->concatEmail($activities)); + } + + /** + * Store a newly created resource in storage. + */ + public function concatEmail($activities) + { + return $activities->sortByDesc('id')->sortByDesc('created_at'); + } +} diff --git a/packages/Webkul/Admin/src/Http/Controllers/Settings/Warehouse/TagController.php b/packages/Webkul/Admin/src/Http/Controllers/Settings/Warehouse/TagController.php new file mode 100644 index 0000000..1d13297 --- /dev/null +++ b/packages/Webkul/Admin/src/Http/Controllers/Settings/Warehouse/TagController.php @@ -0,0 +1,61 @@ +warehouseRepository->find($id); + + if (! $warehouse->tags->contains(request()->input('tag_id'))) { + $warehouse->tags()->attach(request()->input('tag_id')); + } + + Event::dispatch('warehouse.tag.create.after', $warehouse); + + return response()->json([ + 'message' => trans('admin::app.warehouse.view.tags.create-success'), + ]); + } + + /** + * Remove the specified resource from storage. + * + * @param int $warehouseId + * @return \Illuminate\Http\Response + */ + public function detach($warehouseId) + { + Event::dispatch('warehouse.tag.delete.before', $warehouseId); + + $warehouse = $this->warehouseRepository->find($warehouseId); + + $warehouse->tags()->detach(request()->input('tag_id')); + + Event::dispatch('warehouse.tag.delete.after', $warehouse); + + return response()->json([ + 'message' => trans('admin::app.leads.view.tags.destroy-success'), + ]); + } +} diff --git a/packages/Webkul/Admin/src/Http/Controllers/Settings/Warehouse/WarehouseController.php b/packages/Webkul/Admin/src/Http/Controllers/Settings/Warehouse/WarehouseController.php new file mode 100644 index 0000000..ef96bc5 --- /dev/null +++ b/packages/Webkul/Admin/src/Http/Controllers/Settings/Warehouse/WarehouseController.php @@ -0,0 +1,159 @@ +request->add(['entity_type' => 'warehouses']); + } + + /** + * Display a listing of the resource. + */ + public function index(): View|JsonResponse + { + if (request()->ajax()) { + return datagrid(WarehouseDataGrid::class)->process(); + } + + return view('admin::settings.warehouses.index'); + } + + /** + * Search location results + */ + public function search(): JsonResponse + { + $results = $this->warehouseRepository + ->pushCriteria(app(RequestCriteria::class)) + ->all(); + + return response()->json($results); + } + + /** + * Display a listing of the product resource. + */ + public function products(int $id) + { + if (request()->ajax()) { + return datagrid(ProductDataGrid::class)->process(); + } + + $warehouse = $this->warehouseRepository->findOrFail($id); + + return view('admin::settings.warehouses.products', compact('warehouse')); + } + + /** + * Show the form for creating a new resource. + */ + public function create(): View + { + return view('admin::settings.warehouses.create'); + } + + /** + * Store a newly created resource in storage. + */ + public function store(AttributeForm $request): RedirectResponse + { + Event::dispatch('settings.warehouse.create.before'); + + $warehouse = $this->warehouseRepository->create($request->all()); + + Event::dispatch('settings.warehouse.create.after', $warehouse); + + session()->flash('success', trans('admin::app.settings.warehouses.index.create-success')); + + return redirect()->route('admin.settings.warehouses.index'); + } + + /** + * Show the form for viewing the specified resource. + */ + public function view(int $id): View + { + $warehouse = $this->warehouseRepository->findOrFail($id); + + return view('admin::settings.warehouses.view', compact('warehouse')); + } + + /** + * Show the form for editing the specified resource. + * + * @param int $id + * @return \Illuminate\View\View + */ + public function edit($id) + { + $warehouse = $this->warehouseRepository->findOrFail($id); + + return view('admin::settings.warehouses.edit', compact('warehouse')); + } + + /** + * Update the specified resource in storage. + */ + public function update(AttributeForm $request, int $id): RedirectResponse|JsonResponse + { + Event::dispatch('settings.warehouse.update.before', $id); + + $warehouse = $this->warehouseRepository->update($request->all(), $id); + + Event::dispatch('settings.warehouse.update.after', $warehouse); + + if (request()->ajax()) { + return response()->json([ + 'data' => $warehouse, + 'message' => trans('admin::app.settings.warehouses.index.update-success'), + ]); + } + + session()->flash('success', trans('admin::app.settings.warehouses.index.update-success')); + + return redirect()->route('admin.settings.warehouses.index'); + } + + /** + * Remove the specified resource from storage. + */ + public function destroy(int $id): JsonResponse + { + $this->warehouseRepository->findOrFail($id); + + try { + Event::dispatch('settings.warehouse.delete.before', $id); + + $this->warehouseRepository->delete($id); + + Event::dispatch('settings.warehouse.delete.after', $id); + + return response()->json([ + 'message' => trans('admin::app.settings.warehouses.index.delete-success'), + ], 200); + } catch (\Exception $exception) { + return response()->json([ + 'message' => trans('admin::app.settings.warehouses.index.delete-success'), + ], 400); + } + } +} diff --git a/packages/Webkul/Admin/src/Http/Controllers/Settings/WebFormController.php b/packages/Webkul/Admin/src/Http/Controllers/Settings/WebFormController.php new file mode 100644 index 0000000..44e1aaa --- /dev/null +++ b/packages/Webkul/Admin/src/Http/Controllers/Settings/WebFormController.php @@ -0,0 +1,159 @@ +ajax()) { + return datagrid(WebFormDataGrid::class)->process(); + } + + return view('admin::settings.web-forms.index'); + } + + /** + * Show the form for creating a new resource. + */ + public function create(): View + { + $tempAttributes = $this->attributeRepository->findWhereIn('entity_type', ['persons', 'leads']); + + $attributes = []; + + foreach ($tempAttributes as $attribute) { + if ( + $attribute->entity_type == 'persons' + && in_array($attribute->code, ['name', 'emails', 'contact_numbers']) + ) { + $attributes['default'][] = $attribute; + } else { + $attributes['other'][] = $attribute; + } + } + + return view('admin::settings.web-forms.create', compact('attributes')); + } + + /** + * Store a newly created email templates in storage. + */ + public function store(): RedirectResponse + { + $this->validate(request(), [ + 'title' => 'required', + 'submit_button_label' => 'required', + 'submit_success_action' => 'required', + 'submit_success_content' => 'required', + ]); + + Event::dispatch('settings.web_forms.create.before'); + + $data = request()->all(); + + $webForm = $this->webFormRepository->create($data); + + Event::dispatch('settings.web_forms.create.after', $webForm); + + session()->flash('success', trans('admin::app.settings.webforms.index.create-success')); + + return redirect()->route('admin.settings.web_forms.index'); + } + + /** + * Show the form for editing the specified email template. + */ + public function edit(int $id): View + { + $webForm = $this->webFormRepository->findOrFail($id); + + $attributes = $this->attributeRepository->findWhere([ + ['entity_type', 'IN', ['persons', 'leads']], + ['id', 'NOTIN', $webForm->attributes()->pluck('attribute_id')->toArray()], + ]); + + return view('admin::settings.web-forms.edit', compact('webForm', 'attributes')); + } + + /** + * Update the specified email template in storage. + */ + public function update(int $id): RedirectResponse + { + $this->validate(request(), [ + 'title' => 'required', + 'submit_button_label' => 'required', + 'submit_success_action' => 'required', + 'submit_success_content' => 'required', + ]); + + Event::dispatch('settings.web_forms.update.before', $id); + + $data = request()->all(); + + $webForm = $this->webFormRepository->update($data, $id); + + Event::dispatch('settings.web_forms.update.after', $webForm); + + session()->flash('success', trans('admin::app.settings.webforms.index.update-success')); + + return redirect()->route('admin.settings.web_forms.index'); + } + + /** + * Remove the specified email template from storage. + */ + public function destroy(int $id): JsonResponse + { + $webForm = $this->webFormRepository->findOrFail($id); + + try { + Event::dispatch('settings.web_forms.delete.before', $id); + + $webForm->delete($id); + + Event::dispatch('settings.web_forms.delete.after', $id); + + return response()->json([ + 'message' => trans('admin::app.settings.webforms.index.delete-success'), + ]); + } catch (\Exception $exception) { + return response()->json([ + 'message' => trans('admin::app.settings.webforms.index.delete-failed'), + ], 400); + } + } +} diff --git a/packages/Webkul/Admin/src/Http/Controllers/Settings/WebhookController.php b/packages/Webkul/Admin/src/Http/Controllers/Settings/WebhookController.php new file mode 100644 index 0000000..8806f93 --- /dev/null +++ b/packages/Webkul/Admin/src/Http/Controllers/Settings/WebhookController.php @@ -0,0 +1,97 @@ +ajax()) { + return datagrid(WebhookDataGrid::class)->process(); + } + + return view('admin::settings.webhook.index'); + } + + /** + * Show the form for creating a new resource. + */ + public function create(): View + { + return view('admin::settings.webhook.create'); + } + + /** + * Store the newly created resource in storage. + */ + public function store(WebhookRequest $webhookRequest): RedirectResponse + { + Event::dispatch('settings.webhook.create.before'); + + $webhook = $this->webhookRepository->create($webhookRequest->validated()); + + Event::dispatch('settings.webhook.create.after', $webhook); + + session()->flash('success', trans('admin::app.settings.webhooks.index.create-success')); + + return redirect()->route('admin.settings.webhooks.index'); + } + + /** + * Store the newly created resource in storage. + */ + public function edit(int $id): View + { + $webhook = $this->webhookRepository->findOrFail($id); + + return view('admin::settings.webhook.edit', compact('webhook')); + } + + /** + * Update the specified resource in storage. + */ + public function update(WebhookRequest $webhookRequest, int $id): RedirectResponse + { + Event::dispatch('settings.webhook.update.before', $id); + + $webhook = $this->webhookRepository->update($webhookRequest->validated(), $id); + + Event::dispatch('settings.webhook.update.after', $webhook); + + session()->flash('success', trans('admin::app.settings.webhooks.index.update-success')); + + return redirect()->route('admin.settings.webhooks.index'); + } + + /** + * Remove the specified resource from storage. + */ + public function destroy(int $id): JsonResponse + { + $webhook = $this->webhookRepository->findOrFail($id); + + Event::dispatch('settings.webhook.delete.before', $id); + + $webhook?->delete(); + + Event::dispatch('settings.webhook.delete.after', $id); + + return response()->json([ + 'message' => trans('admin::app.settings.webhooks.index.delete-success'), + ]); + } +} diff --git a/packages/Webkul/Admin/src/Http/Controllers/Settings/WorkflowController.php b/packages/Webkul/Admin/src/Http/Controllers/Settings/WorkflowController.php new file mode 100755 index 0000000..4a64beb --- /dev/null +++ b/packages/Webkul/Admin/src/Http/Controllers/Settings/WorkflowController.php @@ -0,0 +1,119 @@ +ajax()) { + return datagrid(WorkflowDataGrid::class)->process(); + } + + return view('admin::settings.workflows.index'); + } + + /** + * Show the form for creating a new resource. + */ + public function create(): View + { + return view('admin::settings.workflows.create'); + } + + /** + * Store a newly created workflow in storage. + */ + public function store(): RedirectResponse + { + $this->validate(request(), [ + 'name' => 'required', + ]); + + Event::dispatch('settings.workflow.create.before'); + + $workflow = $this->workflowRepository->create(request()->all()); + + Event::dispatch('settings.workflow.create.after', $workflow); + + session()->flash('success', trans('admin::app.settings.workflows.index.create-success')); + + return redirect()->route('admin.settings.workflows.index'); + } + + /** + * Show the form for editing the specified workflow. + */ + public function edit(int $id): View + { + $workflow = $this->workflowRepository->findOrFail($id); + + return view('admin::settings.workflows.edit', compact('workflow')); + } + + /** + * Update the specified workflow in storage. + */ + public function update(int $id): RedirectResponse + { + $this->validate(request(), [ + 'name' => 'required', + ]); + + Event::dispatch('settings.workflow.update.before', $id); + + $workflow = $this->workflowRepository->update(request()->all(), $id); + + Event::dispatch('settings.workflow.update.after', $workflow); + + session()->flash('success', trans('admin::app.settings.workflows.index.update-success')); + + return redirect()->route('admin.settings.workflows.index'); + } + + /** + * Remove the specified workflow from storage. + */ + public function destroy(int $id): JsonResponse + { + $workflow = $this->workflowRepository->findOrFail($id); + + try { + Event::dispatch('settings.workflow.delete.before', $id); + + $workflow->delete($id); + + Event::dispatch('settings.workflow.delete.after', $id); + + return response()->json([ + 'message' => trans('admin::app.settings.workflows.index.delete-success'), + ], 200); + } catch (\Exception $exception) { + return response()->json([ + 'message' => trans('admin::app.settings.workflows.index.delete-failed'), + ], 400); + } + + return response()->json([ + 'message' => trans('admin::app.settings.workflows.index.delete-failed'), + ], 400); + } +} diff --git a/packages/Webkul/Admin/src/Http/Controllers/TinyMCEController.php b/packages/Webkul/Admin/src/Http/Controllers/TinyMCEController.php new file mode 100644 index 0000000..bb82f57 --- /dev/null +++ b/packages/Webkul/Admin/src/Http/Controllers/TinyMCEController.php @@ -0,0 +1,62 @@ +storeMedia(); + + if (! empty($media)) { + return response()->json([ + 'location' => $media['file_url'], + ]); + } + + return response()->json([]); + } + + /** + * Store media. + */ + public function storeMedia(): array + { + if (! request()->hasFile('file')) { + return []; + } + + $file = request()->file('file'); + + if (! $file instanceof UploadedFile) { + return []; + } + + $filename = md5($file->getClientOriginalName().time()).'.'.$file->getClientOriginalExtension(); + + $path = $file->storeAs($this->storagePath, $filename); + + $this->sanitizeSVG($path, $file); + + return [ + 'file' => $path, + 'file_name' => $file->getClientOriginalName(), + 'file_url' => Storage::url($path), + ]; + } +} diff --git a/packages/Webkul/Admin/src/Http/Controllers/User/AccountController.php b/packages/Webkul/Admin/src/Http/Controllers/User/AccountController.php new file mode 100755 index 0000000..e882409 --- /dev/null +++ b/packages/Webkul/Admin/src/Http/Controllers/User/AccountController.php @@ -0,0 +1,96 @@ +guard('user')->user(); + + return view('admin::user.account.edit', compact('user')); + } + + /** + * Update the specified resource in storage. + * + * @return \Illuminate\Http\Response + */ + public function update() + { + $user = auth()->guard('user')->user(); + + $this->validate(request(), [ + 'name' => 'required', + 'email' => 'email|unique:users,email,'.$user->id, + 'password' => 'nullable|min:6|confirmed', + 'current_password' => 'required|min:6', + 'image.*' => 'nullable|mimes:bmp,jpeg,jpg,png,webp', + ]); + + $data = request()->only([ + 'name', + 'email', + 'password', + 'password_confirmation', + 'current_password', + 'image', + ]); + + if (! Hash::check($data['current_password'], $user->password)) { + session()->flash('warning', trans('admin::app.account.edit.invalid-password')); + + return redirect()->back(); + } + + if (isset($data['role_id']) || isset($data['view_permission'])) { + session()->flash('warning', trans('admin::app.user.account.permission-denied')); + + return redirect()->back(); + } + + $isPasswordChanged = false; + + if (! $data['password']) { + unset($data['password']); + } else { + $isPasswordChanged = true; + + $data['password'] = bcrypt($data['password']); + } + + if (request()->hasFile('image')) { + $data['image'] = current(request()->file('image'))->store('admins/'.$user->id); + } else { + if (! isset($data['image'])) { + if (! empty($data['image'])) { + Storage::delete($user->image); + } + + $data['image'] = null; + } else { + $data['image'] = $user->image; + } + } + + $user->update($data); + + if ($isPasswordChanged) { + Event::dispatch('user.account.update-password', $user); + } + + session()->flash('success', trans('admin::app.account.edit.update-success')); + + return back(); + } +} diff --git a/packages/Webkul/Admin/src/Http/Controllers/User/ForgotPasswordController.php b/packages/Webkul/Admin/src/Http/Controllers/User/ForgotPasswordController.php new file mode 100755 index 0000000..70441f0 --- /dev/null +++ b/packages/Webkul/Admin/src/Http/Controllers/User/ForgotPasswordController.php @@ -0,0 +1,77 @@ +guard('user')->check()) { + return redirect()->route('admin.dashboard.index'); + } else { + if (strpos(url()->previous(), 'user') !== false) { + $intendedUrl = url()->previous(); + } else { + $intendedUrl = route('admin.dashboard.index'); + } + + session()->put('url.intended', $intendedUrl); + + return view('admin::sessions.forgot-password'); + } + } + + /** + * Store a newly created resource in storage. + * + * @return \Illuminate\Http\Response + */ + public function store() + { + try { + $this->validate(request(), [ + 'email' => 'required|email', + ]); + + $response = $this->broker()->sendResetLink(request(['email']), function ($user, $token) { + $user->notify(new UserResetPassword($token)); + }); + + if ($response == Password::RESET_LINK_SENT) { + session()->flash('success', trans('admin::app.users.forget-password.create.reset-link-sent')); + + return back(); + } + + return back() + ->withInput(request(['email'])) + ->withErrors([ + 'email' => trans('admin::app.users.forget-password.create.email-not-exist'), + ]); + } catch (\Exception $exception) { + session()->flash('error', trans($exception->getMessage())); + + return redirect()->back(); + } + } + + /** + * Get the broker to be used during password reset. + * + * @return \Illuminate\Contracts\Auth\PasswordBroker + */ + public function broker() + { + return Password::broker('users'); + } +} diff --git a/packages/Webkul/Admin/src/Http/Controllers/User/ResetPasswordController.php b/packages/Webkul/Admin/src/Http/Controllers/User/ResetPasswordController.php new file mode 100755 index 0000000..5544a86 --- /dev/null +++ b/packages/Webkul/Admin/src/Http/Controllers/User/ResetPasswordController.php @@ -0,0 +1,97 @@ +with([ + 'token' => $token, + 'email' => request('email'), + ]); + } + + /** + * Store a newly created resource in storage. + * + * @return \Illuminate\Http\Response + */ + public function store() + { + try { + $this->validate(request(), [ + 'token' => 'required', + 'email' => 'required|email', + 'password' => 'required|confirmed|min:6', + ]); + + $response = $this->broker()->reset( + request(['email', 'password', 'password_confirmation', 'token']), function ($admin, $password) { + $this->resetPassword($admin, $password); + } + ); + + if ($response == Password::PASSWORD_RESET) { + return redirect()->route('admin.dashboard.index'); + } + + return back() + ->withInput(request(['email'])) + ->withErrors([ + 'email' => trans($response), + ]); + } catch (\Exception $exception) { + session()->flash('error', trans($exception->getMessage())); + + return redirect()->back(); + } + } + + /** + * Reset the given admin's password. + * + * @param \Illuminate\Contracts\Auth\CanResetPassword $admin + * @param string $password + * @return void + */ + protected function resetPassword($admin, $password) + { + $admin->password = Hash::make($password); + + $admin->setRememberToken(Str::random(60)); + + $admin->save(); + + event(new PasswordReset($admin)); + + auth()->guard('user')->login($admin); + } + + /** + * Get the broker to be used during password reset. + * + * @return \Illuminate\Contracts\Auth\PasswordBroker + */ + public function broker() + { + return Password::broker('users'); + } +} diff --git a/packages/Webkul/Admin/src/Http/Controllers/User/SessionController.php b/packages/Webkul/Admin/src/Http/Controllers/User/SessionController.php new file mode 100755 index 0000000..81771b9 --- /dev/null +++ b/packages/Webkul/Admin/src/Http/Controllers/User/SessionController.php @@ -0,0 +1,117 @@ +guard('user')->check()) { + return redirect()->route('admin.dashboard.index'); + } + + $previousUrl = url()->previous(); + + $intendedUrl = str_contains($previousUrl, 'admin') + ? $previousUrl + : route('admin.dashboard.index'); + + session()->put('url.intended', $intendedUrl); + + return view('admin::sessions.login'); + } + + /** + * Store a newly created resource in storage. + */ + public function store(): RedirectResponse + { + $this->validate(request(), [ + 'email' => 'required|email', + 'password' => 'required', + ]); + + if (! auth()->guard('user')->attempt(request(['email', 'password']), request('remember'))) { + session()->flash('error', trans('admin::app.users.login-error')); + + return redirect()->back(); + } + + if (auth()->guard('user')->user()->status == 0) { + session()->flash('warning', trans('admin::app.users.activate-warning')); + + auth()->guard('user')->logout(); + + return redirect()->route('admin.session.create'); + } + + $menus = menu()->getItems('admin'); + + $availableNextMenu = $menus?->first(); + + if (! bouncer()->hasPermission('dashboard')) { + if (is_null($availableNextMenu)) { + session()->flash('error', trans('admin::app.users.not-permission')); + + auth()->guard('user')->logout(); + + return redirect()->route('admin.session.create'); + } + + return redirect()->to($availableNextMenu->getUrl()); + } + + $hasAccessToIntendedUrl = $this->canAccessIntendedUrl($menus, redirect()->getIntendedUrl()); + + if ($hasAccessToIntendedUrl) { + return redirect()->intended(route('admin.dashboard.index')); + } + + return redirect()->to($availableNextMenu->getUrl()); + } + + /** + * Remove the specified resource from storage. + */ + public function destroy(): RedirectResponse + { + auth()->guard('user')->logout(); + + return redirect()->route('admin.session.create'); + } + + /** + * Find menu item by URL. + */ + protected function canAccessIntendedUrl(Collection $menus, ?string $url): ?MenuItem + { + if (is_null($url)) { + return null; + } + + foreach ($menus as $menu) { + if ($menu->getUrl() === $url) { + return $menu; + } + + if ($menu->haveChildren()) { + $found = $this->canAccessIntendedUrl($menu->getChildren(), $url); + + if ($found) { + return $found; + } + } + } + + return null; + } +} diff --git a/packages/Webkul/Admin/src/Http/Middleware/Bouncer.php b/packages/Webkul/Admin/src/Http/Middleware/Bouncer.php new file mode 100755 index 0000000..a9a7bbc --- /dev/null +++ b/packages/Webkul/Admin/src/Http/Middleware/Bouncer.php @@ -0,0 +1,86 @@ +guard($guard)->check()) { + return redirect()->route('admin.session.create'); + } + + /** + * If user status is changed by admin. Then session should be + * logged out. + */ + if (! (bool) auth()->guard($guard)->user()->status) { + auth()->guard($guard)->logout(); + + session()->flash('error', __('admin::app.errors.401')); + + return redirect()->route('admin.session.create'); + } + + /** + * If somehow the user deleted all permissions, then it should be + * auto logged out and need to contact the administrator again. + */ + if ($this->isPermissionsEmpty()) { + auth()->guard($guard)->logout(); + + session()->flash('error', __('admin::app.errors.401')); + + return redirect()->route('admin.session.create'); + } + + return $next($request); + } + + /** + * Check for user, if they have empty permissions or not except admin. + * + * @return bool + */ + public function isPermissionsEmpty() + { + if (! $role = auth()->guard('user')->user()->role) { + abort(401, 'This action is unauthorized.'); + } + + if ($role->permission_type === 'all') { + return false; + } + + if ($role->permission_type !== 'all' && empty($role->permissions)) { + return true; + } + + $this->checkIfAuthorized(); + + return false; + } + + /** + * Check authorization. + * + * @return null + */ + public function checkIfAuthorized() + { + $roles = acl()->getRoles(); + + if (isset($roles[Route::currentRouteName()])) { + bouncer()->allow($roles[Route::currentRouteName()]); + } + } +} diff --git a/packages/Webkul/Admin/src/Http/Middleware/Locale.php b/packages/Webkul/Admin/src/Http/Middleware/Locale.php new file mode 100644 index 0000000..a4a41a1 --- /dev/null +++ b/packages/Webkul/Admin/src/Http/Middleware/Locale.php @@ -0,0 +1,40 @@ +app = $app; + + $this->request = $request; + } + + /** + * Handle an incoming request. + * + * @param \Illuminate\Http\Request $request + * @return mixed + */ + public function handle($request, Closure $next) + { + app()->setLocale( + core()->getConfigData('general.general.locale_settings.locale') + ?: app()->getLocale() + ); + + return $next($request); + } +} diff --git a/packages/Webkul/Admin/src/Http/Requests/AttributeForm.php b/packages/Webkul/Admin/src/Http/Requests/AttributeForm.php new file mode 100644 index 0000000..a321c54 --- /dev/null +++ b/packages/Webkul/Admin/src/Http/Requests/AttributeForm.php @@ -0,0 +1,120 @@ +attributeRepository->scopeQuery(function ($query) { + $query = $query->whereIn('code', array_keys(request()->all())) + ->where('entity_type', request('entity_type')); + + if (request()->has('quick_add')) { + $query = $query->where('quick_add', 1); + } + + return $query; + })->get(); + + foreach ($attributes as $attribute) { + $validations = []; + + if ($attribute->type == 'boolean') { + continue; + } elseif ($attribute->type == 'address') { + if (! $attribute->is_required) { + continue; + } + + $validations = [ + $attribute->code.'.address' => 'required', + $attribute->code.'.country' => 'required', + $attribute->code.'.state' => 'required', + $attribute->code.'.city' => 'required', + $attribute->code.'.postcode' => 'required', + ]; + } elseif ($attribute->type == 'email') { + $validations = [ + $attribute->code => [$attribute->is_required ? 'required' : 'nullable'], + $attribute->code.'.*.value' => [$attribute->is_required ? 'required' : 'nullable', 'email'], + $attribute->code.'.*.label' => $attribute->is_required ? 'required' : 'nullable', + ]; + } elseif ($attribute->type == 'phone') { + $validations = [ + $attribute->code => [$attribute->is_required ? 'required' : 'nullable'], + $attribute->code.'.*.value' => [$attribute->is_required ? 'required' : 'nullable'], + $attribute->code.'.*.label' => $attribute->is_required ? 'required' : 'nullable', + ]; + } else { + $validations[$attribute->code] = [$attribute->is_required ? 'required' : 'nullable']; + + if ($attribute->type == 'text' && $attribute->validation) { + array_push($validations[$attribute->code], + $attribute->validation == 'decimal' + ? new Decimal + : $attribute->validation + ); + } + + if ($attribute->type == 'price') { + array_push($validations[$attribute->code], new Decimal); + } + + if ($attribute->type == 'image' && ! request($attribute->code.'.delete')) { + array_push($validations[$attribute->code], 'mimes:bmp,jpeg,jpg,png,webp'); + } + } + + if ($attribute->is_unique) { + array_push($validations[in_array($attribute->type, ['email', 'phone']) + ? $attribute->code.'.*.value' + : $attribute->code + ], function ($field, $value, $fail) use ($attribute) { + if (! $this->attributeValueRepository->isValueUnique($this->id, $attribute->entity_type, $attribute, request($field))) { + $fail('The value has already been taken.'); + } + }); + } + + $this->rules = array_merge($this->rules, $validations); + } + + return $this->rules; + } +} diff --git a/packages/Webkul/Admin/src/Http/Requests/ConfigurationForm.php b/packages/Webkul/Admin/src/Http/Requests/ConfigurationForm.php new file mode 100644 index 0000000..45f7459 --- /dev/null +++ b/packages/Webkul/Admin/src/Http/Requests/ConfigurationForm.php @@ -0,0 +1,43 @@ +input('keys', []))->mapWithKeys(function ($item) { + $data = json_decode($item, true); + + return collect($data['fields'])->mapWithKeys(function ($field) use ($data) { + $key = $data['key'].'.'.$field['name']; + + // Check delete key exist in the request + if (! $this->has($key.'.delete')) { + $validation = isset($field['validation']) && $field['validation'] ? $field['validation'] : 'nullable'; + + return [$key => $validation]; + } + + return []; + })->toArray(); + })->toArray(); + } +} diff --git a/packages/Webkul/Admin/src/Http/Requests/LeadForm.php b/packages/Webkul/Admin/src/Http/Requests/LeadForm.php new file mode 100644 index 0000000..52d5ee8 --- /dev/null +++ b/packages/Webkul/Admin/src/Http/Requests/LeadForm.php @@ -0,0 +1,158 @@ + $entityType) { + $attributes = $this->attributeRepository->scopeQuery(function ($query) use ($entityType) { + $attributeCodes = $entityType == 'persons' + ? array_keys(request('person') ?? []) + : array_keys(request()->all()); + + $query = $query->whereIn('code', $attributeCodes) + ->where('entity_type', $entityType); + + if (request()->has('quick_add')) { + $query = $query->where('quick_add', 1); + } + + return $query; + })->get(); + + foreach ($attributes as $attribute) { + if ($entityType == 'persons') { + $attribute->code = 'person.'.$attribute->code; + } + + $validations = []; + + if ($attribute->type == 'boolean') { + continue; + } elseif ($attribute->type == 'address') { + if (! $attribute->is_required) { + continue; + } + + $validations = [ + $attribute->code.'.address' => 'required', + $attribute->code.'.country' => 'required', + $attribute->code.'.state' => 'required', + $attribute->code.'.city' => 'required', + $attribute->code.'.postcode' => 'required', + ]; + } elseif ($attribute->type == 'email') { + $validations = [ + $attribute->code => [$attribute->is_required ? 'required' : 'nullable'], + $attribute->code.'.*.value' => [$attribute->is_required ? 'required' : 'nullable', 'email'], + $attribute->code.'.*.label' => $attribute->is_required ? 'required' : 'nullable', + ]; + } elseif ($attribute->type == 'phone') { + $validations = [ + $attribute->code => [$attribute->is_required ? 'required' : 'nullable'], + $attribute->code.'.*.value' => [$attribute->is_required ? 'required' : 'nullable'], + $attribute->code.'.*.label' => $attribute->is_required ? 'required' : 'nullable', + ]; + } else { + $validations[$attribute->code] = [$attribute->is_required ? 'required' : 'nullable']; + + if ($attribute->type == 'text' && $attribute->validation) { + array_push($validations[$attribute->code], + $attribute->validation == 'decimal' + ? new Decimal + : $attribute->validation + ); + } + + if ($attribute->type == 'price') { + array_push($validations[$attribute->code], new Decimal); + } + } + + if ($attribute->is_unique) { + array_push($validations[in_array($attribute->type, ['email', 'phone']) + ? $attribute->code.'.*.value' + : $attribute->code + ], function ($field, $value, $fail) use ($attribute, $entityType) { + if (! $this->attributeValueRepository->isValueUnique( + $entityType == 'persons' ? request('person.id') : $this->id, + $attribute->entity_type, + $attribute, + request($field) + ) + ) { + $fail('The value has already been taken.'); + } + }); + } + + $this->rules = array_merge($this->rules, $validations); + } + } + + $this->rules['expected_close_date'] = [ + 'date_format:Y-m-d', + 'after:'.Carbon::yesterday()->format('Y-m-d'), + ]; + + return [ + ...$this->rules, + 'products' => 'array', + 'products.*.product_id' => 'sometimes|required|exists:products,id', + 'products.*.name' => 'required_with:products.*.product_id', + 'products.*.price' => 'required_with:products.*.product_id', + 'products.*.quantity' => 'required_with:products.*.product_id', + ]; + } + + /** + * Get the validation messages that apply to the request. + */ + public function messages(): array + { + return [ + 'products.*.product_id.exists' => trans('admin::app.leads.selected-product-not-exist'), + 'products.*.name.required_with' => trans('admin::app.leads.product-name-required'), + 'products.*.price.required_with' => trans('admin::app.leads.product-price-required'), + 'products.*.quantity.required_with' => trans('admin::app.leads.product-quantity-required'), + ]; + } +} diff --git a/packages/Webkul/Admin/src/Http/Requests/MassDestroyRequest.php b/packages/Webkul/Admin/src/Http/Requests/MassDestroyRequest.php new file mode 100644 index 0000000..ea5faa3 --- /dev/null +++ b/packages/Webkul/Admin/src/Http/Requests/MassDestroyRequest.php @@ -0,0 +1,31 @@ + ['required', 'array'], + 'indices.*' => ['integer'], + ]; + } +} diff --git a/packages/Webkul/Admin/src/Http/Requests/MassUpdateRequest.php b/packages/Webkul/Admin/src/Http/Requests/MassUpdateRequest.php new file mode 100644 index 0000000..03c53a7 --- /dev/null +++ b/packages/Webkul/Admin/src/Http/Requests/MassUpdateRequest.php @@ -0,0 +1,32 @@ + ['required', 'array'], + 'indices.*' => ['integer'], + 'value' => ['required'], + ]; + } +} diff --git a/packages/Webkul/Admin/src/Http/Requests/PipelineForm.php b/packages/Webkul/Admin/src/Http/Requests/PipelineForm.php new file mode 100755 index 0000000..42ac9fb --- /dev/null +++ b/packages/Webkul/Admin/src/Http/Requests/PipelineForm.php @@ -0,0 +1,89 @@ +validatorExtensions($validationFactory); + } + + /** + * Determine if the user is authorized to make this request. + * + * @return bool + */ + public function authorize() + { + return true; + } + + /** + * Get the validation rules that apply to the request. + * + * @return array + */ + public function rules() + { + if (request('id')) { + return [ + 'name' => 'required|unique:lead_pipelines,name,'.request('id'), + 'stages.*.name' => 'unique_key', + 'stages.*.code' => 'unique_key', + ]; + } + + return [ + 'name' => 'required|unique:lead_pipelines,name', + 'rotten_days' => 'required', + 'stages.*.name' => 'unique_key', + 'stages.*.code' => 'unique_key', + ]; + } + + /** + * Get the error messages for the defined validation rules. + * + * @return array + */ + public function messages() + { + return [ + 'stages.*.name.unique_key' => __('admin::app.settings.pipelines.duplicate-name'), + ]; + } + + /** + * Place all your validator extensions here. + * + * @return void + */ + public function validatorExtensions(ValidationFactory $validationFactory) + { + $validationFactory->extend( + 'unique_key', + function ($attribute, $value, $parameters) { + $key = last(explode('.', $attribute)); + + $stages = collect(request()->get('stages'))->filter(function ($stage) use ($key, $value) { + return $stage[$key] === $value; + }); + + if ($stages->count() > 1) { + return false; + } + + return true; + } + ); + } +} diff --git a/packages/Webkul/Admin/src/Http/Requests/UserForm.php b/packages/Webkul/Admin/src/Http/Requests/UserForm.php new file mode 100755 index 0000000..e2e9d32 --- /dev/null +++ b/packages/Webkul/Admin/src/Http/Requests/UserForm.php @@ -0,0 +1,43 @@ +rules = [ + 'name' => 'required', + 'email' => 'email|unique:users,email', + 'password' => 'nullable', + 'password_confirmation' => 'nullable|required_with:password|same:password', + 'status' => 'sometimes', + 'role_id' => 'required', + ]; + + if ($this->method() == 'PUT') { + $this->rules['email'] = 'email|unique:users,email,'.$this->route('id'); + } + + return $this->rules; + } +} diff --git a/packages/Webkul/Admin/src/Http/Resources/ActivityFileResource.php b/packages/Webkul/Admin/src/Http/Resources/ActivityFileResource.php new file mode 100644 index 0000000..abfdc0d --- /dev/null +++ b/packages/Webkul/Admin/src/Http/Resources/ActivityFileResource.php @@ -0,0 +1,26 @@ + $this->id, + 'name' => $this->name, + 'path' => $this->path, + 'url' => $this->url, + 'created_at' => $this->created_at, + 'updated_at' => $this->updated_at, + ]; + } +} diff --git a/packages/Webkul/Admin/src/Http/Resources/ActivityParticipantResource.php b/packages/Webkul/Admin/src/Http/Resources/ActivityParticipantResource.php new file mode 100644 index 0000000..d67dde1 --- /dev/null +++ b/packages/Webkul/Admin/src/Http/Resources/ActivityParticipantResource.php @@ -0,0 +1,22 @@ + $this->when($this->user, new UserResource($this->user)), + 'person' => $this->when($this->person, new PersonResource($this->person)), + ]; + } +} diff --git a/packages/Webkul/Admin/src/Http/Resources/ActivityResource.php b/packages/Webkul/Admin/src/Http/Resources/ActivityResource.php new file mode 100644 index 0000000..932f9fb --- /dev/null +++ b/packages/Webkul/Admin/src/Http/Resources/ActivityResource.php @@ -0,0 +1,35 @@ + $this->id, + 'parent_id' => $this->parent_id ?? null, + 'title' => $this->title, + 'type' => $this->type, + 'comment' => $this->comment, + 'additional' => is_array($this->resource->additional) ? $this->resource->additional : json_decode($this->resource->additional, true), + 'schedule_from' => $this->schedule_from, + 'schedule_to' => $this->schedule_to, + 'is_done' => $this->is_done, + 'user' => new UserResource($this->user), + 'files' => ActivityFileResource::collection($this->files), + 'participants' => ActivityParticipantResource::collection($this->participants), + 'location' => $this->location, + 'created_at' => $this->created_at, + 'updated_at' => $this->updated_at, + ]; + } +} diff --git a/packages/Webkul/Admin/src/Http/Resources/EmailAttachmentResource.php b/packages/Webkul/Admin/src/Http/Resources/EmailAttachmentResource.php new file mode 100644 index 0000000..85d73c1 --- /dev/null +++ b/packages/Webkul/Admin/src/Http/Resources/EmailAttachmentResource.php @@ -0,0 +1,29 @@ + $this->id, + 'name' => $this->name, + 'path' => $this->path, + 'url' => $this->url, + 'size' => $this->size, + 'content_type' => $this->content_type, + 'content_id' => $this->content_id, + 'created_at' => $this->created_at, + 'updated_at' => $this->updated_at, + ]; + } +} diff --git a/packages/Webkul/Admin/src/Http/Resources/EmailResource.php b/packages/Webkul/Admin/src/Http/Resources/EmailResource.php new file mode 100644 index 0000000..2078865 --- /dev/null +++ b/packages/Webkul/Admin/src/Http/Resources/EmailResource.php @@ -0,0 +1,43 @@ + $this->id, + 'subject' => $this->subject, + 'source' => $this->source, + 'user_type' => $this->user_type, + 'name' => $this->name, + 'reply' => $this->reply, + 'is_read' => $this->is_read, + 'folders' => $this->folders, + 'from' => $this->from, + 'sender' => $this->sender, + 'reply_to' => $this->reply_to, + 'cc' => $this->cc, + 'bcc' => $this->bcc, + 'unique_id' => $this->unique_id, + 'message_id' => $this->message_id, + 'reference_ids' => $this->reference_ids, + 'person' => new PersonResource($this->person), + 'lead' => new LeadResource($this->lead), + 'parent_id' => $this->parent_id, + 'parent' => new EmailResource($this->parent), + 'attachments' => EmailAttachmentResource::collection($this->attachments), + 'created_at' => $this->created_at, + 'updated_at' => $this->updated_at, + ]; + } +} diff --git a/packages/Webkul/Admin/src/Http/Resources/LeadResource.php b/packages/Webkul/Admin/src/Http/Resources/LeadResource.php new file mode 100644 index 0000000..adac3f1 --- /dev/null +++ b/packages/Webkul/Admin/src/Http/Resources/LeadResource.php @@ -0,0 +1,37 @@ + $this->id, + 'title' => $this->title, + 'lead_value' => $this->lead_value, + 'formatted_lead_value' => core()->formatBasePrice($this->lead_value), + 'status' => $this->status, + 'expected_close_date' => $this->expected_close_date, + 'rotten_days' => $this->rotten_days, + 'closed_at' => $this->closed_at, + 'created_at' => $this->created_at, + 'updated_at' => $this->updated_at, + 'person' => new PersonResource($this->person), + 'user' => new UserResource($this->user), + 'type' => new TypeResource($this->type), + 'source' => new SourceResource($this->source), + 'pipeline' => new PipelineResource($this->pipeline), + 'stage' => new StageResource($this->stage), + 'tags' => TagResource::collection($this->tags), + ]; + } +} diff --git a/packages/Webkul/Admin/src/Http/Resources/OrganizationResource.php b/packages/Webkul/Admin/src/Http/Resources/OrganizationResource.php new file mode 100644 index 0000000..301be29 --- /dev/null +++ b/packages/Webkul/Admin/src/Http/Resources/OrganizationResource.php @@ -0,0 +1,25 @@ + $this->id, + 'name' => $this->name, + 'address' => $this->address, + 'created_at' => $this->created_at, + 'updated_at' => $this->updated_at, + ]; + } +} diff --git a/packages/Webkul/Admin/src/Http/Resources/PersonResource.php b/packages/Webkul/Admin/src/Http/Resources/PersonResource.php new file mode 100644 index 0000000..ba6cc0f --- /dev/null +++ b/packages/Webkul/Admin/src/Http/Resources/PersonResource.php @@ -0,0 +1,27 @@ + $this->id, + 'name' => $this->name, + 'emails' => $this->emails, + 'contact_numbers' => $this->contact_numbers, + 'organization' => new OrganizationResource($this->organization), + 'created_at' => $this->created_at, + 'updated_at' => $this->updated_at, + ]; + } +} diff --git a/packages/Webkul/Admin/src/Http/Resources/PipelineResource.php b/packages/Webkul/Admin/src/Http/Resources/PipelineResource.php new file mode 100644 index 0000000..e4b8514 --- /dev/null +++ b/packages/Webkul/Admin/src/Http/Resources/PipelineResource.php @@ -0,0 +1,27 @@ + $this->id, + 'name' => $this->name, + 'is_default' => $this->is_default, + 'rotten_days' => $this->rotten_days, + 'stages' => StageResource::collection($this->stages), + 'created_at' => $this->created_at, + 'updated_at' => $this->updated_at, + ]; + } +} diff --git a/packages/Webkul/Admin/src/Http/Resources/ProductResource.php b/packages/Webkul/Admin/src/Http/Resources/ProductResource.php new file mode 100644 index 0000000..c7f74a5 --- /dev/null +++ b/packages/Webkul/Admin/src/Http/Resources/ProductResource.php @@ -0,0 +1,27 @@ + $this->id, + 'name' => $this->name, + 'description' => $this->description, + 'sku' => $this->sku, + 'price' => $this->price, + 'created_at' => $this->created_at, + 'updated_at' => $this->updated_at, + ]; + } +} diff --git a/packages/Webkul/Admin/src/Http/Resources/QuoteResource.php b/packages/Webkul/Admin/src/Http/Resources/QuoteResource.php new file mode 100644 index 0000000..7b4d2bf --- /dev/null +++ b/packages/Webkul/Admin/src/Http/Resources/QuoteResource.php @@ -0,0 +1,33 @@ + $this->id, + 'subject' => $this->subject, + 'description' => $this->description, + 'billing_address' => $this->billing_address, + 'shipping_address' => $this->shipping_address, + 'discount_percent' => $this->discount_percent, + 'discount_amount' => $this->discount_amount, + 'tax_amount' => $this->tax_amount, + 'adjustment_amount' => $this->adjustment_amount, + 'sub_total' => $this->sub_total, + 'grand_total' => $this->grand_total, + 'expired_at' => $this->expired_at, + 'user' => new UserResource($this->user), + 'person' => new PersonResource($this->person), + 'leads' => LeadResource::collection($this->leads), + ]; + } +} diff --git a/packages/Webkul/Admin/src/Http/Resources/SourceResource.php b/packages/Webkul/Admin/src/Http/Resources/SourceResource.php new file mode 100644 index 0000000..3dc94a7 --- /dev/null +++ b/packages/Webkul/Admin/src/Http/Resources/SourceResource.php @@ -0,0 +1,24 @@ + $this->id, + 'name' => $this->name, + 'created_at' => $this->created_at, + 'updated_at' => $this->updated_at, + ]; + } +} diff --git a/packages/Webkul/Admin/src/Http/Resources/StageResource.php b/packages/Webkul/Admin/src/Http/Resources/StageResource.php new file mode 100644 index 0000000..e206f1c --- /dev/null +++ b/packages/Webkul/Admin/src/Http/Resources/StageResource.php @@ -0,0 +1,29 @@ + $this->id, + 'code' => $this->code, + 'name' => $this->name, + 'lead_value' => $this->lead_value, + 'formatted_lead_value' => core()->formatBasePrice($this->lead_value), + 'is_user_defined' => $this->is_user_defined, + 'sort_order' => $this->sort_order, + 'created_at' => $this->created_at, + 'updated_at' => $this->updated_at, + ]; + } +} diff --git a/packages/Webkul/Admin/src/Http/Resources/TagResource.php b/packages/Webkul/Admin/src/Http/Resources/TagResource.php new file mode 100644 index 0000000..40cd42e --- /dev/null +++ b/packages/Webkul/Admin/src/Http/Resources/TagResource.php @@ -0,0 +1,26 @@ + $this->id, + 'name' => $this->name, + 'color' => $this->color, + 'user' => new UserResource($this->user), + 'created_at' => $this->created_at, + 'updated_at' => $this->updated_at, + ]; + } +} diff --git a/packages/Webkul/Admin/src/Http/Resources/TypeResource.php b/packages/Webkul/Admin/src/Http/Resources/TypeResource.php new file mode 100644 index 0000000..5e943ef --- /dev/null +++ b/packages/Webkul/Admin/src/Http/Resources/TypeResource.php @@ -0,0 +1,24 @@ + $this->id, + 'name' => $this->name, + 'created_at' => $this->created_at, + 'updated_at' => $this->updated_at, + ]; + } +} diff --git a/packages/Webkul/Admin/src/Http/Resources/UserResource.php b/packages/Webkul/Admin/src/Http/Resources/UserResource.php new file mode 100644 index 0000000..5e29ec9 --- /dev/null +++ b/packages/Webkul/Admin/src/Http/Resources/UserResource.php @@ -0,0 +1,26 @@ + $this->id, + 'name' => $this->name, + 'email' => $this->email, + 'image' => $this->image, + 'created_at' => $this->created_at, + 'updated_at' => $this->name, + ]; + } +} diff --git a/packages/Webkul/Admin/src/Http/helpers.php b/packages/Webkul/Admin/src/Http/helpers.php new file mode 100755 index 0000000..019e620 --- /dev/null +++ b/packages/Webkul/Admin/src/Http/helpers.php @@ -0,0 +1,8 @@ +make('bouncer'); + } +} diff --git a/packages/Webkul/Admin/src/Listeners/Activity.php b/packages/Webkul/Admin/src/Listeners/Activity.php new file mode 100644 index 0000000..d2ba5ed --- /dev/null +++ b/packages/Webkul/Admin/src/Listeners/Activity.php @@ -0,0 +1,56 @@ +input('lead_id')) { + $lead = $this->leadRepository->find(request()->input('lead_id')); + + if (! $lead->activities->contains($activity->id)) { + $lead->activities()->attach($activity->id); + } + } elseif (request()->input('person_id')) { + $person = $this->personRepository->find(request()->input('person_id')); + + if (! $person->activities->contains($activity->id)) { + $person->activities()->attach($activity->id); + } + } elseif (request()->input('warehouse_id')) { + $warehouse = $this->warehouseRepository->find(request()->input('warehouse_id')); + + if (! $warehouse->activities->contains($activity->id)) { + $warehouse->activities()->attach($activity->id); + } + } elseif (request()->input('product_id')) { + $product = $this->productRepository->find(request()->input('product_id')); + + if (! $product->activities->contains($activity->id)) { + $product->activities()->attach($activity->id); + } + } + } +} diff --git a/packages/Webkul/Admin/src/Listeners/Lead.php b/packages/Webkul/Admin/src/Listeners/Lead.php new file mode 100644 index 0000000..20a40fa --- /dev/null +++ b/packages/Webkul/Admin/src/Listeners/Lead.php @@ -0,0 +1,30 @@ +emailRepository->update([ + 'lead_id' => $lead->id, + ], request('email_id')); + } +} diff --git a/packages/Webkul/Admin/src/Listeners/Person.php b/packages/Webkul/Admin/src/Listeners/Person.php new file mode 100644 index 0000000..b8c4378 --- /dev/null +++ b/packages/Webkul/Admin/src/Listeners/Person.php @@ -0,0 +1,30 @@ +emailRepository->update([ + 'person_id' => $person->id, + ], request('email_id')); + } +} diff --git a/packages/Webkul/Admin/src/Notifications/Common.php b/packages/Webkul/Admin/src/Notifications/Common.php new file mode 100644 index 0000000..ae2ff2a --- /dev/null +++ b/packages/Webkul/Admin/src/Notifications/Common.php @@ -0,0 +1,38 @@ +to($this->data['to']) + ->subject($this->data['subject']) + ->view('admin::emails.common.index', [ + 'body' => $this->data['body'], + ]); + + if (isset($this->data['attachments'])) { + foreach ($this->data['attachments'] as $attachment) { + $message->attachData($attachment['content'], $attachment['name'], [ + 'mime' => $attachment['mime'], + ]); + } + } + + return $message; + } +} diff --git a/packages/Webkul/Admin/src/Notifications/User/Create.php b/packages/Webkul/Admin/src/Notifications/User/Create.php new file mode 100644 index 0000000..9f44ed2 --- /dev/null +++ b/packages/Webkul/Admin/src/Notifications/User/Create.php @@ -0,0 +1,27 @@ +to($this->user->email) + ->subject(trans('admin::app.emails.common.user.create-subject')) + ->view('admin::emails.users.create', [ + 'user_name' => $this->user->name, + ]); + } +} diff --git a/packages/Webkul/Admin/src/Notifications/User/UserResetPassword.php b/packages/Webkul/Admin/src/Notifications/User/UserResetPassword.php new file mode 100755 index 0000000..222d04d --- /dev/null +++ b/packages/Webkul/Admin/src/Notifications/User/UserResetPassword.php @@ -0,0 +1,28 @@ +token); + } + + return (new MailMessage) + ->view('admin::emails.users.forget-password', [ + 'user_name' => $notifiable->name, + 'token' => $this->token, + ]); + } +} diff --git a/packages/Webkul/Admin/src/Notifications/User/UserUpdatePassword.php b/packages/Webkul/Admin/src/Notifications/User/UserUpdatePassword.php new file mode 100644 index 0000000..2e82646 --- /dev/null +++ b/packages/Webkul/Admin/src/Notifications/User/UserUpdatePassword.php @@ -0,0 +1,33 @@ +from(core()->getSenderEmailDetails()['email'], core()->getSenderEmailDetails()['name']) + ->to($this->user->email, $this->user->name) + ->subject(trans('shop::app.mail.update-password.subject')) + ->view('shop::emails.users.update-password', ['user' => $this->user]); + } +} diff --git a/packages/Webkul/Admin/src/Providers/AdminServiceProvider.php b/packages/Webkul/Admin/src/Providers/AdminServiceProvider.php new file mode 100644 index 0000000..d8be1f1 --- /dev/null +++ b/packages/Webkul/Admin/src/Providers/AdminServiceProvider.php @@ -0,0 +1,99 @@ +aliasMiddleware('user', BouncerMiddleware::class); + + $router->aliasMiddleware('admin_locale', Locale::class); + + include __DIR__.'/../Http/helpers.php'; + + Route::middleware(['web', 'admin_locale', 'user']) + ->prefix(config('app.admin_path')) + ->group(__DIR__.'/../Routes/Admin/web.php'); + + Route::middleware(['web', 'admin_locale']) + ->group(__DIR__.'/../Routes/Front/web.php'); + + $this->loadMigrationsFrom(__DIR__.'/../Database/Migrations'); + + $this->loadTranslationsFrom(__DIR__.'/../Resources/lang', 'admin'); + + $this->loadViewsFrom(__DIR__.'/../Resources/views', 'admin'); + + Blade::anonymousComponentPath(__DIR__.'/../Resources/views/components', 'admin'); + + $this->app->bind(ExceptionHandler::class, Handler::class); + + Relation::morphMap([ + 'leads' => \Webkul\Lead\Models\Lead::class, + 'organizations' => \Webkul\Contact\Models\Organization::class, + 'persons' => \Webkul\Contact\Models\Person::class, + 'products' => \Webkul\Product\Models\Product::class, + 'quotes' => \Webkul\Quote\Models\Quote::class, + 'warehouses' => \Webkul\Warehouse\Models\Warehouse::class, + ]); + + $this->app->register(EventServiceProvider::class); + } + + /** + * Register services. + * + * @return void + */ + public function register() + { + $this->registerFacades(); + + $this->registerConfig(); + } + + /** + * Register Bouncer as a singleton. + */ + protected function registerFacades(): void + { + $loader = AliasLoader::getInstance(); + + $loader->alias('Bouncer', \Webkul\Admin\Facades\Bouncer::class); + + $this->app->singleton('bouncer', function () { + return new \Webkul\Admin\Bouncer; + }); + } + + /** + * Register package config. + */ + protected function registerConfig(): void + { + $this->mergeConfigFrom(dirname(__DIR__).'/Config/acl.php', 'acl'); + + $this->mergeConfigFrom(dirname(__DIR__).'/Config/menu.php', 'menu.admin'); + + $this->mergeConfigFrom(dirname(__DIR__).'/Config/core_config.php', 'core_config'); + + $this->mergeConfigFrom(dirname(__DIR__).'/Config/attribute_lookups.php', 'attribute_lookups'); + + $this->mergeConfigFrom(dirname(__DIR__).'/Config/attribute_entity_types.php', 'attribute_entity_types'); + } +} diff --git a/packages/Webkul/Admin/src/Providers/EventServiceProvider.php b/packages/Webkul/Admin/src/Providers/EventServiceProvider.php new file mode 100644 index 0000000..d5410b5 --- /dev/null +++ b/packages/Webkul/Admin/src/Providers/EventServiceProvider.php @@ -0,0 +1,31 @@ + [ + 'Webkul\Admin\Listeners\Person@linkToEmail', + ], + + 'lead.create.after' => [ + 'Webkul\Admin\Listeners\Lead@linkToEmail', + ], + + 'activity.create.after' => [ + 'Webkul\Admin\Listeners\Activity@afterUpdateOrCreate', + ], + + 'activity.update.after' => [ + 'Webkul\Admin\Listeners\Activity@afterUpdateOrCreate', + ], + ]; +} diff --git a/packages/Webkul/Admin/src/Providers/ModuleServiceProvider.php b/packages/Webkul/Admin/src/Providers/ModuleServiceProvider.php new file mode 100644 index 0000000..b9d2e2f --- /dev/null +++ b/packages/Webkul/Admin/src/Providers/ModuleServiceProvider.php @@ -0,0 +1,10 @@ +|string> + */ + public function rules() + { + return [ + 'name' => 'required|string|max:255', + 'entity_type' => 'required|string|max:255', + 'description' => 'nullable|string|max:255', + 'method' => 'required|string|max:255', + 'end_point' => 'required|string|max:255', + 'query_params' => 'nullable', + 'headers' => 'nullable', + 'payload_type' => [ + 'required', + 'string', + 'max:255', + Rule::in(['default', 'x-www-form-urlencoded', 'raw']), + ], + 'raw_payload_type' => [ + 'string', + 'max:255', + Rule::in(['json', 'text']), + ], + 'payload' => 'nullable', + ]; + } +} diff --git a/packages/Webkul/Admin/src/Resources/assets/css/app.css b/packages/Webkul/Admin/src/Resources/assets/css/app.css new file mode 100644 index 0000000..c786851 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/assets/css/app.css @@ -0,0 +1,656 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; + +/* -------------------------------- new css -------------------------------- */ + +@font-face { + font-family: 'icomoon'; + src: url('../fonts/icomoon.woff?w2trdd') format('woff'); + font-weight: normal; + font-style: normal; + font-display: block; + } + + [class^="icon-"], [class*=" icon-"] { + /* use !important to prevent issues with browser extensions that change fonts */ + font-family: 'icomoon' !important; + speak: never; + font-style: normal; + font-weight: normal; + font-variant: normal; + text-transform: none; + line-height: 1; + + /* Better Font Rendering =========== */ + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + } + +@layer components { + .icon-image:before { + content: "\e956"; + } + + .icon-bookmark:before { + content: "\e92c"; + } + + .icon-bookmark-active:before { + content: "\e92d"; + } + + .icon-stats-down:before { + content: "\e94d"; + } + + .icon-error:before { + content: "\e951"; + } + + .icon-info:before { + content: "\e952"; + } + + .icon-success:before { + content: "\e953"; + } + + .icon-warning:before { + content: "\e954"; + } + + .icon-stats-down:before { + content: "\e94d"; + } + + .icon-stats-up:before { + content: "\e94f"; + } + + .icon-attribute:before { + content: "\e947"; + } + + .icon-download:before { + content: "\e948"; + } + + .icon-settings-warehouse:before { + content: "\e94e"; + } + + .icon-move:before { + content: "\e949"; + } + + .icon-organization:before { + content: "\e94a"; + } + + .icon-role:before { + content: "\e94b"; + } + + .icon-user:before { + content: "\e94c"; + } + + .icon-system-generate:before { + content: "\e950"; + } + + .icon-settings-attributes:before { + content: "\e93b"; + } + + .icon-settings-flow:before { + content: "\e93c"; + } + + .icon-settings-group:before { + content: "\e93d"; + } + + .icon-settings-mail:before { + content: "\e93e"; + } + + .icon-settings-pipeline:before { + content: "\e93f"; + } + + .icon-settings-roles:before { + content: "\e940"; + } + + .icon-settings-sources:before { + content: "\e941"; + } + + .icon-settings-tag:before { + content: "\e942"; + } + + .icon-settings-type:before { + content: "\e943"; + } + + .icon-settings-user:before { + content: "\e944"; + } + + .icon-settings-webforms:before { + content: "\e945"; + } + + .icon-settings-webhooks:before { + content: "\e946"; + } + + .icon-attached-file:before { + content: "\e932"; + } + + .icon-forward:before { + content: "\e933"; + } + + .icon-location:before { + content: "\e934"; + } + + .icon-pin:before { + content: "\e935"; + } + + .icon-print:before { + content: "\e936"; + } + + .icon-reply-all:before { + content: "\e937"; + } + + .icon-reply:before { + content: "\e938"; + } + + .icon-rotten:before { + content: "\e939"; + } + + .icon-tag:before { + content: "\e93a"; + } + + .icon-list:before { + content: "\e92e"; + } + + .icon-enter:before { + content: "\e92f"; + } + + .icon-kanban:before { + content: "\e930"; + } + + .icon-tick:before { + content: "\e931"; + } + + .icon-eye-hide:before { + content: "\e929"; + } + + .icon-percentage:before { + content: "\e92a"; + } + + .icon-dollar:before { + content: "\e92b"; + } + + .icon-radio-selected:before { + content: "\e924"; + } + + .icon-radio-normal:before { + content: "\e925"; + } + + .icon-folder:before { + content: "\e926"; + } + + .icon-file:before { + content: "\e927"; + } + + .icon-eye:before { + content: "\e928"; + } + + .icon-notification:before { + content: "\e900"; + } + + .icon-configuration:before { + content: "\e901"; + } + + .icon-note:before { + content: "\e902"; + } + + .icon-edit:before { + content: "\e903"; + } + + .icon-menu:before { + content: "\e955"; + } + + .icon-calendar:before { + content: "\e904"; + } + + .icon-delete:before { + content: "\e905"; + } + + .icon-more:before { + content: "\e906"; + } + + .icon-checkbox-multiple:before { + content: "\e907"; + } + + .icon-checkbox-select:before { + content: "\e908"; + } + + .icon-checkbox-outline:before { + content: "\e909"; + } + + .icon-message:before { + content: "\e90a"; + } + + .icon-video:before { + content: "\e90b"; + } + + .icon-attachment:before { + content: "\e90c"; + } + + .icon-sent:before { + content: "\e90d"; + } + + .icon-call:before { + content: "\e90e"; + } + + .icon-meeting:before { + content: "\e90f"; + } + + .icon-light:before { + content: "\e910"; + } + + .icon-dark:before { + content: "\e911"; + } + + .icon-mail:before { + content: "\e912"; + } + + .icon-leads:before { + content: "\e913"; + } + + .icon-filter:before { + content: "\e914"; + } + + .icon-setting:before { + content: "\e915"; + } + + .icon-product:before { + content: "\e916"; + } + + .icon-contact:before { + content: "\e917"; + } + + .icon-activity:before { + content: "\e918"; + } + + .icon-perosnal:before { + content: "\e919"; + } + + .icon-quote:before { + content: "\e91a"; + } + + .icon-dashboard:before { + content: "\e91b"; + } + + .icon-cross-large:before { + content: "\e91c"; + } + + .icon-left-arrow:before { + content: "\e91d"; + } + + .icon-right-arrow:before { + content: "\e91e"; + } + + .icon-up-arrow:before { + content: "\e91f"; + } + + .icon-down-arrow:before { + content: "\e920"; + } + + .icon-search:before { + content: "\e921"; + } + + .icon-add:before { + content: "\e922"; + } + + .icon-add-2:before { + content: "\e923"; + } + + .label-active { + @apply max-w-max rounded-md bg-emerald-200 px-3 py-1.5 text-xs font-medium text-emerald-900; + } + + .label-inactive { + @apply max-w-max rounded-md bg-red-200 px-3 py-1.5 text-xs font-medium text-red-800; + } + + [dir="ltr"] .sidebar-rounded::after { + @apply content-[''] w-[30px] h-[30px] top-0 right-[-30px] absolute bg-no-repeat pointer-events-none bg-[url("../images/corner-clip.svg")] transition-all; + } + + [dir="rtl"] .sidebar-rounded::before { + @apply content-[''] w-[30px] h-[30px] top-0 left-[-30px] absolute bg-no-repeat pointer-events-none bg-[url("../images/corner-clip.svg")] transition-all rotate-90; + } + + .dark .sidebar-rounded::after { + @apply bg-[url("../images/dark-corner-clip.svg")] + } + + .dark .sidebar-rounded::before { + @apply bg-[url("../images/dark-corner-clip.svg")] + } + + .tox.tox-silver-sink.tox-tinymce-aux { + z-index: 99999; + } + + .stage::after { + content: ''; + position: absolute; + top: 50%; + right: -10px; + width: 24px; + height: 24px; + z-index: 1; + border-radius: 0 0 0 25px; + transform: translateY(-50%) rotate(45deg); + border-right: 4px solid #f3f4f6; + border-top: 4px solid #f3f4f6; + } + + .dark .stage::after { + content: ''; + position: absolute; + top: 50%; + right: -10px; + width: 24px; + height: 24px; + z-index: 1; + border-radius: 0 0 0 25px; + transform: translateY(-50%) rotate(45deg); + border-right: 4px solid #030712; + border-top: 4px solid #030712; + } + + [dir="rtl"] .stage::before { + content: ''; + position: absolute; + top: 50%; + left: -10px; + width: 24px; + height: 24px; + z-index: 1; + border-radius: 0 0 0 25px; + transform: translateY(-50%) rotate(225deg); + border-right: 4px solid #f3f4f6; + border-top: 4px solid #f3f4f6; + } + + [dir="rtl"] .stage::after { + display: none; + } + + .dark\:bg-gray-400:is(.dark *) { + --tw-bg-opacity: 1 !important; + background-color: #1f2937 !important; + border: #111827 solid !important; + color: #e5e7eb !important; + } + + .dark\:bg-gray-800:is(.dark *) { + --tw-bg-opacity: 1; + background-color: rgb(16 24 39); + } + + .shimmer { + animation-duration: 2.2s; + animation-fill-mode: forwards; + animation-iteration-count: infinite; + animation-name: skeleton; + animation-timing-function: linear; + background: linear-gradient( + to right, + #f6f6f6 8%, + #f0f0f0 18%, + #f6f6f6 33% + ); + background-size: 1250px 100%; + } + + .light-shimmer-bg { + background: linear-gradient( + to right, + #fafafa 8%, + #f5f5f5 18%, + #fafafa 33% + ); + background-size: 1250px 100%; + } + + .dark .shimmer { + background: linear-gradient( + to right, + #1f2937 8%, + #1a2232 18%, + #1f2937 33% + ); + } + + .primary-button { + @apply bg-brandColor border border-brandColor cursor-pointer flex focus:opacity-[0.9] font-semibold gap-x-1 hover:opacity-[0.9] items-center place-content-center px-3 py-1.5 rounded-md text-gray-50 transition-all; + } + + .secondary-button { + @apply flex cursor-pointer place-content-center items-center gap-x-1 whitespace-nowrap rounded-md border-2 border-brandColor bg-white px-3 py-1.5 font-semibold text-brandColor transition-all hover:bg-[#eff6ff61] focus:bg-[#eff6ff61] dark:border-gray-400 dark:bg-gray-800 dark:text-white dark:hover:opacity-80; + } + + .transparent-button { + @apply flex cursor-pointer appearance-none place-content-center items-center gap-x-1 whitespace-nowrap rounded-md border-2 border-transparent px-3 py-1.5 font-semibold text-gray-600 transition-all marker:shadow hover:bg-gray-100 focus:bg-gray-100 dark:hover:bg-gray-950 dark:focus:bg-gray-950; + } + + ::-webkit-scrollbar { + width: 12px; + } + + ::-webkit-scrollbar-track { + background: #f1f1f1; + } + + ::-webkit-scrollbar-thumb { + background: #888; + border-radius: 6px; + } + + ::-webkit-scrollbar-thumb:hover { + background: #555; + } + + /* Firefox */ + * { + scrollbar-width: thin; + scrollbar-color: #888 #f1f1f1; + } + + ::selection { + background-color: rgba(0, 68, 242, .2); + } + + body { + @apply bg-gray-100 text-sm text-gray-800; + } + + button:disabled { + @apply cursor-not-allowed opacity-50; + } + + button:disabled:hover { + @apply cursor-not-allowed opacity-50; + } + + .draggable-ghost { + opacity: 0.5; + background: #e0e7ff; + } + + html.dark [class^="icon-"], + html.dark [class*=" icon-"]{ + color: #d1d5db; + } + + p { + @apply text-[14px] !leading-[17px]; + } + + input, + textarea, + select { + @apply outline-none; + } + + .journal-scroll::-webkit-scrollbar { + width: 14px; + cursor: pointer; + display: none; + } + + .journal-scroll::-webkit-scrollbar-track { + background-color: #fff; + cursor: pointer; + border-radius: 12px; + border: 1px solid #e9e9e9; + } + + .journal-scroll::-webkit-scrollbar-thumb { + cursor: pointer; + background-color: #e9e9e9; + border-radius: 12px; + border: 3px solid transparent; + background-clip: content-box; + } + + .custom-select { + -webkit-appearance: none; + -moz-appearance: none; + background: transparent; + background-image: url("data:image/svg+xml;utf8,"); + background-repeat: no-repeat; + background-position-x: calc(100% - 10px); + background-position-y: 50%; + } + + .dark .custom-select{ + background-image: url("data:image/svg+xml;utf8,"); + } + + [dir="rtl"] .custom-select { + background-position-x: calc(100% - (100% - 10px)); + } + + .draggable-ghost { + @apply border border-dashed !border-gray-300; + } + + @keyframes skeleton { + 0% { + @apply bg-[-1250px_0]; + } + + 100% { + @apply bg-[1250px_0]; + } + } + + .required:after { + @apply content-['*']; + } +} + +.tox .tox-toolbar__group:last-child button { + padding: 6px 8px; + background: #eff6ff; + color: #2563EB; +} + +.tox .tox-toolbar__group:last-child button:hover { + background: #dbeafe; +} + +.tox .tox-toolbar__group:last-child button[aria-disabled="true"] { + @apply cursor-not-allowed opacity-50; +} + +.tox .tox-toolbar__group:last-child button { + @apply !bg-transparent; +} + +.tox .tox-toolbar__group:last-child button:hover { + @apply border-0 !bg-[#3389ec] text-white shadow-none; +} + +.tox.tox-silver-sink.tox-tinymce-aux { + z-index: 99999; +} \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/assets/fonts/icomoon.woff b/packages/Webkul/Admin/src/Resources/assets/fonts/icomoon.woff new file mode 100644 index 0000000..bedf008 Binary files /dev/null and b/packages/Webkul/Admin/src/Resources/assets/fonts/icomoon.woff differ diff --git a/packages/Webkul/Admin/src/Resources/assets/images/corner-clip.svg b/packages/Webkul/Admin/src/Resources/assets/images/corner-clip.svg new file mode 100644 index 0000000..a2da761 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/assets/images/corner-clip.svg @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/assets/images/dark-corner-clip.svg b/packages/Webkul/Admin/src/Resources/assets/images/dark-corner-clip.svg new file mode 100644 index 0000000..9c36b81 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/assets/images/dark-corner-clip.svg @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/assets/images/dark-logo.svg b/packages/Webkul/Admin/src/Resources/assets/images/dark-logo.svg new file mode 100644 index 0000000..4b14484 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/assets/images/dark-logo.svg @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/packages/Webkul/Admin/src/Resources/assets/images/empty-placeholders/activities.svg b/packages/Webkul/Admin/src/Resources/assets/images/empty-placeholders/activities.svg new file mode 100644 index 0000000..890d0ea --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/assets/images/empty-placeholders/activities.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/packages/Webkul/Admin/src/Resources/assets/images/empty-placeholders/calls.svg b/packages/Webkul/Admin/src/Resources/assets/images/empty-placeholders/calls.svg new file mode 100644 index 0000000..6ade01a --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/assets/images/empty-placeholders/calls.svg @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/packages/Webkul/Admin/src/Resources/assets/images/empty-placeholders/default.svg b/packages/Webkul/Admin/src/Resources/assets/images/empty-placeholders/default.svg new file mode 100644 index 0000000..fa4e8d9 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/assets/images/empty-placeholders/default.svg @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/packages/Webkul/Admin/src/Resources/assets/images/empty-placeholders/description.svg b/packages/Webkul/Admin/src/Resources/assets/images/empty-placeholders/description.svg new file mode 100644 index 0000000..d367df7 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/assets/images/empty-placeholders/description.svg @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/packages/Webkul/Admin/src/Resources/assets/images/empty-placeholders/emails.svg b/packages/Webkul/Admin/src/Resources/assets/images/empty-placeholders/emails.svg new file mode 100644 index 0000000..24a893f --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/assets/images/empty-placeholders/emails.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/packages/Webkul/Admin/src/Resources/assets/images/empty-placeholders/files.svg b/packages/Webkul/Admin/src/Resources/assets/images/empty-placeholders/files.svg new file mode 100644 index 0000000..e75d4fc --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/assets/images/empty-placeholders/files.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/packages/Webkul/Admin/src/Resources/assets/images/empty-placeholders/lunches.svg b/packages/Webkul/Admin/src/Resources/assets/images/empty-placeholders/lunches.svg new file mode 100644 index 0000000..9eef171 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/assets/images/empty-placeholders/lunches.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/packages/Webkul/Admin/src/Resources/assets/images/empty-placeholders/meetings.svg b/packages/Webkul/Admin/src/Resources/assets/images/empty-placeholders/meetings.svg new file mode 100644 index 0000000..6aec1c6 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/assets/images/empty-placeholders/meetings.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/packages/Webkul/Admin/src/Resources/assets/images/empty-placeholders/notes.svg b/packages/Webkul/Admin/src/Resources/assets/images/empty-placeholders/notes.svg new file mode 100644 index 0000000..d27d66c --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/assets/images/empty-placeholders/notes.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/packages/Webkul/Admin/src/Resources/assets/images/empty-placeholders/organizations.svg b/packages/Webkul/Admin/src/Resources/assets/images/empty-placeholders/organizations.svg new file mode 100644 index 0000000..a41bd86 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/assets/images/empty-placeholders/organizations.svg @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/packages/Webkul/Admin/src/Resources/assets/images/empty-placeholders/pipedrive.svg b/packages/Webkul/Admin/src/Resources/assets/images/empty-placeholders/pipedrive.svg new file mode 100644 index 0000000..fc9d411 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/assets/images/empty-placeholders/pipedrive.svg @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/packages/Webkul/Admin/src/Resources/assets/images/empty-placeholders/plans.svg b/packages/Webkul/Admin/src/Resources/assets/images/empty-placeholders/plans.svg new file mode 100644 index 0000000..669e469 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/assets/images/empty-placeholders/plans.svg @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/packages/Webkul/Admin/src/Resources/assets/images/empty-placeholders/products.svg b/packages/Webkul/Admin/src/Resources/assets/images/empty-placeholders/products.svg new file mode 100644 index 0000000..6c1fab3 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/assets/images/empty-placeholders/products.svg @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/packages/Webkul/Admin/src/Resources/assets/images/empty-placeholders/quotes.svg b/packages/Webkul/Admin/src/Resources/assets/images/empty-placeholders/quotes.svg new file mode 100644 index 0000000..db5d86d --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/assets/images/empty-placeholders/quotes.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/packages/Webkul/Admin/src/Resources/assets/images/empty-placeholders/users.svg b/packages/Webkul/Admin/src/Resources/assets/images/empty-placeholders/users.svg new file mode 100644 index 0000000..1a90f23 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/assets/images/empty-placeholders/users.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/packages/Webkul/Admin/src/Resources/assets/images/error.svg b/packages/Webkul/Admin/src/Resources/assets/images/error.svg new file mode 100644 index 0000000..6fe0d2a --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/assets/images/error.svg @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/packages/Webkul/Admin/src/Resources/assets/images/favicon.ico b/packages/Webkul/Admin/src/Resources/assets/images/favicon.ico new file mode 100644 index 0000000..a146b4e Binary files /dev/null and b/packages/Webkul/Admin/src/Resources/assets/images/favicon.ico differ diff --git a/packages/Webkul/Admin/src/Resources/assets/images/logo.svg b/packages/Webkul/Admin/src/Resources/assets/images/logo.svg new file mode 100644 index 0000000..6acc3ad --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/assets/images/logo.svg @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/packages/Webkul/Admin/src/Resources/assets/images/mobile-dark-logo.svg b/packages/Webkul/Admin/src/Resources/assets/images/mobile-dark-logo.svg new file mode 100644 index 0000000..1c24c93 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/assets/images/mobile-dark-logo.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/packages/Webkul/Admin/src/Resources/assets/images/mobile-light-logo.svg b/packages/Webkul/Admin/src/Resources/assets/images/mobile-light-logo.svg new file mode 100644 index 0000000..3d0761d --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/assets/images/mobile-light-logo.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/packages/Webkul/Admin/src/Resources/assets/js/app.js b/packages/Webkul/Admin/src/Resources/assets/js/app.js new file mode 100644 index 0000000..88e5563 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/assets/js/app.js @@ -0,0 +1,134 @@ +/** + * This will track all the images and fonts for publishing. + */ +import.meta.glob(["../images/**", "../fonts/**"]); + +/** + * Main vue bundler. + */ +import { createApp } from "vue/dist/vue.esm-bundler"; + +/** + * Main root application registry. + */ +window.app = createApp({ + data() { + return { + isMenuActive: false, + + hoveringMenu: '', + }; + }, + + created() { + window.addEventListener('click', this.handleFocusOut); + }, + + beforeDestroy() { + window.removeEventListener('click', this.handleFocusOut); + }, + + methods: { + onSubmit() {}, + + onInvalidSubmit({ values, errors, results }) { + setTimeout(() => { + const errorKeys = Object.entries(errors) + .map(([key, value]) => ({ key, value })) + .filter(error => error["value"].length); + + let firstErrorElement = document.querySelector('[name="' + errorKeys[0]["key"] + '"]'); + + firstErrorElement.scrollIntoView({ + behavior: "smooth", + block: "center" + }); + }, 100); + }, + + handleMouseOver(event) { + if (this.isMenuActive) { + return; + } + + const parentElement = event.currentTarget.parentElement; + + if (parentElement.classList.contains('sidebar-collapsed')) { + parentElement.classList.remove('sidebar-collapsed'); + + parentElement.classList.add('sidebar-not-collapsed'); + } + + }, + + handleMouseLeave(event) { + if (this.isMenuActive) { + return; + } + + const parentElement = event.currentTarget.parentElement; + + if (parentElement.classList.contains('sidebar-not-collapsed')) { + parentElement.classList.remove('sidebar-not-collapsed'); + + parentElement.classList.add('sidebar-collapsed'); + } + }, + + handleFocusOut(event) { + const sidebar = this.$refs.sidebar; + + if ( + sidebar && + !sidebar.contains(event.target) + ) { + this.isMenuActive = false; + + const parentElement = sidebar.parentElement; + + if (parentElement.classList.contains('sidebar-not-collapsed')) { + parentElement.classList.remove('sidebar-not-collapsed'); + + parentElement.classList.add('sidebar-collapsed'); + } + } + }, + }, +}); + +/** + * Global plugins registration. + */ +import Admin from "./plugins/admin"; +import Axios from "./plugins/axios"; +import Emitter from "./plugins/emitter"; +import Flatpickr from "./plugins/flatpickr"; +import VeeValidate from "./plugins/vee-validate"; +import CreateElement from "./plugins/createElement"; +import Draggable from "./plugins/draggable"; +import VueCal from "./plugins/vue-cal"; + +[ + Admin, + Axios, + Emitter, + CreateElement, + Draggable, + Flatpickr, + VeeValidate, + VueCal, +].forEach((plugin) => app.use(plugin)); + +/** + * Global directives. + */ +import Debounce from "./directives/debounce"; +import DOMPurify from "./directives/dompurify"; +import ToolTip from "./directives/tooltip"; + +app.directive("debounce", Debounce); +app.directive("safe-html", DOMPurify); +app.directive("tooltip", ToolTip); + +export default app; + diff --git a/packages/Webkul/Admin/src/Resources/assets/js/chart.js b/packages/Webkul/Admin/src/Resources/assets/js/chart.js new file mode 100644 index 0000000..15bf0b8 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/assets/js/chart.js @@ -0,0 +1,20 @@ +/** + * Skipped minification because the original files appears to be already minified. + * Original file: /npm/chart.js@4.4.0/dist/chart.umd.js + * + * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files + */ +/*! + * Chart.js v4.4.0 + * https://www.chartjs.org + * (c) 2023 Chart.js Contributors + * Released under the MIT License + */ +!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t="undefined"!=typeof globalThis?globalThis:t||self).Chart=e()}(this,(function(){"use strict";var t=Object.freeze({__proto__:null,get Colors(){return Go},get Decimation(){return Qo},get Filler(){return ma},get Legend(){return ya},get SubTitle(){return ka},get Title(){return Ma},get Tooltip(){return Ba}});function e(){}const i=(()=>{let t=0;return()=>t++})();function s(t){return null==t}function n(t){if(Array.isArray&&Array.isArray(t))return!0;const e=Object.prototype.toString.call(t);return"[object"===e.slice(0,7)&&"Array]"===e.slice(-6)}function o(t){return null!==t&&"[object Object]"===Object.prototype.toString.call(t)}function a(t){return("number"==typeof t||t instanceof Number)&&isFinite(+t)}function r(t,e){return a(t)?t:e}function l(t,e){return void 0===t?e:t}const h=(t,e)=>"string"==typeof t&&t.endsWith("%")?parseFloat(t)/100:+t/e,c=(t,e)=>"string"==typeof t&&t.endsWith("%")?parseFloat(t)/100*e:+t;function d(t,e,i){if(t&&"function"==typeof t.call)return t.apply(i,e)}function u(t,e,i,s){let a,r,l;if(n(t))if(r=t.length,s)for(a=r-1;a>=0;a--)e.call(i,t[a],a);else for(a=0;at,x:t=>t.x,y:t=>t.y};function v(t){const e=t.split("."),i=[];let s="";for(const t of e)s+=t,s.endsWith("\\")?s=s.slice(0,-1)+".":(i.push(s),s="");return i}function M(t,e){const i=y[e]||(y[e]=function(t){const e=v(t);return t=>{for(const i of e){if(""===i)break;t=t&&t[i]}return t}}(e));return i(t)}function w(t){return t.charAt(0).toUpperCase()+t.slice(1)}const k=t=>void 0!==t,S=t=>"function"==typeof t,P=(t,e)=>{if(t.size!==e.size)return!1;for(const i of t)if(!e.has(i))return!1;return!0};function D(t){return"mouseup"===t.type||"click"===t.type||"contextmenu"===t.type}const C=Math.PI,O=2*C,A=O+C,T=Number.POSITIVE_INFINITY,L=C/180,E=C/2,R=C/4,I=2*C/3,z=Math.log10,F=Math.sign;function V(t,e,i){return Math.abs(t-e)t-e)).pop(),e}function N(t){return!isNaN(parseFloat(t))&&isFinite(t)}function H(t,e){const i=Math.round(t);return i-e<=t&&i+e>=t}function j(t,e,i){let s,n,o;for(s=0,n=t.length;sl&&h=Math.min(e,i)-s&&t<=Math.max(e,i)+s}function et(t,e,i){i=i||(i=>t[i]1;)s=o+n>>1,i(s)?o=s:n=s;return{lo:o,hi:n}}const it=(t,e,i,s)=>et(t,i,s?s=>{const n=t[s][e];return nt[s][e]et(t,i,(s=>t[s][e]>=i));function nt(t,e,i){let s=0,n=t.length;for(;ss&&t[n-1]>i;)n--;return s>0||n{const i="_onData"+w(e),s=t[e];Object.defineProperty(t,e,{configurable:!0,enumerable:!1,value(...e){const n=s.apply(this,e);return t._chartjs.listeners.forEach((t=>{"function"==typeof t[i]&&t[i](...e)})),n}})})))}function rt(t,e){const i=t._chartjs;if(!i)return;const s=i.listeners,n=s.indexOf(e);-1!==n&&s.splice(n,1),s.length>0||(ot.forEach((e=>{delete t[e]})),delete t._chartjs)}function lt(t){const e=new Set(t);return e.size===t.length?t:Array.from(e)}const ht="undefined"==typeof window?function(t){return t()}:window.requestAnimationFrame;function ct(t,e){let i=[],s=!1;return function(...n){i=n,s||(s=!0,ht.call(window,(()=>{s=!1,t.apply(e,i)})))}}function dt(t,e){let i;return function(...s){return e?(clearTimeout(i),i=setTimeout(t,e,s)):t.apply(this,s),e}}const ut=t=>"start"===t?"left":"end"===t?"right":"center",ft=(t,e,i)=>"start"===t?e:"end"===t?i:(e+i)/2,gt=(t,e,i,s)=>t===(s?"left":"right")?i:"center"===t?(e+i)/2:e;function pt(t,e,i){const s=e.length;let n=0,o=s;if(t._sorted){const{iScale:a,_parsed:r}=t,l=a.axis,{min:h,max:c,minDefined:d,maxDefined:u}=a.getUserBounds();d&&(n=J(Math.min(it(r,l,h).lo,i?s:it(e,l,a.getPixelForValue(h)).lo),0,s-1)),o=u?J(Math.max(it(r,a.axis,c,!0).hi+1,i?0:it(e,l,a.getPixelForValue(c),!0).hi+1),n,s)-n:s-n}return{start:n,count:o}}function mt(t){const{xScale:e,yScale:i,_scaleRanges:s}=t,n={xmin:e.min,xmax:e.max,ymin:i.min,ymax:i.max};if(!s)return t._scaleRanges=n,!0;const o=s.xmin!==e.min||s.xmax!==e.max||s.ymin!==i.min||s.ymax!==i.max;return Object.assign(s,n),o}class bt{constructor(){this._request=null,this._charts=new Map,this._running=!1,this._lastDate=void 0}_notify(t,e,i,s){const n=e.listeners[s],o=e.duration;n.forEach((s=>s({chart:t,initial:e.initial,numSteps:o,currentStep:Math.min(i-e.start,o)})))}_refresh(){this._request||(this._running=!0,this._request=ht.call(window,(()=>{this._update(),this._request=null,this._running&&this._refresh()})))}_update(t=Date.now()){let e=0;this._charts.forEach(((i,s)=>{if(!i.running||!i.items.length)return;const n=i.items;let o,a=n.length-1,r=!1;for(;a>=0;--a)o=n[a],o._active?(o._total>i.duration&&(i.duration=o._total),o.tick(t),r=!0):(n[a]=n[n.length-1],n.pop());r&&(s.draw(),this._notify(s,i,t,"progress")),n.length||(i.running=!1,this._notify(s,i,t,"complete"),i.initial=!1),e+=n.length})),this._lastDate=t,0===e&&(this._running=!1)}_getAnims(t){const e=this._charts;let i=e.get(t);return i||(i={running:!1,initial:!0,items:[],listeners:{complete:[],progress:[]}},e.set(t,i)),i}listen(t,e,i){this._getAnims(t).listeners[e].push(i)}add(t,e){e&&e.length&&this._getAnims(t).items.push(...e)}has(t){return this._getAnims(t).items.length>0}start(t){const e=this._charts.get(t);e&&(e.running=!0,e.start=Date.now(),e.duration=e.items.reduce(((t,e)=>Math.max(t,e._duration)),0),this._refresh())}running(t){if(!this._running)return!1;const e=this._charts.get(t);return!!(e&&e.running&&e.items.length)}stop(t){const e=this._charts.get(t);if(!e||!e.items.length)return;const i=e.items;let s=i.length-1;for(;s>=0;--s)i[s].cancel();e.items=[],this._notify(t,e,Date.now(),"complete")}remove(t){return this._charts.delete(t)}}var xt=new bt; +/*! + * @kurkle/color v0.3.2 + * https://github.com/kurkle/color#readme + * (c) 2023 Jukka Kurkela + * Released under the MIT License + */function _t(t){return t+.5|0}const yt=(t,e,i)=>Math.max(Math.min(t,i),e);function vt(t){return yt(_t(2.55*t),0,255)}function Mt(t){return yt(_t(255*t),0,255)}function wt(t){return yt(_t(t/2.55)/100,0,1)}function kt(t){return yt(_t(100*t),0,100)}const St={0:0,1:1,2:2,3:3,4:4,5:5,6:6,7:7,8:8,9:9,A:10,B:11,C:12,D:13,E:14,F:15,a:10,b:11,c:12,d:13,e:14,f:15},Pt=[..."0123456789ABCDEF"],Dt=t=>Pt[15&t],Ct=t=>Pt[(240&t)>>4]+Pt[15&t],Ot=t=>(240&t)>>4==(15&t);function At(t){var e=(t=>Ot(t.r)&&Ot(t.g)&&Ot(t.b)&&Ot(t.a))(t)?Dt:Ct;return t?"#"+e(t.r)+e(t.g)+e(t.b)+((t,e)=>t<255?e(t):"")(t.a,e):void 0}const Tt=/^(hsla?|hwb|hsv)\(\s*([-+.e\d]+)(?:deg)?[\s,]+([-+.e\d]+)%[\s,]+([-+.e\d]+)%(?:[\s,]+([-+.e\d]+)(%)?)?\s*\)$/;function Lt(t,e,i){const s=e*Math.min(i,1-i),n=(e,n=(e+t/30)%12)=>i-s*Math.max(Math.min(n-3,9-n,1),-1);return[n(0),n(8),n(4)]}function Et(t,e,i){const s=(s,n=(s+t/60)%6)=>i-i*e*Math.max(Math.min(n,4-n,1),0);return[s(5),s(3),s(1)]}function Rt(t,e,i){const s=Lt(t,1,.5);let n;for(e+i>1&&(n=1/(e+i),e*=n,i*=n),n=0;n<3;n++)s[n]*=1-e-i,s[n]+=e;return s}function It(t){const e=t.r/255,i=t.g/255,s=t.b/255,n=Math.max(e,i,s),o=Math.min(e,i,s),a=(n+o)/2;let r,l,h;return n!==o&&(h=n-o,l=a>.5?h/(2-n-o):h/(n+o),r=function(t,e,i,s,n){return t===n?(e-i)/s+(e>16&255,o>>8&255,255&o]}return t}(),Ht.transparent=[0,0,0,0]);const e=Ht[t.toLowerCase()];return e&&{r:e[0],g:e[1],b:e[2],a:4===e.length?e[3]:255}}const $t=/^rgba?\(\s*([-+.\d]+)(%)?[\s,]+([-+.e\d]+)(%)?[\s,]+([-+.e\d]+)(%)?(?:[\s,/]+([-+.e\d]+)(%)?)?\s*\)$/;const Yt=t=>t<=.0031308?12.92*t:1.055*Math.pow(t,1/2.4)-.055,Ut=t=>t<=.04045?t/12.92:Math.pow((t+.055)/1.055,2.4);function Xt(t,e,i){if(t){let s=It(t);s[e]=Math.max(0,Math.min(s[e]+s[e]*i,0===e?360:1)),s=Ft(s),t.r=s[0],t.g=s[1],t.b=s[2]}}function qt(t,e){return t?Object.assign(e||{},t):t}function Kt(t){var e={r:0,g:0,b:0,a:255};return Array.isArray(t)?t.length>=3&&(e={r:t[0],g:t[1],b:t[2],a:255},t.length>3&&(e.a=Mt(t[3]))):(e=qt(t,{r:0,g:0,b:0,a:1})).a=Mt(e.a),e}function Gt(t){return"r"===t.charAt(0)?function(t){const e=$t.exec(t);let i,s,n,o=255;if(e){if(e[7]!==i){const t=+e[7];o=e[8]?vt(t):yt(255*t,0,255)}return i=+e[1],s=+e[3],n=+e[5],i=255&(e[2]?vt(i):yt(i,0,255)),s=255&(e[4]?vt(s):yt(s,0,255)),n=255&(e[6]?vt(n):yt(n,0,255)),{r:i,g:s,b:n,a:o}}}(t):Bt(t)}class Zt{constructor(t){if(t instanceof Zt)return t;const e=typeof t;let i;var s,n,o;"object"===e?i=Kt(t):"string"===e&&(o=(s=t).length,"#"===s[0]&&(4===o||5===o?n={r:255&17*St[s[1]],g:255&17*St[s[2]],b:255&17*St[s[3]],a:5===o?17*St[s[4]]:255}:7!==o&&9!==o||(n={r:St[s[1]]<<4|St[s[2]],g:St[s[3]]<<4|St[s[4]],b:St[s[5]]<<4|St[s[6]],a:9===o?St[s[7]]<<4|St[s[8]]:255})),i=n||jt(t)||Gt(t)),this._rgb=i,this._valid=!!i}get valid(){return this._valid}get rgb(){var t=qt(this._rgb);return t&&(t.a=wt(t.a)),t}set rgb(t){this._rgb=Kt(t)}rgbString(){return this._valid?(t=this._rgb)&&(t.a<255?`rgba(${t.r}, ${t.g}, ${t.b}, ${wt(t.a)})`:`rgb(${t.r}, ${t.g}, ${t.b})`):void 0;var t}hexString(){return this._valid?At(this._rgb):void 0}hslString(){return this._valid?function(t){if(!t)return;const e=It(t),i=e[0],s=kt(e[1]),n=kt(e[2]);return t.a<255?`hsla(${i}, ${s}%, ${n}%, ${wt(t.a)})`:`hsl(${i}, ${s}%, ${n}%)`}(this._rgb):void 0}mix(t,e){if(t){const i=this.rgb,s=t.rgb;let n;const o=e===n?.5:e,a=2*o-1,r=i.a-s.a,l=((a*r==-1?a:(a+r)/(1+a*r))+1)/2;n=1-l,i.r=255&l*i.r+n*s.r+.5,i.g=255&l*i.g+n*s.g+.5,i.b=255&l*i.b+n*s.b+.5,i.a=o*i.a+(1-o)*s.a,this.rgb=i}return this}interpolate(t,e){return t&&(this._rgb=function(t,e,i){const s=Ut(wt(t.r)),n=Ut(wt(t.g)),o=Ut(wt(t.b));return{r:Mt(Yt(s+i*(Ut(wt(e.r))-s))),g:Mt(Yt(n+i*(Ut(wt(e.g))-n))),b:Mt(Yt(o+i*(Ut(wt(e.b))-o))),a:t.a+i*(e.a-t.a)}}(this._rgb,t._rgb,e)),this}clone(){return new Zt(this.rgb)}alpha(t){return this._rgb.a=Mt(t),this}clearer(t){return this._rgb.a*=1-t,this}greyscale(){const t=this._rgb,e=_t(.3*t.r+.59*t.g+.11*t.b);return t.r=t.g=t.b=e,this}opaquer(t){return this._rgb.a*=1+t,this}negate(){const t=this._rgb;return t.r=255-t.r,t.g=255-t.g,t.b=255-t.b,this}lighten(t){return Xt(this._rgb,2,t),this}darken(t){return Xt(this._rgb,2,-t),this}saturate(t){return Xt(this._rgb,1,t),this}desaturate(t){return Xt(this._rgb,1,-t),this}rotate(t){return function(t,e){var i=It(t);i[0]=Vt(i[0]+e),i=Ft(i),t.r=i[0],t.g=i[1],t.b=i[2]}(this._rgb,t),this}}function Jt(t){if(t&&"object"==typeof t){const e=t.toString();return"[object CanvasPattern]"===e||"[object CanvasGradient]"===e}return!1}function Qt(t){return Jt(t)?t:new Zt(t)}function te(t){return Jt(t)?t:new Zt(t).saturate(.5).darken(.1).hexString()}const ee=["x","y","borderWidth","radius","tension"],ie=["color","borderColor","backgroundColor"];const se=new Map;function ne(t,e,i){return function(t,e){e=e||{};const i=t+JSON.stringify(e);let s=se.get(i);return s||(s=new Intl.NumberFormat(t,e),se.set(i,s)),s}(e,i).format(t)}const oe={values:t=>n(t)?t:""+t,numeric(t,e,i){if(0===t)return"0";const s=this.chart.options.locale;let n,o=t;if(i.length>1){const e=Math.max(Math.abs(i[0].value),Math.abs(i[i.length-1].value));(e<1e-4||e>1e15)&&(n="scientific"),o=function(t,e){let i=e.length>3?e[2].value-e[1].value:e[1].value-e[0].value;Math.abs(i)>=1&&t!==Math.floor(t)&&(i=t-Math.floor(t));return i}(t,i)}const a=z(Math.abs(o)),r=isNaN(a)?1:Math.max(Math.min(-1*Math.floor(a),20),0),l={notation:n,minimumFractionDigits:r,maximumFractionDigits:r};return Object.assign(l,this.options.ticks.format),ne(t,s,l)},logarithmic(t,e,i){if(0===t)return"0";const s=i[e].significand||t/Math.pow(10,Math.floor(z(t)));return[1,2,3,5,10,15].includes(s)||e>.8*i.length?oe.numeric.call(this,t,e,i):""}};var ae={formatters:oe};const re=Object.create(null),le=Object.create(null);function he(t,e){if(!e)return t;const i=e.split(".");for(let e=0,s=i.length;et.chart.platform.getDevicePixelRatio(),this.elements={},this.events=["mousemove","mouseout","click","touchstart","touchmove"],this.font={family:"'Helvetica Neue', 'Helvetica', 'Arial', sans-serif",size:12,style:"normal",lineHeight:1.2,weight:null},this.hover={},this.hoverBackgroundColor=(t,e)=>te(e.backgroundColor),this.hoverBorderColor=(t,e)=>te(e.borderColor),this.hoverColor=(t,e)=>te(e.color),this.indexAxis="x",this.interaction={mode:"nearest",intersect:!0,includeInvisible:!1},this.maintainAspectRatio=!0,this.onHover=null,this.onClick=null,this.parsing=!0,this.plugins={},this.responsive=!0,this.scale=void 0,this.scales={},this.showLine=!0,this.drawActiveElementsOnTop=!0,this.describe(t),this.apply(e)}set(t,e){return ce(this,t,e)}get(t){return he(this,t)}describe(t,e){return ce(le,t,e)}override(t,e){return ce(re,t,e)}route(t,e,i,s){const n=he(this,t),a=he(this,i),r="_"+e;Object.defineProperties(n,{[r]:{value:n[e],writable:!0},[e]:{enumerable:!0,get(){const t=this[r],e=a[s];return o(t)?Object.assign({},e,t):l(t,e)},set(t){this[r]=t}}})}apply(t){t.forEach((t=>t(this)))}}var ue=new de({_scriptable:t=>!t.startsWith("on"),_indexable:t=>"events"!==t,hover:{_fallback:"interaction"},interaction:{_scriptable:!1,_indexable:!1}},[function(t){t.set("animation",{delay:void 0,duration:1e3,easing:"easeOutQuart",fn:void 0,from:void 0,loop:void 0,to:void 0,type:void 0}),t.describe("animation",{_fallback:!1,_indexable:!1,_scriptable:t=>"onProgress"!==t&&"onComplete"!==t&&"fn"!==t}),t.set("animations",{colors:{type:"color",properties:ie},numbers:{type:"number",properties:ee}}),t.describe("animations",{_fallback:"animation"}),t.set("transitions",{active:{animation:{duration:400}},resize:{animation:{duration:0}},show:{animations:{colors:{from:"transparent"},visible:{type:"boolean",duration:0}}},hide:{animations:{colors:{to:"transparent"},visible:{type:"boolean",easing:"linear",fn:t=>0|t}}}})},function(t){t.set("layout",{autoPadding:!0,padding:{top:0,right:0,bottom:0,left:0}})},function(t){t.set("scale",{display:!0,offset:!1,reverse:!1,beginAtZero:!1,bounds:"ticks",clip:!0,grace:0,grid:{display:!0,lineWidth:1,drawOnChartArea:!0,drawTicks:!0,tickLength:8,tickWidth:(t,e)=>e.lineWidth,tickColor:(t,e)=>e.color,offset:!1},border:{display:!0,dash:[],dashOffset:0,width:1},title:{display:!1,text:"",padding:{top:4,bottom:4}},ticks:{minRotation:0,maxRotation:50,mirror:!1,textStrokeWidth:0,textStrokeColor:"",padding:3,display:!0,autoSkip:!0,autoSkipPadding:3,labelOffset:0,callback:ae.formatters.values,minor:{},major:{},align:"center",crossAlign:"near",showLabelBackdrop:!1,backdropColor:"rgba(255, 255, 255, 0.75)",backdropPadding:2}}),t.route("scale.ticks","color","","color"),t.route("scale.grid","color","","borderColor"),t.route("scale.border","color","","borderColor"),t.route("scale.title","color","","color"),t.describe("scale",{_fallback:!1,_scriptable:t=>!t.startsWith("before")&&!t.startsWith("after")&&"callback"!==t&&"parser"!==t,_indexable:t=>"borderDash"!==t&&"tickBorderDash"!==t&&"dash"!==t}),t.describe("scales",{_fallback:"scale"}),t.describe("scale.ticks",{_scriptable:t=>"backdropPadding"!==t&&"callback"!==t,_indexable:t=>"backdropPadding"!==t})}]);function fe(){return"undefined"!=typeof window&&"undefined"!=typeof document}function ge(t){let e=t.parentNode;return e&&"[object ShadowRoot]"===e.toString()&&(e=e.host),e}function pe(t,e,i){let s;return"string"==typeof t?(s=parseInt(t,10),-1!==t.indexOf("%")&&(s=s/100*e.parentNode[i])):s=t,s}const me=t=>t.ownerDocument.defaultView.getComputedStyle(t,null);function be(t,e){return me(t).getPropertyValue(e)}const xe=["top","right","bottom","left"];function _e(t,e,i){const s={};i=i?"-"+i:"";for(let n=0;n<4;n++){const o=xe[n];s[o]=parseFloat(t[e+"-"+o+i])||0}return s.width=s.left+s.right,s.height=s.top+s.bottom,s}const ye=(t,e,i)=>(t>0||e>0)&&(!i||!i.shadowRoot);function ve(t,e){if("native"in t)return t;const{canvas:i,currentDevicePixelRatio:s}=e,n=me(i),o="border-box"===n.boxSizing,a=_e(n,"padding"),r=_e(n,"border","width"),{x:l,y:h,box:c}=function(t,e){const i=t.touches,s=i&&i.length?i[0]:t,{offsetX:n,offsetY:o}=s;let a,r,l=!1;if(ye(n,o,t.target))a=n,r=o;else{const t=e.getBoundingClientRect();a=s.clientX-t.left,r=s.clientY-t.top,l=!0}return{x:a,y:r,box:l}}(t,i),d=a.left+(c&&r.left),u=a.top+(c&&r.top);let{width:f,height:g}=e;return o&&(f-=a.width+r.width,g-=a.height+r.height),{x:Math.round((l-d)/f*i.width/s),y:Math.round((h-u)/g*i.height/s)}}const Me=t=>Math.round(10*t)/10;function we(t,e,i,s){const n=me(t),o=_e(n,"margin"),a=pe(n.maxWidth,t,"clientWidth")||T,r=pe(n.maxHeight,t,"clientHeight")||T,l=function(t,e,i){let s,n;if(void 0===e||void 0===i){const o=ge(t);if(o){const t=o.getBoundingClientRect(),a=me(o),r=_e(a,"border","width"),l=_e(a,"padding");e=t.width-l.width-r.width,i=t.height-l.height-r.height,s=pe(a.maxWidth,o,"clientWidth"),n=pe(a.maxHeight,o,"clientHeight")}else e=t.clientWidth,i=t.clientHeight}return{width:e,height:i,maxWidth:s||T,maxHeight:n||T}}(t,e,i);let{width:h,height:c}=l;if("content-box"===n.boxSizing){const t=_e(n,"border","width"),e=_e(n,"padding");h-=e.width+t.width,c-=e.height+t.height}h=Math.max(0,h-o.width),c=Math.max(0,s?h/s:c-o.height),h=Me(Math.min(h,a,l.maxWidth)),c=Me(Math.min(c,r,l.maxHeight)),h&&!c&&(c=Me(h/2));return(void 0!==e||void 0!==i)&&s&&l.height&&c>l.height&&(c=l.height,h=Me(Math.floor(c*s))),{width:h,height:c}}function ke(t,e,i){const s=e||1,n=Math.floor(t.height*s),o=Math.floor(t.width*s);t.height=Math.floor(t.height),t.width=Math.floor(t.width);const a=t.canvas;return a.style&&(i||!a.style.height&&!a.style.width)&&(a.style.height=`${t.height}px`,a.style.width=`${t.width}px`),(t.currentDevicePixelRatio!==s||a.height!==n||a.width!==o)&&(t.currentDevicePixelRatio=s,a.height=n,a.width=o,t.ctx.setTransform(s,0,0,s,0,0),!0)}const Se=function(){let t=!1;try{const e={get passive(){return t=!0,!1}};window.addEventListener("test",null,e),window.removeEventListener("test",null,e)}catch(t){}return t}();function Pe(t,e){const i=be(t,e),s=i&&i.match(/^(\d+)(\.\d+)?px$/);return s?+s[1]:void 0}function De(t){return!t||s(t.size)||s(t.family)?null:(t.style?t.style+" ":"")+(t.weight?t.weight+" ":"")+t.size+"px "+t.family}function Ce(t,e,i,s,n){let o=e[n];return o||(o=e[n]=t.measureText(n).width,i.push(n)),o>s&&(s=o),s}function Oe(t,e,i,s){let o=(s=s||{}).data=s.data||{},a=s.garbageCollect=s.garbageCollect||[];s.font!==e&&(o=s.data={},a=s.garbageCollect=[],s.font=e),t.save(),t.font=e;let r=0;const l=i.length;let h,c,d,u,f;for(h=0;hi.length){for(h=0;h0&&t.stroke()}}function Re(t,e,i){return i=i||.5,!e||t&&t.x>e.left-i&&t.xe.top-i&&t.y0&&""!==r.strokeColor;let c,d;for(t.save(),t.font=a.string,function(t,e){e.translation&&t.translate(e.translation[0],e.translation[1]),s(e.rotation)||t.rotate(e.rotation),e.color&&(t.fillStyle=e.color),e.textAlign&&(t.textAlign=e.textAlign),e.textBaseline&&(t.textBaseline=e.textBaseline)}(t,r),c=0;ct[0])){const o=i||t;void 0===s&&(s=ti("_fallback",t));const a={[Symbol.toStringTag]:"Object",_cacheable:!0,_scopes:t,_rootScopes:o,_fallback:s,_getTarget:n,override:i=>je([i,...t],e,o,s)};return new Proxy(a,{deleteProperty:(e,i)=>(delete e[i],delete e._keys,delete t[0][i],!0),get:(i,s)=>qe(i,s,(()=>function(t,e,i,s){let n;for(const o of e)if(n=ti(Ue(o,t),i),void 0!==n)return Xe(t,n)?Je(i,s,t,n):n}(s,e,t,i))),getOwnPropertyDescriptor:(t,e)=>Reflect.getOwnPropertyDescriptor(t._scopes[0],e),getPrototypeOf:()=>Reflect.getPrototypeOf(t[0]),has:(t,e)=>ei(t).includes(e),ownKeys:t=>ei(t),set(t,e,i){const s=t._storage||(t._storage=n());return t[e]=s[e]=i,delete t._keys,!0}})}function $e(t,e,i,s){const a={_cacheable:!1,_proxy:t,_context:e,_subProxy:i,_stack:new Set,_descriptors:Ye(t,s),setContext:e=>$e(t,e,i,s),override:n=>$e(t.override(n),e,i,s)};return new Proxy(a,{deleteProperty:(e,i)=>(delete e[i],delete t[i],!0),get:(t,e,i)=>qe(t,e,(()=>function(t,e,i){const{_proxy:s,_context:a,_subProxy:r,_descriptors:l}=t;let h=s[e];S(h)&&l.isScriptable(e)&&(h=function(t,e,i,s){const{_proxy:n,_context:o,_subProxy:a,_stack:r}=i;if(r.has(t))throw new Error("Recursion detected: "+Array.from(r).join("->")+"->"+t);r.add(t);let l=e(o,a||s);r.delete(t),Xe(t,l)&&(l=Je(n._scopes,n,t,l));return l}(e,h,t,i));n(h)&&h.length&&(h=function(t,e,i,s){const{_proxy:n,_context:a,_subProxy:r,_descriptors:l}=i;if(void 0!==a.index&&s(t))return e[a.index%e.length];if(o(e[0])){const i=e,s=n._scopes.filter((t=>t!==i));e=[];for(const o of i){const i=Je(s,n,t,o);e.push($e(i,a,r&&r[t],l))}}return e}(e,h,t,l.isIndexable));Xe(e,h)&&(h=$e(h,a,r&&r[e],l));return h}(t,e,i))),getOwnPropertyDescriptor:(e,i)=>e._descriptors.allKeys?Reflect.has(t,i)?{enumerable:!0,configurable:!0}:void 0:Reflect.getOwnPropertyDescriptor(t,i),getPrototypeOf:()=>Reflect.getPrototypeOf(t),has:(e,i)=>Reflect.has(t,i),ownKeys:()=>Reflect.ownKeys(t),set:(e,i,s)=>(t[i]=s,delete e[i],!0)})}function Ye(t,e={scriptable:!0,indexable:!0}){const{_scriptable:i=e.scriptable,_indexable:s=e.indexable,_allKeys:n=e.allKeys}=t;return{allKeys:n,scriptable:i,indexable:s,isScriptable:S(i)?i:()=>i,isIndexable:S(s)?s:()=>s}}const Ue=(t,e)=>t?t+w(e):e,Xe=(t,e)=>o(e)&&"adapters"!==t&&(null===Object.getPrototypeOf(e)||e.constructor===Object);function qe(t,e,i){if(Object.prototype.hasOwnProperty.call(t,e))return t[e];const s=i();return t[e]=s,s}function Ke(t,e,i){return S(t)?t(e,i):t}const Ge=(t,e)=>!0===t?e:"string"==typeof t?M(e,t):void 0;function Ze(t,e,i,s,n){for(const o of e){const e=Ge(i,o);if(e){t.add(e);const o=Ke(e._fallback,i,n);if(void 0!==o&&o!==i&&o!==s)return o}else if(!1===e&&void 0!==s&&i!==s)return null}return!1}function Je(t,e,i,s){const a=e._rootScopes,r=Ke(e._fallback,i,s),l=[...t,...a],h=new Set;h.add(s);let c=Qe(h,l,i,r||i,s);return null!==c&&((void 0===r||r===i||(c=Qe(h,l,r,c,s),null!==c))&&je(Array.from(h),[""],a,r,(()=>function(t,e,i){const s=t._getTarget();e in s||(s[e]={});const a=s[e];if(n(a)&&o(i))return i;return a||{}}(e,i,s))))}function Qe(t,e,i,s,n){for(;i;)i=Ze(t,e,i,s,n);return i}function ti(t,e){for(const i of e){if(!i)continue;const e=i[t];if(void 0!==e)return e}}function ei(t){let e=t._keys;return e||(e=t._keys=function(t){const e=new Set;for(const i of t)for(const t of Object.keys(i).filter((t=>!t.startsWith("_"))))e.add(t);return Array.from(e)}(t._scopes)),e}function ii(t,e,i,s){const{iScale:n}=t,{key:o="r"}=this._parsing,a=new Array(s);let r,l,h,c;for(r=0,l=s;re"x"===t?"y":"x";function ai(t,e,i,s){const n=t.skip?e:t,o=e,a=i.skip?e:i,r=q(o,n),l=q(a,o);let h=r/(r+l),c=l/(r+l);h=isNaN(h)?0:h,c=isNaN(c)?0:c;const d=s*h,u=s*c;return{previous:{x:o.x-d*(a.x-n.x),y:o.y-d*(a.y-n.y)},next:{x:o.x+u*(a.x-n.x),y:o.y+u*(a.y-n.y)}}}function ri(t,e="x"){const i=oi(e),s=t.length,n=Array(s).fill(0),o=Array(s);let a,r,l,h=ni(t,0);for(a=0;a!t.skip))),"monotone"===e.cubicInterpolationMode)ri(t,n);else{let i=s?t[t.length-1]:t[0];for(o=0,a=t.length;o0===t||1===t,di=(t,e,i)=>-Math.pow(2,10*(t-=1))*Math.sin((t-e)*O/i),ui=(t,e,i)=>Math.pow(2,-10*t)*Math.sin((t-e)*O/i)+1,fi={linear:t=>t,easeInQuad:t=>t*t,easeOutQuad:t=>-t*(t-2),easeInOutQuad:t=>(t/=.5)<1?.5*t*t:-.5*(--t*(t-2)-1),easeInCubic:t=>t*t*t,easeOutCubic:t=>(t-=1)*t*t+1,easeInOutCubic:t=>(t/=.5)<1?.5*t*t*t:.5*((t-=2)*t*t+2),easeInQuart:t=>t*t*t*t,easeOutQuart:t=>-((t-=1)*t*t*t-1),easeInOutQuart:t=>(t/=.5)<1?.5*t*t*t*t:-.5*((t-=2)*t*t*t-2),easeInQuint:t=>t*t*t*t*t,easeOutQuint:t=>(t-=1)*t*t*t*t+1,easeInOutQuint:t=>(t/=.5)<1?.5*t*t*t*t*t:.5*((t-=2)*t*t*t*t+2),easeInSine:t=>1-Math.cos(t*E),easeOutSine:t=>Math.sin(t*E),easeInOutSine:t=>-.5*(Math.cos(C*t)-1),easeInExpo:t=>0===t?0:Math.pow(2,10*(t-1)),easeOutExpo:t=>1===t?1:1-Math.pow(2,-10*t),easeInOutExpo:t=>ci(t)?t:t<.5?.5*Math.pow(2,10*(2*t-1)):.5*(2-Math.pow(2,-10*(2*t-1))),easeInCirc:t=>t>=1?t:-(Math.sqrt(1-t*t)-1),easeOutCirc:t=>Math.sqrt(1-(t-=1)*t),easeInOutCirc:t=>(t/=.5)<1?-.5*(Math.sqrt(1-t*t)-1):.5*(Math.sqrt(1-(t-=2)*t)+1),easeInElastic:t=>ci(t)?t:di(t,.075,.3),easeOutElastic:t=>ci(t)?t:ui(t,.075,.3),easeInOutElastic(t){const e=.1125;return ci(t)?t:t<.5?.5*di(2*t,e,.45):.5+.5*ui(2*t-1,e,.45)},easeInBack(t){const e=1.70158;return t*t*((e+1)*t-e)},easeOutBack(t){const e=1.70158;return(t-=1)*t*((e+1)*t+e)+1},easeInOutBack(t){let e=1.70158;return(t/=.5)<1?t*t*((1+(e*=1.525))*t-e)*.5:.5*((t-=2)*t*((1+(e*=1.525))*t+e)+2)},easeInBounce:t=>1-fi.easeOutBounce(1-t),easeOutBounce(t){const e=7.5625,i=2.75;return t<1/i?e*t*t:t<2/i?e*(t-=1.5/i)*t+.75:t<2.5/i?e*(t-=2.25/i)*t+.9375:e*(t-=2.625/i)*t+.984375},easeInOutBounce:t=>t<.5?.5*fi.easeInBounce(2*t):.5*fi.easeOutBounce(2*t-1)+.5};function gi(t,e,i,s){return{x:t.x+i*(e.x-t.x),y:t.y+i*(e.y-t.y)}}function pi(t,e,i,s){return{x:t.x+i*(e.x-t.x),y:"middle"===s?i<.5?t.y:e.y:"after"===s?i<1?t.y:e.y:i>0?e.y:t.y}}function mi(t,e,i,s){const n={x:t.cp2x,y:t.cp2y},o={x:e.cp1x,y:e.cp1y},a=gi(t,n,i),r=gi(n,o,i),l=gi(o,e,i),h=gi(a,r,i),c=gi(r,l,i);return gi(h,c,i)}const bi=/^(normal|(\d+(?:\.\d+)?)(px|em|%)?)$/,xi=/^(normal|italic|initial|inherit|unset|(oblique( -?[0-9]?[0-9]deg)?))$/;function _i(t,e){const i=(""+t).match(bi);if(!i||"normal"===i[1])return 1.2*e;switch(t=+i[2],i[3]){case"px":return t;case"%":t/=100}return e*t}const yi=t=>+t||0;function vi(t,e){const i={},s=o(e),n=s?Object.keys(e):e,a=o(t)?s?i=>l(t[i],t[e[i]]):e=>t[e]:()=>t;for(const t of n)i[t]=yi(a(t));return i}function Mi(t){return vi(t,{top:"y",right:"x",bottom:"y",left:"x"})}function wi(t){return vi(t,["topLeft","topRight","bottomLeft","bottomRight"])}function ki(t){const e=Mi(t);return e.width=e.left+e.right,e.height=e.top+e.bottom,e}function Si(t,e){t=t||{},e=e||ue.font;let i=l(t.size,e.size);"string"==typeof i&&(i=parseInt(i,10));let s=l(t.style,e.style);s&&!(""+s).match(xi)&&(console.warn('Invalid font style specified: "'+s+'"'),s=void 0);const n={family:l(t.family,e.family),lineHeight:_i(l(t.lineHeight,e.lineHeight),i),size:i,style:s,weight:l(t.weight,e.weight),string:""};return n.string=De(n),n}function Pi(t,e,i,s){let o,a,r,l=!0;for(o=0,a=t.length;oi&&0===t?0:t+e;return{min:a(s,-Math.abs(o)),max:a(n,o)}}function Ci(t,e){return Object.assign(Object.create(t),e)}function Oi(t,e,i){return t?function(t,e){return{x:i=>t+t+e-i,setWidth(t){e=t},textAlign:t=>"center"===t?t:"right"===t?"left":"right",xPlus:(t,e)=>t-e,leftForLtr:(t,e)=>t-e}}(e,i):{x:t=>t,setWidth(t){},textAlign:t=>t,xPlus:(t,e)=>t+e,leftForLtr:(t,e)=>t}}function Ai(t,e){let i,s;"ltr"!==e&&"rtl"!==e||(i=t.canvas.style,s=[i.getPropertyValue("direction"),i.getPropertyPriority("direction")],i.setProperty("direction",e,"important"),t.prevTextDirection=s)}function Ti(t,e){void 0!==e&&(delete t.prevTextDirection,t.canvas.style.setProperty("direction",e[0],e[1]))}function Li(t){return"angle"===t?{between:Z,compare:K,normalize:G}:{between:tt,compare:(t,e)=>t-e,normalize:t=>t}}function Ei({start:t,end:e,count:i,loop:s,style:n}){return{start:t%i,end:e%i,loop:s&&(e-t+1)%i==0,style:n}}function Ri(t,e,i){if(!i)return[t];const{property:s,start:n,end:o}=i,a=e.length,{compare:r,between:l,normalize:h}=Li(s),{start:c,end:d,loop:u,style:f}=function(t,e,i){const{property:s,start:n,end:o}=i,{between:a,normalize:r}=Li(s),l=e.length;let h,c,{start:d,end:u,loop:f}=t;if(f){for(d+=l,u+=l,h=0,c=l;hx||l(n,b,p)&&0!==r(n,b),v=()=>!x||0===r(o,p)||l(o,b,p);for(let t=c,i=c;t<=d;++t)m=e[t%a],m.skip||(p=h(m[s]),p!==b&&(x=l(p,n,o),null===_&&y()&&(_=0===r(p,n)?t:i),null!==_&&v()&&(g.push(Ei({start:_,end:t,loop:u,count:a,style:f})),_=null),i=t,b=p));return null!==_&&g.push(Ei({start:_,end:d,loop:u,count:a,style:f})),g}function Ii(t,e){const i=[],s=t.segments;for(let n=0;nn&&t[o%e].skip;)o--;return o%=e,{start:n,end:o}}(i,n,o,s);if(!0===s)return Fi(t,[{start:a,end:r,loop:o}],i,e);return Fi(t,function(t,e,i,s){const n=t.length,o=[];let a,r=e,l=t[e];for(a=e+1;a<=i;++a){const i=t[a%n];i.skip||i.stop?l.skip||(s=!1,o.push({start:e%n,end:(a-1)%n,loop:s}),e=r=i.stop?a:null):(r=a,l.skip&&(e=a)),l=i}return null!==r&&o.push({start:e%n,end:r%n,loop:s}),o}(i,a,r{t[a](e[i],n)&&(o.push({element:t,datasetIndex:s,index:l}),r=r||t.inRange(e.x,e.y,n))})),s&&!r?[]:o}var Xi={evaluateInteractionItems:Hi,modes:{index(t,e,i,s){const n=ve(e,t),o=i.axis||"x",a=i.includeInvisible||!1,r=i.intersect?ji(t,n,o,s,a):Yi(t,n,o,!1,s,a),l=[];return r.length?(t.getSortedVisibleDatasetMetas().forEach((t=>{const e=r[0].index,i=t.data[e];i&&!i.skip&&l.push({element:i,datasetIndex:t.index,index:e})})),l):[]},dataset(t,e,i,s){const n=ve(e,t),o=i.axis||"xy",a=i.includeInvisible||!1;let r=i.intersect?ji(t,n,o,s,a):Yi(t,n,o,!1,s,a);if(r.length>0){const e=r[0].datasetIndex,i=t.getDatasetMeta(e).data;r=[];for(let t=0;tji(t,ve(e,t),i.axis||"xy",s,i.includeInvisible||!1),nearest(t,e,i,s){const n=ve(e,t),o=i.axis||"xy",a=i.includeInvisible||!1;return Yi(t,n,o,i.intersect,s,a)},x:(t,e,i,s)=>Ui(t,ve(e,t),"x",i.intersect,s),y:(t,e,i,s)=>Ui(t,ve(e,t),"y",i.intersect,s)}};const qi=["left","top","right","bottom"];function Ki(t,e){return t.filter((t=>t.pos===e))}function Gi(t,e){return t.filter((t=>-1===qi.indexOf(t.pos)&&t.box.axis===e))}function Zi(t,e){return t.sort(((t,i)=>{const s=e?i:t,n=e?t:i;return s.weight===n.weight?s.index-n.index:s.weight-n.weight}))}function Ji(t,e){const i=function(t){const e={};for(const i of t){const{stack:t,pos:s,stackWeight:n}=i;if(!t||!qi.includes(s))continue;const o=e[t]||(e[t]={count:0,placed:0,weight:0,size:0});o.count++,o.weight+=n}return e}(t),{vBoxMaxWidth:s,hBoxMaxHeight:n}=e;let o,a,r;for(o=0,a=t.length;o{s[t]=Math.max(e[t],i[t])})),s}return s(t?["left","right"]:["top","bottom"])}function ss(t,e,i,s){const n=[];let o,a,r,l,h,c;for(o=0,a=t.length,h=0;ot.box.fullSize)),!0),s=Zi(Ki(e,"left"),!0),n=Zi(Ki(e,"right")),o=Zi(Ki(e,"top"),!0),a=Zi(Ki(e,"bottom")),r=Gi(e,"x"),l=Gi(e,"y");return{fullSize:i,leftAndTop:s.concat(o),rightAndBottom:n.concat(l).concat(a).concat(r),chartArea:Ki(e,"chartArea"),vertical:s.concat(n).concat(l),horizontal:o.concat(a).concat(r)}}(t.boxes),l=r.vertical,h=r.horizontal;u(t.boxes,(t=>{"function"==typeof t.beforeLayout&&t.beforeLayout()}));const c=l.reduce(((t,e)=>e.box.options&&!1===e.box.options.display?t:t+1),0)||1,d=Object.freeze({outerWidth:e,outerHeight:i,padding:n,availableWidth:o,availableHeight:a,vBoxMaxWidth:o/2/c,hBoxMaxHeight:a/2}),f=Object.assign({},n);ts(f,ki(s));const g=Object.assign({maxPadding:f,w:o,h:a,x:n.left,y:n.top},n),p=Ji(l.concat(h),d);ss(r.fullSize,g,d,p),ss(l,g,d,p),ss(h,g,d,p)&&ss(l,g,d,p),function(t){const e=t.maxPadding;function i(i){const s=Math.max(e[i]-t[i],0);return t[i]+=s,s}t.y+=i("top"),t.x+=i("left"),i("right"),i("bottom")}(g),os(r.leftAndTop,g,d,p),g.x+=g.w,g.y+=g.h,os(r.rightAndBottom,g,d,p),t.chartArea={left:g.left,top:g.top,right:g.left+g.w,bottom:g.top+g.h,height:g.h,width:g.w},u(r.chartArea,(e=>{const i=e.box;Object.assign(i,t.chartArea),i.update(g.w,g.h,{left:0,top:0,right:0,bottom:0})}))}};class rs{acquireContext(t,e){}releaseContext(t){return!1}addEventListener(t,e,i){}removeEventListener(t,e,i){}getDevicePixelRatio(){return 1}getMaximumSize(t,e,i,s){return e=Math.max(0,e||t.width),i=i||t.height,{width:e,height:Math.max(0,s?Math.floor(e/s):i)}}isAttached(t){return!0}updateConfig(t){}}class ls extends rs{acquireContext(t){return t&&t.getContext&&t.getContext("2d")||null}updateConfig(t){t.options.animation=!1}}const hs="$chartjs",cs={touchstart:"mousedown",touchmove:"mousemove",touchend:"mouseup",pointerenter:"mouseenter",pointerdown:"mousedown",pointermove:"mousemove",pointerup:"mouseup",pointerleave:"mouseout",pointerout:"mouseout"},ds=t=>null===t||""===t;const us=!!Se&&{passive:!0};function fs(t,e,i){t.canvas.removeEventListener(e,i,us)}function gs(t,e){for(const i of t)if(i===e||i.contains(e))return!0}function ps(t,e,i){const s=t.canvas,n=new MutationObserver((t=>{let e=!1;for(const i of t)e=e||gs(i.addedNodes,s),e=e&&!gs(i.removedNodes,s);e&&i()}));return n.observe(document,{childList:!0,subtree:!0}),n}function ms(t,e,i){const s=t.canvas,n=new MutationObserver((t=>{let e=!1;for(const i of t)e=e||gs(i.removedNodes,s),e=e&&!gs(i.addedNodes,s);e&&i()}));return n.observe(document,{childList:!0,subtree:!0}),n}const bs=new Map;let xs=0;function _s(){const t=window.devicePixelRatio;t!==xs&&(xs=t,bs.forEach(((e,i)=>{i.currentDevicePixelRatio!==t&&e()})))}function ys(t,e,i){const s=t.canvas,n=s&&ge(s);if(!n)return;const o=ct(((t,e)=>{const s=n.clientWidth;i(t,e),s{const e=t[0],i=e.contentRect.width,s=e.contentRect.height;0===i&&0===s||o(i,s)}));return a.observe(n),function(t,e){bs.size||window.addEventListener("resize",_s),bs.set(t,e)}(t,o),a}function vs(t,e,i){i&&i.disconnect(),"resize"===e&&function(t){bs.delete(t),bs.size||window.removeEventListener("resize",_s)}(t)}function Ms(t,e,i){const s=t.canvas,n=ct((e=>{null!==t.ctx&&i(function(t,e){const i=cs[t.type]||t.type,{x:s,y:n}=ve(t,e);return{type:i,chart:e,native:t,x:void 0!==s?s:null,y:void 0!==n?n:null}}(e,t))}),t);return function(t,e,i){t.addEventListener(e,i,us)}(s,e,n),n}class ws extends rs{acquireContext(t,e){const i=t&&t.getContext&&t.getContext("2d");return i&&i.canvas===t?(function(t,e){const i=t.style,s=t.getAttribute("height"),n=t.getAttribute("width");if(t[hs]={initial:{height:s,width:n,style:{display:i.display,height:i.height,width:i.width}}},i.display=i.display||"block",i.boxSizing=i.boxSizing||"border-box",ds(n)){const e=Pe(t,"width");void 0!==e&&(t.width=e)}if(ds(s))if(""===t.style.height)t.height=t.width/(e||2);else{const e=Pe(t,"height");void 0!==e&&(t.height=e)}}(t,e),i):null}releaseContext(t){const e=t.canvas;if(!e[hs])return!1;const i=e[hs].initial;["height","width"].forEach((t=>{const n=i[t];s(n)?e.removeAttribute(t):e.setAttribute(t,n)}));const n=i.style||{};return Object.keys(n).forEach((t=>{e.style[t]=n[t]})),e.width=e.width,delete e[hs],!0}addEventListener(t,e,i){this.removeEventListener(t,e);const s=t.$proxies||(t.$proxies={}),n={attach:ps,detach:ms,resize:ys}[e]||Ms;s[e]=n(t,e,i)}removeEventListener(t,e){const i=t.$proxies||(t.$proxies={}),s=i[e];if(!s)return;({attach:vs,detach:vs,resize:vs}[e]||fs)(t,e,s),i[e]=void 0}getDevicePixelRatio(){return window.devicePixelRatio}getMaximumSize(t,e,i,s){return we(t,e,i,s)}isAttached(t){const e=ge(t);return!(!e||!e.isConnected)}}function ks(t){return!fe()||"undefined"!=typeof OffscreenCanvas&&t instanceof OffscreenCanvas?ls:ws}var Ss=Object.freeze({__proto__:null,BasePlatform:rs,BasicPlatform:ls,DomPlatform:ws,_detectPlatform:ks});const Ps="transparent",Ds={boolean:(t,e,i)=>i>.5?e:t,color(t,e,i){const s=Qt(t||Ps),n=s.valid&&Qt(e||Ps);return n&&n.valid?n.mix(s,i).hexString():e},number:(t,e,i)=>t+(e-t)*i};class Cs{constructor(t,e,i,s){const n=e[i];s=Pi([t.to,s,n,t.from]);const o=Pi([t.from,n,s]);this._active=!0,this._fn=t.fn||Ds[t.type||typeof o],this._easing=fi[t.easing]||fi.linear,this._start=Math.floor(Date.now()+(t.delay||0)),this._duration=this._total=Math.floor(t.duration),this._loop=!!t.loop,this._target=e,this._prop=i,this._from=o,this._to=s,this._promises=void 0}active(){return this._active}update(t,e,i){if(this._active){this._notify(!1);const s=this._target[this._prop],n=i-this._start,o=this._duration-n;this._start=i,this._duration=Math.floor(Math.max(o,t.duration)),this._total+=n,this._loop=!!t.loop,this._to=Pi([t.to,e,s,t.from]),this._from=Pi([t.from,s,e])}}cancel(){this._active&&(this.tick(Date.now()),this._active=!1,this._notify(!1))}tick(t){const e=t-this._start,i=this._duration,s=this._prop,n=this._from,o=this._loop,a=this._to;let r;if(this._active=n!==a&&(o||e1?2-r:r,r=this._easing(Math.min(1,Math.max(0,r))),this._target[s]=this._fn(n,a,r))}wait(){const t=this._promises||(this._promises=[]);return new Promise(((e,i)=>{t.push({res:e,rej:i})}))}_notify(t){const e=t?"res":"rej",i=this._promises||[];for(let t=0;t{const a=t[s];if(!o(a))return;const r={};for(const t of e)r[t]=a[t];(n(a.properties)&&a.properties||[s]).forEach((t=>{t!==s&&i.has(t)||i.set(t,r)}))}))}_animateOptions(t,e){const i=e.options,s=function(t,e){if(!e)return;let i=t.options;if(!i)return void(t.options=e);i.$shared&&(t.options=i=Object.assign({},i,{$shared:!1,$animations:{}}));return i}(t,i);if(!s)return[];const n=this._createAnimations(s,i);return i.$shared&&function(t,e){const i=[],s=Object.keys(e);for(let e=0;e{t.options=i}),(()=>{})),n}_createAnimations(t,e){const i=this._properties,s=[],n=t.$animations||(t.$animations={}),o=Object.keys(e),a=Date.now();let r;for(r=o.length-1;r>=0;--r){const l=o[r];if("$"===l.charAt(0))continue;if("options"===l){s.push(...this._animateOptions(t,e));continue}const h=e[l];let c=n[l];const d=i.get(l);if(c){if(d&&c.active()){c.update(d,h,a);continue}c.cancel()}d&&d.duration?(n[l]=c=new Cs(d,t,l,h),s.push(c)):t[l]=h}return s}update(t,e){if(0===this._properties.size)return void Object.assign(t,e);const i=this._createAnimations(t,e);return i.length?(xt.add(this._chart,i),!0):void 0}}function As(t,e){const i=t&&t.options||{},s=i.reverse,n=void 0===i.min?e:0,o=void 0===i.max?e:0;return{start:s?o:n,end:s?n:o}}function Ts(t,e){const i=[],s=t._getSortedDatasetMetas(e);let n,o;for(n=0,o=s.length;n0||!i&&e<0)return n.index}return null}function zs(t,e){const{chart:i,_cachedMeta:s}=t,n=i._stacks||(i._stacks={}),{iScale:o,vScale:a,index:r}=s,l=o.axis,h=a.axis,c=function(t,e,i){return`${t.id}.${e.id}.${i.stack||i.type}`}(o,a,s),d=e.length;let u;for(let t=0;ti[t].axis===e)).shift()}function Vs(t,e){const i=t.controller.index,s=t.vScale&&t.vScale.axis;if(s){e=e||t._parsed;for(const t of e){const e=t._stacks;if(!e||void 0===e[s]||void 0===e[s][i])return;delete e[s][i],void 0!==e[s]._visualValues&&void 0!==e[s]._visualValues[i]&&delete e[s]._visualValues[i]}}}const Bs=t=>"reset"===t||"none"===t,Ws=(t,e)=>e?t:Object.assign({},t);class Ns{static defaults={};static datasetElementType=null;static dataElementType=null;constructor(t,e){this.chart=t,this._ctx=t.ctx,this.index=e,this._cachedDataOpts={},this._cachedMeta=this.getMeta(),this._type=this._cachedMeta.type,this.options=void 0,this._parsing=!1,this._data=void 0,this._objectData=void 0,this._sharedOptions=void 0,this._drawStart=void 0,this._drawCount=void 0,this.enableOptionSharing=!1,this.supportsDecimation=!1,this.$context=void 0,this._syncList=[],this.datasetElementType=new.target.datasetElementType,this.dataElementType=new.target.dataElementType,this.initialize()}initialize(){const t=this._cachedMeta;this.configure(),this.linkScales(),t._stacked=Es(t.vScale,t),this.addElements(),this.options.fill&&!this.chart.isPluginEnabled("filler")&&console.warn("Tried to use the 'fill' option without the 'Filler' plugin enabled. Please import and register the 'Filler' plugin and make sure it is not disabled in the options")}updateIndex(t){this.index!==t&&Vs(this._cachedMeta),this.index=t}linkScales(){const t=this.chart,e=this._cachedMeta,i=this.getDataset(),s=(t,e,i,s)=>"x"===t?e:"r"===t?s:i,n=e.xAxisID=l(i.xAxisID,Fs(t,"x")),o=e.yAxisID=l(i.yAxisID,Fs(t,"y")),a=e.rAxisID=l(i.rAxisID,Fs(t,"r")),r=e.indexAxis,h=e.iAxisID=s(r,n,o,a),c=e.vAxisID=s(r,o,n,a);e.xScale=this.getScaleForId(n),e.yScale=this.getScaleForId(o),e.rScale=this.getScaleForId(a),e.iScale=this.getScaleForId(h),e.vScale=this.getScaleForId(c)}getDataset(){return this.chart.data.datasets[this.index]}getMeta(){return this.chart.getDatasetMeta(this.index)}getScaleForId(t){return this.chart.scales[t]}_getOtherScale(t){const e=this._cachedMeta;return t===e.iScale?e.vScale:e.iScale}reset(){this._update("reset")}_destroy(){const t=this._cachedMeta;this._data&&rt(this._data,this),t._stacked&&Vs(t)}_dataCheck(){const t=this.getDataset(),e=t.data||(t.data=[]),i=this._data;if(o(e))this._data=function(t){const e=Object.keys(t),i=new Array(e.length);let s,n,o;for(s=0,n=e.length;s0&&i._parsed[t-1];if(!1===this._parsing)i._parsed=s,i._sorted=!0,d=s;else{d=n(s[t])?this.parseArrayData(i,s,t,e):o(s[t])?this.parseObjectData(i,s,t,e):this.parsePrimitiveData(i,s,t,e);const a=()=>null===c[l]||f&&c[l]t&&!e.hidden&&e._stacked&&{keys:Ts(i,!0),values:null})(e,i,this.chart),h={min:Number.POSITIVE_INFINITY,max:Number.NEGATIVE_INFINITY},{min:c,max:d}=function(t){const{min:e,max:i,minDefined:s,maxDefined:n}=t.getUserBounds();return{min:s?e:Number.NEGATIVE_INFINITY,max:n?i:Number.POSITIVE_INFINITY}}(r);let u,f;function g(){f=s[u];const e=f[r.axis];return!a(f[t.axis])||c>e||d=0;--u)if(!g()){this.updateRangeFromParsed(h,t,f,l);break}return h}getAllParsedValues(t){const e=this._cachedMeta._parsed,i=[];let s,n,o;for(s=0,n=e.length;s=0&&tthis.getContext(i,s,e)),c);return f.$shared&&(f.$shared=r,n[o]=Object.freeze(Ws(f,r))),f}_resolveAnimations(t,e,i){const s=this.chart,n=this._cachedDataOpts,o=`animation-${e}`,a=n[o];if(a)return a;let r;if(!1!==s.options.animation){const s=this.chart.config,n=s.datasetAnimationScopeKeys(this._type,e),o=s.getOptionScopes(this.getDataset(),n);r=s.createResolver(o,this.getContext(t,i,e))}const l=new Os(s,r&&r.animations);return r&&r._cacheable&&(n[o]=Object.freeze(l)),l}getSharedOptions(t){if(t.$shared)return this._sharedOptions||(this._sharedOptions=Object.assign({},t))}includeOptions(t,e){return!e||Bs(t)||this.chart._animationsDisabled}_getSharedOptions(t,e){const i=this.resolveDataElementOptions(t,e),s=this._sharedOptions,n=this.getSharedOptions(i),o=this.includeOptions(e,n)||n!==s;return this.updateSharedOptions(n,e,i),{sharedOptions:n,includeOptions:o}}updateElement(t,e,i,s){Bs(s)?Object.assign(t,i):this._resolveAnimations(e,s).update(t,i)}updateSharedOptions(t,e,i){t&&!Bs(e)&&this._resolveAnimations(void 0,e).update(t,i)}_setStyle(t,e,i,s){t.active=s;const n=this.getStyle(e,s);this._resolveAnimations(e,i,s).update(t,{options:!s&&this.getSharedOptions(n)||n})}removeHoverStyle(t,e,i){this._setStyle(t,i,"active",!1)}setHoverStyle(t,e,i){this._setStyle(t,i,"active",!0)}_removeDatasetHoverStyle(){const t=this._cachedMeta.dataset;t&&this._setStyle(t,void 0,"active",!1)}_setDatasetHoverStyle(){const t=this._cachedMeta.dataset;t&&this._setStyle(t,void 0,"active",!0)}_resyncElements(t){const e=this._data,i=this._cachedMeta.data;for(const[t,e,i]of this._syncList)this[t](e,i);this._syncList=[];const s=i.length,n=e.length,o=Math.min(n,s);o&&this.parse(0,o),n>s?this._insertElements(s,n-s,t):n{for(t.length+=e,a=t.length-1;a>=o;a--)t[a]=t[a-e]};for(r(n),a=t;a{s[t]=i[t]&&i[t].active()?i[t]._to:this[t]})),s}}function js(t,e){const i=t.options.ticks,n=function(t){const e=t.options.offset,i=t._tickSize(),s=t._length/i+(e?0:1),n=t._maxLength/i;return Math.floor(Math.min(s,n))}(t),o=Math.min(i.maxTicksLimit||n,n),a=i.major.enabled?function(t){const e=[];let i,s;for(i=0,s=t.length;io)return function(t,e,i,s){let n,o=0,a=i[0];for(s=Math.ceil(s),n=0;nn)return e}return Math.max(n,1)}(a,e,o);if(r>0){let t,i;const n=r>1?Math.round((h-l)/(r-1)):null;for($s(e,c,d,s(n)?0:l-n,l),t=0,i=r-1;t"top"===e||"left"===e?t[e]+i:t[e]-i,Us=(t,e)=>Math.min(e||t,t);function Xs(t,e){const i=[],s=t.length/e,n=t.length;let o=0;for(;oa+r)))return h}function Ks(t){return t.drawTicks?t.tickLength:0}function Gs(t,e){if(!t.display)return 0;const i=Si(t.font,e),s=ki(t.padding);return(n(t.text)?t.text.length:1)*i.lineHeight+s.height}function Zs(t,e,i){let s=ut(t);return(i&&"right"!==e||!i&&"right"===e)&&(s=(t=>"left"===t?"right":"right"===t?"left":t)(s)),s}class Js extends Hs{constructor(t){super(),this.id=t.id,this.type=t.type,this.options=void 0,this.ctx=t.ctx,this.chart=t.chart,this.top=void 0,this.bottom=void 0,this.left=void 0,this.right=void 0,this.width=void 0,this.height=void 0,this._margins={left:0,right:0,top:0,bottom:0},this.maxWidth=void 0,this.maxHeight=void 0,this.paddingTop=void 0,this.paddingBottom=void 0,this.paddingLeft=void 0,this.paddingRight=void 0,this.axis=void 0,this.labelRotation=void 0,this.min=void 0,this.max=void 0,this._range=void 0,this.ticks=[],this._gridLineItems=null,this._labelItems=null,this._labelSizes=null,this._length=0,this._maxLength=0,this._longestTextCache={},this._startPixel=void 0,this._endPixel=void 0,this._reversePixels=!1,this._userMax=void 0,this._userMin=void 0,this._suggestedMax=void 0,this._suggestedMin=void 0,this._ticksLength=0,this._borderValue=0,this._cache={},this._dataLimitsCached=!1,this.$context=void 0}init(t){this.options=t.setContext(this.getContext()),this.axis=t.axis,this._userMin=this.parse(t.min),this._userMax=this.parse(t.max),this._suggestedMin=this.parse(t.suggestedMin),this._suggestedMax=this.parse(t.suggestedMax)}parse(t,e){return t}getUserBounds(){let{_userMin:t,_userMax:e,_suggestedMin:i,_suggestedMax:s}=this;return t=r(t,Number.POSITIVE_INFINITY),e=r(e,Number.NEGATIVE_INFINITY),i=r(i,Number.POSITIVE_INFINITY),s=r(s,Number.NEGATIVE_INFINITY),{min:r(t,i),max:r(e,s),minDefined:a(t),maxDefined:a(e)}}getMinMax(t){let e,{min:i,max:s,minDefined:n,maxDefined:o}=this.getUserBounds();if(n&&o)return{min:i,max:s};const a=this.getMatchingVisibleMetas();for(let r=0,l=a.length;rs?s:i,s=n&&i>s?i:s,{min:r(i,r(s,i)),max:r(s,r(i,s))}}getPadding(){return{left:this.paddingLeft||0,top:this.paddingTop||0,right:this.paddingRight||0,bottom:this.paddingBottom||0}}getTicks(){return this.ticks}getLabels(){const t=this.chart.data;return this.options.labels||(this.isHorizontal()?t.xLabels:t.yLabels)||t.labels||[]}getLabelItems(t=this.chart.chartArea){return this._labelItems||(this._labelItems=this._computeLabelItems(t))}beforeLayout(){this._cache={},this._dataLimitsCached=!1}beforeUpdate(){d(this.options.beforeUpdate,[this])}update(t,e,i){const{beginAtZero:s,grace:n,ticks:o}=this.options,a=o.sampleSize;this.beforeUpdate(),this.maxWidth=t,this.maxHeight=e,this._margins=i=Object.assign({left:0,right:0,top:0,bottom:0},i),this.ticks=null,this._labelSizes=null,this._gridLineItems=null,this._labelItems=null,this.beforeSetDimensions(),this.setDimensions(),this.afterSetDimensions(),this._maxLength=this.isHorizontal()?this.width+i.left+i.right:this.height+i.top+i.bottom,this._dataLimitsCached||(this.beforeDataLimits(),this.determineDataLimits(),this.afterDataLimits(),this._range=Di(this,n,s),this._dataLimitsCached=!0),this.beforeBuildTicks(),this.ticks=this.buildTicks()||[],this.afterBuildTicks();const r=a=n||i<=1||!this.isHorizontal())return void(this.labelRotation=s);const h=this._getLabelSizes(),c=h.widest.width,d=h.highest.height,u=J(this.chart.width-c,0,this.maxWidth);o=t.offset?this.maxWidth/i:u/(i-1),c+6>o&&(o=u/(i-(t.offset?.5:1)),a=this.maxHeight-Ks(t.grid)-e.padding-Gs(t.title,this.chart.options.font),r=Math.sqrt(c*c+d*d),l=Y(Math.min(Math.asin(J((h.highest.height+6)/o,-1,1)),Math.asin(J(a/r,-1,1))-Math.asin(J(d/r,-1,1)))),l=Math.max(s,Math.min(n,l))),this.labelRotation=l}afterCalculateLabelRotation(){d(this.options.afterCalculateLabelRotation,[this])}afterAutoSkip(){}beforeFit(){d(this.options.beforeFit,[this])}fit(){const t={width:0,height:0},{chart:e,options:{ticks:i,title:s,grid:n}}=this,o=this._isVisible(),a=this.isHorizontal();if(o){const o=Gs(s,e.options.font);if(a?(t.width=this.maxWidth,t.height=Ks(n)+o):(t.height=this.maxHeight,t.width=Ks(n)+o),i.display&&this.ticks.length){const{first:e,last:s,widest:n,highest:o}=this._getLabelSizes(),r=2*i.padding,l=$(this.labelRotation),h=Math.cos(l),c=Math.sin(l);if(a){const e=i.mirror?0:c*n.width+h*o.height;t.height=Math.min(this.maxHeight,t.height+e+r)}else{const e=i.mirror?0:h*n.width+c*o.height;t.width=Math.min(this.maxWidth,t.width+e+r)}this._calculatePadding(e,s,c,h)}}this._handleMargins(),a?(this.width=this._length=e.width-this._margins.left-this._margins.right,this.height=t.height):(this.width=t.width,this.height=this._length=e.height-this._margins.top-this._margins.bottom)}_calculatePadding(t,e,i,s){const{ticks:{align:n,padding:o},position:a}=this.options,r=0!==this.labelRotation,l="top"!==a&&"x"===this.axis;if(this.isHorizontal()){const a=this.getPixelForTick(0)-this.left,h=this.right-this.getPixelForTick(this.ticks.length-1);let c=0,d=0;r?l?(c=s*t.width,d=i*e.height):(c=i*t.height,d=s*e.width):"start"===n?d=e.width:"end"===n?c=t.width:"inner"!==n&&(c=t.width/2,d=e.width/2),this.paddingLeft=Math.max((c-a+o)*this.width/(this.width-a),0),this.paddingRight=Math.max((d-h+o)*this.width/(this.width-h),0)}else{let i=e.height/2,s=t.height/2;"start"===n?(i=0,s=t.height):"end"===n&&(i=e.height,s=0),this.paddingTop=i+o,this.paddingBottom=s+o}}_handleMargins(){this._margins&&(this._margins.left=Math.max(this.paddingLeft,this._margins.left),this._margins.top=Math.max(this.paddingTop,this._margins.top),this._margins.right=Math.max(this.paddingRight,this._margins.right),this._margins.bottom=Math.max(this.paddingBottom,this._margins.bottom))}afterFit(){d(this.options.afterFit,[this])}isHorizontal(){const{axis:t,position:e}=this.options;return"top"===e||"bottom"===e||"x"===t}isFullSize(){return this.options.fullSize}_convertTicksToLabels(t){let e,i;for(this.beforeTickToLabelConversion(),this.generateTickLabels(t),e=0,i=t.length;e{const i=t.gc,s=i.length/2;let n;if(s>e){for(n=0;n({width:r[t]||0,height:l[t]||0});return{first:P(0),last:P(e-1),widest:P(k),highest:P(S),widths:r,heights:l}}getLabelForValue(t){return t}getPixelForValue(t,e){return NaN}getValueForPixel(t){}getPixelForTick(t){const e=this.ticks;return t<0||t>e.length-1?null:this.getPixelForValue(e[t].value)}getPixelForDecimal(t){this._reversePixels&&(t=1-t);const e=this._startPixel+t*this._length;return Q(this._alignToPixels?Ae(this.chart,e,0):e)}getDecimalForPixel(t){const e=(t-this._startPixel)/this._length;return this._reversePixels?1-e:e}getBasePixel(){return this.getPixelForValue(this.getBaseValue())}getBaseValue(){const{min:t,max:e}=this;return t<0&&e<0?e:t>0&&e>0?t:0}getContext(t){const e=this.ticks||[];if(t>=0&&ta*s?a/i:r/s:r*s0}_computeGridLineItems(t){const e=this.axis,i=this.chart,s=this.options,{grid:n,position:a,border:r}=s,h=n.offset,c=this.isHorizontal(),d=this.ticks.length+(h?1:0),u=Ks(n),f=[],g=r.setContext(this.getContext()),p=g.display?g.width:0,m=p/2,b=function(t){return Ae(i,t,p)};let x,_,y,v,M,w,k,S,P,D,C,O;if("top"===a)x=b(this.bottom),w=this.bottom-u,S=x-m,D=b(t.top)+m,O=t.bottom;else if("bottom"===a)x=b(this.top),D=t.top,O=b(t.bottom)-m,w=x+m,S=this.top+u;else if("left"===a)x=b(this.right),M=this.right-u,k=x-m,P=b(t.left)+m,C=t.right;else if("right"===a)x=b(this.left),P=t.left,C=b(t.right)-m,M=x+m,k=this.left+u;else if("x"===e){if("center"===a)x=b((t.top+t.bottom)/2+.5);else if(o(a)){const t=Object.keys(a)[0],e=a[t];x=b(this.chart.scales[t].getPixelForValue(e))}D=t.top,O=t.bottom,w=x+m,S=w+u}else if("y"===e){if("center"===a)x=b((t.left+t.right)/2);else if(o(a)){const t=Object.keys(a)[0],e=a[t];x=b(this.chart.scales[t].getPixelForValue(e))}M=x-m,k=M-u,P=t.left,C=t.right}const A=l(s.ticks.maxTicksLimit,d),T=Math.max(1,Math.ceil(d/A));for(_=0;_e.value===t));if(i>=0){return e.setContext(this.getContext(i)).lineWidth}return 0}drawGrid(t){const e=this.options.grid,i=this.ctx,s=this._gridLineItems||(this._gridLineItems=this._computeGridLineItems(t));let n,o;const a=(t,e,s)=>{s.width&&s.color&&(i.save(),i.lineWidth=s.width,i.strokeStyle=s.color,i.setLineDash(s.borderDash||[]),i.lineDashOffset=s.borderDashOffset,i.beginPath(),i.moveTo(t.x,t.y),i.lineTo(e.x,e.y),i.stroke(),i.restore())};if(e.display)for(n=0,o=s.length;n{this.drawBackground(),this.drawGrid(t),this.drawTitle()}},{z:s,draw:()=>{this.drawBorder()}},{z:e,draw:t=>{this.drawLabels(t)}}]:[{z:e,draw:t=>{this.draw(t)}}]}getMatchingVisibleMetas(t){const e=this.chart.getSortedVisibleDatasetMetas(),i=this.axis+"AxisID",s=[];let n,o;for(n=0,o=e.length;n{const s=i.split("."),n=s.pop(),o=[t].concat(s).join("."),a=e[i].split("."),r=a.pop(),l=a.join(".");ue.route(o,n,l,r)}))}(e,t.defaultRoutes);t.descriptors&&ue.describe(e,t.descriptors)}(t,o,i),this.override&&ue.override(t.id,t.overrides)),o}get(t){return this.items[t]}unregister(t){const e=this.items,i=t.id,s=this.scope;i in e&&delete e[i],s&&i in ue[s]&&(delete ue[s][i],this.override&&delete re[i])}}class tn{constructor(){this.controllers=new Qs(Ns,"datasets",!0),this.elements=new Qs(Hs,"elements"),this.plugins=new Qs(Object,"plugins"),this.scales=new Qs(Js,"scales"),this._typedRegistries=[this.controllers,this.scales,this.elements]}add(...t){this._each("register",t)}remove(...t){this._each("unregister",t)}addControllers(...t){this._each("register",t,this.controllers)}addElements(...t){this._each("register",t,this.elements)}addPlugins(...t){this._each("register",t,this.plugins)}addScales(...t){this._each("register",t,this.scales)}getController(t){return this._get(t,this.controllers,"controller")}getElement(t){return this._get(t,this.elements,"element")}getPlugin(t){return this._get(t,this.plugins,"plugin")}getScale(t){return this._get(t,this.scales,"scale")}removeControllers(...t){this._each("unregister",t,this.controllers)}removeElements(...t){this._each("unregister",t,this.elements)}removePlugins(...t){this._each("unregister",t,this.plugins)}removeScales(...t){this._each("unregister",t,this.scales)}_each(t,e,i){[...e].forEach((e=>{const s=i||this._getRegistryForType(e);i||s.isForType(e)||s===this.plugins&&e.id?this._exec(t,s,e):u(e,(e=>{const s=i||this._getRegistryForType(e);this._exec(t,s,e)}))}))}_exec(t,e,i){const s=w(t);d(i["before"+s],[],i),e[t](i),d(i["after"+s],[],i)}_getRegistryForType(t){for(let e=0;et.filter((t=>!e.some((e=>t.plugin.id===e.plugin.id))));this._notify(s(e,i),t,"stop"),this._notify(s(i,e),t,"start")}}function nn(t,e){return e||!1!==t?!0===t?{}:t:null}function on(t,{plugin:e,local:i},s,n){const o=t.pluginScopeKeys(e),a=t.getOptionScopes(s,o);return i&&e.defaults&&a.push(e.defaults),t.createResolver(a,n,[""],{scriptable:!1,indexable:!1,allKeys:!0})}function an(t,e){const i=ue.datasets[t]||{};return((e.datasets||{})[t]||{}).indexAxis||e.indexAxis||i.indexAxis||"x"}function rn(t){if("x"===t||"y"===t||"r"===t)return t}function ln(t,...e){if(rn(t))return t;for(const s of e){const e=s.axis||("top"===(i=s.position)||"bottom"===i?"x":"left"===i||"right"===i?"y":void 0)||t.length>1&&rn(t[0].toLowerCase());if(e)return e}var i;throw new Error(`Cannot determine type of '${t}' axis. Please provide 'axis' or 'position' option.`)}function hn(t,e,i){if(i[e+"AxisID"]===t)return{axis:e}}function cn(t,e){const i=re[t.type]||{scales:{}},s=e.scales||{},n=an(t.type,e),a=Object.create(null);return Object.keys(s).forEach((e=>{const r=s[e];if(!o(r))return console.error(`Invalid scale configuration for scale: ${e}`);if(r._proxy)return console.warn(`Ignoring resolver passed as options for scale: ${e}`);const l=ln(e,r,function(t,e){if(e.data&&e.data.datasets){const i=e.data.datasets.filter((e=>e.xAxisID===t||e.yAxisID===t));if(i.length)return hn(t,"x",i[0])||hn(t,"y",i[0])}return{}}(e,t),ue.scales[r.type]),h=function(t,e){return t===e?"_index_":"_value_"}(l,n),c=i.scales||{};a[e]=x(Object.create(null),[{axis:l},r,c[l],c[h]])})),t.data.datasets.forEach((i=>{const n=i.type||t.type,o=i.indexAxis||an(n,e),r=(re[n]||{}).scales||{};Object.keys(r).forEach((t=>{const e=function(t,e){let i=t;return"_index_"===t?i=e:"_value_"===t&&(i="x"===e?"y":"x"),i}(t,o),n=i[e+"AxisID"]||e;a[n]=a[n]||Object.create(null),x(a[n],[{axis:e},s[n],r[t]])}))})),Object.keys(a).forEach((t=>{const e=a[t];x(e,[ue.scales[e.type],ue.scale])})),a}function dn(t){const e=t.options||(t.options={});e.plugins=l(e.plugins,{}),e.scales=cn(t,e)}function un(t){return(t=t||{}).datasets=t.datasets||[],t.labels=t.labels||[],t}const fn=new Map,gn=new Set;function pn(t,e){let i=fn.get(t);return i||(i=e(),fn.set(t,i),gn.add(i)),i}const mn=(t,e,i)=>{const s=M(e,i);void 0!==s&&t.add(s)};class bn{constructor(t){this._config=function(t){return(t=t||{}).data=un(t.data),dn(t),t}(t),this._scopeCache=new Map,this._resolverCache=new Map}get platform(){return this._config.platform}get type(){return this._config.type}set type(t){this._config.type=t}get data(){return this._config.data}set data(t){this._config.data=un(t)}get options(){return this._config.options}set options(t){this._config.options=t}get plugins(){return this._config.plugins}update(){const t=this._config;this.clearCache(),dn(t)}clearCache(){this._scopeCache.clear(),this._resolverCache.clear()}datasetScopeKeys(t){return pn(t,(()=>[[`datasets.${t}`,""]]))}datasetAnimationScopeKeys(t,e){return pn(`${t}.transition.${e}`,(()=>[[`datasets.${t}.transitions.${e}`,`transitions.${e}`],[`datasets.${t}`,""]]))}datasetElementScopeKeys(t,e){return pn(`${t}-${e}`,(()=>[[`datasets.${t}.elements.${e}`,`datasets.${t}`,`elements.${e}`,""]]))}pluginScopeKeys(t){const e=t.id;return pn(`${this.type}-plugin-${e}`,(()=>[[`plugins.${e}`,...t.additionalOptionScopes||[]]]))}_cachedScopes(t,e){const i=this._scopeCache;let s=i.get(t);return s&&!e||(s=new Map,i.set(t,s)),s}getOptionScopes(t,e,i){const{options:s,type:n}=this,o=this._cachedScopes(t,i),a=o.get(e);if(a)return a;const r=new Set;e.forEach((e=>{t&&(r.add(t),e.forEach((e=>mn(r,t,e)))),e.forEach((t=>mn(r,s,t))),e.forEach((t=>mn(r,re[n]||{},t))),e.forEach((t=>mn(r,ue,t))),e.forEach((t=>mn(r,le,t)))}));const l=Array.from(r);return 0===l.length&&l.push(Object.create(null)),gn.has(e)&&o.set(e,l),l}chartOptionScopes(){const{options:t,type:e}=this;return[t,re[e]||{},ue.datasets[e]||{},{type:e},ue,le]}resolveNamedOptions(t,e,i,s=[""]){const o={$shared:!0},{resolver:a,subPrefixes:r}=xn(this._resolverCache,t,s);let l=a;if(function(t,e){const{isScriptable:i,isIndexable:s}=Ye(t);for(const o of e){const e=i(o),a=s(o),r=(a||e)&&t[o];if(e&&(S(r)||_n(r))||a&&n(r))return!0}return!1}(a,e)){o.$shared=!1;l=$e(a,i=S(i)?i():i,this.createResolver(t,i,r))}for(const t of e)o[t]=l[t];return o}createResolver(t,e,i=[""],s){const{resolver:n}=xn(this._resolverCache,t,i);return o(e)?$e(n,e,void 0,s):n}}function xn(t,e,i){let s=t.get(e);s||(s=new Map,t.set(e,s));const n=i.join();let o=s.get(n);if(!o){o={resolver:je(e,i),subPrefixes:i.filter((t=>!t.toLowerCase().includes("hover")))},s.set(n,o)}return o}const _n=t=>o(t)&&Object.getOwnPropertyNames(t).reduce(((e,i)=>e||S(t[i])),!1);const yn=["top","bottom","left","right","chartArea"];function vn(t,e){return"top"===t||"bottom"===t||-1===yn.indexOf(t)&&"x"===e}function Mn(t,e){return function(i,s){return i[t]===s[t]?i[e]-s[e]:i[t]-s[t]}}function wn(t){const e=t.chart,i=e.options.animation;e.notifyPlugins("afterRender"),d(i&&i.onComplete,[t],e)}function kn(t){const e=t.chart,i=e.options.animation;d(i&&i.onProgress,[t],e)}function Sn(t){return fe()&&"string"==typeof t?t=document.getElementById(t):t&&t.length&&(t=t[0]),t&&t.canvas&&(t=t.canvas),t}const Pn={},Dn=t=>{const e=Sn(t);return Object.values(Pn).filter((t=>t.canvas===e)).pop()};function Cn(t,e,i){const s=Object.keys(t);for(const n of s){const s=+n;if(s>=e){const o=t[n];delete t[n],(i>0||s>e)&&(t[s+i]=o)}}}function On(t,e,i){return t.options.clip?t[i]:e[i]}class An{static defaults=ue;static instances=Pn;static overrides=re;static registry=en;static version="4.4.0";static getChart=Dn;static register(...t){en.add(...t),Tn()}static unregister(...t){en.remove(...t),Tn()}constructor(t,e){const s=this.config=new bn(e),n=Sn(t),o=Dn(n);if(o)throw new Error("Canvas is already in use. Chart with ID '"+o.id+"' must be destroyed before the canvas with ID '"+o.canvas.id+"' can be reused.");const a=s.createResolver(s.chartOptionScopes(),this.getContext());this.platform=new(s.platform||ks(n)),this.platform.updateConfig(s);const r=this.platform.acquireContext(n,a.aspectRatio),l=r&&r.canvas,h=l&&l.height,c=l&&l.width;this.id=i(),this.ctx=r,this.canvas=l,this.width=c,this.height=h,this._options=a,this._aspectRatio=this.aspectRatio,this._layers=[],this._metasets=[],this._stacks=void 0,this.boxes=[],this.currentDevicePixelRatio=void 0,this.chartArea=void 0,this._active=[],this._lastEvent=void 0,this._listeners={},this._responsiveListeners=void 0,this._sortedMetasets=[],this.scales={},this._plugins=new sn,this.$proxies={},this._hiddenIndices={},this.attached=!1,this._animationsDisabled=void 0,this.$context=void 0,this._doResize=dt((t=>this.update(t)),a.resizeDelay||0),this._dataChanges=[],Pn[this.id]=this,r&&l?(xt.listen(this,"complete",wn),xt.listen(this,"progress",kn),this._initialize(),this.attached&&this.update()):console.error("Failed to create chart: can't acquire context from the given item")}get aspectRatio(){const{options:{aspectRatio:t,maintainAspectRatio:e},width:i,height:n,_aspectRatio:o}=this;return s(t)?e&&o?o:n?i/n:null:t}get data(){return this.config.data}set data(t){this.config.data=t}get options(){return this._options}set options(t){this.config.options=t}get registry(){return en}_initialize(){return this.notifyPlugins("beforeInit"),this.options.responsive?this.resize():ke(this,this.options.devicePixelRatio),this.bindEvents(),this.notifyPlugins("afterInit"),this}clear(){return Te(this.canvas,this.ctx),this}stop(){return xt.stop(this),this}resize(t,e){xt.running(this)?this._resizeBeforeDraw={width:t,height:e}:this._resize(t,e)}_resize(t,e){const i=this.options,s=this.canvas,n=i.maintainAspectRatio&&this.aspectRatio,o=this.platform.getMaximumSize(s,t,e,n),a=i.devicePixelRatio||this.platform.getDevicePixelRatio(),r=this.width?"resize":"attach";this.width=o.width,this.height=o.height,this._aspectRatio=this.aspectRatio,ke(this,a,!0)&&(this.notifyPlugins("resize",{size:o}),d(i.onResize,[this,o],this),this.attached&&this._doResize(r)&&this.render())}ensureScalesHaveIDs(){u(this.options.scales||{},((t,e)=>{t.id=e}))}buildOrUpdateScales(){const t=this.options,e=t.scales,i=this.scales,s=Object.keys(i).reduce(((t,e)=>(t[e]=!1,t)),{});let n=[];e&&(n=n.concat(Object.keys(e).map((t=>{const i=e[t],s=ln(t,i),n="r"===s,o="x"===s;return{options:i,dposition:n?"chartArea":o?"bottom":"left",dtype:n?"radialLinear":o?"category":"linear"}})))),u(n,(e=>{const n=e.options,o=n.id,a=ln(o,n),r=l(n.type,e.dtype);void 0!==n.position&&vn(n.position,a)===vn(e.dposition)||(n.position=e.dposition),s[o]=!0;let h=null;if(o in i&&i[o].type===r)h=i[o];else{h=new(en.getScale(r))({id:o,type:r,ctx:this.ctx,chart:this}),i[h.id]=h}h.init(n,t)})),u(s,((t,e)=>{t||delete i[e]})),u(i,(t=>{as.configure(this,t,t.options),as.addBox(this,t)}))}_updateMetasets(){const t=this._metasets,e=this.data.datasets.length,i=t.length;if(t.sort(((t,e)=>t.index-e.index)),i>e){for(let t=e;te.length&&delete this._stacks,t.forEach(((t,i)=>{0===e.filter((e=>e===t._dataset)).length&&this._destroyDatasetMeta(i)}))}buildOrUpdateControllers(){const t=[],e=this.data.datasets;let i,s;for(this._removeUnreferencedMetasets(),i=0,s=e.length;i{this.getDatasetMeta(e).controller.reset()}),this)}reset(){this._resetElements(),this.notifyPlugins("reset")}update(t){const e=this.config;e.update();const i=this._options=e.createResolver(e.chartOptionScopes(),this.getContext()),s=this._animationsDisabled=!i.animation;if(this._updateScales(),this._checkEventBindings(),this._updateHiddenIndices(),this._plugins.invalidate(),!1===this.notifyPlugins("beforeUpdate",{mode:t,cancelable:!0}))return;const n=this.buildOrUpdateControllers();this.notifyPlugins("beforeElementsUpdate");let o=0;for(let t=0,e=this.data.datasets.length;t{t.reset()})),this._updateDatasets(t),this.notifyPlugins("afterUpdate",{mode:t}),this._layers.sort(Mn("z","_idx"));const{_active:a,_lastEvent:r}=this;r?this._eventHandler(r,!0):a.length&&this._updateHoverStyles(a,a,!0),this.render()}_updateScales(){u(this.scales,(t=>{as.removeBox(this,t)})),this.ensureScalesHaveIDs(),this.buildOrUpdateScales()}_checkEventBindings(){const t=this.options,e=new Set(Object.keys(this._listeners)),i=new Set(t.events);P(e,i)&&!!this._responsiveListeners===t.responsive||(this.unbindEvents(),this.bindEvents())}_updateHiddenIndices(){const{_hiddenIndices:t}=this,e=this._getUniformDataChanges()||[];for(const{method:i,start:s,count:n}of e){Cn(t,s,"_removeElements"===i?-n:n)}}_getUniformDataChanges(){const t=this._dataChanges;if(!t||!t.length)return;this._dataChanges=[];const e=this.data.datasets.length,i=e=>new Set(t.filter((t=>t[0]===e)).map(((t,e)=>e+","+t.splice(1).join(",")))),s=i(0);for(let t=1;tt.split(","))).map((t=>({method:t[1],start:+t[2],count:+t[3]})))}_updateLayout(t){if(!1===this.notifyPlugins("beforeLayout",{cancelable:!0}))return;as.update(this,this.width,this.height,t);const e=this.chartArea,i=e.width<=0||e.height<=0;this._layers=[],u(this.boxes,(t=>{i&&"chartArea"===t.position||(t.configure&&t.configure(),this._layers.push(...t._layers()))}),this),this._layers.forEach(((t,e)=>{t._idx=e})),this.notifyPlugins("afterLayout")}_updateDatasets(t){if(!1!==this.notifyPlugins("beforeDatasetsUpdate",{mode:t,cancelable:!0})){for(let t=0,e=this.data.datasets.length;t=0;--e)this._drawDataset(t[e]);this.notifyPlugins("afterDatasetsDraw")}_drawDataset(t){const e=this.ctx,i=t._clip,s=!i.disabled,n=function(t,e){const{xScale:i,yScale:s}=t;return i&&s?{left:On(i,e,"left"),right:On(i,e,"right"),top:On(s,e,"top"),bottom:On(s,e,"bottom")}:e}(t,this.chartArea),o={meta:t,index:t.index,cancelable:!0};!1!==this.notifyPlugins("beforeDatasetDraw",o)&&(s&&Ie(e,{left:!1===i.left?0:n.left-i.left,right:!1===i.right?this.width:n.right+i.right,top:!1===i.top?0:n.top-i.top,bottom:!1===i.bottom?this.height:n.bottom+i.bottom}),t.controller.draw(),s&&ze(e),o.cancelable=!1,this.notifyPlugins("afterDatasetDraw",o))}isPointInArea(t){return Re(t,this.chartArea,this._minPadding)}getElementsAtEventForMode(t,e,i,s){const n=Xi.modes[e];return"function"==typeof n?n(this,t,i,s):[]}getDatasetMeta(t){const e=this.data.datasets[t],i=this._metasets;let s=i.filter((t=>t&&t._dataset===e)).pop();return s||(s={type:null,data:[],dataset:null,controller:null,hidden:null,xAxisID:null,yAxisID:null,order:e&&e.order||0,index:t,_dataset:e,_parsed:[],_sorted:!1},i.push(s)),s}getContext(){return this.$context||(this.$context=Ci(null,{chart:this,type:"chart"}))}getVisibleDatasetCount(){return this.getSortedVisibleDatasetMetas().length}isDatasetVisible(t){const e=this.data.datasets[t];if(!e)return!1;const i=this.getDatasetMeta(t);return"boolean"==typeof i.hidden?!i.hidden:!e.hidden}setDatasetVisibility(t,e){this.getDatasetMeta(t).hidden=!e}toggleDataVisibility(t){this._hiddenIndices[t]=!this._hiddenIndices[t]}getDataVisibility(t){return!this._hiddenIndices[t]}_updateVisibility(t,e,i){const s=i?"show":"hide",n=this.getDatasetMeta(t),o=n.controller._resolveAnimations(void 0,s);k(e)?(n.data[e].hidden=!i,this.update()):(this.setDatasetVisibility(t,i),o.update(n,{visible:i}),this.update((e=>e.datasetIndex===t?s:void 0)))}hide(t,e){this._updateVisibility(t,e,!1)}show(t,e){this._updateVisibility(t,e,!0)}_destroyDatasetMeta(t){const e=this._metasets[t];e&&e.controller&&e.controller._destroy(),delete this._metasets[t]}_stop(){let t,e;for(this.stop(),xt.remove(this),t=0,e=this.data.datasets.length;t{e.addEventListener(this,i,s),t[i]=s},s=(t,e,i)=>{t.offsetX=e,t.offsetY=i,this._eventHandler(t)};u(this.options.events,(t=>i(t,s)))}bindResponsiveEvents(){this._responsiveListeners||(this._responsiveListeners={});const t=this._responsiveListeners,e=this.platform,i=(i,s)=>{e.addEventListener(this,i,s),t[i]=s},s=(i,s)=>{t[i]&&(e.removeEventListener(this,i,s),delete t[i])},n=(t,e)=>{this.canvas&&this.resize(t,e)};let o;const a=()=>{s("attach",a),this.attached=!0,this.resize(),i("resize",n),i("detach",o)};o=()=>{this.attached=!1,s("resize",n),this._stop(),this._resize(0,0),i("attach",a)},e.isAttached(this.canvas)?a():o()}unbindEvents(){u(this._listeners,((t,e)=>{this.platform.removeEventListener(this,e,t)})),this._listeners={},u(this._responsiveListeners,((t,e)=>{this.platform.removeEventListener(this,e,t)})),this._responsiveListeners=void 0}updateHoverStyle(t,e,i){const s=i?"set":"remove";let n,o,a,r;for("dataset"===e&&(n=this.getDatasetMeta(t[0].datasetIndex),n.controller["_"+s+"DatasetHoverStyle"]()),a=0,r=t.length;a{const i=this.getDatasetMeta(t);if(!i)throw new Error("No dataset found at index "+t);return{datasetIndex:t,element:i.data[e],index:e}}));!f(i,e)&&(this._active=i,this._lastEvent=null,this._updateHoverStyles(i,e))}notifyPlugins(t,e,i){return this._plugins.notify(this,t,e,i)}isPluginEnabled(t){return 1===this._plugins._cache.filter((e=>e.plugin.id===t)).length}_updateHoverStyles(t,e,i){const s=this.options.hover,n=(t,e)=>t.filter((t=>!e.some((e=>t.datasetIndex===e.datasetIndex&&t.index===e.index)))),o=n(e,t),a=i?t:n(t,e);o.length&&this.updateHoverStyle(o,s.mode,!1),a.length&&s.mode&&this.updateHoverStyle(a,s.mode,!0)}_eventHandler(t,e){const i={event:t,replay:e,cancelable:!0,inChartArea:this.isPointInArea(t)},s=e=>(e.options.events||this.options.events).includes(t.native.type);if(!1===this.notifyPlugins("beforeEvent",i,s))return;const n=this._handleEvent(t,e,i.inChartArea);return i.cancelable=!1,this.notifyPlugins("afterEvent",i,s),(n||i.changed)&&this.render(),this}_handleEvent(t,e,i){const{_active:s=[],options:n}=this,o=e,a=this._getActiveElements(t,s,i,o),r=D(t),l=function(t,e,i,s){return i&&"mouseout"!==t.type?s?e:t:null}(t,this._lastEvent,i,r);i&&(this._lastEvent=null,d(n.onHover,[t,a,this],this),r&&d(n.onClick,[t,a,this],this));const h=!f(a,s);return(h||e)&&(this._active=a,this._updateHoverStyles(a,s,e)),this._lastEvent=l,h}_getActiveElements(t,e,i,s){if("mouseout"===t.type)return[];if(!i)return e;const n=this.options.hover;return this.getElementsAtEventForMode(t,n.mode,n,s)}}function Tn(){return u(An.instances,(t=>t._plugins.invalidate()))}function Ln(){throw new Error("This method is not implemented: Check that a complete date adapter is provided.")}class En{static override(t){Object.assign(En.prototype,t)}options;constructor(t){this.options=t||{}}init(){}formats(){return Ln()}parse(){return Ln()}format(){return Ln()}add(){return Ln()}diff(){return Ln()}startOf(){return Ln()}endOf(){return Ln()}}var Rn={_date:En};function In(t){const e=t.iScale,i=function(t,e){if(!t._cache.$bar){const i=t.getMatchingVisibleMetas(e);let s=[];for(let e=0,n=i.length;et-e)))}return t._cache.$bar}(e,t.type);let s,n,o,a,r=e._length;const l=()=>{32767!==o&&-32768!==o&&(k(a)&&(r=Math.min(r,Math.abs(o-a)||r)),a=o)};for(s=0,n=i.length;sMath.abs(r)&&(l=r,h=a),e[i.axis]=h,e._custom={barStart:l,barEnd:h,start:n,end:o,min:a,max:r}}(t,e,i,s):e[i.axis]=i.parse(t,s),e}function Fn(t,e,i,s){const n=t.iScale,o=t.vScale,a=n.getLabels(),r=n===o,l=[];let h,c,d,u;for(h=i,c=i+s;ht.x,i="left",s="right"):(e=t.base"spacing"!==t,_indexable:t=>"spacing"!==t&&!t.startsWith("borderDash")&&!t.startsWith("hoverBorderDash")};static overrides={aspectRatio:1,plugins:{legend:{labels:{generateLabels(t){const e=t.data;if(e.labels.length&&e.datasets.length){const{labels:{pointStyle:i,color:s}}=t.legend.options;return e.labels.map(((e,n)=>{const o=t.getDatasetMeta(0).controller.getStyle(n);return{text:e,fillStyle:o.backgroundColor,strokeStyle:o.borderColor,fontColor:s,lineWidth:o.borderWidth,pointStyle:i,hidden:!t.getDataVisibility(n),index:n}}))}return[]}},onClick(t,e,i){i.chart.toggleDataVisibility(e.index),i.chart.update()}}}};constructor(t,e){super(t,e),this.enableOptionSharing=!0,this.innerRadius=void 0,this.outerRadius=void 0,this.offsetX=void 0,this.offsetY=void 0}linkScales(){}parse(t,e){const i=this.getDataset().data,s=this._cachedMeta;if(!1===this._parsing)s._parsed=i;else{let n,a,r=t=>+i[t];if(o(i[t])){const{key:t="value"}=this._parsing;r=e=>+M(i[e],t)}for(n=t,a=t+e;nZ(t,r,l,!0)?1:Math.max(e,e*i,s,s*i),g=(t,e,s)=>Z(t,r,l,!0)?-1:Math.min(e,e*i,s,s*i),p=f(0,h,d),m=f(E,c,u),b=g(C,h,d),x=g(C+E,c,u);s=(p-b)/2,n=(m-x)/2,o=-(p+b)/2,a=-(m+x)/2}return{ratioX:s,ratioY:n,offsetX:o,offsetY:a}}(u,d,r),b=(i.width-o)/f,x=(i.height-o)/g,_=Math.max(Math.min(b,x)/2,0),y=c(this.options.radius,_),v=(y-Math.max(y*r,0))/this._getVisibleDatasetWeightTotal();this.offsetX=p*y,this.offsetY=m*y,s.total=this.calculateTotal(),this.outerRadius=y-v*this._getRingWeightOffset(this.index),this.innerRadius=Math.max(this.outerRadius-v*l,0),this.updateElements(n,0,n.length,t)}_circumference(t,e){const i=this.options,s=this._cachedMeta,n=this._getCircumference();return e&&i.animation.animateRotate||!this.chart.getDataVisibility(t)||null===s._parsed[t]||s.data[t].hidden?0:this.calculateCircumference(s._parsed[t]*n/O)}updateElements(t,e,i,s){const n="reset"===s,o=this.chart,a=o.chartArea,r=o.options.animation,l=(a.left+a.right)/2,h=(a.top+a.bottom)/2,c=n&&r.animateScale,d=c?0:this.innerRadius,u=c?0:this.outerRadius,{sharedOptions:f,includeOptions:g}=this._getSharedOptions(e,s);let p,m=this._getRotation();for(p=0;p0&&!isNaN(t)?O*(Math.abs(t)/e):0}getLabelAndValue(t){const e=this._cachedMeta,i=this.chart,s=i.data.labels||[],n=ne(e._parsed[t],i.options.locale);return{label:s[t]||"",value:n}}getMaxBorderWidth(t){let e=0;const i=this.chart;let s,n,o,a,r;if(!t)for(s=0,n=i.data.datasets.length;s{const o=t.getDatasetMeta(0).controller.getStyle(n);return{text:e,fillStyle:o.backgroundColor,strokeStyle:o.borderColor,fontColor:s,lineWidth:o.borderWidth,pointStyle:i,hidden:!t.getDataVisibility(n),index:n}}))}return[]}},onClick(t,e,i){i.chart.toggleDataVisibility(e.index),i.chart.update()}}},scales:{r:{type:"radialLinear",angleLines:{display:!1},beginAtZero:!0,grid:{circular:!0},pointLabels:{display:!1},startAngle:0}}};constructor(t,e){super(t,e),this.innerRadius=void 0,this.outerRadius=void 0}getLabelAndValue(t){const e=this._cachedMeta,i=this.chart,s=i.data.labels||[],n=ne(e._parsed[t].r,i.options.locale);return{label:s[t]||"",value:n}}parseObjectData(t,e,i,s){return ii.bind(this)(t,e,i,s)}update(t){const e=this._cachedMeta.data;this._updateRadius(),this.updateElements(e,0,e.length,t)}getMinMax(){const t=this._cachedMeta,e={min:Number.POSITIVE_INFINITY,max:Number.NEGATIVE_INFINITY};return t.data.forEach(((t,i)=>{const s=this.getParsed(i).r;!isNaN(s)&&this.chart.getDataVisibility(i)&&(se.max&&(e.max=s))})),e}_updateRadius(){const t=this.chart,e=t.chartArea,i=t.options,s=Math.min(e.right-e.left,e.bottom-e.top),n=Math.max(s/2,0),o=(n-Math.max(i.cutoutPercentage?n/100*i.cutoutPercentage:1,0))/t.getVisibleDatasetCount();this.outerRadius=n-o*this.index,this.innerRadius=this.outerRadius-o}updateElements(t,e,i,s){const n="reset"===s,o=this.chart,a=o.options.animation,r=this._cachedMeta.rScale,l=r.xCenter,h=r.yCenter,c=r.getIndexAngle(0)-.5*C;let d,u=c;const f=360/this.countVisibleElements();for(d=0;d{!isNaN(this.getParsed(i).r)&&this.chart.getDataVisibility(i)&&e++})),e}_computeAngle(t,e,i){return this.chart.getDataVisibility(t)?$(this.resolveDataElementOptions(t,e).angle||i):0}}var Yn=Object.freeze({__proto__:null,BarController:class extends Ns{static id="bar";static defaults={datasetElementType:!1,dataElementType:"bar",categoryPercentage:.8,barPercentage:.9,grouped:!0,animations:{numbers:{type:"number",properties:["x","y","base","width","height"]}}};static overrides={scales:{_index_:{type:"category",offset:!0,grid:{offset:!0}},_value_:{type:"linear",beginAtZero:!0}}};parsePrimitiveData(t,e,i,s){return Fn(t,e,i,s)}parseArrayData(t,e,i,s){return Fn(t,e,i,s)}parseObjectData(t,e,i,s){const{iScale:n,vScale:o}=t,{xAxisKey:a="x",yAxisKey:r="y"}=this._parsing,l="x"===n.axis?a:r,h="x"===o.axis?a:r,c=[];let d,u,f,g;for(d=i,u=i+s;dt.controller.options.grouped)),o=i.options.stacked,a=[],r=t=>{const i=t.controller.getParsed(e),n=i&&i[t.vScale.axis];if(s(n)||isNaN(n))return!0};for(const i of n)if((void 0===e||!r(i))&&((!1===o||-1===a.indexOf(i.stack)||void 0===o&&void 0===i.stack)&&a.push(i.stack),i.index===t))break;return a.length||a.push(void 0),a}_getStackCount(t){return this._getStacks(void 0,t).length}_getStackIndex(t,e,i){const s=this._getStacks(t,i),n=void 0!==e?s.indexOf(e):-1;return-1===n?s.length-1:n}_getRuler(){const t=this.options,e=this._cachedMeta,i=e.iScale,s=[];let n,o;for(n=0,o=e.data.length;n=i?1:-1)}(u,e,r)*a,f===r&&(b-=u/2);const t=e.getPixelForDecimal(0),s=e.getPixelForDecimal(1),o=Math.min(t,s),h=Math.max(t,s);b=Math.max(Math.min(b,h),o),d=b+u,i&&!c&&(l._stacks[e.axis]._visualValues[n]=e.getValueForPixel(d)-e.getValueForPixel(b))}if(b===e.getPixelForValue(r)){const t=F(u)*e.getLineWidthForValue(r)/2;b+=t,u-=t}return{size:u,base:b,head:d,center:d+u/2}}_calculateBarIndexPixels(t,e){const i=e.scale,n=this.options,o=n.skipNull,a=l(n.maxBarThickness,1/0);let r,h;if(e.grouped){const i=o?this._getStackCount(t):e.stackCount,l="flex"===n.barThickness?function(t,e,i,s){const n=e.pixels,o=n[t];let a=t>0?n[t-1]:null,r=t=0;--i)e=Math.max(e,t[i].size(this.resolveDataElementOptions(i))/2);return e>0&&e}getLabelAndValue(t){const e=this._cachedMeta,i=this.chart.data.labels||[],{xScale:s,yScale:n}=e,o=this.getParsed(t),a=s.getLabelForValue(o.x),r=n.getLabelForValue(o.y),l=o._custom;return{label:i[t]||"",value:"("+a+", "+r+(l?", "+l:"")+")"}}update(t){const e=this._cachedMeta.data;this.updateElements(e,0,e.length,t)}updateElements(t,e,i,s){const n="reset"===s,{iScale:o,vScale:a}=this._cachedMeta,{sharedOptions:r,includeOptions:l}=this._getSharedOptions(e,s),h=o.axis,c=a.axis;for(let d=e;d0&&this.getParsed(e-1);for(let i=0;i<_;++i){const g=t[i],_=b?g:{};if(i=x){_.skip=!0;continue}const v=this.getParsed(i),M=s(v[f]),w=_[u]=a.getPixelForValue(v[u],i),k=_[f]=o||M?r.getBasePixel():r.getPixelForValue(l?this.applyStack(r,v,l):v[f],i);_.skip=isNaN(w)||isNaN(k)||M,_.stop=i>0&&Math.abs(v[u]-y[u])>m,p&&(_.parsed=v,_.raw=h.data[i]),d&&(_.options=c||this.resolveDataElementOptions(i,g.active?"active":n)),b||this.updateElement(g,i,_,n),y=v}}getMaxOverflow(){const t=this._cachedMeta,e=t.dataset,i=e.options&&e.options.borderWidth||0,s=t.data||[];if(!s.length)return i;const n=s[0].size(this.resolveDataElementOptions(0)),o=s[s.length-1].size(this.resolveDataElementOptions(s.length-1));return Math.max(i,n,o)/2}draw(){const t=this._cachedMeta;t.dataset.updateControlPoints(this.chart.chartArea,t.iScale.axis),super.draw()}},PieController:class extends jn{static id="pie";static defaults={cutout:0,rotation:0,circumference:360,radius:"100%"}},PolarAreaController:$n,RadarController:class extends Ns{static id="radar";static defaults={datasetElementType:"line",dataElementType:"point",indexAxis:"r",showLine:!0,elements:{line:{fill:"start"}}};static overrides={aspectRatio:1,scales:{r:{type:"radialLinear"}}};getLabelAndValue(t){const e=this._cachedMeta.vScale,i=this.getParsed(t);return{label:e.getLabels()[t],value:""+e.getLabelForValue(i[e.axis])}}parseObjectData(t,e,i,s){return ii.bind(this)(t,e,i,s)}update(t){const e=this._cachedMeta,i=e.dataset,s=e.data||[],n=e.iScale.getLabels();if(i.points=s,"resize"!==t){const e=this.resolveDatasetElementOptions(t);this.options.showLine||(e.borderWidth=0);const o={_loop:!0,_fullLoop:n.length===s.length,options:e};this.updateElement(i,void 0,o,t)}this.updateElements(s,0,s.length,t)}updateElements(t,e,i,s){const n=this._cachedMeta.rScale,o="reset"===s;for(let a=e;a0&&this.getParsed(e-1);for(let c=e;c0&&Math.abs(i[f]-_[f])>b,m&&(p.parsed=i,p.raw=h.data[c]),u&&(p.options=d||this.resolveDataElementOptions(c,e.active?"active":n)),x||this.updateElement(e,c,p,n),_=i}this.updateSharedOptions(d,n,c)}getMaxOverflow(){const t=this._cachedMeta,e=t.data||[];if(!this.options.showLine){let t=0;for(let i=e.length-1;i>=0;--i)t=Math.max(t,e[i].size(this.resolveDataElementOptions(i))/2);return t>0&&t}const i=t.dataset,s=i.options&&i.options.borderWidth||0;if(!e.length)return s;const n=e[0].size(this.resolveDataElementOptions(0)),o=e[e.length-1].size(this.resolveDataElementOptions(e.length-1));return Math.max(s,n,o)/2}}});function Un(t,e,i,s){const n=vi(t.options.borderRadius,["outerStart","outerEnd","innerStart","innerEnd"]);const o=(i-e)/2,a=Math.min(o,s*e/2),r=t=>{const e=(i-Math.min(o,t))*s/2;return J(t,0,Math.min(o,e))};return{outerStart:r(n.outerStart),outerEnd:r(n.outerEnd),innerStart:J(n.innerStart,0,a),innerEnd:J(n.innerEnd,0,a)}}function Xn(t,e,i,s){return{x:i+t*Math.cos(e),y:s+t*Math.sin(e)}}function qn(t,e,i,s,n,o){const{x:a,y:r,startAngle:l,pixelMargin:h,innerRadius:c}=e,d=Math.max(e.outerRadius+s+i-h,0),u=c>0?c+s+i+h:0;let f=0;const g=n-l;if(s){const t=((c>0?c-s:0)+(d>0?d-s:0))/2;f=(g-(0!==t?g*t/(t+s):g))/2}const p=(g-Math.max(.001,g*d-i/C)/d)/2,m=l+p+f,b=n-p-f,{outerStart:x,outerEnd:_,innerStart:y,innerEnd:v}=Un(e,u,d,b-m),M=d-x,w=d-_,k=m+x/M,S=b-_/w,P=u+y,D=u+v,O=m+y/P,A=b-v/D;if(t.beginPath(),o){const e=(k+S)/2;if(t.arc(a,r,d,k,e),t.arc(a,r,d,e,S),_>0){const e=Xn(w,S,a,r);t.arc(e.x,e.y,_,S,b+E)}const i=Xn(D,b,a,r);if(t.lineTo(i.x,i.y),v>0){const e=Xn(D,A,a,r);t.arc(e.x,e.y,v,b+E,A+Math.PI)}const s=(b-v/u+(m+y/u))/2;if(t.arc(a,r,u,b-v/u,s,!0),t.arc(a,r,u,s,m+y/u,!0),y>0){const e=Xn(P,O,a,r);t.arc(e.x,e.y,y,O+Math.PI,m-E)}const n=Xn(M,m,a,r);if(t.lineTo(n.x,n.y),x>0){const e=Xn(M,k,a,r);t.arc(e.x,e.y,x,m-E,k)}}else{t.moveTo(a,r);const e=Math.cos(k)*d+a,i=Math.sin(k)*d+r;t.lineTo(e,i);const s=Math.cos(S)*d+a,n=Math.sin(S)*d+r;t.lineTo(s,n)}t.closePath()}function Kn(t,e,i,s,n){const{fullCircles:o,startAngle:a,circumference:r,options:l}=e,{borderWidth:h,borderJoinStyle:c,borderDash:d,borderDashOffset:u}=l,f="inner"===l.borderAlign;if(!h)return;t.setLineDash(d||[]),t.lineDashOffset=u,f?(t.lineWidth=2*h,t.lineJoin=c||"round"):(t.lineWidth=h,t.lineJoin=c||"bevel");let g=e.endAngle;if(o){qn(t,e,i,s,g,n);for(let e=0;en?(h=n/l,t.arc(o,a,l,i+h,s-h,!0)):t.arc(o,a,n,i+E,s-E),t.closePath(),t.clip()}(t,e,g),o||(qn(t,e,i,s,g,n),t.stroke())}function Gn(t,e,i=e){t.lineCap=l(i.borderCapStyle,e.borderCapStyle),t.setLineDash(l(i.borderDash,e.borderDash)),t.lineDashOffset=l(i.borderDashOffset,e.borderDashOffset),t.lineJoin=l(i.borderJoinStyle,e.borderJoinStyle),t.lineWidth=l(i.borderWidth,e.borderWidth),t.strokeStyle=l(i.borderColor,e.borderColor)}function Zn(t,e,i){t.lineTo(i.x,i.y)}function Jn(t,e,i={}){const s=t.length,{start:n=0,end:o=s-1}=i,{start:a,end:r}=e,l=Math.max(n,a),h=Math.min(o,r),c=nr&&o>r;return{count:s,start:l,loop:e.loop,ilen:h(a+(h?r-t:t))%o,_=()=>{f!==g&&(t.lineTo(m,g),t.lineTo(m,f),t.lineTo(m,p))};for(l&&(d=n[x(0)],t.moveTo(d.x,d.y)),c=0;c<=r;++c){if(d=n[x(c)],d.skip)continue;const e=d.x,i=d.y,s=0|e;s===u?(ig&&(g=i),m=(b*m+e)/++b):(_(),t.lineTo(e,i),u=s,b=0,f=g=i),p=i}_()}function eo(t){const e=t.options,i=e.borderDash&&e.borderDash.length;return!(t._decimated||t._loop||e.tension||"monotone"===e.cubicInterpolationMode||e.stepped||i)?to:Qn}const io="function"==typeof Path2D;function so(t,e,i,s){io&&!e.options.segment?function(t,e,i,s){let n=e._path;n||(n=e._path=new Path2D,e.path(n,i,s)&&n.closePath()),Gn(t,e.options),t.stroke(n)}(t,e,i,s):function(t,e,i,s){const{segments:n,options:o}=e,a=eo(e);for(const r of n)Gn(t,o,r.style),t.beginPath(),a(t,e,r,{start:i,end:i+s-1})&&t.closePath(),t.stroke()}(t,e,i,s)}class no extends Hs{static id="line";static defaults={borderCapStyle:"butt",borderDash:[],borderDashOffset:0,borderJoinStyle:"miter",borderWidth:3,capBezierPoints:!0,cubicInterpolationMode:"default",fill:!1,spanGaps:!1,stepped:!1,tension:0};static defaultRoutes={backgroundColor:"backgroundColor",borderColor:"borderColor"};static descriptors={_scriptable:!0,_indexable:t=>"borderDash"!==t&&"fill"!==t};constructor(t){super(),this.animated=!0,this.options=void 0,this._chart=void 0,this._loop=void 0,this._fullLoop=void 0,this._path=void 0,this._points=void 0,this._segments=void 0,this._decimated=!1,this._pointsUpdated=!1,this._datasetIndex=void 0,t&&Object.assign(this,t)}updateControlPoints(t,e){const i=this.options;if((i.tension||"monotone"===i.cubicInterpolationMode)&&!i.stepped&&!this._pointsUpdated){const s=i.spanGaps?this._loop:this._fullLoop;hi(this._points,i,t,s,e),this._pointsUpdated=!0}}set points(t){this._points=t,delete this._segments,delete this._path,this._pointsUpdated=!1}get points(){return this._points}get segments(){return this._segments||(this._segments=zi(this,this.options.segment))}first(){const t=this.segments,e=this.points;return t.length&&e[t[0].start]}last(){const t=this.segments,e=this.points,i=t.length;return i&&e[t[i-1].end]}interpolate(t,e){const i=this.options,s=t[e],n=this.points,o=Ii(this,{property:e,start:s,end:s});if(!o.length)return;const a=[],r=function(t){return t.stepped?pi:t.tension||"monotone"===t.cubicInterpolationMode?mi:gi}(i);let l,h;for(l=0,h=o.length;l"borderDash"!==t};circumference;endAngle;fullCircles;innerRadius;outerRadius;pixelMargin;startAngle;constructor(t){super(),this.options=void 0,this.circumference=void 0,this.startAngle=void 0,this.endAngle=void 0,this.innerRadius=void 0,this.outerRadius=void 0,this.pixelMargin=0,this.fullCircles=0,t&&Object.assign(this,t)}inRange(t,e,i){const s=this.getProps(["x","y"],i),{angle:n,distance:o}=X(s,{x:t,y:e}),{startAngle:a,endAngle:r,innerRadius:h,outerRadius:c,circumference:d}=this.getProps(["startAngle","endAngle","innerRadius","outerRadius","circumference"],i),u=(this.options.spacing+this.options.borderWidth)/2,f=l(d,r-a)>=O||Z(n,a,r),g=tt(o,h+u,c+u);return f&&g}getCenterPoint(t){const{x:e,y:i,startAngle:s,endAngle:n,innerRadius:o,outerRadius:a}=this.getProps(["x","y","startAngle","endAngle","innerRadius","outerRadius"],t),{offset:r,spacing:l}=this.options,h=(s+n)/2,c=(o+a+l+r)/2;return{x:e+Math.cos(h)*c,y:i+Math.sin(h)*c}}tooltipPosition(t){return this.getCenterPoint(t)}draw(t){const{options:e,circumference:i}=this,s=(e.offset||0)/4,n=(e.spacing||0)/2,o=e.circular;if(this.pixelMargin="inner"===e.borderAlign?.33:0,this.fullCircles=i>O?Math.floor(i/O):0,0===i||this.innerRadius<0||this.outerRadius<0)return;t.save();const a=(this.startAngle+this.endAngle)/2;t.translate(Math.cos(a)*s,Math.sin(a)*s);const r=s*(1-Math.sin(Math.min(C,i||0)));t.fillStyle=e.backgroundColor,t.strokeStyle=e.borderColor,function(t,e,i,s,n){const{fullCircles:o,startAngle:a,circumference:r}=e;let l=e.endAngle;if(o){qn(t,e,i,s,l,n);for(let e=0;e("string"==typeof e?(i=t.push(e)-1,s.unshift({index:i,label:e})):isNaN(e)&&(i=null),i))(t,e,i,s);return n!==t.lastIndexOf(e)?i:n}function po(t){const e=this.getLabels();return t>=0&&ts=e?s:t,a=t=>n=i?n:t;if(t){const t=F(s),e=F(n);t<0&&e<0?a(0):t>0&&e>0&&o(0)}if(s===n){let e=0===n?1:Math.abs(.05*n);a(n+e),t||o(s-e)}this.min=s,this.max=n}getTickLimit(){const t=this.options.ticks;let e,{maxTicksLimit:i,stepSize:s}=t;return s?(e=Math.ceil(this.max/s)-Math.floor(this.min/s)+1,e>1e3&&(console.warn(`scales.${this.id}.ticks.stepSize: ${s} would result generating up to ${e} ticks. Limiting to 1000.`),e=1e3)):(e=this.computeTickLimit(),i=i||11),i&&(e=Math.min(i,e)),e}computeTickLimit(){return Number.POSITIVE_INFINITY}buildTicks(){const t=this.options,e=t.ticks;let i=this.getTickLimit();i=Math.max(2,i);const n=function(t,e){const i=[],{bounds:n,step:o,min:a,max:r,precision:l,count:h,maxTicks:c,maxDigits:d,includeBounds:u}=t,f=o||1,g=c-1,{min:p,max:m}=e,b=!s(a),x=!s(r),_=!s(h),y=(m-p)/(d+1);let v,M,w,k,S=B((m-p)/g/f)*f;if(S<1e-14&&!b&&!x)return[{value:p},{value:m}];k=Math.ceil(m/S)-Math.floor(p/S),k>g&&(S=B(k*S/g/f)*f),s(l)||(v=Math.pow(10,l),S=Math.ceil(S*v)/v),"ticks"===n?(M=Math.floor(p/S)*S,w=Math.ceil(m/S)*S):(M=p,w=m),b&&x&&o&&H((r-a)/o,S/1e3)?(k=Math.round(Math.min((r-a)/S,c)),S=(r-a)/k,M=a,w=r):_?(M=b?a:M,w=x?r:w,k=h-1,S=(w-M)/k):(k=(w-M)/S,k=V(k,Math.round(k),S/1e3)?Math.round(k):Math.ceil(k));const P=Math.max(U(S),U(M));v=Math.pow(10,s(l)?P:l),M=Math.round(M*v)/v,w=Math.round(w*v)/v;let D=0;for(b&&(u&&M!==a?(i.push({value:a}),Mr)break;i.push({value:t})}return x&&u&&w!==r?i.length&&V(i[i.length-1].value,r,mo(r,y,t))?i[i.length-1].value=r:i.push({value:r}):x&&w!==r||i.push({value:w}),i}({maxTicks:i,bounds:t.bounds,min:t.min,max:t.max,precision:e.precision,step:e.stepSize,count:e.count,maxDigits:this._maxDigits(),horizontal:this.isHorizontal(),minRotation:e.minRotation||0,includeBounds:!1!==e.includeBounds},this._range||this);return"ticks"===t.bounds&&j(n,this,"value"),t.reverse?(n.reverse(),this.start=this.max,this.end=this.min):(this.start=this.min,this.end=this.max),n}configure(){const t=this.ticks;let e=this.min,i=this.max;if(super.configure(),this.options.offset&&t.length){const s=(i-e)/Math.max(t.length-1,1)/2;e-=s,i+=s}this._startValue=e,this._endValue=i,this._valueRange=i-e}getLabelForValue(t){return ne(t,this.chart.options.locale,this.options.ticks.format)}}class xo extends bo{static id="linear";static defaults={ticks:{callback:ae.formatters.numeric}};determineDataLimits(){const{min:t,max:e}=this.getMinMax(!0);this.min=a(t)?t:0,this.max=a(e)?e:1,this.handleTickRangeOptions()}computeTickLimit(){const t=this.isHorizontal(),e=t?this.width:this.height,i=$(this.options.ticks.minRotation),s=(t?Math.sin(i):Math.cos(i))||.001,n=this._resolveTickFontOptions(0);return Math.ceil(e/Math.min(40,n.lineHeight/s))}getPixelForValue(t){return null===t?NaN:this.getPixelForDecimal((t-this._startValue)/this._valueRange)}getValueForPixel(t){return this._startValue+this.getDecimalForPixel(t)*this._valueRange}}const _o=t=>Math.floor(z(t)),yo=(t,e)=>Math.pow(10,_o(t)+e);function vo(t){return 1===t/Math.pow(10,_o(t))}function Mo(t,e,i){const s=Math.pow(10,i),n=Math.floor(t/s);return Math.ceil(e/s)-n}function wo(t,{min:e,max:i}){e=r(t.min,e);const s=[],n=_o(e);let o=function(t,e){let i=_o(e-t);for(;Mo(t,e,i)>10;)i++;for(;Mo(t,e,i)<10;)i--;return Math.min(i,_o(t))}(e,i),a=o<0?Math.pow(10,Math.abs(o)):1;const l=Math.pow(10,o),h=n>o?Math.pow(10,n):0,c=Math.round((e-h)*a)/a,d=Math.floor((e-h)/l/10)*l*10;let u=Math.floor((c-d)/Math.pow(10,o)),f=r(t.min,Math.round((h+d+u*Math.pow(10,o))*a)/a);for(;f=10?u=u<15?15:20:u++,u>=20&&(o++,u=2,a=o>=0?1:a),f=Math.round((h+d+u*Math.pow(10,o))*a)/a;const g=r(t.max,f);return s.push({value:g,major:vo(g),significand:u}),s}class ko extends Js{static id="logarithmic";static defaults={ticks:{callback:ae.formatters.logarithmic,major:{enabled:!0}}};constructor(t){super(t),this.start=void 0,this.end=void 0,this._startValue=void 0,this._valueRange=0}parse(t,e){const i=bo.prototype.parse.apply(this,[t,e]);if(0!==i)return a(i)&&i>0?i:null;this._zero=!0}determineDataLimits(){const{min:t,max:e}=this.getMinMax(!0);this.min=a(t)?Math.max(0,t):null,this.max=a(e)?Math.max(0,e):null,this.options.beginAtZero&&(this._zero=!0),this._zero&&this.min!==this._suggestedMin&&!a(this._userMin)&&(this.min=t===yo(this.min,0)?yo(this.min,-1):yo(this.min,0)),this.handleTickRangeOptions()}handleTickRangeOptions(){const{minDefined:t,maxDefined:e}=this.getUserBounds();let i=this.min,s=this.max;const n=e=>i=t?i:e,o=t=>s=e?s:t;i===s&&(i<=0?(n(1),o(10)):(n(yo(i,-1)),o(yo(s,1)))),i<=0&&n(yo(s,-1)),s<=0&&o(yo(i,1)),this.min=i,this.max=s}buildTicks(){const t=this.options,e=wo({min:this._userMin,max:this._userMax},this);return"ticks"===t.bounds&&j(e,this,"value"),t.reverse?(e.reverse(),this.start=this.max,this.end=this.min):(this.start=this.min,this.end=this.max),e}getLabelForValue(t){return void 0===t?"0":ne(t,this.chart.options.locale,this.options.ticks.format)}configure(){const t=this.min;super.configure(),this._startValue=z(t),this._valueRange=z(this.max)-z(t)}getPixelForValue(t){return void 0!==t&&0!==t||(t=this.min),null===t||isNaN(t)?NaN:this.getPixelForDecimal(t===this.min?0:(z(t)-this._startValue)/this._valueRange)}getValueForPixel(t){const e=this.getDecimalForPixel(t);return Math.pow(10,this._startValue+e*this._valueRange)}}function So(t){const e=t.ticks;if(e.display&&t.display){const t=ki(e.backdropPadding);return l(e.font&&e.font.size,ue.font.size)+t.height}return 0}function Po(t,e,i,s,n){return t===s||t===n?{start:e-i/2,end:e+i/2}:tn?{start:e-i,end:e}:{start:e,end:e+i}}function Do(t){const e={l:t.left+t._padding.left,r:t.right-t._padding.right,t:t.top+t._padding.top,b:t.bottom-t._padding.bottom},i=Object.assign({},e),s=[],o=[],a=t._pointLabels.length,r=t.options.pointLabels,l=r.centerPointLabels?C/a:0;for(let u=0;ue.r&&(r=(s.end-e.r)/o,t.r=Math.max(t.r,e.r+r)),n.starte.b&&(l=(n.end-e.b)/a,t.b=Math.max(t.b,e.b+l))}function Oo(t,e,i){const s=t.drawingArea,{extra:n,additionalAngle:o,padding:a,size:r}=i,l=t.getPointPosition(e,s+n+a,o),h=Math.round(Y(G(l.angle+E))),c=function(t,e,i){90===i||270===i?t-=e/2:(i>270||i<90)&&(t-=e);return t}(l.y,r.h,h),d=function(t){if(0===t||180===t)return"center";if(t<180)return"left";return"right"}(h),u=function(t,e,i){"right"===i?t-=e:"center"===i&&(t-=e/2);return t}(l.x,r.w,d);return{visible:!0,x:l.x,y:c,textAlign:d,left:u,top:c,right:u+r.w,bottom:c+r.h}}function Ao(t,e){if(!e)return!0;const{left:i,top:s,right:n,bottom:o}=t;return!(Re({x:i,y:s},e)||Re({x:i,y:o},e)||Re({x:n,y:s},e)||Re({x:n,y:o},e))}function To(t,e,i){const{left:n,top:o,right:a,bottom:r}=i,{backdropColor:l}=e;if(!s(l)){const i=wi(e.borderRadius),s=ki(e.backdropPadding);t.fillStyle=l;const h=n-s.left,c=o-s.top,d=a-n+s.width,u=r-o+s.height;Object.values(i).some((t=>0!==t))?(t.beginPath(),He(t,{x:h,y:c,w:d,h:u,radius:i}),t.fill()):t.fillRect(h,c,d,u)}}function Lo(t,e,i,s){const{ctx:n}=t;if(i)n.arc(t.xCenter,t.yCenter,e,0,O);else{let i=t.getPointPosition(0,e);n.moveTo(i.x,i.y);for(let o=1;ot,padding:5,centerPointLabels:!1}};static defaultRoutes={"angleLines.color":"borderColor","pointLabels.color":"color","ticks.color":"color"};static descriptors={angleLines:{_fallback:"grid"}};constructor(t){super(t),this.xCenter=void 0,this.yCenter=void 0,this.drawingArea=void 0,this._pointLabels=[],this._pointLabelItems=[]}setDimensions(){const t=this._padding=ki(So(this.options)/2),e=this.width=this.maxWidth-t.width,i=this.height=this.maxHeight-t.height;this.xCenter=Math.floor(this.left+e/2+t.left),this.yCenter=Math.floor(this.top+i/2+t.top),this.drawingArea=Math.floor(Math.min(e,i)/2)}determineDataLimits(){const{min:t,max:e}=this.getMinMax(!1);this.min=a(t)&&!isNaN(t)?t:0,this.max=a(e)&&!isNaN(e)?e:0,this.handleTickRangeOptions()}computeTickLimit(){return Math.ceil(this.drawingArea/So(this.options))}generateTickLabels(t){bo.prototype.generateTickLabels.call(this,t),this._pointLabels=this.getLabels().map(((t,e)=>{const i=d(this.options.pointLabels.callback,[t,e],this);return i||0===i?i:""})).filter(((t,e)=>this.chart.getDataVisibility(e)))}fit(){const t=this.options;t.display&&t.pointLabels.display?Do(this):this.setCenterPoint(0,0,0,0)}setCenterPoint(t,e,i,s){this.xCenter+=Math.floor((t-e)/2),this.yCenter+=Math.floor((i-s)/2),this.drawingArea-=Math.min(this.drawingArea/2,Math.max(t,e,i,s))}getIndexAngle(t){return G(t*(O/(this._pointLabels.length||1))+$(this.options.startAngle||0))}getDistanceFromCenterForValue(t){if(s(t))return NaN;const e=this.drawingArea/(this.max-this.min);return this.options.reverse?(this.max-t)*e:(t-this.min)*e}getValueForDistanceFromCenter(t){if(s(t))return NaN;const e=t/(this.drawingArea/(this.max-this.min));return this.options.reverse?this.max-e:this.min+e}getPointLabelContext(t){const e=this._pointLabels||[];if(t>=0&&t=0;n--){const e=t._pointLabelItems[n];if(!e.visible)continue;const o=s.setContext(t.getPointLabelContext(n));To(i,o,e);const a=Si(o.font),{x:r,y:l,textAlign:h}=e;Ne(i,t._pointLabels[n],r,l+a.lineHeight/2,a,{color:o.color,textAlign:h,textBaseline:"middle"})}}(this,o),s.display&&this.ticks.forEach(((t,e)=>{if(0!==e){r=this.getDistanceFromCenterForValue(t.value);const i=this.getContext(e),a=s.setContext(i),l=n.setContext(i);!function(t,e,i,s,n){const o=t.ctx,a=e.circular,{color:r,lineWidth:l}=e;!a&&!s||!r||!l||i<0||(o.save(),o.strokeStyle=r,o.lineWidth=l,o.setLineDash(n.dash),o.lineDashOffset=n.dashOffset,o.beginPath(),Lo(t,i,a,s),o.closePath(),o.stroke(),o.restore())}(this,a,r,o,l)}})),i.display){for(t.save(),a=o-1;a>=0;a--){const s=i.setContext(this.getPointLabelContext(a)),{color:n,lineWidth:o}=s;o&&n&&(t.lineWidth=o,t.strokeStyle=n,t.setLineDash(s.borderDash),t.lineDashOffset=s.borderDashOffset,r=this.getDistanceFromCenterForValue(e.ticks.reverse?this.min:this.max),l=this.getPointPosition(a,r),t.beginPath(),t.moveTo(this.xCenter,this.yCenter),t.lineTo(l.x,l.y),t.stroke())}t.restore()}}drawBorder(){}drawLabels(){const t=this.ctx,e=this.options,i=e.ticks;if(!i.display)return;const s=this.getIndexAngle(0);let n,o;t.save(),t.translate(this.xCenter,this.yCenter),t.rotate(s),t.textAlign="center",t.textBaseline="middle",this.ticks.forEach(((s,a)=>{if(0===a&&!e.reverse)return;const r=i.setContext(this.getContext(a)),l=Si(r.font);if(n=this.getDistanceFromCenterForValue(this.ticks[a].value),r.showLabelBackdrop){t.font=l.string,o=t.measureText(s.label).width,t.fillStyle=r.backdropColor;const e=ki(r.backdropPadding);t.fillRect(-o/2-e.left,-n-l.size/2-e.top,o+e.width,l.size+e.height)}Ne(t,s.label,0,-n,l,{color:r.color,strokeColor:r.textStrokeColor,strokeWidth:r.textStrokeWidth})})),t.restore()}drawTitle(){}}const Ro={millisecond:{common:!0,size:1,steps:1e3},second:{common:!0,size:1e3,steps:60},minute:{common:!0,size:6e4,steps:60},hour:{common:!0,size:36e5,steps:24},day:{common:!0,size:864e5,steps:30},week:{common:!1,size:6048e5,steps:4},month:{common:!0,size:2628e6,steps:12},quarter:{common:!1,size:7884e6,steps:4},year:{common:!0,size:3154e7}},Io=Object.keys(Ro);function zo(t,e){return t-e}function Fo(t,e){if(s(e))return null;const i=t._adapter,{parser:n,round:o,isoWeekday:r}=t._parseOpts;let l=e;return"function"==typeof n&&(l=n(l)),a(l)||(l="string"==typeof n?i.parse(l,n):i.parse(l)),null===l?null:(o&&(l="week"!==o||!N(r)&&!0!==r?i.startOf(l,o):i.startOf(l,"isoWeek",r)),+l)}function Vo(t,e,i,s){const n=Io.length;for(let o=Io.indexOf(t);o=e?i[s]:i[n]]=!0}}else t[e]=!0}function Wo(t,e,i){const s=[],n={},o=e.length;let a,r;for(a=0;a=0&&(e[l].major=!0);return e}(t,s,n,i):s}class No extends Js{static id="time";static defaults={bounds:"data",adapters:{},time:{parser:!1,unit:!1,round:!1,isoWeekday:!1,minUnit:"millisecond",displayFormats:{}},ticks:{source:"auto",callback:!1,major:{enabled:!1}}};constructor(t){super(t),this._cache={data:[],labels:[],all:[]},this._unit="day",this._majorUnit=void 0,this._offsets={},this._normalized=!1,this._parseOpts=void 0}init(t,e={}){const i=t.time||(t.time={}),s=this._adapter=new Rn._date(t.adapters.date);s.init(e),x(i.displayFormats,s.formats()),this._parseOpts={parser:i.parser,round:i.round,isoWeekday:i.isoWeekday},super.init(t),this._normalized=e.normalized}parse(t,e){return void 0===t?null:Fo(this,t)}beforeLayout(){super.beforeLayout(),this._cache={data:[],labels:[],all:[]}}determineDataLimits(){const t=this.options,e=this._adapter,i=t.time.unit||"day";let{min:s,max:n,minDefined:o,maxDefined:r}=this.getUserBounds();function l(t){o||isNaN(t.min)||(s=Math.min(s,t.min)),r||isNaN(t.max)||(n=Math.max(n,t.max))}o&&r||(l(this._getLabelBounds()),"ticks"===t.bounds&&"labels"===t.ticks.source||l(this.getMinMax(!1))),s=a(s)&&!isNaN(s)?s:+e.startOf(Date.now(),i),n=a(n)&&!isNaN(n)?n:+e.endOf(Date.now(),i)+1,this.min=Math.min(s,n-1),this.max=Math.max(s+1,n)}_getLabelBounds(){const t=this.getLabelTimestamps();let e=Number.POSITIVE_INFINITY,i=Number.NEGATIVE_INFINITY;return t.length&&(e=t[0],i=t[t.length-1]),{min:e,max:i}}buildTicks(){const t=this.options,e=t.time,i=t.ticks,s="labels"===i.source?this.getLabelTimestamps():this._generate();"ticks"===t.bounds&&s.length&&(this.min=this._userMin||s[0],this.max=this._userMax||s[s.length-1]);const n=this.min,o=nt(s,n,this.max);return this._unit=e.unit||(i.autoSkip?Vo(e.minUnit,this.min,this.max,this._getLabelCapacity(n)):function(t,e,i,s,n){for(let o=Io.length-1;o>=Io.indexOf(i);o--){const i=Io[o];if(Ro[i].common&&t._adapter.diff(n,s,i)>=e-1)return i}return Io[i?Io.indexOf(i):0]}(this,o.length,e.minUnit,this.min,this.max)),this._majorUnit=i.major.enabled&&"year"!==this._unit?function(t){for(let e=Io.indexOf(t)+1,i=Io.length;e+t.value)))}initOffsets(t=[]){let e,i,s=0,n=0;this.options.offset&&t.length&&(e=this.getDecimalForValue(t[0]),s=1===t.length?1-e:(this.getDecimalForValue(t[1])-e)/2,i=this.getDecimalForValue(t[t.length-1]),n=1===t.length?i:(i-this.getDecimalForValue(t[t.length-2]))/2);const o=t.length<3?.5:.25;s=J(s,0,o),n=J(n,0,o),this._offsets={start:s,end:n,factor:1/(s+1+n)}}_generate(){const t=this._adapter,e=this.min,i=this.max,s=this.options,n=s.time,o=n.unit||Vo(n.minUnit,e,i,this._getLabelCapacity(e)),a=l(s.ticks.stepSize,1),r="week"===o&&n.isoWeekday,h=N(r)||!0===r,c={};let d,u,f=e;if(h&&(f=+t.startOf(f,"isoWeek",r)),f=+t.startOf(f,h?"day":o),t.diff(i,e,o)>1e5*a)throw new Error(e+" and "+i+" are too far apart with stepSize of "+a+" "+o);const g="data"===s.ticks.source&&this.getDataTimestamps();for(d=f,u=0;d+t))}getLabelForValue(t){const e=this._adapter,i=this.options.time;return i.tooltipFormat?e.format(t,i.tooltipFormat):e.format(t,i.displayFormats.datetime)}format(t,e){const i=this.options.time.displayFormats,s=this._unit,n=e||i[s];return this._adapter.format(t,n)}_tickFormatFunction(t,e,i,s){const n=this.options,o=n.ticks.callback;if(o)return d(o,[t,e,i],this);const a=n.time.displayFormats,r=this._unit,l=this._majorUnit,h=r&&a[r],c=l&&a[l],u=i[e],f=l&&c&&u&&u.major;return this._adapter.format(t,s||(f?c:h))}generateTickLabels(t){let e,i,s;for(e=0,i=t.length;e0?a:1}getDataTimestamps(){let t,e,i=this._cache.data||[];if(i.length)return i;const s=this.getMatchingVisibleMetas();if(this._normalized&&s.length)return this._cache.data=s[0].controller.getAllParsedValues(this);for(t=0,e=s.length;t=t[r].pos&&e<=t[l].pos&&({lo:r,hi:l}=it(t,"pos",e)),({pos:s,time:o}=t[r]),({pos:n,time:a}=t[l])):(e>=t[r].time&&e<=t[l].time&&({lo:r,hi:l}=it(t,"time",e)),({time:s,pos:o}=t[r]),({time:n,pos:a}=t[l]));const h=n-s;return h?o+(a-o)*(e-s)/h:o}var jo=Object.freeze({__proto__:null,CategoryScale:class extends Js{static id="category";static defaults={ticks:{callback:po}};constructor(t){super(t),this._startValue=void 0,this._valueRange=0,this._addedLabels=[]}init(t){const e=this._addedLabels;if(e.length){const t=this.getLabels();for(const{index:i,label:s}of e)t[i]===s&&t.splice(i,1);this._addedLabels=[]}super.init(t)}parse(t,e){if(s(t))return null;const i=this.getLabels();return((t,e)=>null===t?null:J(Math.round(t),0,e))(e=isFinite(e)&&i[e]===t?e:go(i,t,l(e,t),this._addedLabels),i.length-1)}determineDataLimits(){const{minDefined:t,maxDefined:e}=this.getUserBounds();let{min:i,max:s}=this.getMinMax(!0);"ticks"===this.options.bounds&&(t||(i=0),e||(s=this.getLabels().length-1)),this.min=i,this.max=s}buildTicks(){const t=this.min,e=this.max,i=this.options.offset,s=[];let n=this.getLabels();n=0===t&&e===n.length-1?n:n.slice(t,e+1),this._valueRange=Math.max(n.length-(i?0:1),1),this._startValue=this.min-(i?.5:0);for(let i=t;i<=e;i++)s.push({value:i});return s}getLabelForValue(t){return po.call(this,t)}configure(){super.configure(),this.isHorizontal()||(this._reversePixels=!this._reversePixels)}getPixelForValue(t){return"number"!=typeof t&&(t=this.parse(t)),null===t?NaN:this.getPixelForDecimal((t-this._startValue)/this._valueRange)}getPixelForTick(t){const e=this.ticks;return t<0||t>e.length-1?null:this.getPixelForValue(e[t].value)}getValueForPixel(t){return Math.round(this._startValue+this.getDecimalForPixel(t)*this._valueRange)}getBasePixel(){return this.bottom}},LinearScale:xo,LogarithmicScale:ko,RadialLinearScale:Eo,TimeScale:No,TimeSeriesScale:class extends No{static id="timeseries";static defaults=No.defaults;constructor(t){super(t),this._table=[],this._minPos=void 0,this._tableRange=void 0}initOffsets(){const t=this._getTimestampsForTable(),e=this._table=this.buildLookupTable(t);this._minPos=Ho(e,this.min),this._tableRange=Ho(e,this.max)-this._minPos,super.initOffsets(t)}buildLookupTable(t){const{min:e,max:i}=this,s=[],n=[];let o,a,r,l,h;for(o=0,a=t.length;o=e&&l<=i&&s.push(l);if(s.length<2)return[{time:e,pos:0},{time:i,pos:1}];for(o=0,a=s.length;ot-e))}_getTimestampsForTable(){let t=this._cache.all||[];if(t.length)return t;const e=this.getDataTimestamps(),i=this.getLabelTimestamps();return t=e.length&&i.length?this.normalize(e.concat(i)):e.length?e:i,t=this._cache.all=t,t}getDecimalForValue(t){return(Ho(this._table,t)-this._minPos)/this._tableRange}getValueForPixel(t){const e=this._offsets,i=this.getDecimalForPixel(t)/e.factor-e.end;return Ho(this._table,i*this._tableRange+this._minPos,!0)}}});const $o=["rgb(54, 162, 235)","rgb(255, 99, 132)","rgb(255, 159, 64)","rgb(255, 205, 86)","rgb(75, 192, 192)","rgb(153, 102, 255)","rgb(201, 203, 207)"],Yo=$o.map((t=>t.replace("rgb(","rgba(").replace(")",", 0.5)")));function Uo(t){return $o[t%$o.length]}function Xo(t){return Yo[t%Yo.length]}function qo(t){let e=0;return(i,s)=>{const n=t.getDatasetMeta(s).controller;n instanceof jn?e=function(t,e){return t.backgroundColor=t.data.map((()=>Uo(e++))),e}(i,e):n instanceof $n?e=function(t,e){return t.backgroundColor=t.data.map((()=>Xo(e++))),e}(i,e):n&&(e=function(t,e){return t.borderColor=Uo(e),t.backgroundColor=Xo(e),++e}(i,e))}}function Ko(t){let e;for(e in t)if(t[e].borderColor||t[e].backgroundColor)return!0;return!1}var Go={id:"colors",defaults:{enabled:!0,forceOverride:!1},beforeLayout(t,e,i){if(!i.enabled)return;const{data:{datasets:s},options:n}=t.config,{elements:o}=n;if(!i.forceOverride&&(Ko(s)||(a=n)&&(a.borderColor||a.backgroundColor)||o&&Ko(o)))return;var a;const r=qo(t);s.forEach(r)}};function Zo(t){if(t._decimated){const e=t._data;delete t._decimated,delete t._data,Object.defineProperty(t,"data",{configurable:!0,enumerable:!0,writable:!0,value:e})}}function Jo(t){t.data.datasets.forEach((t=>{Zo(t)}))}var Qo={id:"decimation",defaults:{algorithm:"min-max",enabled:!1},beforeElementsUpdate:(t,e,i)=>{if(!i.enabled)return void Jo(t);const n=t.width;t.data.datasets.forEach(((e,o)=>{const{_data:a,indexAxis:r}=e,l=t.getDatasetMeta(o),h=a||e.data;if("y"===Pi([r,t.options.indexAxis]))return;if(!l.controller.supportsDecimation)return;const c=t.scales[l.xAxisID];if("linear"!==c.type&&"time"!==c.type)return;if(t.options.parsing)return;let{start:d,count:u}=function(t,e){const i=e.length;let s,n=0;const{iScale:o}=t,{min:a,max:r,minDefined:l,maxDefined:h}=o.getUserBounds();return l&&(n=J(it(e,o.axis,a).lo,0,i-1)),s=h?J(it(e,o.axis,r).hi+1,n,i)-n:i-n,{start:n,count:s}}(l,h);if(u<=(i.threshold||4*n))return void Zo(e);let f;switch(s(a)&&(e._data=h,delete e.data,Object.defineProperty(e,"data",{configurable:!0,enumerable:!0,get:function(){return this._decimated},set:function(t){this._data=t}})),i.algorithm){case"lttb":f=function(t,e,i,s,n){const o=n.samples||s;if(o>=i)return t.slice(e,e+i);const a=[],r=(i-2)/(o-2);let l=0;const h=e+i-1;let c,d,u,f,g,p=e;for(a[l++]=t[p],c=0;cu&&(u=f,d=t[s],g=s);a[l++]=d,p=g}return a[l++]=t[h],a}(h,d,u,n,i);break;case"min-max":f=function(t,e,i,n){let o,a,r,l,h,c,d,u,f,g,p=0,m=0;const b=[],x=e+i-1,_=t[e].x,y=t[x].x-_;for(o=e;og&&(g=l,d=o),p=(m*p+a.x)/++m;else{const i=o-1;if(!s(c)&&!s(d)){const e=Math.min(c,d),s=Math.max(c,d);e!==u&&e!==i&&b.push({...t[e],x:p}),s!==u&&s!==i&&b.push({...t[s],x:p})}o>0&&i!==u&&b.push(t[i]),b.push(a),h=e,m=0,f=g=l,c=d=u=o}}return b}(h,d,u,n);break;default:throw new Error(`Unsupported decimation algorithm '${i.algorithm}'`)}e._decimated=f}))},destroy(t){Jo(t)}};function ta(t,e,i,s){if(s)return;let n=e[t],o=i[t];return"angle"===t&&(n=G(n),o=G(o)),{property:t,start:n,end:o}}function ea(t,e,i){for(;e>t;e--){const t=i[e];if(!isNaN(t.x)&&!isNaN(t.y))break}return e}function ia(t,e,i,s){return t&&e?s(t[i],e[i]):t?t[i]:e?e[i]:0}function sa(t,e){let i=[],s=!1;return n(t)?(s=!0,i=t):i=function(t,e){const{x:i=null,y:s=null}=t||{},n=e.points,o=[];return e.segments.forEach((({start:t,end:e})=>{e=ea(t,e,n);const a=n[t],r=n[e];null!==s?(o.push({x:a.x,y:s}),o.push({x:r.x,y:s})):null!==i&&(o.push({x:i,y:a.y}),o.push({x:i,y:r.y}))})),o}(t,e),i.length?new no({points:i,options:{tension:0},_loop:s,_fullLoop:s}):null}function na(t){return t&&!1!==t.fill}function oa(t,e,i){let s=t[e].fill;const n=[e];let o;if(!i)return s;for(;!1!==s&&-1===n.indexOf(s);){if(!a(s))return s;if(o=t[s],!o)return!1;if(o.visible)return s;n.push(s),s=o.fill}return!1}function aa(t,e,i){const s=function(t){const e=t.options,i=e.fill;let s=l(i&&i.target,i);void 0===s&&(s=!!e.backgroundColor);if(!1===s||null===s)return!1;if(!0===s)return"origin";return s}(t);if(o(s))return!isNaN(s.value)&&s;let n=parseFloat(s);return a(n)&&Math.floor(n)===n?function(t,e,i,s){"-"!==t&&"+"!==t||(i=e+i);if(i===e||i<0||i>=s)return!1;return i}(s[0],e,n,i):["origin","start","end","stack","shape"].indexOf(s)>=0&&s}function ra(t,e,i){const s=[];for(let n=0;n=0;--e){const i=n[e].$filler;i&&(i.line.updateControlPoints(o,i.axis),s&&i.fill&&da(t.ctx,i,o))}},beforeDatasetsDraw(t,e,i){if("beforeDatasetsDraw"!==i.drawTime)return;const s=t.getSortedVisibleDatasetMetas();for(let e=s.length-1;e>=0;--e){const i=s[e].$filler;na(i)&&da(t.ctx,i,t.chartArea)}},beforeDatasetDraw(t,e,i){const s=e.meta.$filler;na(s)&&"beforeDatasetDraw"===i.drawTime&&da(t.ctx,s,t.chartArea)},defaults:{propagate:!0,drawTime:"beforeDatasetDraw"}};const ba=(t,e)=>{let{boxHeight:i=e,boxWidth:s=e}=t;return t.usePointStyle&&(i=Math.min(i,e),s=t.pointStyleWidth||Math.min(s,e)),{boxWidth:s,boxHeight:i,itemHeight:Math.max(e,i)}};class xa extends Hs{constructor(t){super(),this._added=!1,this.legendHitBoxes=[],this._hoveredItem=null,this.doughnutMode=!1,this.chart=t.chart,this.options=t.options,this.ctx=t.ctx,this.legendItems=void 0,this.columnSizes=void 0,this.lineWidths=void 0,this.maxHeight=void 0,this.maxWidth=void 0,this.top=void 0,this.bottom=void 0,this.left=void 0,this.right=void 0,this.height=void 0,this.width=void 0,this._margins=void 0,this.position=void 0,this.weight=void 0,this.fullSize=void 0}update(t,e,i){this.maxWidth=t,this.maxHeight=e,this._margins=i,this.setDimensions(),this.buildLabels(),this.fit()}setDimensions(){this.isHorizontal()?(this.width=this.maxWidth,this.left=this._margins.left,this.right=this.width):(this.height=this.maxHeight,this.top=this._margins.top,this.bottom=this.height)}buildLabels(){const t=this.options.labels||{};let e=d(t.generateLabels,[this.chart],this)||[];t.filter&&(e=e.filter((e=>t.filter(e,this.chart.data)))),t.sort&&(e=e.sort(((e,i)=>t.sort(e,i,this.chart.data)))),this.options.reverse&&e.reverse(),this.legendItems=e}fit(){const{options:t,ctx:e}=this;if(!t.display)return void(this.width=this.height=0);const i=t.labels,s=Si(i.font),n=s.size,o=this._computeTitleHeight(),{boxWidth:a,itemHeight:r}=ba(i,n);let l,h;e.font=s.string,this.isHorizontal()?(l=this.maxWidth,h=this._fitRows(o,n,a,r)+10):(h=this.maxHeight,l=this._fitCols(o,s,a,r)+10),this.width=Math.min(l,t.maxWidth||this.maxWidth),this.height=Math.min(h,t.maxHeight||this.maxHeight)}_fitRows(t,e,i,s){const{ctx:n,maxWidth:o,options:{labels:{padding:a}}}=this,r=this.legendHitBoxes=[],l=this.lineWidths=[0],h=s+a;let c=t;n.textAlign="left",n.textBaseline="middle";let d=-1,u=-h;return this.legendItems.forEach(((t,f)=>{const g=i+e/2+n.measureText(t.text).width;(0===f||l[l.length-1]+g+2*a>o)&&(c+=h,l[l.length-(f>0?0:1)]=0,u+=h,d++),r[f]={left:0,top:u,row:d,width:g,height:s},l[l.length-1]+=g+a})),c}_fitCols(t,e,i,s){const{ctx:n,maxHeight:o,options:{labels:{padding:a}}}=this,r=this.legendHitBoxes=[],l=this.columnSizes=[],h=o-t;let c=a,d=0,u=0,f=0,g=0;return this.legendItems.forEach(((t,o)=>{const{itemWidth:p,itemHeight:m}=function(t,e,i,s,n){const o=function(t,e,i,s){let n=t.text;n&&"string"!=typeof n&&(n=n.reduce(((t,e)=>t.length>e.length?t:e)));return e+i.size/2+s.measureText(n).width}(s,t,e,i),a=function(t,e,i){let s=t;"string"!=typeof e.text&&(s=_a(e,i));return s}(n,s,e.lineHeight);return{itemWidth:o,itemHeight:a}}(i,e,n,t,s);o>0&&u+m+2*a>h&&(c+=d+a,l.push({width:d,height:u}),f+=d+a,g++,d=u=0),r[o]={left:f,top:u,col:g,width:p,height:m},d=Math.max(d,p),u+=m+a})),c+=d,l.push({width:d,height:u}),c}adjustHitBoxes(){if(!this.options.display)return;const t=this._computeTitleHeight(),{legendHitBoxes:e,options:{align:i,labels:{padding:s},rtl:n}}=this,o=Oi(n,this.left,this.width);if(this.isHorizontal()){let n=0,a=ft(i,this.left+s,this.right-this.lineWidths[n]);for(const r of e)n!==r.row&&(n=r.row,a=ft(i,this.left+s,this.right-this.lineWidths[n])),r.top+=this.top+t+s,r.left=o.leftForLtr(o.x(a),r.width),a+=r.width+s}else{let n=0,a=ft(i,this.top+t+s,this.bottom-this.columnSizes[n].height);for(const r of e)r.col!==n&&(n=r.col,a=ft(i,this.top+t+s,this.bottom-this.columnSizes[n].height)),r.top=a,r.left+=this.left+s,r.left=o.leftForLtr(o.x(r.left),r.width),a+=r.height+s}}isHorizontal(){return"top"===this.options.position||"bottom"===this.options.position}draw(){if(this.options.display){const t=this.ctx;Ie(t,this),this._draw(),ze(t)}}_draw(){const{options:t,columnSizes:e,lineWidths:i,ctx:s}=this,{align:n,labels:o}=t,a=ue.color,r=Oi(t.rtl,this.left,this.width),h=Si(o.font),{padding:c}=o,d=h.size,u=d/2;let f;this.drawTitle(),s.textAlign=r.textAlign("left"),s.textBaseline="middle",s.lineWidth=.5,s.font=h.string;const{boxWidth:g,boxHeight:p,itemHeight:m}=ba(o,d),b=this.isHorizontal(),x=this._computeTitleHeight();f=b?{x:ft(n,this.left+c,this.right-i[0]),y:this.top+c+x,line:0}:{x:this.left+c,y:ft(n,this.top+x+c,this.bottom-e[0].height),line:0},Ai(this.ctx,t.textDirection);const _=m+c;this.legendItems.forEach(((y,v)=>{s.strokeStyle=y.fontColor,s.fillStyle=y.fontColor;const M=s.measureText(y.text).width,w=r.textAlign(y.textAlign||(y.textAlign=o.textAlign)),k=g+u+M;let S=f.x,P=f.y;r.setWidth(this.width),b?v>0&&S+k+c>this.right&&(P=f.y+=_,f.line++,S=f.x=ft(n,this.left+c,this.right-i[f.line])):v>0&&P+_>this.bottom&&(S=f.x=S+e[f.line].width+c,f.line++,P=f.y=ft(n,this.top+x+c,this.bottom-e[f.line].height));if(function(t,e,i){if(isNaN(g)||g<=0||isNaN(p)||p<0)return;s.save();const n=l(i.lineWidth,1);if(s.fillStyle=l(i.fillStyle,a),s.lineCap=l(i.lineCap,"butt"),s.lineDashOffset=l(i.lineDashOffset,0),s.lineJoin=l(i.lineJoin,"miter"),s.lineWidth=n,s.strokeStyle=l(i.strokeStyle,a),s.setLineDash(l(i.lineDash,[])),o.usePointStyle){const a={radius:p*Math.SQRT2/2,pointStyle:i.pointStyle,rotation:i.rotation,borderWidth:n},l=r.xPlus(t,g/2);Ee(s,a,l,e+u,o.pointStyleWidth&&g)}else{const o=e+Math.max((d-p)/2,0),a=r.leftForLtr(t,g),l=wi(i.borderRadius);s.beginPath(),Object.values(l).some((t=>0!==t))?He(s,{x:a,y:o,w:g,h:p,radius:l}):s.rect(a,o,g,p),s.fill(),0!==n&&s.stroke()}s.restore()}(r.x(S),P,y),S=gt(w,S+g+u,b?S+k:this.right,t.rtl),function(t,e,i){Ne(s,i.text,t,e+m/2,h,{strikethrough:i.hidden,textAlign:r.textAlign(i.textAlign)})}(r.x(S),P,y),b)f.x+=k+c;else if("string"!=typeof y.text){const t=h.lineHeight;f.y+=_a(y,t)+c}else f.y+=_})),Ti(this.ctx,t.textDirection)}drawTitle(){const t=this.options,e=t.title,i=Si(e.font),s=ki(e.padding);if(!e.display)return;const n=Oi(t.rtl,this.left,this.width),o=this.ctx,a=e.position,r=i.size/2,l=s.top+r;let h,c=this.left,d=this.width;if(this.isHorizontal())d=Math.max(...this.lineWidths),h=this.top+l,c=ft(t.align,c,this.right-d);else{const e=this.columnSizes.reduce(((t,e)=>Math.max(t,e.height)),0);h=l+ft(t.align,this.top,this.bottom-e-t.labels.padding-this._computeTitleHeight())}const u=ft(a,c,c+d);o.textAlign=n.textAlign(ut(a)),o.textBaseline="middle",o.strokeStyle=e.color,o.fillStyle=e.color,o.font=i.string,Ne(o,e.text,u,h,i)}_computeTitleHeight(){const t=this.options.title,e=Si(t.font),i=ki(t.padding);return t.display?e.lineHeight+i.height:0}_getLegendItemAt(t,e){let i,s,n;if(tt(t,this.left,this.right)&&tt(e,this.top,this.bottom))for(n=this.legendHitBoxes,i=0;it.chart.options.color,boxWidth:40,padding:10,generateLabels(t){const e=t.data.datasets,{labels:{usePointStyle:i,pointStyle:s,textAlign:n,color:o,useBorderRadius:a,borderRadius:r}}=t.legend.options;return t._getSortedDatasetMetas().map((t=>{const l=t.controller.getStyle(i?0:void 0),h=ki(l.borderWidth);return{text:e[t.index].label,fillStyle:l.backgroundColor,fontColor:o,hidden:!t.visible,lineCap:l.borderCapStyle,lineDash:l.borderDash,lineDashOffset:l.borderDashOffset,lineJoin:l.borderJoinStyle,lineWidth:(h.width+h.height)/4,strokeStyle:l.borderColor,pointStyle:s||l.pointStyle,rotation:l.rotation,textAlign:n||l.textAlign,borderRadius:a&&(r||l.borderRadius),datasetIndex:t.index}}),this)}},title:{color:t=>t.chart.options.color,display:!1,position:"center",text:""}},descriptors:{_scriptable:t=>!t.startsWith("on"),labels:{_scriptable:t=>!["generateLabels","filter","sort"].includes(t)}}};class va extends Hs{constructor(t){super(),this.chart=t.chart,this.options=t.options,this.ctx=t.ctx,this._padding=void 0,this.top=void 0,this.bottom=void 0,this.left=void 0,this.right=void 0,this.width=void 0,this.height=void 0,this.position=void 0,this.weight=void 0,this.fullSize=void 0}update(t,e){const i=this.options;if(this.left=0,this.top=0,!i.display)return void(this.width=this.height=this.right=this.bottom=0);this.width=this.right=t,this.height=this.bottom=e;const s=n(i.text)?i.text.length:1;this._padding=ki(i.padding);const o=s*Si(i.font).lineHeight+this._padding.height;this.isHorizontal()?this.height=o:this.width=o}isHorizontal(){const t=this.options.position;return"top"===t||"bottom"===t}_drawArgs(t){const{top:e,left:i,bottom:s,right:n,options:o}=this,a=o.align;let r,l,h,c=0;return this.isHorizontal()?(l=ft(a,i,n),h=e+t,r=n-i):("left"===o.position?(l=i+t,h=ft(a,s,e),c=-.5*C):(l=n-t,h=ft(a,e,s),c=.5*C),r=s-e),{titleX:l,titleY:h,maxWidth:r,rotation:c}}draw(){const t=this.ctx,e=this.options;if(!e.display)return;const i=Si(e.font),s=i.lineHeight/2+this._padding.top,{titleX:n,titleY:o,maxWidth:a,rotation:r}=this._drawArgs(s);Ne(t,e.text,0,0,i,{color:e.color,maxWidth:a,rotation:r,textAlign:ut(e.align),textBaseline:"middle",translation:[n,o]})}}var Ma={id:"title",_element:va,start(t,e,i){!function(t,e){const i=new va({ctx:t.ctx,options:e,chart:t});as.configure(t,i,e),as.addBox(t,i),t.titleBlock=i}(t,i)},stop(t){const e=t.titleBlock;as.removeBox(t,e),delete t.titleBlock},beforeUpdate(t,e,i){const s=t.titleBlock;as.configure(t,s,i),s.options=i},defaults:{align:"center",display:!1,font:{weight:"bold"},fullSize:!0,padding:10,position:"top",text:"",weight:2e3},defaultRoutes:{color:"color"},descriptors:{_scriptable:!0,_indexable:!1}};const wa=new WeakMap;var ka={id:"subtitle",start(t,e,i){const s=new va({ctx:t.ctx,options:i,chart:t});as.configure(t,s,i),as.addBox(t,s),wa.set(t,s)},stop(t){as.removeBox(t,wa.get(t)),wa.delete(t)},beforeUpdate(t,e,i){const s=wa.get(t);as.configure(t,s,i),s.options=i},defaults:{align:"center",display:!1,font:{weight:"normal"},fullSize:!0,padding:0,position:"top",text:"",weight:1500},defaultRoutes:{color:"color"},descriptors:{_scriptable:!0,_indexable:!1}};const Sa={average(t){if(!t.length)return!1;let e,i,s=0,n=0,o=0;for(e=0,i=t.length;e-1?t.split("\n"):t}function Ca(t,e){const{element:i,datasetIndex:s,index:n}=e,o=t.getDatasetMeta(s).controller,{label:a,value:r}=o.getLabelAndValue(n);return{chart:t,label:a,parsed:o.getParsed(n),raw:t.data.datasets[s].data[n],formattedValue:r,dataset:o.getDataset(),dataIndex:n,datasetIndex:s,element:i}}function Oa(t,e){const i=t.chart.ctx,{body:s,footer:n,title:o}=t,{boxWidth:a,boxHeight:r}=e,l=Si(e.bodyFont),h=Si(e.titleFont),c=Si(e.footerFont),d=o.length,f=n.length,g=s.length,p=ki(e.padding);let m=p.height,b=0,x=s.reduce(((t,e)=>t+e.before.length+e.lines.length+e.after.length),0);if(x+=t.beforeBody.length+t.afterBody.length,d&&(m+=d*h.lineHeight+(d-1)*e.titleSpacing+e.titleMarginBottom),x){m+=g*(e.displayColors?Math.max(r,l.lineHeight):l.lineHeight)+(x-g)*l.lineHeight+(x-1)*e.bodySpacing}f&&(m+=e.footerMarginTop+f*c.lineHeight+(f-1)*e.footerSpacing);let _=0;const y=function(t){b=Math.max(b,i.measureText(t).width+_)};return i.save(),i.font=h.string,u(t.title,y),i.font=l.string,u(t.beforeBody.concat(t.afterBody),y),_=e.displayColors?a+2+e.boxPadding:0,u(s,(t=>{u(t.before,y),u(t.lines,y),u(t.after,y)})),_=0,i.font=c.string,u(t.footer,y),i.restore(),b+=p.width,{width:b,height:m}}function Aa(t,e,i,s){const{x:n,width:o}=i,{width:a,chartArea:{left:r,right:l}}=t;let h="center";return"center"===s?h=n<=(r+l)/2?"left":"right":n<=o/2?h="left":n>=a-o/2&&(h="right"),function(t,e,i,s){const{x:n,width:o}=s,a=i.caretSize+i.caretPadding;return"left"===t&&n+o+a>e.width||"right"===t&&n-o-a<0||void 0}(h,t,e,i)&&(h="center"),h}function Ta(t,e,i){const s=i.yAlign||e.yAlign||function(t,e){const{y:i,height:s}=e;return it.height-s/2?"bottom":"center"}(t,i);return{xAlign:i.xAlign||e.xAlign||Aa(t,e,i,s),yAlign:s}}function La(t,e,i,s){const{caretSize:n,caretPadding:o,cornerRadius:a}=t,{xAlign:r,yAlign:l}=i,h=n+o,{topLeft:c,topRight:d,bottomLeft:u,bottomRight:f}=wi(a);let g=function(t,e){let{x:i,width:s}=t;return"right"===e?i-=s:"center"===e&&(i-=s/2),i}(e,r);const p=function(t,e,i){let{y:s,height:n}=t;return"top"===e?s+=i:s-="bottom"===e?n+i:n/2,s}(e,l,h);return"center"===l?"left"===r?g+=h:"right"===r&&(g-=h):"left"===r?g-=Math.max(c,u)+n:"right"===r&&(g+=Math.max(d,f)+n),{x:J(g,0,s.width-e.width),y:J(p,0,s.height-e.height)}}function Ea(t,e,i){const s=ki(i.padding);return"center"===e?t.x+t.width/2:"right"===e?t.x+t.width-s.right:t.x+s.left}function Ra(t){return Pa([],Da(t))}function Ia(t,e){const i=e&&e.dataset&&e.dataset.tooltip&&e.dataset.tooltip.callbacks;return i?t.override(i):t}const za={beforeTitle:e,title(t){if(t.length>0){const e=t[0],i=e.chart.data.labels,s=i?i.length:0;if(this&&this.options&&"dataset"===this.options.mode)return e.dataset.label||"";if(e.label)return e.label;if(s>0&&e.dataIndex{const e={before:[],lines:[],after:[]},n=Ia(i,t);Pa(e.before,Da(Fa(n,"beforeLabel",this,t))),Pa(e.lines,Fa(n,"label",this,t)),Pa(e.after,Da(Fa(n,"afterLabel",this,t))),s.push(e)})),s}getAfterBody(t,e){return Ra(Fa(e.callbacks,"afterBody",this,t))}getFooter(t,e){const{callbacks:i}=e,s=Fa(i,"beforeFooter",this,t),n=Fa(i,"footer",this,t),o=Fa(i,"afterFooter",this,t);let a=[];return a=Pa(a,Da(s)),a=Pa(a,Da(n)),a=Pa(a,Da(o)),a}_createItems(t){const e=this._active,i=this.chart.data,s=[],n=[],o=[];let a,r,l=[];for(a=0,r=e.length;at.filter(e,s,n,i)))),t.itemSort&&(l=l.sort(((e,s)=>t.itemSort(e,s,i)))),u(l,(e=>{const i=Ia(t.callbacks,e);s.push(Fa(i,"labelColor",this,e)),n.push(Fa(i,"labelPointStyle",this,e)),o.push(Fa(i,"labelTextColor",this,e))})),this.labelColors=s,this.labelPointStyles=n,this.labelTextColors=o,this.dataPoints=l,l}update(t,e){const i=this.options.setContext(this.getContext()),s=this._active;let n,o=[];if(s.length){const t=Sa[i.position].call(this,s,this._eventPosition);o=this._createItems(i),this.title=this.getTitle(o,i),this.beforeBody=this.getBeforeBody(o,i),this.body=this.getBody(o,i),this.afterBody=this.getAfterBody(o,i),this.footer=this.getFooter(o,i);const e=this._size=Oa(this,i),a=Object.assign({},t,e),r=Ta(this.chart,i,a),l=La(i,a,r,this.chart);this.xAlign=r.xAlign,this.yAlign=r.yAlign,n={opacity:1,x:l.x,y:l.y,width:e.width,height:e.height,caretX:t.x,caretY:t.y}}else 0!==this.opacity&&(n={opacity:0});this._tooltipItems=o,this.$context=void 0,n&&this._resolveAnimations().update(this,n),t&&i.external&&i.external.call(this,{chart:this.chart,tooltip:this,replay:e})}drawCaret(t,e,i,s){const n=this.getCaretPosition(t,i,s);e.lineTo(n.x1,n.y1),e.lineTo(n.x2,n.y2),e.lineTo(n.x3,n.y3)}getCaretPosition(t,e,i){const{xAlign:s,yAlign:n}=this,{caretSize:o,cornerRadius:a}=i,{topLeft:r,topRight:l,bottomLeft:h,bottomRight:c}=wi(a),{x:d,y:u}=t,{width:f,height:g}=e;let p,m,b,x,_,y;return"center"===n?(_=u+g/2,"left"===s?(p=d,m=p-o,x=_+o,y=_-o):(p=d+f,m=p+o,x=_-o,y=_+o),b=p):(m="left"===s?d+Math.max(r,h)+o:"right"===s?d+f-Math.max(l,c)-o:this.caretX,"top"===n?(x=u,_=x-o,p=m-o,b=m+o):(x=u+g,_=x+o,p=m+o,b=m-o),y=x),{x1:p,x2:m,x3:b,y1:x,y2:_,y3:y}}drawTitle(t,e,i){const s=this.title,n=s.length;let o,a,r;if(n){const l=Oi(i.rtl,this.x,this.width);for(t.x=Ea(this,i.titleAlign,i),e.textAlign=l.textAlign(i.titleAlign),e.textBaseline="middle",o=Si(i.titleFont),a=i.titleSpacing,e.fillStyle=i.titleColor,e.font=o.string,r=0;r0!==t))?(t.beginPath(),t.fillStyle=n.multiKeyBackground,He(t,{x:e,y:g,w:h,h:l,radius:r}),t.fill(),t.stroke(),t.fillStyle=a.backgroundColor,t.beginPath(),He(t,{x:i,y:g+1,w:h-2,h:l-2,radius:r}),t.fill()):(t.fillStyle=n.multiKeyBackground,t.fillRect(e,g,h,l),t.strokeRect(e,g,h,l),t.fillStyle=a.backgroundColor,t.fillRect(i,g+1,h-2,l-2))}t.fillStyle=this.labelTextColors[i]}drawBody(t,e,i){const{body:s}=this,{bodySpacing:n,bodyAlign:o,displayColors:a,boxHeight:r,boxWidth:l,boxPadding:h}=i,c=Si(i.bodyFont);let d=c.lineHeight,f=0;const g=Oi(i.rtl,this.x,this.width),p=function(i){e.fillText(i,g.x(t.x+f),t.y+d/2),t.y+=d+n},m=g.textAlign(o);let b,x,_,y,v,M,w;for(e.textAlign=o,e.textBaseline="middle",e.font=c.string,t.x=Ea(this,m,i),e.fillStyle=i.bodyColor,u(this.beforeBody,p),f=a&&"right"!==m?"center"===o?l/2+h:l+2+h:0,y=0,M=s.length;y0&&e.stroke()}_updateAnimationTarget(t){const e=this.chart,i=this.$animations,s=i&&i.x,n=i&&i.y;if(s||n){const i=Sa[t.position].call(this,this._active,this._eventPosition);if(!i)return;const o=this._size=Oa(this,t),a=Object.assign({},i,this._size),r=Ta(e,t,a),l=La(t,a,r,e);s._to===l.x&&n._to===l.y||(this.xAlign=r.xAlign,this.yAlign=r.yAlign,this.width=o.width,this.height=o.height,this.caretX=i.x,this.caretY=i.y,this._resolveAnimations().update(this,l))}}_willRender(){return!!this.opacity}draw(t){const e=this.options.setContext(this.getContext());let i=this.opacity;if(!i)return;this._updateAnimationTarget(e);const s={width:this.width,height:this.height},n={x:this.x,y:this.y};i=Math.abs(i)<.001?0:i;const o=ki(e.padding),a=this.title.length||this.beforeBody.length||this.body.length||this.afterBody.length||this.footer.length;e.enabled&&a&&(t.save(),t.globalAlpha=i,this.drawBackground(n,t,s,e),Ai(t,e.textDirection),n.y+=o.top,this.drawTitle(n,t,e),this.drawBody(n,t,e),this.drawFooter(n,t,e),Ti(t,e.textDirection),t.restore())}getActiveElements(){return this._active||[]}setActiveElements(t,e){const i=this._active,s=t.map((({datasetIndex:t,index:e})=>{const i=this.chart.getDatasetMeta(t);if(!i)throw new Error("Cannot find a dataset at index "+t);return{datasetIndex:t,element:i.data[e],index:e}})),n=!f(i,s),o=this._positionChanged(s,e);(n||o)&&(this._active=s,this._eventPosition=e,this._ignoreReplayEvents=!0,this.update(!0))}handleEvent(t,e,i=!0){if(e&&this._ignoreReplayEvents)return!1;this._ignoreReplayEvents=!1;const s=this.options,n=this._active||[],o=this._getActiveElements(t,n,e,i),a=this._positionChanged(o,t),r=e||!f(o,n)||a;return r&&(this._active=o,(s.enabled||s.external)&&(this._eventPosition={x:t.x,y:t.y},this.update(!0,e))),r}_getActiveElements(t,e,i,s){const n=this.options;if("mouseout"===t.type)return[];if(!s)return e;const o=this.chart.getElementsAtEventForMode(t,n.mode,n,i);return n.reverse&&o.reverse(),o}_positionChanged(t,e){const{caretX:i,caretY:s,options:n}=this,o=Sa[n.position].call(this,t,e);return!1!==o&&(i!==o.x||s!==o.y)}}var Ba={id:"tooltip",_element:Va,positioners:Sa,afterInit(t,e,i){i&&(t.tooltip=new Va({chart:t,options:i}))},beforeUpdate(t,e,i){t.tooltip&&t.tooltip.initialize(i)},reset(t,e,i){t.tooltip&&t.tooltip.initialize(i)},afterDraw(t){const e=t.tooltip;if(e&&e._willRender()){const i={tooltip:e};if(!1===t.notifyPlugins("beforeTooltipDraw",{...i,cancelable:!0}))return;e.draw(t.ctx),t.notifyPlugins("afterTooltipDraw",i)}},afterEvent(t,e){if(t.tooltip){const i=e.replay;t.tooltip.handleEvent(e.event,i,e.inChartArea)&&(e.changed=!0)}},defaults:{enabled:!0,external:null,position:"average",backgroundColor:"rgba(0,0,0,0.8)",titleColor:"#fff",titleFont:{weight:"bold"},titleSpacing:2,titleMarginBottom:6,titleAlign:"left",bodyColor:"#fff",bodySpacing:2,bodyFont:{},bodyAlign:"left",footerColor:"#fff",footerSpacing:2,footerMarginTop:6,footerFont:{weight:"bold"},footerAlign:"left",padding:6,caretPadding:2,caretSize:5,cornerRadius:6,boxHeight:(t,e)=>e.bodyFont.size,boxWidth:(t,e)=>e.bodyFont.size,multiKeyBackground:"#fff",displayColors:!0,boxPadding:0,borderColor:"rgba(0,0,0,0)",borderWidth:0,animation:{duration:400,easing:"easeOutQuart"},animations:{numbers:{type:"number",properties:["x","y","width","height","caretX","caretY"]},opacity:{easing:"linear",duration:200}},callbacks:za},defaultRoutes:{bodyFont:"font",footerFont:"font",titleFont:"font"},descriptors:{_scriptable:t=>"filter"!==t&&"itemSort"!==t&&"external"!==t,_indexable:!1,callbacks:{_scriptable:!1,_indexable:!1},animation:{_fallback:!1},animations:{_fallback:"animation"}},additionalOptionScopes:["interaction"]};return An.register(Yn,jo,fo,t),An.helpers={...Wi},An._adapters=Rn,An.Animation=Cs,An.Animations=Os,An.animator=xt,An.controllers=en.controllers.items,An.DatasetController=Ns,An.Element=Hs,An.elements=fo,An.Interaction=Xi,An.layouts=as,An.platforms=Ss,An.Scale=Js,An.Ticks=ae,Object.assign(An,Yn,jo,fo,t,Ss),An.Chart=An,"undefined"!=typeof window&&(window.Chart=An),An})); +//# sourceMappingURL=chart.umd.js.map \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/assets/js/directives/debounce.js b/packages/Webkul/Admin/src/Resources/assets/js/directives/debounce.js new file mode 100644 index 0000000..5961581 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/assets/js/directives/debounce.js @@ -0,0 +1,17 @@ +var timeoutID = null; + +export default { + mounted(el, binding) { + let handler = function (e) { + if (binding.value !== binding.oldValue) { + clearTimeout(timeoutID) + + timeoutID = setTimeout(function () { + el.dispatchEvent(new Event('change')) + }, binding.value || 500) + } + }; + + el.addEventListener('input', handler); + } +} \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/assets/js/directives/dompurify.js b/packages/Webkul/Admin/src/Resources/assets/js/directives/dompurify.js new file mode 100644 index 0000000..e990eba --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/assets/js/directives/dompurify.js @@ -0,0 +1,10 @@ +import DOMPurify from 'dompurify'; + +export default { + beforeMount(el, binding) { + el.innerHTML = DOMPurify.sanitize(binding.value); + }, + updated(el, binding) { + el.innerHTML = DOMPurify.sanitize(binding.value); + } +}; diff --git a/packages/Webkul/Admin/src/Resources/assets/js/directives/tooltip.js b/packages/Webkul/Admin/src/Resources/assets/js/directives/tooltip.js new file mode 100644 index 0000000..e6bf232 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/assets/js/directives/tooltip.js @@ -0,0 +1,143 @@ +export default { + mounted(el, binding) { + initTooltip(el, binding); + }, + updated(el, binding) { + initTooltip(el, binding); + } +}; + +const initTooltip = (el, binding) => { + const defaultOptions = { + placement: 'top', + trigger: 'hover', + html: false, + content: '', + delay: { show: 200, hide: 100 } + }; + + const options = { + ...defaultOptions, + ...(typeof binding.value === 'object' ? binding.value : { content: binding.value }) + }; + + let tooltip = document.getElementById(`tooltip-${el.tooltipId}`); + + if (! tooltip) { + el.tooltipId = Math.random().toString(36).substring(2, 9); + tooltip = document.createElement('div'); + tooltip.id = `tooltip-${el.tooltipId}`; + tooltip.className = 'max-w-[250px] break-words rounded-lg bg-gray-800 px-4 py-3 text-sm leading-snug text-white shadow-lg transition-opacity transition-transform duration-200'; + tooltip.style.display = 'none'; + tooltip.style.position = 'absolute'; + tooltip.style.zIndex = '10000'; + + const inner = document.createElement('div'); + inner.className = 'tooltip-inner'; + + const arrow = document.createElement('div'); + arrow.className = 'absolute h-0 w-0 border-solid'; + + tooltip.appendChild(inner); + tooltip.appendChild(arrow); + document.body.appendChild(tooltip); + + if (options.html) { + inner.innerHTML = options.content; + } else { + inner.textContent = options.content; + } + + el._tooltip = tooltip; + + const showTooltip = () => { + tooltip.style.display = 'block'; + + const rect = el.getBoundingClientRect(); + const tooltipRect = tooltip.getBoundingClientRect(); + + let top, left; + + switch (options.placement) { + case 'top': + top = rect.top - tooltipRect.height - 10; + left = rect.left + (rect.width / 2) - (tooltipRect.width / 2); + arrow.style.top = 'auto'; + arrow.style.bottom = '-5px'; + arrow.style.left = '50%'; + arrow.style.transform = 'translateX(-50%)'; + break; + case 'bottom': + top = rect.bottom + 10; + left = rect.left + (rect.width / 2) - (tooltipRect.width / 2); + arrow.style.bottom = 'auto'; + arrow.style.top = '-5px'; + arrow.style.left = '50%'; + arrow.style.transform = 'translateX(-50%) rotate(180deg)'; + break; + case 'left': + top = rect.top + (rect.height / 2) - (tooltipRect.height / 2); + left = rect.left - tooltipRect.width - 10; + arrow.style.top = '50%'; + arrow.style.left = 'auto'; + arrow.style.right = '-5px'; + arrow.style.transform = 'translateY(-50%) rotate(-90deg)'; + break; + case 'right': + top = rect.top + (rect.height / 2) - (tooltipRect.height / 2); + left = rect.right + 10; + arrow.style.top = '50%'; + arrow.style.right = 'auto'; + arrow.style.left = '-5px'; + arrow.style.transform = 'translateY(-50%) rotate(90deg)'; + break; + } + + if (top < 0) { + top = 0; + } + + if (left < 0) { + left = 0; + } + + if (left + tooltipRect.width > window.innerWidth) { + left = window.innerWidth - tooltipRect.width; + } + + tooltip.style.top = `${top + window.scrollY}px`; + tooltip.style.left = `${left + window.scrollX}px`; + }; + + const hideTooltip = () => { + tooltip.style.display = 'none'; + }; + + if (options.trigger === 'hover') { + el.addEventListener('mouseenter', () => { + el._showTimeout = setTimeout(showTooltip, options.delay.show); + }); + + el.addEventListener('mouseleave', () => { + clearTimeout(el._showTimeout); + el._hideTimeout = setTimeout(hideTooltip, options.delay.hide); + }); + } else if (options.trigger === 'click') { + el.addEventListener('click', showTooltip); + + document.addEventListener('click', (e) => { + if (e.target !== el && !el.contains(e.target)) { + hideTooltip(); + } + }); + } + } else { + const inner = tooltip.querySelector('.tooltip-inner'); + + if (options.html) { + inner.innerHTML = options.content; + } else { + inner.textContent = options.content; + } + } +} diff --git a/packages/Webkul/Admin/src/Resources/assets/js/plugins/admin.js b/packages/Webkul/Admin/src/Resources/assets/js/plugins/admin.js new file mode 100644 index 0000000..6d1aa23 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/assets/js/plugins/admin.js @@ -0,0 +1,148 @@ +export default { + install(app) { + app.config.globalProperties.$admin = { + /** + * Generates a formatted price. + * + * @param {number} price - The price value to be formatted. + * @returns {string} - The formatted price string. + */ + formatPrice: (price) => { + let locale = document.querySelector( + 'meta[http-equiv="content-language"]' + ).content; + + locale = locale.replace(/([a-z]{2})_([A-Z]{2})/g, "$1-$2"); + + const currency = JSON.parse( + document.querySelector('meta[name="currency"]').content + ); + + const symbol = + currency.symbol !== "" ? currency.symbol : currency.code; + + if (!currency.currency_position) { + return new Intl.NumberFormat(locale, { + style: "currency", + currency: currency.code, + }).format(price); + } + + const formatter = new Intl.NumberFormat(locale, { + style: "currency", + currency: currency.code, + minimumFractionDigits: currency.decimal ?? 2, + }); + + const formattedCurrency = formatter + .formatToParts(price) + .map((part) => { + switch (part.type) { + case "currency": + return ""; + + case "group": + return currency.group_separator === "" + ? part.value + : currency.group_separator; + + case "decimal": + return currency.decimal_separator === "" + ? part.value + : currency.decimal_separator; + + default: + return part.value; + } + }) + .join(""); + + switch (currency.currency_position) { + case "left": + return symbol + formattedCurrency; + + case "left_with_space": + return symbol + " " + formattedCurrency; + + case "right": + return formattedCurrency + symbol; + + case "right_with_space": + return formattedCurrency + " " + symbol; + + default: + return formattedCurrency; + } + }, + + /** + * Generates a formatted date based on specified timezone. + * + * @param {string} dateString - The date value to be formatted. + * @param {string} format - The format to be used for formatting the date. + * @param {string} timezone - The timezone to use (e.g., 'America/New_York'). + * @returns {string} - The formatted date string. + */ + formatDate: (dateString, format, timezone) => { + const date = new Date(dateString); + + const options = { timeZone: timezone }; + + const formatter = new Intl.DateTimeFormat("en-US", { + ...options, + hour12: false, + year: "numeric", + month: "numeric", + day: "numeric", + hour: "numeric", + minute: "numeric", + second: "numeric", + }); + + const parts = formatter.formatToParts(date); + const dateParts = {}; + + parts.forEach((part) => { + if (part.type !== "literal") { + dateParts[part.type] = part.value; + } + }); + + const tzDay = parseInt(dateParts.day, 10); + const tzMonth = parseInt(dateParts.month, 10); + const tzYear = parseInt(dateParts.year, 10); + const tzHour = parseInt(dateParts.hour, 10); + const tzMinute = parseInt(dateParts.minute, 10); + + const formatters = { + d: tzDay, + DD: tzDay.toString().padStart(2, "0"), + M: tzMonth, + MM: tzMonth.toString().padStart(2, "0"), + MMM: new Date(tzYear, tzMonth - 1, 1).toLocaleString( + "en-US", + { month: "short" } + ), + MMMM: new Date(tzYear, tzMonth - 1, 1).toLocaleString( + "en-US", + { month: "long" } + ), + yy: tzYear.toString().slice(-2), + yyyy: tzYear, + H: tzHour, + HH: tzHour.toString().padStart(2, "0"), + h: tzHour % 12 || 12, + hh: (tzHour % 12 || 12).toString().padStart(2, "0"), + m: tzMinute, + mm: tzMinute.toString().padStart(2, "0"), + A: tzHour < 12 ? "AM" : "PM", + }; + + return format.replace( + /\b(?:d|DD|M|MM|MMM|MMMM|yy|yyyy|H|HH|h|hh|m|mm|A)\b/g, + (match) => formatters[match] + ); + }, + }; + }, +}; diff --git a/packages/Webkul/Admin/src/Resources/assets/js/plugins/axios.js b/packages/Webkul/Admin/src/Resources/assets/js/plugins/axios.js new file mode 100644 index 0000000..d96e755 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/assets/js/plugins/axios.js @@ -0,0 +1,14 @@ +/** + * We'll load the axios HTTP library which allows us to easily issue requests + * to our Laravel back-end. This library automatically handles sending the + * CSRF token as a header based on the value of the "XSRF" token cookie. + */ +import axios from "axios"; +window.axios = axios; +window.axios.defaults.headers.common["X-Requested-With"] = "XMLHttpRequest"; + +export default { + install(app) { + app.config.globalProperties.$axios = axios; + }, +}; diff --git a/packages/Webkul/Admin/src/Resources/assets/js/plugins/createElement.js b/packages/Webkul/Admin/src/Resources/assets/js/plugins/createElement.js new file mode 100644 index 0000000..714c11e --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/assets/js/plugins/createElement.js @@ -0,0 +1,15 @@ +import { h, resolveComponent } from "vue/dist/vue.esm-bundler"; + +export default { + install(app) { + /** + * Create the virtual dom element + */ + app.config.globalProperties.$h = h; + + /** + * Resolve the component which is globally registered + */ + app.config.globalProperties.$resolveComponent = resolveComponent; + }, +}; diff --git a/packages/Webkul/Admin/src/Resources/assets/js/plugins/draggable.js b/packages/Webkul/Admin/src/Resources/assets/js/plugins/draggable.js new file mode 100644 index 0000000..a8fc1fa --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/assets/js/plugins/draggable.js @@ -0,0 +1,10 @@ +import Draggable from 'vuedraggable'; + +export default { + install: (app) => { + /** + * Global component registration; + */ + app.component("draggable", Draggable); + }, +}; diff --git a/packages/Webkul/Admin/src/Resources/assets/js/plugins/emitter.js b/packages/Webkul/Admin/src/Resources/assets/js/plugins/emitter.js new file mode 100644 index 0000000..eb6a588 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/assets/js/plugins/emitter.js @@ -0,0 +1,11 @@ +import mitt from "mitt"; + +const emitter = mitt(); + +window.emitter = emitter; + +export default { + install: (app, options) => { + app.config.globalProperties.$emitter = emitter; + }, +}; diff --git a/packages/Webkul/Admin/src/Resources/assets/js/plugins/flatpickr.js b/packages/Webkul/Admin/src/Resources/assets/js/plugins/flatpickr.js new file mode 100644 index 0000000..835ec6d --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/assets/js/plugins/flatpickr.js @@ -0,0 +1,56 @@ +import Flatpickr from "flatpickr"; +import "flatpickr/dist/flatpickr.css"; +import { Spanish } from "flatpickr/dist/l10n/es.js"; +import { Arabic } from "flatpickr/dist/l10n/ar.js"; +import { Persian } from "flatpickr/dist/l10n/fa.js"; +import { Turkish } from "flatpickr/dist/l10n/tr.js"; + +export default { + install: (app) => { + window.Flatpickr = Flatpickr; + + const setLocaleFromLang = () => { + const lang = document.documentElement.lang || "en"; + + const localeMap = { + es: Spanish, + ar: Arabic, + fa: Persian, + tr: Turkish + }; + + const locale = localeMap[lang] || null; + + if (locale) { + window.Flatpickr.localize(locale); + } + }; + + setLocaleFromLang(); + + const changeTheme = (theme) => { + document.getElementById('flatpickr')?.remove(); + + if (theme === 'light') { + return; + } + + const linkElement = document.createElement("link"); + + linkElement.rel = "stylesheet"; + linkElement.type = "text/css"; + linkElement.href = `https://npmcdn.com/flatpickr/dist/themes/${theme}.css`; + linkElement.id = 'flatpickr'; + + document.head.appendChild(linkElement); + }; + + const currentTheme = document.documentElement.classList.contains("dark") + ? "dark" + : "light"; + + changeTheme(currentTheme); + + window.emitter.on("change-theme", (theme) => changeTheme(theme)); + }, +}; diff --git a/packages/Webkul/Admin/src/Resources/assets/js/plugins/vee-validate.js b/packages/Webkul/Admin/src/Resources/assets/js/plugins/vee-validate.js new file mode 100644 index 0000000..018bf05 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/assets/js/plugins/vee-validate.js @@ -0,0 +1,194 @@ +/** + * We are defining all the global rules here and configuring + * all the `vee-validate` settings. + */ +import { configure, defineRule, Field, Form, ErrorMessage } from "vee-validate"; +import { localize, setLocale } from "@vee-validate/i18n"; +import ar from "@vee-validate/i18n/dist/locale/ar.json"; +import bn from "@vee-validate/i18n/dist/locale/bn.json"; +import de from "@vee-validate/i18n/dist/locale/de.json"; +import en from "@vee-validate/i18n/dist/locale/en.json"; +import es from "@vee-validate/i18n/dist/locale/es.json"; +import fa from "@vee-validate/i18n/dist/locale/fa.json"; +import fr from "@vee-validate/i18n/dist/locale/fr.json"; +import he from "@vee-validate/i18n/dist/locale/he.json"; +import hi_IN from "../../locales/hi_IN.json"; +import it from "@vee-validate/i18n/dist/locale/it.json"; +import ja from "@vee-validate/i18n/dist/locale/ja.json"; +import nl from "@vee-validate/i18n/dist/locale/nl.json"; +import pl from "@vee-validate/i18n/dist/locale/pl.json"; +import pt_BR from "@vee-validate/i18n/dist/locale/pt_BR.json"; +import ru from "@vee-validate/i18n/dist/locale/ru.json"; +import sin from "../../locales/sin.json"; +import tr from "@vee-validate/i18n/dist/locale/tr.json"; +import uk from "@vee-validate/i18n/dist/locale/uk.json"; +import zh_CN from "@vee-validate/i18n/dist/locale/zh_CN.json"; +import { all } from '@vee-validate/rules'; + +window.defineRule = defineRule; + +export default { + install: (app) => { + /** + * Global components registration; + */ + app.component("VForm", Form); + app.component("VField", Field); + app.component("VErrorMessage", ErrorMessage); + + window.addEventListener("load", () => setLocale(document.documentElement.attributes.lang.value)); + + /** + * Registration of all global validators. + */ + Object.entries(all).forEach(([name, rule]) => defineRule(name, rule)); + + /** + * This regular expression allows phone numbers with the following conditions: + * - The phone number can start with an optional "+" sign. + * - After the "+" sign, there should be one or more digits. + * + * This validation is sufficient for global-level phone number validation. If + * someone wants to customize it, they can override this rule. + */ + defineRule("phone", (value) => { + if (! value || ! value.length) { + return true; + } + + if (! /^\+?\d+$/.test(value)) { + return false; + } + + return true; + }); + + defineRule("address", (value) => { + if (!value || !value.length) { + return true; + } + + if ( + !/^[a-zA-Z0-9\s.\/*'\u0600-\u06FF\u0750-\u077F\u08A0-\u08FF\u0590-\u05FF\u3040-\u309F\u30A0-\u30FF\u0400-\u04FF\u0D80-\u0DFF\u3400-\u4DBF\u2000-\u2A6D\u00C0-\u017F\u0980-\u09FF\u0900-\u097F\u4E00-\u9FFF,\(\)-]{1,60}$/iu.test( + value + ) + ) { + return false; + } + + return true; + }); + + defineRule("postcode", (value) => { + if (! value || ! value.length) { + return true; + } + + if (! /^[a-zA-Z0-9][a-zA-Z0-9\s-]*[a-zA-Z0-9]$/.test(value)) { + return false; + } + + return true; + }); + + defineRule("decimal", (value, { decimals = '*', separator = '.' } = {}) => { + if (value === null || value === undefined || value === '') { + return true; + } + + if (Number(decimals) === 0) { + return /^-?\d*$/.test(value); + } + + const regexPart = decimals === '*' ? '+' : `{1,${decimals}}`; + const regex = new RegExp(`^[-+]?\\d*(\\${separator}\\d${regexPart})?([eE]{1}[-]?\\d+)?$`); + + return regex.test(value); + }); + + defineRule("required_if", (value, { condition = true } = {}) => { + if (condition) { + if (value === null || value === undefined || value === '') { + return false; + } + } + + return true; + }); + + defineRule("", () => true); + + defineRule("date_format", (value) => { + const regex = /^\d{4}-\d{2}-\d{2}$/; + + return regex.test(value); + }); + + defineRule("after", (value) => { + const today = new Date(); + const inputDate = new Date(value); + + today.setHours(0, 0, 0, 0); + inputDate.setHours(0, 0, 0, 0); + + return inputDate >= today; + }); + + configure({ + /** + * Built-in error messages and custom error messages are available. Multiple + * locales can be added in the same way. + */ + generateMessage: localize({ + ar: { + ...ar, + messages: { + ...ar.messages, + phone: "يجب أن يكون هذا {field} رقم هاتف صالحًا", + after: "يجب أن يكون {field} تاريخًا في المستقبل أو اليوم.", + }, + }, + + en: { + ...en, + messages: { + ...en.messages, + phone: "This {field} must be a valid phone number", + after: "The {field} must be a date in the future or today.", + }, + }, + + es: { + ...es, + messages: { + ...es.messages, + phone: "Este {field} debe ser un número de teléfono válido.", + after: "El {field} debe ser una fecha en el futuro o hoy.", + }, + }, + + fa: { + ...fa, + messages: { + ...fa.messages, + phone: "این {field} باید یک شماره تلفن معتبر باشد.", + after: "{field} باید یک تاریخ در آینده یا امروز باشد.", + }, + }, + + tr: { + ...tr, + messages: { + ...tr.messages, + phone: "Bu {field} geçerli bir telefon numarası olmalıdır.", + after: "{field} gelecekte veya bugün olmalıdır.", + }, + }, + }), + + validateOnBlur: true, + validateOnInput: true, + validateOnChange: true, + }); + }, +}; diff --git a/packages/Webkul/Admin/src/Resources/assets/js/plugins/vue-cal.js b/packages/Webkul/Admin/src/Resources/assets/js/plugins/vue-cal.js new file mode 100644 index 0000000..9aa6209 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/assets/js/plugins/vue-cal.js @@ -0,0 +1,16 @@ + +import VueCal from 'vue-cal'; + +import 'vue-cal/dist/vuecal.css'; + +import 'vue-cal/dist/i18n/ar.es.js'; +import 'vue-cal/dist/i18n/en.es.js'; +import 'vue-cal/dist/i18n/es.es.js'; +import 'vue-cal/dist/i18n/fa.es.js'; +import 'vue-cal/dist/i18n/tr.es.js'; +import 'vue-cal/dist/i18n/pt-br.es.js'; +import 'vue-cal/dist/i18n/vi.es.js'; + +export default { + install: (app, options) => app.component('v-vue-cal', VueCal), +}; diff --git a/packages/Webkul/Admin/src/Resources/assets/locales/hi_IN.json b/packages/Webkul/Admin/src/Resources/assets/locales/hi_IN.json new file mode 100644 index 0000000..bb7bb23 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/assets/locales/hi_IN.json @@ -0,0 +1,32 @@ +{ + "code": "hi_IN", + "messages": { + "_default": "यह {field} मान्य नहीं है", + "alpha": "{field} फ़ील्ड में केवल वर्णात्मक अक्षर हो सकते हैं", + "alpha_num": "{field} फ़ील्ड में केवल वर्णात्मक और संख्यात्मक अक्षर हो सकते हैं", + "alpha_dash": "{field} फ़ील्ड में वर्णात्मक और संख्यात्मक अक्षरों के साथ डैश और अंडरस्कोर हो सकते हैं", + "alpha_spaces": "{field} फ़ील्ड में केवल वर्णात्मक अक्षर और अंतर हो सकते हैं", + "between": "{field} फ़ील्ड 0:{min} और 1:{max} के बीच होना चाहिए", + "confirmed": "{field} फ़ील्ड की पुष्टि मेल नहीं खाती", + "digits": "{field} फ़ील्ड संख्यात्मक होनी चाहिए और बिल्कुल 0:{length} अंक होने चाहिए", + "dimensions": "{field} फ़ील्ड 0:{width} पिक्सेल और 1:{height} पिक्सेल होना चाहिए", + "email": "{field} फ़ील्ड में एक मान्य ईमेल होना चाहिए", + "not_one_of": "{field} फ़ील्ड मान्य मूल्य नहीं है", + "ext": "{field} फ़ील्ड में मान्य फ़ाइल नहीं है", + "image": "{field} फ़ील्ड एक छवि होनी चाहिए", + "integer": "{field} फ़ील्ड एक पूर्णांक होना चाहिए", + "length": "{field} फ़ील्ड 0:{length} लंबा होना चाहिए", + "max_value": "{field} फ़ील्ड 0:{max} या उससे कम होना चाहिए", + "max": "{field} फ़ील्ड 0:{length} अक्षरों से अधिक नहीं हो सकता", + "mimes": "{field} फ़ील्ड को मान्य फ़ाइल प्रकार होना चाहिए", + "min_value": "{field} फ़ील्ड 0:{min} या उससे अधिक होना चाहिए", + "min": "{field} फ़ील्ड कम से कम 0:{length} अक्षरों का होना चाहिए", + "numeric": "{field} फ़ील्ड में केवल संख्याएँ हो सकती हैं", + "one_of": "{field} फ़ील्ड मान्य मूल्य नहीं है", + "regex": "{field} फ़ील्ड का प्रारूप अवैध है", + "required_if": "{field} फ़ील्ड आवश्यक है", + "required": "{field} फ़ील्ड आवश्यक है", + "size": "{field} फ़ील्ड का आकार 0:{size}KB से कम होना चाहिए", + "url": "{field} फ़ील्ड में एक मान्य URL नहीं है" + } +} diff --git a/packages/Webkul/Admin/src/Resources/assets/locales/sin.json b/packages/Webkul/Admin/src/Resources/assets/locales/sin.json new file mode 100644 index 0000000..d0f8a85 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/assets/locales/sin.json @@ -0,0 +1,32 @@ +{ + "code": "sin", + "messages": { + "_default": "මේ {field} වල වලංගු නොවේ", + "alpha": "{field} ක්ෂණික සංඛ්‍යාවක් පිළිබඳව සියල්ල සියල්ල සහිතව හැකිය", + "alpha_num": "{field} ක්ෂණික සහ සංඛ්‍යාවක් පිළිබඳව සියල්ල සහිතව හැකිය", + "alpha_dash": "{field} ක්ෂණික සහ සංඛ්‍යාවක් සමග දැහැ හෝ පරිදි ලොව සහිතව හැකිය", + "alpha_spaces": "{field} ක්ෂණික සංඛ්‍යාවක් සහිතව හැකිය, සහ වීඩියෝ හෝම්හෝ සහිතව හැකිය", + "between": "{field} ක්ෂණික 0:{min} සහ 1:{max} අතර විය යුතුය", + "confirmed": "{field} ක්ෂණික තහවුරු නොගත් බව තහවුරු කර නොයාය", + "digits": "{field} ක්ෂණික සෂ්යෝගයක් හා සියලුමේ විය 0:{length} දිගු විය යුතුය", + "dimensions": "{field} ක්ෂණික 0:{width} පික්සල සහ 1:{height} පික්සල විය යුතුය", + "email": "{field} ක්ෂණික වලංගු ඊමේල් එක හෝ යුක්ත විය යුතුය", + "not_one_of": "{field} ක්ෂණික වලංගු අගය නොවේ", + "ext": "{field} ක්ෂණික වලංගු ගොනුව නොවේ", + "image": "{field} ක්ෂණික වලංගු ඡායාරූපය යුතුය", + "integer": "{field} ක්ෂණික වලංගු නික්මෙර වර්ගයේ යුතුය", + "length": "{field} ක්ෂණික වලංගු 0:{length} හෝමාව යුතුය", + "max_value": "{field} ක්ෂණික 0:{max} හෝමා හෝමා හෝමා යුතුය", + "max": "{field} ක්ෂණික 0:{length} අකුරු වලංගු වී නොයාය", + "mimes": "{field} ක්ෂණික ගොනුවේ වලංගු ගොනු වර්ගය හෝ හෝ හෝ යුතුය", + "min_value": "{field} ක්ෂණික 0:{min} හෝමාව හෝමාව හෝමාව හෝමාව හෝමාව යුතුය", + "min": "{field} ක්ෂණික 0:{length} හෝමාවක් හෝමාවක් හෝමාවක් හෝමාවක් යුතුය", + "numeric": "{field} ක්ෂණික වලංගු සංඛ්‍යාවෙන් වයස්ක්‍ර සංඛ්‍යාවෙන් වයස්ක්‍ර විය ෺", + "one_of": "{field} ක්ෂණික වලංගු අගය නොවේ", + "regex": "{field} ක්ෂණික වලංගු ආකාරය අවලංගුය", + "required_if": "{field} ක්ෂණිකයෙන් හෝයි", + "required": "{field} ක්ෂණිකයෙන් හෝයි", + "size": "{field} ක්ෂණික වලංගු විය හැකි ආකාරය 0:{size}KB හෝ හොයා යුතුයි", + "url": "{field} ක්ෂණික වලංගු වර්ගවල URL නොවේ" + } +} \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/lang/ar/app.php b/packages/Webkul/Admin/src/Resources/lang/ar/app.php new file mode 100644 index 0000000..0ca98e8 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/lang/ar/app.php @@ -0,0 +1,2225 @@ + [ + 'leads' => 'العملاء المحتملون', + 'lead' => 'عميل محتمل', + 'quotes' => 'عروض الأسعار', + 'mail' => 'البريد', + 'inbox' => 'الوارد', + 'draft' => 'المسودات', + 'outbox' => 'الصادر', + 'sent' => 'المرسل', + 'trash' => 'المحذوفات', + 'activities' => 'الأنشطة', + 'webhook' => 'Webhook', + 'contacts' => 'جهات الاتصال', + 'persons' => 'الأشخاص', + 'organizations' => 'المنظمات', + 'products' => 'المنتجات', + 'settings' => 'الإعدادات', + 'groups' => 'المجموعات', + 'roles' => 'الأدوار', + 'users' => 'المستخدمون', + 'user' => 'المستخدم', + 'automation' => 'الأتمتة', + 'attributes' => 'السمات', + 'pipelines' => 'قنوات البيع', + 'sources' => 'المصادر', + 'types' => 'الأنواع', + 'email-templates' => 'قوالب البريد الإلكتروني', + 'workflows' => 'سير العمل', + 'other-settings' => 'إعدادات أخرى', + 'tags' => 'الوسوم', + 'configuration' => 'التهيئة', + 'create' => 'إنشاء', + 'edit' => 'تعديل', + 'view' => 'عرض', + 'print' => 'طباعة', + 'delete' => 'حذف', + 'export' => 'تصدير', + 'mass-delete' => 'حذف جماعي', + 'data-transfer' => 'نقل البيانات', + 'imports' => 'الاستيرادات', + 'import' => 'استيراد', + 'event' => 'حدث', + 'campaigns' => 'الحملات', + ], + 'users' => [ + 'activate-warning' => 'حسابك لم يتم تفعيله بعد. يرجى الاتصال بالمسؤول.', + 'login-error' => 'بيانات الاعتماد لا تتطابق مع سجلاتنا.', + 'not-permission' => 'ليس لديك إذن للوصول إلى لوحة الإدارة.', + 'login' => [ + 'email' => 'عنوان البريد الإلكتروني', + 'forget-password-link' => 'نسيت كلمة المرور؟', + 'password' => 'كلمة المرور', + 'submit-btn' => 'تسجيل الدخول', + 'title' => 'تسجيل الدخول', + ], + 'forget-password' => [ + 'create' => [ + 'email' => 'البريد الإلكتروني المسجل', + 'email-not-exist' => 'البريد الإلكتروني غير موجود', + 'page-title' => 'نسيت كلمة المرور', + 'reset-link-sent' => 'تم إرسال رابط إعادة تعيين كلمة المرور', + 'sign-in-link' => 'العودة إلى تسجيل الدخول؟', + 'submit-btn' => 'إعادة تعيين', + 'title' => 'استعادة كلمة المرور', + ], + ], + 'reset-password' => [ + 'back-link-title' => 'العودة إلى تسجيل الدخول؟', + 'confirm-password' => 'تأكيد كلمة المرور', + 'email' => 'البريد الإلكتروني المسجل', + 'password' => 'كلمة المرور', + 'submit-btn' => 'إعادة تعيين كلمة المرور', + 'title' => 'إعادة تعيين كلمة المرور', + ], + ], + 'account' => [ + 'edit' => [ + 'back-btn' => 'رجوع', + 'change-password' => 'تغيير كلمة المرور', + 'confirm-password' => 'تأكيد كلمة المرور', + 'current-password' => 'كلمة المرور الحالية', + 'email' => 'البريد الإلكتروني', + 'general' => 'عام', + 'invalid-password' => 'كلمة المرور الحالية التي أدخلتها غير صحيحة.', + 'name' => 'الاسم', + 'password' => 'كلمة المرور', + 'profile-image' => 'صورة الملف الشخصي', + 'save-btn' => 'حفظ الحساب', + 'title' => 'حسابي', + 'update-success' => 'تم تحديث الحساب بنجاح', + 'upload-image-info' => 'قم بتحميل صورة الملف الشخصي (110px X 110px) بتنسيق PNG أو JPG', + ], + ], + 'components' => [ + 'activities' => [ + 'actions' => [ + 'mail' => [ + 'btn' => 'بريد', + 'title' => 'كتابة بريد', + 'to' => 'إلى', + 'enter-emails' => 'اضغط Enter لإضافة عناوين البريد الإلكتروني', + 'cc' => 'نسخة', + 'bcc' => 'نسخة مخفية', + 'subject' => 'الموضوع', + 'send-btn' => 'إرسال', + 'message' => 'رسالة', + ], + 'file' => [ + 'btn' => 'ملف', + 'title' => 'إضافة ملف', + 'title-control' => 'عنوان', + 'name' => 'اسم', + 'description' => 'وصف', + 'file' => 'ملف', + 'save-btn' => 'حفظ الملف', + ], + 'note' => [ + 'btn' => 'ملاحظة', + 'title' => 'إضافة ملاحظة', + 'comment' => 'تعليق', + 'save-btn' => 'حفظ الملاحظة', + ], + 'activity' => [ + 'btn' => 'نشاط', + 'title' => 'إضافة نشاط', + 'title-control' => 'عنوان', + 'description' => 'وصف', + 'schedule-from' => 'الجدولة من', + 'schedule-to' => 'الجدولة إلى', + 'location' => 'موقع', + 'call' => 'مكالمة', + 'meeting' => 'اجتماع', + 'lunch' => 'غداء', + 'save-btn' => 'حفظ النشاط', + 'participants' => [ + 'title' => 'المشاركون', + 'placeholder' => 'اكتب للبحث عن المشاركين', + 'users' => 'المستخدمون', + 'persons' => 'الأشخاص', + 'no-results' => 'لم يتم العثور على نتائج...', + ], + ], + ], + 'index' => [ + 'all' => 'الكل', + 'bcc' => 'نسخة مخفية', + 'by-user' => 'بواسطة :user', + 'calls' => 'المكالمات', + 'cc' => 'نسخة', + 'change-log' => 'سجلات التغيير', + 'delete' => 'حذف', + 'edit' => 'تعديل', + 'emails' => 'البريد الإلكتروني', + 'empty' => 'فارغ', + 'files' => 'الملفات', + 'from' => 'من', + 'location' => 'موقع', + 'lunches' => 'الغداء', + 'mark-as-done' => 'وضع علامة تم', + 'meetings' => 'الاجتماعات', + 'notes' => 'الملاحظات', + 'participants' => 'المشاركون', + 'planned' => 'مخطط له', + 'quotes' => 'الاقتباسات', + 'scheduled-on' => 'مجدول في', + 'system' => 'النظام', + 'to' => 'إلى', + 'unlink' => 'إلغاء الارتباط', + 'view' => 'عرض', + 'empty-placeholders' => [ + 'all' => [ + 'title' => 'لم يتم العثور على أي أنشطة', + 'description' => 'لم يتم العثور على أي أنشطة لهذا العنصر. يمكنك إضافة الأنشطة من خلال النقر على زر "النشاط" في اللوحة الجانبية اليسرى.', + ], + 'planned' => [ + 'title' => 'لم يتم العثور على أنشطة مخططة', + 'description' => 'لم يتم العثور على أنشطة مخططة لهذا العنصر. يمكنك إضافة أنشطة مخططة من خلال النقر على زر "النشاط" في اللوحة الجانبية اليسرى.', + ], + 'notes' => [ + 'title' => 'لم يتم العثور على ملاحظات', + 'description' => 'لم يتم العثور على ملاحظات لهذا العنصر. يمكنك إضافة الملاحظات من خلال النقر على زر "الملاحظة" في اللوحة الجانبية اليسرى.', + ], + 'calls' => [ + 'title' => 'لم يتم العثور على مكالمات', + 'description' => 'لم يتم العثور على مكالمات لهذا العنصر. يمكنك إضافة المكالمات من خلال النقر على زر "النشاط" في اللوحة الجانبية اليسرى واختيار نوع المكالمة.', + ], + 'meetings' => [ + 'title' => 'لم يتم العثور على اجتماعات', + 'description' => 'لم يتم العثور على اجتماعات لهذا العنصر. يمكنك إضافة الاجتماعات من خلال النقر على زر "النشاط" في اللوحة الجانبية اليسرى واختيار نوع الاجتماع.', + ], + 'lunches' => [ + 'title' => 'لم يتم العثور على غداءات', + 'description' => 'لم يتم العثور على غداءات لهذا العنصر. يمكنك إضافة الغداءات من خلال النقر على زر "النشاط" في اللوحة الجانبية اليسرى واختيار نوع الغداء.', + ], + 'files' => [ + 'title' => 'لم يتم العثور على ملفات', + 'description' => 'لم يتم العثور على ملفات لهذا العنصر. يمكنك إضافة الملفات من خلال النقر على زر "الملف" في اللوحة الجانبية اليسرى.', + ], + 'emails' => [ + 'title' => 'لم يتم العثور على رسائل بريد إلكتروني', + 'description' => 'لم يتم العثور على رسائل بريد إلكتروني لهذا العنصر. يمكنك إضافة الرسائل من خلال النقر على زر "البريد" في اللوحة الجانبية اليسرى.', + ], + 'system' => [ + 'title' => 'لم يتم العثور على سجلات التغيير', + 'description' => 'لم يتم العثور على سجلات التغيير لهذا العنصر.', + ], + ], + ], + ], + 'media' => [ + 'images' => [ + 'add-image-btn' => 'إضافة صورة', + 'ai-add-image-btn' => 'الذكاء الاصطناعي السحري', + 'allowed-types' => 'png, jpeg, jpg', + 'not-allowed-error' => 'فقط ملفات الصور (.jpeg, .jpg, .png) مسموح بها.', + 'placeholders' => [ + 'front' => 'الأمام', + 'next' => 'التالي', + 'size' => 'الحجم', + 'use-cases' => 'حالات الاستخدام', + 'zoom' => 'تكبير', + ], + ], + 'videos' => [ + 'add-video-btn' => 'إضافة فيديو', + 'allowed-types' => 'mp4, webm, mkv', + 'not-allowed-error' => 'فقط ملفات الفيديو (.mp4, .mov, .ogg) مسموح بها.', + ], + ], + 'datagrid' => [ + 'index' => [ + 'no-records-selected' => 'لم يتم اختيار أي سجلات.', + 'must-select-a-mass-action-option' => 'يجب أن تختار خيارًا للإجراء الجماعي.', + 'must-select-a-mass-action' => 'يجب أن تختار إجراءً جماعيًا.', + ], + 'toolbar' => [ + 'length-of' => ':length من', + 'of' => 'من', + 'per-page' => 'لكل صفحة', + 'results' => ':total نتائج', + 'delete' => 'حذف', + 'selected' => ':total عناصر مختارة', + 'mass-actions' => [ + 'submit' => 'إرسال', + 'select-option' => 'اختر خيارًا', + 'select-action' => 'اختر إجراءً', + ], + 'filter' => [ + 'apply-filters-btn' => 'تطبيق الفلاتر', + 'back-btn' => 'رجوع', + 'create-new-filter' => 'إنشاء فلتر جديد', + 'custom-filters' => 'فلاتر مخصصة', + 'delete-error' => 'حدث خطأ أثناء حذف الفلتر، يرجى المحاولة مرة أخرى.', + 'delete-success' => 'تم حذف الفلتر بنجاح.', + 'empty-description' => 'لا توجد فلاتر محددة للحفظ. يرجى اختيار الفلاتر للحفظ.', + 'empty-title' => 'أضف فلاتر للحفظ', + 'name' => 'الاسم', + 'quick-filters' => 'الفلاتر السريعة', + 'save-btn' => 'حفظ', + 'save-filter' => 'حفظ الفلتر', + 'saved-success' => 'تم حفظ الفلتر بنجاح.', + 'selected-filters' => 'الفلاتر المحددة', + 'title' => 'فلتر', + 'update' => 'تحديث', + 'update-filter' => 'تحديث الفلتر', + 'updated-success' => 'تم تحديث الفلتر بنجاح.', + ], + 'search' => [ + 'title' => 'بحث', + ], + ], + 'filters' => [ + 'select' => 'اختر', + 'title' => 'فلاتر', + 'dropdown' => [ + 'searchable' => [ + 'at-least-two-chars' => 'اكتب حرفين على الأقل...', + 'no-results' => 'لم يتم العثور على نتائج...', + ], + ], + 'custom-filters' => [ + 'clear-all' => 'مسح الكل', + 'title' => 'فلاتر مخصصة', + ], + 'boolean-options' => [ + 'false' => 'خاطئ', + 'true' => 'صحيح', + ], + 'date-options' => [ + 'last-month' => 'الشهر الماضي', + 'last-six-months' => 'آخر 6 أشهر', + 'last-three-months' => 'آخر 3 أشهر', + 'this-month' => 'هذا الشهر', + 'this-week' => 'هذا الأسبوع', + 'this-year' => 'هذا العام', + 'today' => 'اليوم', + 'yesterday' => 'الأمس', + ], + ], + 'table' => [ + 'actions' => 'الإجراءات', + 'no-records-available' => 'لا توجد سجلات متاحة.', + ], + ], + 'modal' => [ + 'confirm' => [ + 'agree-btn' => 'موافق', + 'disagree-btn' => 'غير موافق', + 'message' => 'هل أنت متأكد أنك تريد تنفيذ هذا الإجراء؟', + 'title' => 'هل أنت متأكد؟', + ], + ], + 'tags' => [ + 'index' => [ + 'title' => 'الوسوم', + 'added-tags' => 'الوسوم المضافة', + 'save-btn' => 'حفظ الوسم', + 'placeholder' => 'اكتب للبحث عن الوسوم', + 'add-tag' => 'إضافة ":term"...', + 'aquarelle-red' => 'أحمر مائي', + 'crushed-cashew' => 'كاجو مطحون', + 'beeswax' => 'شمع العسل', + 'lemon-chiffon' => 'شيفون الليمون', + 'snow-flurry' => 'زوبعة ثلجية', + 'honeydew' => 'شمام', + ], + ], + 'layouts' => [ + 'powered-by' => [ + 'description' => 'Powered by :krayin, an open-source project by :webkul.', + ], + 'header' => [ + 'mega-search' => [ + 'title' => 'البحث الشامل', + 'tabs' => [ + 'leads' => 'العملاء المحتملين', + 'quotes' => 'عروض الأسعار', + 'persons' => 'الأشخاص', + 'products' => 'المنتجات', + ], + 'explore-all-products' => 'استكشاف جميع المنتجات', + 'explore-all-leads' => 'استكشاف جميع العملاء المحتملين', + 'explore-all-contacts' => 'استكشاف جميع جهات الاتصال', + 'explore-all-quotes' => 'استكشاف جميع عروض الأسعار', + 'explore-all-matching-products' => 'استكشاف جميع المنتجات المطابقة لـ ":query" (:count)', + 'explore-all-matching-leads' => 'استكشاف جميع العملاء المحتملين المطابقين لـ ":query" (:count)', + 'explore-all-matching-contacts' => 'استكشاف جميع جهات الاتصال المطابقة لـ ":query" (:count)', + 'explore-all-matching-quotes' => 'استكشاف جميع عروض الأسعار المطابقة لـ ":query" (:count)', + ], + ], + ], + 'attributes' => [ + 'edit' => [ + 'delete' => 'حذف', + ], + 'lookup' => [ + 'click-to-add' => 'انقر للإضافة', + 'search' => 'بحث...', + 'no-result-found' => 'لم يتم العثور على نتائج', + ], + ], + 'lookup' => [ + 'click-to-add' => 'انقر للإضافة', + 'no-results' => 'لم يتم العثور على نتائج', + 'add-as-new' => 'إضافة كجديد', + 'search' => 'بحث...', + ], + 'flash-group' => [ + 'success' => 'نجاح', + 'error' => 'خطأ', + 'warning' => 'تحذير', + 'info' => 'معلومات', + ], + 'tiny-mce' => [ + 'http-error' => 'خطأ في HTTP', + 'invalid-json' => 'استجابة JSON غير صالحة من الخادم.', + 'upload-failed' => 'فشل تحميل الملف. يرجى المحاولة مرة أخرى.', + ], + ], + 'quotes' => [ + 'index' => [ + 'title' => 'عروض الأسعار', + 'create-btn' => 'إنشاء عرض سعر', + 'create-success' => 'تم إنشاء عرض السعر بنجاح.', + 'update-success' => 'تم تحديث عرض السعر بنجاح.', + 'delete-success' => 'تم حذف عرض السعر بنجاح.', + 'delete-failed' => 'لا يمكن حذف عرض السعر.', + 'datagrid' => [ + 'subject' => 'الموضوع', + 'sales-person' => 'مندوب المبيعات', + 'expired-at' => 'تاريخ الانتهاء', + 'created-at' => 'تاريخ الإنشاء', + 'person' => 'الشخص', + 'subtotal' => 'المجموع الفرعي', + 'discount' => 'الخصم', + 'tax' => 'الضريبة', + 'adjustment' => 'التعديل', + 'grand-total' => 'المجموع الكلي', + 'edit' => 'تعديل', + 'delete' => 'حذف', + 'print' => 'طباعة', + ], + 'pdf' => [ + 'adjustment' => 'التعديل', + 'amount' => 'المبلغ', + 'billing-address' => 'عنوان الفوترة', + 'date' => 'التاريخ', + 'discount' => 'الخصم', + 'expired-at' => 'تاريخ الانتهاء', + 'grand-total' => 'المجموع الكلي', + 'person' => 'Person', + 'price' => 'السعر', + 'product-name' => 'اسم المنتج', + 'quantity' => 'الكمية', + 'quote-id' => 'رقم عرض السعر', + 'sales-person' => 'مندوب المبيعات', + 'shipping-address' => 'عنوان الشحن', + 'sku' => 'رمز المنتج', + 'sub-total' => 'المجموع الفرعي', + 'subject' => 'Subject', + 'tax' => 'الضريبة', + 'title' => 'عرض السعر', + ], + ], + 'create' => [ + 'title' => 'إنشاء عرض سعر', + 'save-btn' => 'حفظ عرض السعر', + 'quote-info' => 'معلومات عرض السعر', + 'quote-info-info' => 'أدخل المعلومات الأساسية لعرض السعر.', + 'address-info' => 'معلومات العنوان', + 'address-info-info' => 'معلومات عن العنوان المتعلق بعرض السعر.', + 'quote-items' => 'بنود عرض السعر', + 'search-products' => 'البحث عن المنتجات', + 'link-to-lead' => 'ربط بالعميل المحتمل', + 'quote-item-info' => 'أضف طلب المنتج لهذا العرض.', + 'quote-name' => 'اسم عرض السعر', + 'quantity' => 'الكمية', + 'price' => 'السعر', + 'discount' => 'الخصم', + 'tax' => 'الضريبة', + 'total' => 'المجموع', + 'amount' => 'المبلغ', + 'add-item' => '+ إضافة بند', + 'sub-total' => 'المجموع الفرعي (:symbol)', + 'total-discount' => 'الخصم (:symbol)', + 'total-tax' => 'الضريبة (:symbol)', + 'total-adjustment' => 'التعديل (:symbol)', + 'grand-total' => 'المجموع الكلي (:symbol)', + 'discount-amount' => 'مبلغ الخصم', + 'tax-amount' => 'مبلغ الضريبة', + 'adjustment-amount' => 'مبلغ التعديل', + 'product-name' => 'اسم المنتج', + 'action' => 'الإجراء', + ], + 'edit' => [ + 'title' => 'تعديل عرض السعر', + 'save-btn' => 'حفظ عرض السعر', + 'quote-info' => 'معلومات عرض السعر', + 'quote-info-info' => 'أدخل المعلومات الأساسية لعرض السعر.', + 'address-info' => 'معلومات العنوان', + 'address-info-info' => 'معلومات عن العنوان المتعلق بعرض السعر.', + 'quote-items' => 'بنود عرض السعر', + 'link-to-lead' => 'ربط بالعميل المحتمل', + 'quote-item-info' => 'أضف طلب المنتج لهذا العرض.', + 'quote-name' => 'اسم عرض السعر', + 'quantity' => 'الكمية', + 'price' => 'السعر', + 'search-products' => 'البحث عن المنتجات', + 'discount' => 'الخصم', + 'tax' => 'الضريبة', + 'total' => 'المجموع', + 'amount' => 'المبلغ', + 'add-item' => '+ إضافة بند', + 'sub-total' => 'المجموع الفرعي (:symbol)', + 'total-discount' => 'الخصم (:symbol)', + 'total-tax' => 'الضريبة (:symbol)', + 'total-adjustment' => 'التعديل (:symbol)', + 'grand-total' => 'المجموع الكلي (:symbol)', + 'discount-amount' => 'مبلغ الخصم', + 'tax-amount' => 'مبلغ الضريبة', + 'adjustment-amount' => 'مبلغ التعديل', + 'product-name' => 'اسم المنتج', + 'action' => 'الإجراء', + ], + ], + 'contacts' => [ + 'persons' => [ + 'index' => [ + 'title' => 'الأشخاص', + 'create-btn' => 'إنشاء شخص', + 'create-success' => 'تم إنشاء الشخص بنجاح.', + 'update-success' => 'تم تحديث الشخص بنجاح.', + 'all-delete-success' => 'تم حذف جميع الأشخاص المحددين بنجاح.', + 'partial-delete-warning' => 'تم حذف بعض الأشخاص بنجاح. لم يتم حذف الآخرين لأنهم مرتبطون بعملاء محتملين.', + 'none-delete-warning' => 'لم يتم حذف أي من الأشخاص المحددين لأنهم مرتبطون بعملاء محتملين.', + 'no-selection' => 'لم يتم تحديد أي أشخاص للحذف.', + 'delete-failed' => 'فشل في حذف الأشخاص المحددين.', + 'datagrid' => [ + 'contact-numbers' => 'أرقام الاتصال', + 'delete' => 'حذف', + 'edit' => 'تعديل', + 'emails' => 'البريد الإلكتروني', + 'id' => 'المعرف', + 'view' => 'عرض', + 'name' => 'الاسم', + 'organization-name' => 'اسم المؤسسة', + ], + ], + 'view' => [ + 'title' => ':name', + 'about-person' => 'عن الشخص', + 'about-organization' => 'حول المؤسسة', + 'activities' => [ + 'index' => [ + 'all' => 'الكل', + 'calls' => 'المكالمات', + 'meetings' => 'الاجتماعات', + 'lunches' => 'الغداء', + 'files' => 'الملفات', + 'quotes' => 'عروض الأسعار', + 'notes' => 'الملاحظات', + 'emails' => 'رسائل البريد الإلكتروني', + 'by-user' => 'بواسطة :user', + 'scheduled-on' => 'مجدول في', + 'location' => 'الموقع', + 'participants' => 'المشاركون', + 'mark-as-done' => 'وضع علامة كمنتهي', + 'delete' => 'حذف', + 'edit' => 'تعديل', + ], + 'actions' => [ + 'mail' => [ + 'btn' => 'بريد', + 'title' => 'إنشاء بريد', + 'to' => 'إلى', + 'cc' => 'نسخة', + 'bcc' => 'نسخة مخفية', + 'subject' => 'الموضوع', + 'send-btn' => 'إرسال', + 'message' => 'الرسالة', + ], + 'file' => [ + 'btn' => 'ملف', + 'title' => 'إضافة ملف', + 'title-control' => 'العنوان', + 'name' => 'اسم الملف', + 'description' => 'الوصف', + 'file' => 'الملف', + 'save-btn' => 'حفظ الملف', + ], + 'note' => [ + 'btn' => 'ملاحظة', + 'title' => 'إضافة ملاحظة', + 'comment' => 'التعليق', + 'save-btn' => 'حفظ الملاحظة', + ], + 'activity' => [ + 'btn' => 'نشاط', + 'title' => 'إضافة نشاط', + 'title-control' => 'العنوان', + 'description' => 'الوصف', + 'schedule-from' => 'مجدول من', + 'schedule-to' => 'مجدول إلى', + 'location' => 'الموقع', + 'call' => 'مكالمة', + 'meeting' => 'اجتماع', + 'lunch' => 'غداء', + 'save-btn' => 'حفظ النشاط', + ], + ], + ], + 'tags' => [ + 'create-success' => 'تم إنشاء الوسم بنجاح.', + 'destroy-success' => 'تم حذف الوسم بنجاح.', + ], + ], + 'create' => [ + 'title' => 'إنشاء شخص', + 'save-btn' => 'حفظ الشخص', + ], + 'edit' => [ + 'title' => 'تعديل الشخص', + 'save-btn' => 'حفظ الشخص', + ], + ], + 'organizations' => [ + 'index' => [ + 'title' => 'المؤسسات', + 'create-btn' => 'إنشاء مؤسسة', + 'create-success' => 'تم إنشاء المؤسسة بنجاح.', + 'update-success' => 'تم تحديث المؤسسة بنجاح.', + 'delete-success' => 'تم حذف المؤسسة بنجاح.', + 'delete-failed' => 'لا يمكن حذف المؤسسة.', + 'datagrid' => [ + 'delete' => 'حذف', + 'edit' => 'تعديل', + 'id' => 'المعرف', + 'name' => 'الاسم', + 'persons-count' => 'عدد الأشخاص', + ], + ], + 'create' => [ + 'title' => 'إنشاء مؤسسة', + 'save-btn' => 'حفظ المؤسسة', + ], + 'edit' => [ + 'title' => 'تعديل المؤسسة', + 'save-btn' => 'حفظ المؤسسة', + ], + ], + ], + 'products' => [ + 'index' => [ + 'title' => 'المنتجات', + 'create-btn' => 'إنشاء منتج', + 'create-success' => 'تم إنشاء المنتج بنجاح.', + 'update-success' => 'تم تحديث المنتج بنجاح.', + 'delete-success' => 'تم حذف المنتج بنجاح.', + 'delete-failed' => 'لا يمكن حذف المنتج.', + 'datagrid' => [ + 'allocated' => 'مخصص', + 'delete' => 'حذف', + 'edit' => 'تعديل', + 'id' => 'المعرف', + 'in-stock' => 'في المخزون', + 'name' => 'الاسم', + 'on-hand' => 'متوفر', + 'tag-name' => 'اسم الوسم', + 'price' => 'السعر', + 'sku' => 'رمز المنتج', + 'view' => 'عرض', + ], + ], + 'create' => [ + 'save-btn' => 'حفظ المنتجات', + 'title' => 'إنشاء منتجات', + 'general' => 'عام', + 'price' => 'السعر', + ], + 'edit' => [ + 'title' => 'تعديل المنتجات', + 'save-btn' => 'حفظ المنتجات', + 'general' => 'عام', + 'price' => 'السعر', + ], + 'view' => [ + 'sku' => 'رمز المنتج', + 'all' => 'الكل', + 'notes' => 'الملاحظات', + 'files' => 'الملفات', + 'inventories' => 'المخزون', + 'change-logs' => 'سجلات التغيير', + 'attributes' => [ + 'about-product' => 'عن المنتج', + ], + 'inventory' => [ + 'source' => 'المصدر', + 'in-stock' => 'في المخزون', + 'allocated' => 'مخصص', + 'on-hand' => 'متوفر', + 'actions' => 'الإجراءات', + 'assign' => 'تعيين', + 'add-source' => 'إضافة مصدر', + 'location' => 'الموقع', + 'add-more' => 'إضافة المزيد', + 'save' => 'حفظ', + ], + ], + ], + 'settings' => [ + 'title' => 'الإعدادات', + 'groups' => [ + 'index' => [ + 'create-btn' => 'إنشاء مجموعة', + 'title' => 'المجموعات', + 'create-success' => 'تم إنشاء المجموعة بنجاح.', + 'update-success' => 'تم تحديث المجموعة بنجاح.', + 'destroy-success' => 'تم حذف المجموعة بنجاح.', + 'delete-failed' => 'لا يمكن حذف المجموعة.', + 'delete-failed-associated-users' => 'لا يمكن حذف المجموعة لأنها مستخدمة من قبل المستخدمين.', + 'datagrid' => [ + 'delete' => 'حذف', + 'description' => 'الوصف', + 'edit' => 'تعديل', + 'id' => 'المعرف', + 'name' => 'الاسم', + ], + 'edit' => [ + 'title' => 'تعديل المجموعة', + ], + 'create' => [ + 'name' => 'الاسم', + 'title' => 'إنشاء مجموعة', + 'description' => 'الوصف', + 'save-btn' => 'حفظ المجموعة', + ], + ], + ], + 'roles' => [ + 'index' => [ + 'being-used' => 'لا يمكن حذف الدور، حيث أنه قيد الاستخدام في مستخدم الإدارة.', + 'create-btn' => 'إنشاء الأدوار', + 'create-success' => 'تم إنشاء الدور بنجاح.', + 'current-role-delete-error' => 'لا يمكن حذف الدور المخصص للمستخدم الحالي.', + 'delete-failed' => 'لا يمكن حذف الدور.', + 'delete-success' => 'تم حذف الدور بنجاح.', + 'last-delete-error' => 'مطلوب دور واحد على الأقل.', + 'settings' => 'الإعدادات', + 'title' => 'الأدوار', + 'update-success' => 'تم تحديث الدور بنجاح.', + 'user-define-error' => 'لا يمكن حذف دور النظام.', + 'datagrid' => [ + 'all' => 'الكل', + 'custom' => 'مخصص', + 'delete' => 'حذف', + 'description' => 'الوصف', + 'edit' => 'تعديل', + 'id' => 'المعرف', + 'name' => 'الاسم', + 'permission-type' => 'نوع الإذن', + ], + ], + 'create' => [ + 'access-control' => 'التحكم في الوصول', + 'all' => 'الكل', + 'back-btn' => 'رجوع', + 'custom' => 'مخصص', + 'description' => 'الوصف', + 'general' => 'عام', + 'name' => 'الاسم', + 'permissions' => 'الأذونات', + 'save-btn' => 'حفظ الدور', + 'title' => 'إنشاء دور', + ], + 'edit' => [ + 'access-control' => 'التحكم في الوصول', + 'all' => 'الكل', + 'back-btn' => 'رجوع', + 'custom' => 'مخصص', + 'description' => 'الوصف', + 'general' => 'عام', + 'name' => 'الاسم', + 'permissions' => 'الأذونات', + 'save-btn' => 'حفظ الدور', + 'title' => 'تعديل الدور', + ], + ], + 'types' => [ + 'index' => [ + 'create-btn' => 'إنشاء نوع', + 'create-success' => 'تم إنشاء النوع بنجاح.', + 'delete-failed' => 'لا يمكن حذف النوع.', + 'delete-success' => 'تم حذف النوع بنجاح.', + 'title' => 'الأنواع', + 'update-success' => 'تم تحديث النوع بنجاح.', + 'datagrid' => [ + 'delete' => 'حذف', + 'description' => 'الوصف', + 'edit' => 'تعديل', + 'id' => 'المعرف', + 'name' => 'الاسم', + ], + 'create' => [ + 'name' => 'الاسم', + 'save-btn' => 'حفظ النوع', + 'title' => 'إنشاء نوع', + ], + 'edit' => [ + 'title' => 'تعديل النوع', + ], + ], + ], + 'sources' => [ + 'index' => [ + 'title' => 'المصادر', + 'create-btn' => 'إنشاء مصدر', + 'create-success' => 'تم إنشاء المصدر بنجاح.', + 'delete-failed' => 'لا يمكن حذف المصدر.', + 'delete-success' => 'تم حذف المصدر بنجاح.', + 'update-success' => 'تم تحديث المصدر بنجاح.', + 'delete-failed-associated-leads' => 'لا يمكن حذف المصدر لأنه مرتبط بعملاء محتملين موجودين. يرجى فصل أو تحديث هؤلاء العملاء قبل الحذف.', + 'datagrid' => [ + 'delete' => 'حذف', + 'edit' => 'تعديل', + 'id' => 'المعرف', + 'name' => 'الاسم', + ], + 'create' => [ + 'name' => 'اسم', + 'save-btn' => 'حفظ المصدر', + 'title' => 'إنشاء مصدر', + ], + 'edit' => [ + 'title' => 'تعديل المصدر', + ], + ], + ], + 'workflows' => [ + 'index' => [ + 'title' => 'سير العمل', + 'create-btn' => 'إنشاء سير عمل', + 'create-success' => 'تم إنشاء سير العمل بنجاح.', + 'update-success' => 'تم تحديث سير العمل بنجاح.', + 'delete-success' => 'تم حذف سير العمل بنجاح.', + 'delete-failed' => 'لا يمكن حذف سير العمل.', + 'datagrid' => [ + 'delete' => 'حذف', + 'description' => 'الوصف', + 'edit' => 'تعديل', + 'id' => 'المعرف', + 'name' => 'الاسم', + ], + ], + 'helpers' => [ + 'update-related-leads' => 'تحديث العملاء المحتملين ذوي الصلة', + 'send-email-to-sales-owner' => 'إرسال بريد إلكتروني إلى مسؤول المبيعات', + 'send-email-to-participants' => 'إرسال بريد إلكتروني إلى المشاركين', + 'add-webhook' => 'إضافة Webhook', + 'update-lead' => 'تحديث العميل المحتمل', + 'update-person' => 'تحديث الشخص', + 'send-email-to-person' => 'إرسال بريد إلكتروني إلى الشخص', + 'add-tag' => 'إضافة علامة', + 'add-note-as-activity' => 'إضافة ملاحظة كنشاط', + 'update-quote' => 'تحديث العرض', + ], + 'create' => [ + 'title' => 'إنشاء سير عمل', + 'event' => 'الحدث', + 'back-btn' => 'رجوع', + 'save-btn' => 'حفظ سير العمل', + 'name' => 'الاسم', + 'basic-details' => 'التفاصيل الأساسية', + 'description' => 'الوصف', + 'actions' => 'الإجراءات', + 'basic-details-info' => 'ضع المعلومات الأساسية لسير العمل.', + 'event-info' => 'يقوم الحدث بتشغيل والتحقق من الشروط وتنفيذ الإجراءات المحددة مسبقًا.', + 'conditions' => 'الشروط', + 'conditions-info' => 'الشروط هي قواعد تتحقق من السيناريوهات، ويتم تشغيلها في مناسبات محددة.', + 'actions-info' => 'الإجراء لا يقلل فقط من عبء العمل ولكنه يجعل أتمتة CRM أسهل بكثير', + 'value' => 'القيمة', + 'condition-type' => 'نوع الشرط', + 'all-condition-are-true' => 'جميع الشروط صحيحة', + 'any-condition-are-true' => 'أي شرط صحيح', + 'add-condition' => 'إضافة شرط', + 'add-action' => 'إضافة إجراء', + 'yes' => 'نعم', + 'no' => 'لا', + 'email' => 'البريد الإلكتروني', + 'is-equal-to' => 'يساوي', + 'is-not-equal-to' => 'لا يساوي', + 'equals-or-greater-than' => 'يساوي أو أكبر من', + 'equals-or-less-than' => 'يساوي أو أقل من', + 'greater-than' => 'أكبر من', + 'less-than' => 'أقل من', + 'type' => 'النوع', + 'contain' => 'يحتوي', + 'contains' => 'يحتوي', + 'does-not-contain' => 'لا يحتوي', + ], + 'edit' => [ + 'title' => 'تعديل سير العمل', + 'event' => 'الحدث', + 'back-btn' => 'رجوع', + 'save-btn' => 'حفظ سير العمل', + 'name' => 'الاسم', + 'basic-details' => 'التفاصيل الأساسية', + 'description' => 'الوصف', + 'actions' => 'الإجراءات', + 'type' => 'النوع', + 'basic-details-info' => 'ضع المعلومات الأساسية لسير العمل.', + 'event-info' => 'يقوم الحدث بتشغيل والتحقق من الشروط وتنفيذ الإجراءات المحددة مسبقًا.', + 'conditions' => 'الشروط', + 'conditions-info' => 'الشروط هي قواعد تتحقق من السيناريوهات، ويتم تشغيلها في مناسبات محددة.', + 'actions-info' => 'الإجراء لا يقلل فقط من عبء العمل ولكنه يجعل أتمتة CRM أسهل بكثير', + 'value' => 'القيمة', + 'condition-type' => 'نوع الشرط', + 'all-condition-are-true' => 'جميع الشروط صحيحة', + 'any-condition-are-true' => 'أي شرط صحيح', + 'add-condition' => 'إضافة شرط', + 'add-action' => 'إضافة إجراء', + 'yes' => 'نعم', + 'no' => 'لا', + 'email' => 'البريد الإلكتروني', + 'is-equal-to' => 'يساوي', + 'is-not-equal-to' => 'لا يساوي', + 'equals-or-greater-than' => 'يساوي أو أكبر من', + 'equals-or-less-than' => 'يساوي أو أقل من', + 'greater-than' => 'أكبر من', + 'less-than' => 'أقل من', + 'contain' => 'يحتوي', + 'contains' => 'يحتوي', + 'does-not-contain' => 'لا يحتوي', + ], + ], + 'webforms' => [ + 'index' => [ + 'title' => 'نماذج الويب', + 'create-btn' => 'إنشاء نموذج ويب', + 'create-success' => 'تم إنشاء نموذج الويب بنجاح.', + 'update-success' => 'تم تحديث نموذج الويب بنجاح.', + 'delete-success' => 'تم حذف نموذج الويب بنجاح.', + 'delete-failed' => 'لا يمكن حذف نموذج الويب.', + 'datagrid' => [ + 'id' => 'المعرف', + 'title' => 'العنوان', + 'edit' => 'تعديل', + 'delete' => 'حذف', + ], + ], + 'create' => [ + 'title' => 'إنشاء استمارة ويب', + 'add-attribute-btn' => 'زر إضافة سمة', + 'attribute-label-color' => 'لون تسمية السمة', + 'attributes' => 'السمات', + 'attributes-info' => 'أضف سمات مخصصة إلى النموذج.', + 'background-color' => 'لون الخلفية', + 'create-lead' => 'إنشاء عميل محتمل', + 'customize-webform' => 'تخصيص نموذج الويب', + 'customize-webform-info' => 'خصص نموذج الويب الخاص بك بألوان العناصر التي تختارها.', + 'description' => 'الوصف', + 'display-custom-message' => 'عرض رسالة مخصصة', + 'form-background-color' => 'لون خلفية النموذج', + 'form-submit-btn-color' => 'لون زر إرسال النموذج', + 'form-submit-button-color' => 'لون زر إرسال النموذج', + 'form-title-color' => 'لون عنوان النموذج', + 'general' => 'عام', + 'leads' => 'العملاء المحتملون', + 'person' => 'شخص', + 'save-btn' => 'حفظ نموذج الويب', + 'submit-button-label' => 'تسمية زر الإرسال', + 'submit-success-action' => 'إجراء نجاح الإرسال', + 'redirect-to-url' => 'إعادة التوجيه إلى الرابط', + 'choose-value' => 'اختر قيمة', + 'select-file' => 'اختر ملف', + 'select-image' => 'اختر صورة', + 'enter-value' => 'أدخل القيمة', + ], + 'edit' => [ + 'add-attribute-btn' => 'زر إضافة سمة', + 'attribute-label-color' => 'لون تسمية السمة', + 'attributes' => 'السمات', + 'attributes-info' => 'أضف سمات مخصصة إلى النموذج.', + 'background-color' => 'لون الخلفية', + 'choose-value' => 'اختر القيمة', + 'code-snippet' => 'مقتطف الكود', + 'copied' => 'تم النسخ', + 'copy' => 'نسخ', + 'create-lead' => 'إنشاء عميل محتمل', + 'customize-webform' => 'تخصيص نموذج الويب', + 'customize-webform-info' => 'خصص نموذج الويب الخاص بك بألوان العناصر التي تختارها.', + 'description' => 'الوصف', + 'display-custom-message' => 'عرض رسالة مخصصة', + 'embed' => 'تضمين', + 'enter-value' => 'أدخل القيمة', + 'form-background-color' => 'لون خلفية النموذج', + 'form-submit-btn-color' => 'لون زر إرسال النموذج', + 'form-submit-button-color' => 'لون زر إرسال النموذج', + 'form-title-color' => 'لون عنوان النموذج', + 'general' => 'عام', + 'leads' => 'العملاء المحتملون', + 'person' => 'شخص', + 'preview' => 'معاينة', + 'public-url' => 'الرابط العام', + 'redirect-to-url' => 'إعادة التوجيه إلى الرابط', + 'save-btn' => 'حفظ نموذج الويب', + 'select-file' => 'اختر ملف', + 'select-image' => 'اختر صورة', + 'submit-button-label' => 'تسمية زر الإرسال', + 'submit-success-action' => 'إجراء نجاح الإرسال', + 'title' => 'تعديل استمارة ويب', + ], + ], + 'email-template' => [ + 'index' => [ + 'create-btn' => 'إنشاء قالب بريد إلكتروني', + 'title' => 'قوالب البريد الإلكتروني', + 'create-success' => 'تم إنشاء قالب البريد الإلكتروني بنجاح.', + 'update-success' => 'تم تحديث قالب البريد الإلكتروني بنجاح.', + 'delete-success' => 'تم حذف قالب البريد الإلكتروني بنجاح.', + 'delete-failed' => 'لا يمكن حذف قالب البريد الإلكتروني.', + 'datagrid' => [ + 'delete' => 'حذف', + 'edit' => 'تعديل', + 'id' => 'المعرف', + 'name' => 'الاسم', + 'subject' => 'الموضوع', + ], + ], + 'create' => [ + 'title' => 'إنشاء قالب بريد إلكتروني', + 'save-btn' => 'حفظ قالب البريد الإلكتروني', + 'email-template' => 'قالب البريد الإلكتروني', + 'subject' => 'الموضوع', + 'content' => 'المحتوى', + 'subject-placeholders' => 'العناصر النائبة للموضوع', + 'general' => 'عام', + 'name' => 'الاسم', + ], + 'edit' => [ + 'title' => 'تعديل قالب البريد الإلكتروني', + 'save-btn' => 'حفظ قالب البريد الإلكتروني', + 'email-template' => 'قالب البريد الإلكتروني', + 'subject' => 'الموضوع', + 'content' => 'المحتوى', + 'subject-placeholders' => 'العناصر النائبة للموضوع', + 'general' => 'عام', + 'name' => 'الاسم', + ], + ], + 'marketing' => [ + 'events' => [ + 'index' => [ + 'create-btn' => 'إنشاء حدث', + 'title' => 'الأحداث', + 'create-success' => 'تم إنشاء الحدث بنجاح.', + 'update-success' => 'تم تحديث الحدث بنجاح.', + 'delete-success' => 'تم حذف الحدث بنجاح.', + 'delete-failed' => 'لا يمكن حذف الحدث.', + 'mass-delete-success' => 'تم حذف الأحداث بنجاح', + 'datagrid' => [ + 'delete' => 'حذف', + 'edit' => 'تحرير', + 'id' => 'المعرف', + 'name' => 'الاسم', + 'description' => 'الوصف', + 'date' => 'التاريخ', + ], + 'create' => [ + 'title' => 'إنشاء حدث', + 'name' => 'الاسم', + 'date' => 'التاريخ', + 'description' => 'الوصف', + 'save-btn' => 'حفظ الحدث', + ], + 'edit' => [ + 'title' => 'تحرير الحدث', + ], + ], + ], + 'campaigns' => [ + 'index' => [ + 'create-btn' => 'إنشاء حملة', + 'title' => 'الحملات', + 'create-success' => 'تم إنشاء الحملة بنجاح.', + 'update-success' => 'تم تحديث الحملة بنجاح.', + 'delete-success' => 'تم حذف الحملة بنجاح.', + 'delete-failed' => 'لا يمكن حذف الحملة.', + 'mass-delete-success' => 'تم حذف الحملات بنجاح.', + 'datagrid' => [ + 'id' => 'المعرف', + 'name' => 'الاسم', + 'subject' => 'الموضوع', + 'status' => 'الحالة', + 'active' => 'نشط', + 'inactive' => 'غير نشط', + 'edit' => 'تحرير', + 'delete' => 'حذف', + ], + 'create' => [ + 'title' => 'إنشاء حملة', + 'name' => 'الاسم', + 'type' => 'النوع', + 'subject' => 'الموضوع', + 'event' => 'الحدث', + 'email-template' => 'نموذج البريد الإلكتروني', + 'status' => 'الحالة', + ], + 'edit' => [ + 'title' => 'تحرير الحملة', + ], + ], + ], + ], + 'tags' => [ + 'index' => [ + 'create-btn' => 'إنشاء وسم', + 'title' => 'الوسوم', + 'create-success' => 'تم إنشاء الوسم بنجاح.', + 'update-success' => 'تم تحديث الوسم بنجاح.', + 'delete-success' => 'تم حذف الوسم بنجاح.', + 'delete-failed' => 'لا يمكن حذف الوسم.', + 'datagrid' => [ + 'delete' => 'حذف', + 'edit' => 'تعديل', + 'id' => 'المعرف', + 'name' => 'الاسم', + 'users' => 'المستخدمون', + 'created-at' => 'تم الإنشاء في', + ], + 'create' => [ + 'name' => 'الاسم', + 'save-btn' => 'حفظ الوسم', + 'title' => 'إنشاء وسم', + 'color' => 'اللون', + ], + 'edit' => [ + 'title' => 'تعديل الوسم', + ], + ], + ], + 'users' => [ + 'index' => [ + 'create-btn' => 'إنشاء مستخدم', + 'create-success' => 'تم إنشاء المستخدم بنجاح.', + 'delete-failed' => 'لا يمكن حذف المستخدم.', + 'delete-success' => 'تم حذف المستخدم بنجاح.', + 'last-delete-error' => 'مطلوب مستخدم واحد على الأقل.', + 'mass-delete-failed' => 'لا يمكن حذف المستخدمين.', + 'mass-delete-success' => 'تم حذف المستخدمين بنجاح.', + 'mass-update-failed' => 'لا يمكن تحديث المستخدمين.', + 'mass-update-success' => 'تم تحديث المستخدمين بنجاح.', + 'title' => 'المستخدمون', + 'update-success' => 'تم تحديث المستخدم بنجاح.', + 'user-define-error' => 'لا يمكن حذف مستخدم النظام.', + 'active' => 'نشط', + 'inactive' => 'غير نشط', + 'datagrid' => [ + 'active' => 'نشط', + 'created-at' => 'تم الإنشاء في', + 'delete' => 'حذف', + 'edit' => 'تعديل', + 'email' => 'البريد الإلكتروني', + 'id' => 'المعرف', + 'inactive' => 'غير نشط', + 'name' => 'الاسم', + 'status' => 'الحالة', + 'update-status' => 'تحديث الحالة', + 'users' => 'المستخدمون', + ], + 'create' => [ + 'confirm-password' => 'تأكيد كلمة المرور', + 'email' => 'البريد الإلكتروني', + 'general' => 'عام', + 'global' => 'عالمي', + 'group' => 'مجموعة', + 'individual' => 'فردي', + 'name' => 'الاسم', + 'password' => 'كلمة المرور', + 'permission' => 'الصلاحية', + 'role' => 'الدور', + 'save-btn' => 'حفظ المستخدم', + 'status' => 'الحالة', + 'title' => 'إنشاء مستخدم', + 'view-permission' => 'عرض الصلاحية', + 'select-at-lest-one-group' => 'Select at least one group', + ], + 'edit' => [ + 'title' => 'تعديل المستخدم', + ], + ], + ], + 'pipelines' => [ + 'index' => [ + 'title' => 'خطوط الأنابيب', + 'create-btn' => 'إنشاء خط أنابيب', + 'create-success' => 'تم إنشاء خط الأنابيب بنجاح.', + 'update-success' => 'تم تحديث خط الأنابيب بنجاح.', + 'default-required' => 'مطلوب وجود خط أنابيب افتراضي واحد على الأقل.', + 'delete-success' => 'تم حذف خط الأنابيب بنجاح.', + 'delete-failed' => 'لا يمكن حذف خط الأنابيب.', + 'default-delete-error' => 'لا يمكن حذف خط الأنابيب الافتراضي.', + 'datagrid' => [ + 'delete' => 'حذف', + 'edit' => 'تعديل', + 'id' => 'المعرف', + 'is-default' => 'افتراضي', + 'name' => 'الاسم', + 'no' => 'لا', + 'rotten-days' => 'أيام التعفن', + 'yes' => 'نعم', + ], + ], + 'create' => [ + 'title' => 'إنشاء خط أنابيب', + 'save-btn' => 'حفظ خط الأنابيب', + 'name' => 'الاسم', + 'rotten-days' => 'أيام التعفن', + 'mark-as-default' => 'تعيين كافتراضي', + 'general' => 'عام', + 'probability' => 'الاحتمالية (%)', + 'new-stage' => 'جديد', + 'won-stage' => 'فاز', + 'lost-stage' => 'خسر', + 'stage-btn' => 'إضافة مرحلة', + 'stages' => 'المراحل', + 'duplicate-name' => 'لا يمكن تكرار حقل "الاسم"', + 'delete-stage' => 'حذف المرحلة', + 'add-new-stages' => 'إضافة مراحل جديدة', + 'add-stage-info' => 'أضف مرحلة جديدة لخط الأنابيب الخاص بك', + 'newly-added' => 'تمت الإضافة حديثًا', + 'stage-delete-success' => 'تم حذف المرحلة بنجاح', + ], + 'edit' => [ + 'title' => 'تعديل خط الأنابيب', + 'save-btn' => 'حفظ خط الأنابيب', + 'name' => 'الاسم', + 'rotten-days' => 'أيام التعفن', + 'mark-as-default' => 'تعيين كافتراضي', + 'general' => 'عام', + 'probability' => 'الاحتمالية (%)', + 'new-stage' => 'جديد', + 'won-stage' => 'فاز', + 'lost-stage' => 'خسر', + 'stage-btn' => 'إضافة مرحلة', + 'stages' => 'المراحل', + 'duplicate-name' => 'لا يمكن تكرار حقل "الاسم"', + 'delete-stage' => 'حذف المرحلة', + 'add-new-stages' => 'إضافة مراحل جديدة', + 'add-stage-info' => 'أضف مرحلة جديدة لخط الأنابيب الخاص بك', + 'stage-delete-success' => 'تم حذف المرحلة بنجاح', + ], + ], + 'webhooks' => [ + 'index' => [ + 'title' => 'الويب هوكس', + 'create-btn' => 'إنشاء ويب هوك', + 'create-success' => 'تم إنشاء الويب هوك بنجاح.', + 'update-success' => 'تم تحديث الويب هوك بنجاح.', + 'delete-success' => 'تم حذف الويب هوك بنجاح.', + 'delete-failed' => 'لا يمكن حذف الويب هوك.', + 'datagrid' => [ + 'id' => 'المعرف', + 'delete' => 'حذف', + 'edit' => 'تعديل', + 'name' => 'الاسم', + 'entity-type' => 'نوع الكيان', + 'end-point' => 'نقطة النهاية', + ], + ], + 'create' => [ + 'title' => 'إنشاء ويب هوك', + 'save-btn' => 'حفظ الويب هوك', + 'info' => 'أدخل تفاصيل الويب هوكس', + 'url-and-parameters' => 'الرابط والمعلمات', + 'method' => 'الطريقة', + 'post' => 'إرسال', + 'put' => 'تحديث', + 'url-endpoint' => 'نقطة نهاية الرابط', + 'parameters' => 'المعلمات', + 'add-new-parameter' => 'إضافة معلمة جديدة', + 'url-preview' => 'معاينة الرابط:', + 'headers' => 'الرؤوس', + 'add-new-header' => 'إضافة رأس جديد', + 'body' => 'الجسم', + 'default' => 'افتراضي', + 'x-www-form-urlencoded' => 'x-www-form-urlencoded', + 'key-and-value' => 'المفتاح والقيمة', + 'add-new-payload' => 'إضافة حمولة جديدة', + 'raw' => 'خام', + 'general' => 'عام', + 'name' => 'الاسم', + 'entity-type' => 'نوع الكيان', + 'insert-placeholder' => 'إدراج العنصر النائب', + 'description' => 'الوصف', + 'json' => 'Json', + 'text' => 'نص', + ], + 'edit' => [ + 'title' => 'تعديل الويب هوك', + 'edit-btn' => 'حفظ الويب هوك', + 'save-btn' => 'حفظ الويب هوك', + 'info' => 'أدخل تفاصيل الويب هوكس', + 'url-and-parameters' => 'الرابط والمعلمات', + 'method' => 'الطريقة', + 'post' => 'إرسال', + 'put' => 'تحديث', + 'url-endpoint' => 'نقطة نهاية الرابط', + 'parameters' => 'المعلمات', + 'add-new-parameter' => 'إضافة معلمة جديدة', + 'url-preview' => 'معاينة الرابط:', + 'headers' => 'الرؤوس', + 'add-new-header' => 'إضافة رأس جديد', + 'body' => 'الجسم', + 'default' => 'افتراضي', + 'x-www-form-urlencoded' => 'x-www-form-urlencoded', + 'key-and-value' => 'المفتاح والقيمة', + 'add-new-payload' => 'إضافة حمولة جديدة', + 'raw' => 'خام', + 'general' => 'عام', + 'name' => 'الاسم', + 'entity-type' => 'نوع الكيان', + 'insert-placeholder' => 'إدراج العنصر النائب', + 'description' => 'الوصف', + 'json' => 'Json', + 'text' => 'نص', + ], + ], + 'warehouses' => [ + 'index' => [ + 'title' => 'المستودعات', + 'create-btn' => 'إنشاء مستودع', + 'create-success' => 'تم إنشاء المستودع بنجاح.', + 'name-exists' => 'اسم المستودع موجود بالفعل.', + 'update-success' => 'تم تحديث المستودع بنجاح.', + 'delete-success' => 'تم حذف المستودع بنجاح.', + 'delete-failed' => 'لا يمكن حذف المستودع.', + 'datagrid' => [ + 'id' => 'المعرف', + 'name' => 'الاسم', + 'contact-name' => 'اسم جهة الاتصال', + 'delete' => 'حذف', + 'edit' => 'تعديل', + 'view' => 'عرض', + 'created-at' => 'تم الإنشاء في', + 'products' => 'المنتجات', + 'contact-emails' => 'البريد الإلكتروني للاتصال', + 'contact-numbers' => 'أرقام الاتصال', + ], + ], + 'create' => [ + 'title' => 'إنشاء مستودع', + 'save-btn' => 'حفظ المستودع', + 'contact-info' => 'معلومات الاتصال', + ], + 'edit' => [ + 'title' => 'تعديل المستودع', + 'save-btn' => 'حفظ المستودع', + 'contact-info' => 'معلومات الاتصال', + ], + 'view' => [ + 'all' => 'الكل', + 'notes' => 'الملاحظات', + 'files' => 'الملفات', + 'location' => 'الموقع', + 'change-logs' => 'سجلات التغيير', + 'locations' => [ + 'action' => 'إجراء', + 'add-location' => 'إضافة موقع', + 'create-success' => 'تم إنشاء الموقع بنجاح.', + 'delete' => 'حذف', + 'delete-failed' => 'لا يمكن حذف الموقع.', + 'delete-success' => 'تم حذف الموقع بنجاح.', + 'name' => 'الاسم', + 'save-btn' => 'حفظ', + ], + 'general-information' => [ + 'title' => 'معلومات عامة', + ], + 'contact-information' => [ + 'title' => 'معلومات الاتصال', + ], + ], + ], + 'attributes' => [ + 'index' => [ + 'title' => 'السمات', + 'create-btn' => 'إنشاء سمة', + 'create-success' => 'تم إنشاء السمة بنجاح.', + 'update-success' => 'تم تحديث السمة بنجاح.', + 'delete-success' => 'تم حذف السمة بنجاح.', + 'delete-failed' => 'لا يمكن حذف السمة.', + 'user-define-error' => 'لا يمكن حذف سمة النظام.', + 'mass-delete-failed' => 'لا يمكن حذف سمات النظام.', + 'datagrid' => [ + 'yes' => 'نعم', + 'no' => 'لا', + 'id' => 'المعرف', + 'code' => 'الرمز', + 'name' => 'الاسم', + 'entity-type' => 'نوع الكيان', + 'type' => 'النوع', + 'is-default' => 'افتراضي', + 'edit' => 'تعديل', + 'delete' => 'حذف', + 'entity-types' => [ + 'leads' => 'العملاء المحتملين', + 'organizations' => 'المنظمات', + 'persons' => 'الأشخاص', + 'products' => 'المنتجات', + 'quotes' => 'عروض الأسعار', + 'warehouses' => 'المستودعات', + ], + 'types' => [ + 'text' => 'نص', + 'textarea' => 'منطقة نصية', + 'price' => 'سعر', + 'boolean' => 'قيمة منطقية', + 'select' => 'قائمة منسدلة', + 'multiselect' => 'اختيار متعدد', + 'checkbox' => 'مربع اختيار', + 'email' => 'بريد إلكتروني', + 'address' => 'عنوان', + 'phone' => 'هاتف', + 'lookup' => 'بحث', + 'datetime' => 'تاريخ ووقت', + 'date' => 'تاريخ', + 'image' => 'صورة', + 'file' => 'ملف', + ], + ], + ], + 'create' => [ + 'title' => 'إنشاء سمة', + 'save-btn' => 'حفظ السمة', + 'code' => 'الرمز', + 'name' => 'الاسم', + 'entity-type' => 'نوع الكيان', + 'type' => 'النوع', + 'validations' => 'التحققات', + 'is-required' => 'مطلوب', + 'input-validation' => 'التحقق من الإدخال', + 'is-unique' => 'فريد', + 'labels' => 'التسميات', + 'general' => 'عام', + 'numeric' => 'رقمي', + 'decimal' => 'عشري', + 'url' => 'رابط', + 'options' => 'الخيارات', + 'option-type' => 'نوع الخيار', + 'lookup-type' => 'نوع البحث', + 'add-option' => 'إضافة خيار', + 'save-option' => 'حفظ الخيار', + 'option-name' => 'اسم الخيار', + 'add-attribute-options' => 'إضافة خيارات السمة', + 'text' => 'نص', + 'textarea' => 'منطقة نص', + 'price' => 'السعر', + 'boolean' => 'منطقي', + 'select' => 'اختيار', + 'multiselect' => 'اختيار متعدد', + 'email' => 'بريد إلكتروني', + 'address' => 'عنوان', + 'phone' => 'هاتف', + 'datetime' => 'تاريخ ووقت', + 'date' => 'تاريخ', + 'image' => 'صورة', + 'file' => 'ملف', + 'lookup' => 'بحث', + 'entity_type' => 'نوع الكيان', + 'checkbox' => 'خانة اختيار', + 'is_required' => 'مطلوب', + 'is_unique' => 'فريد', + 'actions' => 'الإجراءات', + ], + 'edit' => [ + 'actions' => 'الإجراءات', + 'add-attribute-options' => 'إضافة خيارات السمة', + 'add-option' => 'إضافة خيار', + 'address' => 'عنوان', + 'boolean' => 'منطقي', + 'checkbox' => 'خانة اختيار', + 'code' => 'الرمز', + 'date' => 'تاريخ', + 'datetime' => 'تاريخ ووقت', + 'decimal' => 'عشري', + 'email' => 'بريد إلكتروني', + 'entity-type' => 'نوع الكيان', + 'entity_type' => 'نوع الكيان', + 'file' => 'ملف', + 'general' => 'عام', + 'image' => 'صورة', + 'input-validation' => 'التحقق من الإدخال', + 'is-required' => 'مطلوب', + 'is-unique' => 'فريد', + 'is_required' => 'مطلوب', + 'is_unique' => 'فريد', + 'labels' => 'التسميات', + 'lookup' => 'بحث', + 'lookup-type' => 'نوع البحث', + 'multiselect' => 'اختيار متعدد', + 'name' => 'الاسم', + 'numeric' => 'رقمي', + 'option-deleted' => 'Attribute Option is deleted successfully', + 'option-name' => 'اسم الخيار', + 'option-type' => 'نوع الخيار', + 'options' => 'الخيارات', + 'phone' => 'هاتف', + 'price' => 'السعر', + 'save-btn' => 'حفظ السمة', + 'save-option' => 'حفظ الخيار', + 'select' => 'اختيار', + 'text' => 'نص', + 'textarea' => 'منطقة نص', + 'title' => 'تعديل السمة', + 'type' => 'النوع', + 'url' => 'رابط', + 'validations' => 'التحققات', + ], + ], + 'data-transfer' => [ + 'imports' => [ + 'create' => [ + 'action' => 'إجراء', + 'allowed-errors' => 'الأخطاء المسموح بها', + 'back-btn' => 'عودة', + 'create-update' => 'إنشاء/تحديث', + 'delete' => 'حذف', + 'download-sample' => 'تنزيل العينة', + 'field-separator' => 'فاصل الحقول', + 'file' => 'ملف', + 'general' => 'عام', + 'images-directory' => 'مسار دليل الصور', + 'process-in-queue' => 'معالجة في قائمة الانتظار', + 'results' => 'النتائج', + 'save-btn' => 'حفظ الاستيراد', + 'settings' => 'الإعدادات', + 'skip-errors' => 'تخطي الأخطاء', + 'stop-on-errors' => 'التوقف عند الأخطاء', + 'title' => 'إنشاء استيراد', + 'type' => 'النوع', + 'validation-strategy' => 'استراتيجية التحقق', + ], + 'edit' => [ + 'action' => 'إجراء', + 'allowed-errors' => 'الأخطاء المسموح بها', + 'back-btn' => 'عودة', + 'create-update' => 'إنشاء/تحديث', + 'delete' => 'حذف', + 'download-sample' => 'تنزيل العينة', + 'field-separator' => 'فاصل الحقول', + 'file' => 'ملف', + 'general' => 'عام', + 'images-directory' => 'مسار دليل الصور', + 'process-in-queue' => 'معالجة في قائمة الانتظار', + 'results' => 'النتائج', + 'save-btn' => 'حفظ الاستيراد', + 'settings' => 'الإعدادات', + 'skip-errors' => 'تخطي الأخطاء', + 'stop-on-errors' => 'التوقف عند الأخطاء', + 'title' => 'تحرير الاستيراد', + 'type' => 'النوع', + 'validation-strategy' => 'استراتيجية التحقق', + ], + 'index' => [ + 'button-title' => 'إنشاء استيراد', + 'title' => 'الاستيرادات', + 'datagrid' => [ + 'actions' => 'الإجراءات', + 'completed-at' => 'اكتمل في', + 'created' => 'تم الإنشاء', + 'delete' => 'حذف', + 'deleted' => 'تم الحذف', + 'edit' => 'تحرير', + 'error-file' => 'ملف الأخطاء', + 'id' => 'الرقم التعريفي', + 'started-at' => 'بدأ في', + 'state' => 'الحالة', + 'summary' => 'الملخص', + 'type' => 'النوع', + 'updated' => 'تم التحديث', + 'uploaded-file' => 'الملف المرفوع', + ], + ], + 'import' => [ + 'back-btn' => 'عودة', + 'completed-batches' => 'إجمالي الدفعات المكتملة:', + 'download-error-report' => 'تنزيل التقرير الكامل', + 'edit-btn' => 'تحرير', + 'imported-info' => 'تهانينا! تم استيرادك بنجاح.', + 'importing-info' => 'الاستيراد قيد المعالجة', + 'indexing-info' => 'تجميع الموارد (الأسعار، المخزون و Elastic Search) جارٍ', + 'linking-info' => 'ربط الموارد جارٍ', + 'progress' => 'التقدم:', + 'title' => 'استيراد', + 'total-batches' => 'إجمالي الدفعات:', + 'total-created' => 'إجمالي السجلات التي تم إنشاؤها:', + 'total-deleted' => 'إجمالي السجلات المحذوفة:', + 'total-errors' => 'إجمالي الأخطاء:', + 'total-invalid-rows' => 'إجمالي الصفوف غير الصالحة:', + 'total-rows-processed' => 'إجمالي الصفوف المعالجة:', + 'total-updated' => 'إجمالي السجلات التي تم تحديثها:', + 'validate' => 'التحقق', + 'validate-info' => 'انقر على التحقق من البيانات لفحص الاستيراد.', + 'validating-info' => 'بدأت قراءة البيانات والتحقق منها', + 'validation-failed-info' => 'استيرادك غير صالح. يرجى إصلاح الأخطاء التالية والمحاولة مرة أخرى.', + 'validation-success-info' => 'استيرادك صالح. انقر على استيراد لبدء عملية الاستيراد.', + ], + 'create-success' => 'تم إنشاء الاستيراد بنجاح.', + 'delete-failed' => 'فشل حذف الاستيراد بشكل غير متوقع.', + 'delete-success' => 'تم حذف الاستيراد بنجاح.', + 'not-valid' => 'الاستيراد غير صالح', + 'nothing-to-import' => 'لا توجد موارد لاستيرادها.', + 'setup-queue-error' => 'يرجى تغيير برنامج تشغيل قائمة الانتظار إلى "قاعدة البيانات" أو "ريديس" لبدء عملية الاستيراد.', + 'update-success' => 'تم تحديث الاستيراد بنجاح.', + ], + ], + ], + 'activities' => [ + 'index' => [ + 'title' => 'الأنشطة', + 'datagrid' => [ + 'comment' => 'تعليق', + 'created_at' => 'تاريخ الإنشاء', + 'created_by' => 'تم الإنشاء بواسطة', + 'edit' => 'تحرير', + 'id' => 'المعرف', + 'done' => 'تم', + 'not-done' => 'لم يتم', + 'lead' => 'القيادة', + 'mass-delete' => 'حذف جماعي', + 'mass-update' => 'تحديث جماعي', + 'schedule-from' => 'جدولة من', + 'schedule-to' => 'جدولة إلى', + 'schedule_from' => 'جدولة من', + 'schedule_to' => 'جدولة إلى', + 'title' => 'العنوان', + 'is_done' => 'تم', + 'type' => 'النوع', + 'update' => 'تحديث', + 'call' => 'مكالمة', + 'meeting' => 'اجتماع', + 'lunch' => 'غداء', + ], + ], + 'edit' => [ + 'title' => 'تحرير النشاط', + 'back-btn' => 'رجوع', + 'save-btn' => 'حفظ النشاط', + 'type' => 'نوع النشاط', + 'call' => 'مكالمة', + 'meeting' => 'اجتماع', + 'lunch' => 'غداء', + 'schedule_to' => 'جدولة إلى', + 'schedule_from' => 'جدولة من', + 'location' => 'الموقع', + 'comment' => 'تعليق', + 'lead' => 'القيادة', + 'participants' => 'المشاركون', + 'general' => 'عام', + 'persons' => 'الأشخاص', + 'no-result-found' => 'لم يتم العثور على سجلات.', + 'users' => 'المستخدمون', + ], + 'updated' => 'تم تحديث :attribute', + 'created' => 'تم الإنشاء', + 'duration-overlapping' => 'لدى المشاركين اجتماع آخر في هذا الوقت. هل تريد المتابعة؟', + 'create-success' => 'تم إنشاء النشاط بنجاح.', + 'update-success' => 'تم تحديث النشاط بنجاح.', + 'overlapping-error' => 'لدى المشاركين اجتماع آخر في هذا الوقت.', + 'destroy-success' => 'تم حذف النشاط بنجاح.', + 'delete-failed' => 'لا يمكن حذف النشاط.', + 'mass-update-success' => 'تم تحديث الأنشطة بنجاح.', + 'mass-destroy-success' => 'تم حذف الأنشطة بنجاح.', + 'mass-delete-failed' => 'لا يمكن حذف الأنشطة.', + ], + 'mail' => [ + 'index' => [ + 'compose' => 'إنشاء', + 'draft' => 'مسودة', + 'inbox' => 'الوارد', + 'outbox' => 'الصادر', + 'sent' => 'تم الإرسال', + 'trash' => 'المهملات', + 'compose-mail-btn' => 'إنشاء بريد', + 'btn' => 'البريد', + 'mail' => [ + 'title' => 'إنشاء بريد', + 'to' => 'إلى', + 'enter-emails' => 'اضغط على Enter لإضافة البريد الإلكتروني', + 'cc' => 'نسخة إلى', + 'bcc' => 'نسخة مخفية إلى', + 'subject' => 'الموضوع', + 'send-btn' => 'إرسال', + 'message' => 'الرسالة', + 'draft' => 'مسودة', + ], + 'datagrid' => [ + 'id' => 'المعرف', + 'from' => 'من', + 'to' => 'إلى', + 'subject' => 'الموضوع', + 'tags' => 'العلامات', + 'content' => 'المحتوى', + 'attachments' => 'المرفقات', + 'date' => 'التاريخ', + 'move-to-inbox' => 'نقل إلى البريد الوارد', + 'move-to-trash' => 'تم النقل إلى سلة المهملات', + 'edit' => 'تعديل', + 'view' => 'عرض', + 'delete' => 'حذف', + ], + ], + 'create-success' => 'تم إرسال البريد الإلكتروني بنجاح.', + 'update-success' => 'تم تحديث البريد الإلكتروني بنجاح.', + 'mass-update-success' => 'تم تحديث البريد الإلكتروني بنجاح.', + 'delete-success' => 'تم حذف البريد الإلكتروني بنجاح.', + 'delete-failed' => 'لا يمكن حذف البريد الإلكتروني.', + 'view' => [ + 'title' => 'الرسائل', + 'subject' => ':الموضوع', + 'link-mail' => 'ربط البريد', + 'to' => 'إلى', + 'cc' => 'نسخة إلى', + 'bcc' => 'نسخة مخفية إلى', + 'reply' => 'رد', + 'reply-all' => 'رد على الجميع', + 'forward' => 'إعادة توجيه', + 'delete' => 'حذف', + 'enter-mails' => 'أدخل معرف البريد الإلكتروني', + 'rotten-days' => 'العميل المحتمل مهمل لمدة :days يومًا', + 'search-an-existing-lead' => 'البحث عن عميل محتمل موجود', + 'search-an-existing-contact' => 'البحث عن جهة اتصال موجودة', + 'message' => 'الرسالة', + 'add-attachments' => 'إضافة مرفقات', + 'discard' => 'تجاهل', + 'send' => 'إرسال', + 'no-result-found' => 'لم يتم العثور على نتائج', + 'add-new-contact' => 'إضافة جهة اتصال جديدة', + 'description' => 'الوصف', + 'search' => 'بحث...', + 'add-new-lead' => 'إضافة عميل محتمل جديد', + 'create-new-contact' => 'إنشاء جهة اتصال جديدة', + 'save-contact' => 'حفظ جهة الاتصال', + 'create-lead' => 'إنشاء عميل محتمل', + 'linked-contact' => 'جهة الاتصال المرتبطة', + 'link-to-contact' => 'ربط بجهة اتصال', + 'link-to-lead' => 'ربط بالعميل المحتمل', + 'linked-lead' => 'العميل المحتمل المرتبط', + 'lead-details' => 'تفاصيل العميل المحتمل', + 'contact-person' => 'الشخص المسؤول', + 'product' => 'المنتج', + 'tags' => [ + 'create-success' => 'تم إنشاء العلامة بنجاح.', + 'destroy-success' => 'تم حذف العلامة بنجاح.', + ], + ], + ], + 'common' => [ + 'custom-attributes' => [ + 'add-more' => 'أضف المزيد', + 'address' => 'العنوان', + 'city' => 'المدينة', + 'contact' => 'أرقام الاتصال', + 'country' => 'الدولة', + 'email' => 'البريد الإلكتروني', + 'home' => 'المنزل', + 'postcode' => 'الرمز البريدي', + 'save' => 'حفظ', + 'select' => 'اختر', + 'select-country' => 'اختر الدولة', + 'select-state' => 'اختر الولاية', + 'state' => 'الولاية', + 'update-contact-title' => 'تحديث أرقام الاتصال', + 'update-emails-title' => 'تحديث عناوين البريد الإلكتروني', + 'work' => 'العمل', + ], + ], + 'leads' => [ + 'create-success' => 'تم إنشاء العميل المحتمل بنجاح.', + 'update-success' => 'تم تحديث العميل المحتمل بنجاح.', + 'update-failed' => 'Leads can not be deleted.', + 'destroy-success' => 'تم حذف العميل المحتمل بنجاح.', + 'destroy-failed' => 'لا يمكن حذف العميل المحتمل.', + 'file' => [ + 'data-not-found' => 'البيانات غير موجودة.', + 'empty-content' => 'محتوى PDF فارغ أو لم يتم استخراجه.', + 'failed-extract' => 'فشل في استخراج النص من الملف.', + 'insufficient-info' => 'بسبب نقص البيانات، لا يمكننا معالجة طلبك في الوقت الحالي.', + 'invalid-base64' => 'تنسيق base64 غير صالح.', + 'invalid-format' => 'تنسيق JSON غير صالح.', + 'invalid-response' => 'تنسيق استجابة الذكاء الاصطناعي غير صالح.', + 'missing-api-key' => 'مفتاح API أو تكوين النموذج مفقود.', + 'not-found' => 'الملف غير موجود.', + 'recursive-call' => 'تم الكشف عن استدعاء متكرر.', + 'text-generation-failed' => 'فشل استخراج النص. قد يكون الملف فارغًا أو غير قابل للقراءة.', + ], + 'index' => [ + 'title' => 'العملاء المحتملون', + 'create-btn' => 'إنشاء عميل محتمل', + 'datagrid' => [ + 'id' => 'ID', + 'sales-person' => 'مندوب المبيعات', + 'subject' => 'الموضوع', + 'source' => 'المصدر', + 'lead-value' => 'قيمة العميل المحتمل', + 'lead-type' => 'نوع العميل المحتمل', + 'tag-name' => 'اسم العلامة', + 'contact-person' => 'شخص الاتصال', + 'stage' => 'المرحلة', + 'rotten-lead' => 'عميل محتمل متعفن', + 'date-to' => 'تاريخ إلى', + 'created-at' => 'تم الإنشاء في', + 'no' => 'لا', + 'yes' => 'نعم', + 'delete' => 'حذف', + 'mass-delete' => 'حذف جماعي', + 'mass-update' => 'تحديث جماعي', + ], + 'kanban' => [ + 'rotten-days' => 'العميل الفاسد منذ :days أيام', + 'empty-list' => 'قائمة العملاء الخاصة بك فارغة', + 'empty-list-description' => 'قم بإنشاء عميل لتنظيم أهدافك.', + 'create-lead-btn' => 'إنشاء عميل', + 'columns' => [ + 'contact-person' => 'شخص الاتصال', + 'id' => 'ID', + 'lead-type' => 'نوع العميل المحتمل', + 'lead-value' => 'قيمة العميل المحتمل', + 'sales-person' => 'مندوب المبيعات', + 'source' => 'المصدر', + 'title' => 'العنوان', + 'tags' => 'العلامات', + 'expected-close-date' => 'تاريخ الإغلاق المتوقع', + 'created-at' => 'تم الإنشاء في', + ], + 'toolbar' => [ + 'search' => [ + 'title' => 'البحث حسب العنوان', + ], + 'filters' => [ + 'apply-filters' => 'تطبيق الفلاتر', + 'clear-all' => 'مسح الكل', + 'filter' => 'تصفية', + 'filters' => 'الفلاتر', + 'from' => 'من', + 'select' => 'اختر', + 'to' => 'إلى', + ], + ], + ], + 'view-switcher' => [ + 'all-pipelines' => 'كل المسارات', + 'create-new-pipeline' => 'إنشاء مسار جديد', + ], + 'upload' => [ + 'create-lead' => 'إنشاء عميل محتمل باستخدام الذكاء الاصطناعي', + 'file' => 'رفع ملف', + 'file-info' => 'يتم قبول الملفات بتنسيق pdf, bmp, jpg, jpeg, png فقط.', + 'file-required' => 'يرجى اختيار ملف صالح واحد على الأقل للمتابعة.', + 'save-btn' => 'حفظ', + 'upload-file' => 'رفع الملف', + ], + ], + 'create' => [ + 'title' => 'إنشاء عميل محتمل', + 'save-btn' => 'حفظ', + 'details' => 'التفاصيل', + 'details-info' => 'ضع المعلومات الأساسية للعميل المحتمل', + 'contact-person' => 'شخص الاتصال', + 'contact-info' => 'معلومات عن شخص الاتصال', + 'products' => 'المنتجات', + 'products-info' => 'معلومات عن المنتجات', + ], + 'edit' => [ + 'title' => 'تعديل العميل المحتمل', + 'save-btn' => 'حفظ', + 'details' => 'التفاصيل', + 'details-info' => 'ضع المعلومات الأساسية للعميل المحتمل', + 'contact-person' => 'شخص الاتصال', + 'contact-info' => 'معلومات عن شخص الاتصال', + 'products' => 'المنتجات', + 'products-info' => 'معلومات عن المنتجات', + ], + 'common' => [ + 'contact' => [ + 'name' => 'الاسم', + 'email' => 'البريد الإلكتروني', + 'contact-number' => 'رقم الاتصال', + 'organization' => 'المنظمة', + ], + 'products' => [ + 'product-name' => 'اسم المنتج', + 'quantity' => 'الكمية', + 'price' => 'السعر', + 'amount' => 'المبلغ', + 'action' => 'الإجراء', + 'add-more' => 'أضف المزيد', + 'total' => 'الإجمالي', + ], + ], + 'view' => [ + 'title' => 'الفرصة: :title', + 'rotten-days' => ':days أيام', + 'tabs' => [ + 'description' => 'الوصف', + 'products' => 'المنتجات', + 'quotes' => 'الاقتباسات', + ], + 'attributes' => [ + 'title' => 'حول الفرصة', + ], + 'quotes' => [ + 'subject' => 'الموضوع', + 'expired-at' => 'تنتهي في', + 'sub-total' => 'المجموع الفرعي', + 'discount' => 'الخصم', + 'tax' => 'الضريبة', + 'adjustment' => 'التعديل', + 'grand-total' => 'المجموع الكلي', + 'delete' => 'حذف', + 'edit' => 'تعديل', + 'download' => 'تحميل', + 'destroy-success' => 'تم حذف العرض بنجاح.', + 'empty-title' => 'لا توجد عروض', + 'empty-info' => 'لم يتم العثور على عروض لهذه الفرصة', + 'add-btn' => 'إضافة عرض', + ], + 'products' => [ + 'product-name' => 'اسم المنتج', + 'quantity' => 'الكمية', + 'price' => 'السعر', + 'amount' => 'المبلغ', + 'action' => 'الإجراء', + 'add-more' => 'إضافة المزيد', + 'total' => 'الإجمالي', + 'empty-title' => 'لا توجد منتجات', + 'empty-info' => 'لم يتم العثور على منتجات لهذه الفرصة', + 'add-product' => 'إضافة منتج', + ], + 'persons' => [ + 'title' => 'حول الأشخاص', + 'job-title' => ':job_title في :organization', + ], + 'stages' => [ + 'won-lost' => 'ربحت/خسرت', + 'won' => 'ربحت', + 'lost' => 'خسرت', + 'need-more-info' => 'تحتاج إلى مزيد من التفاصيل', + 'closed-at' => 'أغلقت في', + 'won-value' => 'قيمة الربح', + 'lost-reason' => 'سبب الخسارة', + 'save-btn' => 'حفظ', + ], + 'tags' => [ + 'create-success' => 'تم إنشاء العلامة بنجاح.', + 'destroy-success' => 'تم حذف العلامة بنجاح.', + ], + ], + ], + 'configuration' => [ + 'index' => [ + 'back' => 'رجوع', + 'delete' => 'حذف', + 'save-btn' => 'حفظ التكوين', + 'save-success' => 'تم حفظ التكوين بنجاح.', + 'search' => 'بحث', + 'select-country' => 'اختر الدولة', + 'select-state' => 'اختر الولاية', + 'title' => 'التكوين', + 'general' => [ + 'title' => 'عام', + 'info' => 'تكوين عام', + 'general' => [ + 'title' => 'عام', + 'info' => 'قم بتحديث إعداداتك العامة هنا.', + 'locale-settings' => [ + 'title' => 'إعدادات اللغة', + 'title-info' => 'تعريف اللغة المستخدمة في واجهة المستخدم، مثل العربية (ar)، الإنجليزية (en)، الإسبانية (es)، الفارسية (fa) والتركية (tr).', + ], + 'admin-logo' => [ + 'logo-image' => 'صورة الشعار', + 'title' => 'شعار الإدارة', + 'title-info' => 'تكوين صورة الشعار للوحة الإدارة الخاصة بك.', + ], + ], + 'settings' => [ + 'title' => 'Settings', + 'info' => 'Update your settings here.', + 'footer' => [ + 'info' => 'We can configure the powered by section here.', + 'powered-by' => 'Powered by text editor', + 'title' => 'Powered by Section Configurations', + ], + 'menu' => [ + 'activities' => 'Activities', + 'configuration' => 'Configuration', + 'contacts' => 'Contacts', + 'dashboard' => 'Dashboard', + 'draft' => 'Draft', + 'inbox' => 'Inbox', + 'info' => 'We can configure the menu items name here.', + 'leads' => 'Leads', + 'mail' => 'Mail', + 'organizations' => 'Organizations', + 'outbox' => 'Outbox', + 'persons' => 'Persons', + 'products' => 'Products', + 'quotes' => 'Quotes', + 'sent' => 'Sent', + 'settings' => 'Settings', + 'title' => 'Menu Item Configurations', + 'trash' => 'Trash', + ], + 'menu-color' => [ + 'brand-color' => 'Brand Color', + 'info' => 'We can change the menu items colors here.', + 'title' => 'Menu Item Color Configurations', + ], + ], + ], + 'email' => [ + 'title' => 'إعدادات البريد الإلكتروني', + 'info' => 'تكوين البريد الإلكتروني للتطبيق.', + 'imap' => [ + 'title' => 'إعدادات IMAP', + 'info' => 'تكوين البريد الإلكتروني IMAP لتلقي الرسائل.', + 'account' => [ + 'title' => 'حساب IMAP', + 'title-info' => 'قم بتكوين إعدادات حساب IMAP هنا.', + 'host' => 'المضيف', + 'port' => 'المنفذ', + 'encryption' => 'نوع التشفير', + 'validate-cert' => 'التحقق من شهادة SSL', + 'username' => 'اسم مستخدم IMAP', + 'password' => 'كلمة مرور IMAP', + ], + ], + ], + 'magic-ai' => [ + 'title' => 'الذكاء الاصطناعي السحري', + 'info' => 'تكوين الذكاء الاصطناعي السحري للتطبيق.', + 'settings' => [ + 'api-key' => 'مفتاح API', + 'api-key-info' => 'تذكر استخدام مفتاح API من OpenRouter لكل نموذج. إنها خطوة بسيطة لتعزيز الأمان والأداء.', + 'enable' => 'تمكين', + 'info' => 'عزز تجربتك مع الذكاء الاصطناعي السحري باستخدام مفتاح API من OpenRouter. قم بدمجه الآن لتجربة ذكاء اصطناعي سلسة ومخصصة لك! قم بتخصيص الإعدادات بسهولة وتحكم في رحلتك مع الذكاء الاصطناعي.', + 'other' => 'نموذج آخر', + 'other-model' => 'بالنسبة للنماذج الأخرى، استخدم معرف النموذج من OpenRouter.', + 'doc-generation' => 'توليد DOC', + 'doc-generation-info' => 'قم بتمكين ميزة توليد DOC لاستخراج البيانات تلقائيًا من ملفات DOC وتحويلها إلى تنسيق نصي. عزز إنتاجيتك وكفاءتك من خلال تفعيل هذه الميزة لتبسيط سير عملك.', + 'title' => 'الإعدادات العامة', + 'models' => [ + 'deepseek-r1' => 'Deepseek R1 Distill-llama-8b', + 'gemini-2-0-flash-001' => 'Gemini 2.0 flash-001', + 'gpt-4o' => 'GPT-4.0', + 'gpt-4o-mini' => 'GPT-4.0 mini', + 'grok-2-1212' => 'Grok 2.12', + 'llama-3-2-3b-instruct' => 'Llama 3.2 3b Instruct', + 'title' => 'النماذج', + ], + ], + ], + ], + ], + 'dashboard' => [ + 'index' => [ + 'title' => 'لوحة القيادة', + 'revenue' => [ + 'lost-revenue' => 'الإيرادات المفقودة', + 'won-revenue' => 'الإيرادات المكتسبة', + ], + 'over-all' => [ + 'average-lead-value' => 'متوسط قيمة العملاء المحتملين', + 'total-leads' => 'إجمالي العملاء المحتملين', + 'average-leads-per-day' => 'متوسط العملاء المحتملين في اليوم', + 'total-quotations' => 'إجمالي العروض', + 'total-persons' => 'إجمالي الأشخاص', + 'total-organizations' => 'إجمالي المؤسسات', + ], + 'total-leads' => [ + 'title' => 'العملاء المحتملين', + 'total' => 'إجمالي العملاء المحتملين', + 'won' => 'العملاء المحتملين المكتسبين', + 'lost' => 'العملاء المحتملين المفقودين', + ], + 'revenue-by-sources' => [ + 'title' => 'الإيرادات حسب المصادر', + 'empty-title' => 'لا توجد بيانات متاحة', + 'empty-info' => 'لا توجد بيانات متاحة للفترة المختارة', + ], + 'revenue-by-types' => [ + 'title' => 'الإيرادات حسب الأنواع', + 'empty-title' => 'لا توجد بيانات متاحة', + 'empty-info' => 'لا توجد بيانات متاحة للفترة المختارة', + ], + 'top-selling-products' => [ + 'title' => 'أفضل المنتجات مبيعاً', + 'empty-title' => 'لم يتم العثور على منتجات', + 'empty-info' => 'لا توجد منتجات متاحة للفترة المختارة', + ], + 'top-persons' => [ + 'title' => 'أفضل الأشخاص', + 'empty-title' => 'لم يتم العثور على أشخاص', + 'empty-info' => 'لا توجد أشخاص متاحة للفترة المختارة', + ], + 'open-leads-by-states' => [ + 'title' => 'العملاء المحتملين المفتوحين حسب المراحل', + 'empty-title' => 'لا توجد بيانات متاحة', + 'empty-info' => 'لا توجد بيانات متاحة للفترة المختارة', + ], + ], + ], + 'layouts' => [ + 'app-version' => 'الإصدار: :version', + 'dashboard' => 'لوحة القيادة', + 'leads' => 'العملاء المحتملين', + 'quotes' => 'العروض', + 'quote' => 'عرض', + 'mail' => [ + 'title' => 'البريد', + 'compose' => 'إنشاء رسالة', + 'inbox' => 'البريد الوارد', + 'draft' => 'المسودات', + 'outbox' => 'الصادر', + 'sent' => 'المرسل', + 'trash' => 'سلة المهملات', + 'setting' => 'الإعدادات', + ], + 'activities' => 'الأنشطة', + 'contacts' => 'جهات الاتصال', + 'persons' => 'الأشخاص', + 'person' => 'شخص', + 'organizations' => 'المؤسسات', + 'organization' => 'مؤسسة', + 'products' => 'المنتجات', + 'product' => 'منتج', + 'settings' => 'الإعدادات', + 'user' => 'المستخدم', + 'user-info' => 'إدارة جميع مستخدميك وصلاحياتهم في نظام CRM، وما يُسمح لهم بفعله.', + 'groups' => 'المجموعات', + 'groups-info' => 'إضافة أو تعديل أو حذف المجموعات من نظام CRM', + 'roles' => 'الأدوار', + 'role' => 'دور', + 'roles-info' => 'إضافة أو تعديل أو حذف الأدوار من نظام CRM', + 'users' => 'المستخدمين', + 'users-info' => 'إضافة أو تعديل أو حذف المستخدمين من نظام CRM', + 'lead' => 'عميل محتمل', + 'lead-info' => 'إدارة جميع إعدادات العملاء المحتملين الخاصة بك في نظام CRM', + 'pipelines' => 'الأنابيب', + 'pipelines-info' => 'إضافة أو تعديل أو حذف الأنابيب من نظام CRM', + 'sources' => 'المصادر', + 'sources-info' => 'إضافة أو تعديل أو حذف المصادر من نظام CRM', + 'types' => 'الأنواع', + 'types-info' => 'إضافة أو تعديل أو حذف الأنواع من نظام CRM', + 'automation' => 'الأتمتة', + 'automation-info' => 'إدارة جميع إعدادات الأتمتة الخاصة بك في نظام CRM', + 'attributes' => 'الخصائص', + 'attribute' => 'خاصية', + 'attributes-info' => 'إضافة أو تعديل أو حذف الخصائص من نظام CRM', + 'email-templates' => 'قوالب البريد الإلكتروني', + 'email' => 'البريد الإلكتروني', + 'email-templates-info' => 'إضافة أو تعديل أو حذف قوالب البريد الإلكتروني من نظام CRM', + 'events' => 'الفعاليات', + 'events-info' => 'إضافة، تعديل أو حذف الفعاليات من إدارة العلاقات', + 'campaigns' => 'الحملات', + 'campaigns-info' => 'إضافة، تعديل أو حذف الحملات من إدارة العلاقات', + 'workflows' => 'سير العمل', + 'workflows-info' => 'إضافة أو تعديل أو حذف سير العمل من نظام CRM', + 'webhooks' => 'الويب هوك', + 'webhooks-info' => 'إضافة، تحرير أو حذف الويب هوك من CRM', + 'other-settings' => 'إعدادات أخرى', + 'other-settings-info' => 'إدارة جميع إعداداتك الإضافية في نظام CRM', + 'tags' => 'العلامات', + 'tags-info' => 'إضافة أو تعديل أو حذف العلامات من نظام CRM', + 'my-account' => 'حسابي', + 'sign-out' => 'تسجيل الخروج', + 'back' => 'رجوع', + 'name' => 'الاسم', + 'configuration' => 'الإعدادات', + 'howdy' => 'مرحبا!', + 'warehouses' => 'المستودعات', + 'warehouse' => 'مستودع', + 'warehouses-info' => 'إضافة أو تعديل أو حذف المستودعات من نظام CRM', + 'data_transfer' => 'نقل البيانات', + 'data_transfer_info' => 'إدارة إعدادات نقل البيانات المتعلقة بالأشخاص والمنتجات والعملاء المحتملين في إدارة علاقات العملاء (CRM)', + ], + 'user' => [ + 'account' => [ + 'name' => 'الاسم', + 'email' => 'البريد الإلكتروني', + 'password' => 'كلمة المرور', + 'my_account' => 'حسابي', + 'update_details' => 'تحديث التفاصيل', + 'current_password' => 'كلمة المرور الحالية', + 'confirm_password' => 'تأكيد كلمة المرور', + 'password-match' => 'كلمة المرور الحالية لا تطابق.', + 'account-save' => 'تم حفظ تغييرات الحساب بنجاح.', + 'permission-denied' => 'تم رفض الإذن', + 'remove-image' => 'إزالة الصورة', + 'upload_image_pix' => 'تحميل صورة الملف الشخصي (100 بكسل × 100 بكسل)', + 'upload_image_format' => 'بصيغة PNG أو JPG', + 'image_upload_message' => 'فقط الصور (.jpeg، .jpg، .png، ..) مسموح بها.', + ], + ], + 'emails' => [ + 'common' => [ + 'dear' => 'عزيزي :name', + 'cheers' => 'مع أطيب التحيات،
فريق :app_name', + 'user' => [ + 'dear' => 'عزيزي :username', + 'create-subject' => 'تم إضافتك كعضو.', + 'create-body' => 'تهانينا! أنت الآن عضو في فريقنا.', + 'forget-password' => [ + 'subject' => 'إعادة تعيين كلمة مرور العميل', + 'dear' => 'عزيزي :username', + 'reset-password' => 'إعادة تعيين كلمة المرور', + 'info' => 'تتلقى هذا البريد الإلكتروني لأننا تلقينا طلب إعادة تعيين كلمة المرور لحسابك', + 'final-summary' => 'إذا لم تكن قد طلبت إعادة تعيين كلمة المرور، فلا يلزم اتخاذ أي إجراء إضافي', + 'thanks' => 'شكراً!', + ], + ], + ], + ], + 'validations' => [ + 'message' => [ + 'decimal' => ':attribute يجب أن يكون رقمًا عشريًا.', + ], + ], + 'errors' => [ + 'dashboard' => 'لوحة التحكم', + 'go-back' => 'العودة', + 'support' => 'إذا استمرت المشكلة، تواصل معنا على
:email للحصول على المساعدة.', + '404' => [ + 'description' => 'عذرًا! الصفحة التي تبحث عنها في إجازة. يبدو أننا لم نجد ما كنت تبحث عنه.', + 'title' => '404 الصفحة غير موجودة', + ], + '401' => [ + 'description' => 'عذرًا! يبدو أنك غير مصرح لك بالوصول إلى هذه الصفحة. يبدو أنك تفتقد الأوراق اللازمة.', + 'title' => '401 غير مصرح', + ], + '403' => [ + 'description' => 'عذرًا! هذه الصفحة محظورة. يبدو أنك لا تملك الأذونات اللازمة لعرض هذا المحتوى.', + 'title' => '403 ممنوع الدخول', + ], + '500' => [ + 'description' => 'عذرًا! حدث خطأ ما. يبدو أننا نواجه مشكلة في تحميل الصفحة التي تبحث عنها.', + 'title' => '500 خطأ داخلي في الخادم', + ], + '503' => [ + 'description' => 'عذرًا! يبدو أننا متوقفون مؤقتًا للصيانة. يرجى العودة لاحقًا.', + 'title' => '503 الخدمة غير متوفرة', + ], + ], + 'export' => [ + 'csv' => 'CSV', + 'download' => 'تحميل', + 'export' => 'تصدير', + 'no-records' => 'لا توجد سجلات للتصدير', + 'xls' => 'XLS', + 'xlsx' => 'XLSX', + ], +]; diff --git a/packages/Webkul/Admin/src/Resources/lang/en/app.php b/packages/Webkul/Admin/src/Resources/lang/en/app.php new file mode 100644 index 0000000..288fea6 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/lang/en/app.php @@ -0,0 +1,2440 @@ + [ + 'leads' => 'Leads', + 'lead' => 'Lead', + 'quotes' => 'Quotes', + 'mail' => 'Mail', + 'inbox' => 'Inbox', + 'draft' => 'Draft', + 'outbox' => 'Outbox', + 'sent' => 'Sent', + 'trash' => 'Trash', + 'activities' => 'Activities', + 'webhook' => 'Webhook', + 'contacts' => 'Contacts', + 'persons' => 'Persons', + 'organizations' => 'Organizations', + 'products' => 'Products', + 'settings' => 'Settings', + 'groups' => 'Groups', + 'roles' => 'Roles', + 'users' => 'Users', + 'user' => 'User', + 'automation' => 'Automation', + 'attributes' => 'Attributes', + 'pipelines' => 'Pipelines', + 'sources' => 'Sources', + 'types' => 'Types', + 'email-templates' => 'Email Templates', + 'workflows' => 'Workflows', + 'other-settings' => 'Other Settings', + 'tags' => 'Tags', + 'configuration' => 'Configuration', + 'create' => 'Create', + 'edit' => 'Edit', + 'view' => 'View', + 'print' => 'Print', + 'delete' => 'Delete', + 'export' => 'Export', + 'mass-delete' => 'Mass Delete', + 'data-transfer' => 'Data Transfer', + 'imports' => 'Imports', + 'import' => 'Import', + 'event' => 'Event', + 'campaigns' => 'Campaigns', + ], + + 'users' => [ + 'activate-warning' => 'Your account is not activated yet. Please contact the administrator.', + 'login-error' => 'The credentials do not match our records.', + 'not-permission' => 'You do not have permission to access the admin panel.', + + 'login' => [ + 'email' => 'Email Address', + 'forget-password-link' => 'Forget Password ?', + 'password' => 'Password', + 'submit-btn' => 'Sign In', + 'title' => 'Sign In', + ], + + 'forget-password' => [ + 'create' => [ + 'email' => 'Registered Email', + 'email-not-exist' => 'Email Not Exists', + 'page-title' => 'Forget Password', + 'reset-link-sent' => 'Reset Password link sent', + 'sign-in-link' => 'Back to Sign In ?', + 'submit-btn' => 'Reset', + 'title' => 'Recover Password', + ], + ], + + 'reset-password' => [ + 'back-link-title' => 'Back to Sign In ?', + 'confirm-password' => 'Confirm Password', + 'email' => 'Registered Email', + 'password' => 'Password', + 'submit-btn' => 'Reset Password', + 'title' => 'Reset Password', + ], + ], + + 'account' => [ + 'edit' => [ + 'back-btn' => 'Back', + 'change-password' => 'Change Password', + 'confirm-password' => 'Confirm Password', + 'current-password' => 'Current Password', + 'email' => 'Email', + 'general' => 'General', + 'invalid-password' => 'The current password you entered is incorrect.', + 'name' => 'Name', + 'password' => 'Password', + 'profile-image' => 'Profile Image', + 'save-btn' => 'Save Account', + 'title' => 'My Account', + 'update-success' => 'Account updated successfully', + 'upload-image-info' => 'Upload a Profile Image (110px X 110px) in PNG or JPG Format', + ], + ], + + 'components' => [ + 'activities' => [ + 'actions' => [ + 'mail' => [ + 'btn' => 'Mail', + 'title' => 'Compose Mail', + 'to' => 'To', + 'enter-emails' => 'Press enter to add emails', + 'cc' => 'CC', + 'bcc' => 'BCC', + 'subject' => 'Subject', + 'send-btn' => 'Send', + 'message' => 'Message', + ], + + 'file' => [ + 'btn' => 'File', + 'title' => 'Add File', + 'title-control' => 'Title', + 'name' => 'Name', + 'description' => 'Description', + 'file' => 'File', + 'save-btn' => 'Save File', + ], + + 'note' => [ + 'btn' => 'Note', + 'title' => 'Add Note', + 'comment' => 'Comment', + 'save-btn' => 'Save Note', + ], + + 'activity' => [ + 'btn' => 'Activity', + 'title' => 'Add Activity', + 'title-control' => 'Title', + 'description' => 'Description', + 'schedule-from' => 'Schedule From', + 'schedule-to' => 'Schedule To', + 'location' => 'Location', + 'call' => 'Call', + 'meeting' => 'Meeting', + 'lunch' => 'Lunch', + 'save-btn' => 'Save Activity', + + 'participants' => [ + 'title' => 'Participants', + 'placeholder' => 'Type to search participants', + 'users' => 'Users', + 'persons' => 'Persons', + 'no-results' => 'No result found...', + ], + ], + ], + + 'index' => [ + 'all' => 'All', + 'bcc' => 'Bcc', + 'by-user' => 'By :user', + 'calls' => 'Calls', + 'cc' => 'Cc', + 'change-log' => 'Changelogs', + 'delete' => 'Delete', + 'edit' => 'Edit', + 'emails' => 'Emails', + 'empty' => 'Empty', + 'files' => 'Files', + 'from' => 'From', + 'location' => 'Location', + 'lunches' => 'Lunches', + 'mark-as-done' => 'Mark as Done', + 'meetings' => 'Meetings', + 'notes' => 'Notes', + 'participants' => 'Participants', + 'planned' => 'Planned', + 'quotes' => 'Quotes', + 'scheduled-on' => 'Scheduled on', + 'system' => 'System', + 'to' => 'To', + 'unlink' => 'Unlink', + 'view' => 'View', + + 'empty-placeholders' => [ + 'all' => [ + 'title' => 'No Activities Found', + 'description' => 'No activities found for this. You can add activities by clicking on the Activity button on the left panel.', + ], + + 'planned' => [ + 'title' => 'No Planned Activities Found', + 'description' => 'No planned activities found for this. You can add planned activities by clicking on the Activity button on the left panel.', + ], + + 'notes' => [ + 'title' => 'No Notes Found', + 'description' => 'No notes found for this. You can add notes by clicking on the Note button on the left panel.', + ], + + 'calls' => [ + 'title' => 'No Calls Found', + 'description' => 'No calls found for this. You can add calls by clicking on the Activity button on the left panel and selecting the Call type.', + ], + + 'meetings' => [ + 'title' => 'No Meetings Found', + 'description' => 'No meetings found for this. You can add meetings by clicking on the Activity button on the left panel and selecting the Meeting type.', + ], + + 'lunches' => [ + 'title' => 'No Lunches Found', + 'description' => 'No lunches found for this. You can add lunches by clicking on the Activity button on the left panel and selecting the Lunch type.', + ], + + 'files' => [ + 'title' => 'No Files Found', + 'description' => 'No files found for this. You can add files by clicking on the File button on the left panel.', + ], + + 'emails' => [ + 'title' => 'No Emails Found', + 'description' => 'No emails found for this. You can add emails by clicking on the Mail button on the left panel.', + ], + + 'system' => [ + 'title' => 'No Changelogs Found', + 'description' => 'No changelogs found for this.', + ], + ], + ], + ], + + 'media' => [ + 'images' => [ + 'add-image-btn' => 'Add Image', + 'ai-add-image-btn' => 'Magic AI', + 'allowed-types' => 'png, jpeg, jpg', + 'not-allowed-error' => 'Only images files (.jpeg, .jpg, .png, ..) are allowed.', + + 'placeholders' => [ + 'front' => 'Front', + 'next' => 'Next', + 'size' => 'Size', + 'use-cases' => 'Use Cases', + 'zoom' => 'Zoom', + ], + ], + + 'videos' => [ + 'add-video-btn' => 'Add Video', + 'allowed-types' => 'mp4, webm, mkv', + 'not-allowed-error' => 'Only videos files (.mp4, .mov, .ogg ..) are allowed.', + ], + ], + + 'datagrid' => [ + 'index' => [ + 'no-records-selected' => 'No records have been selected.', + 'must-select-a-mass-action-option' => 'You must select a mass action\'s option.', + 'must-select-a-mass-action' => 'You must select a mass action.', + ], + + 'toolbar' => [ + 'length-of' => ':length of', + 'of' => 'of', + 'per-page' => 'Per Page', + 'results' => ':total Results', + 'delete' => 'Delete', + 'selected' => ':total Items Selected', + + 'mass-actions' => [ + 'submit' => 'Submit', + 'select-option' => 'Select Option', + 'select-action' => 'Select Action', + ], + + 'filter' => [ + 'apply-filters-btn' => 'Apply Filters', + 'back-btn' => 'Back', + 'create-new-filter' => 'Create New Filter', + 'custom-filters' => 'Custom Filters', + 'delete-error' => 'Something went wrong while deleting the filter, please try again.', + 'delete-success' => 'Filter has been deleted successfully.', + 'empty-description' => 'There is no selected filters available to save. Please select filters to save.', + 'empty-title' => 'Add Filters to Save', + 'name' => 'Name', + 'quick-filters' => 'Quick Filters', + 'save-btn' => 'Save', + 'save-filter' => 'Save Filter', + 'saved-success' => 'Filter has been saved successfully.', + 'selected-filters' => 'Selected Filters', + 'title' => 'Filter', + 'update' => 'Update', + 'update-filter' => 'Update Filter', + 'updated-success' => 'Filter has been updated successfully.', + ], + + 'search' => [ + 'title' => 'Search', + ], + ], + + 'filters' => [ + 'select' => 'Select', + 'title' => 'Filters', + + 'dropdown' => [ + 'searchable' => [ + 'at-least-two-chars' => 'Type at least 2 characters...', + 'no-results' => 'No result found...', + ], + ], + + 'custom-filters' => [ + 'clear-all' => 'Clear All', + 'title' => 'Custom Filters', + ], + + 'boolean-options' => [ + 'false' => 'False', + 'true' => 'True', + ], + + 'date-options' => [ + 'last-month' => 'Last Month', + 'last-six-months' => 'Last 6 Months', + 'last-three-months' => 'Last 3 Months', + 'this-month' => 'This Month', + 'this-week' => 'This Week', + 'this-year' => 'This Year', + 'today' => 'Today', + 'yesterday' => 'Yesterday', + ], + ], + + 'table' => [ + 'actions' => 'Actions', + 'no-records-available' => 'No Records Available.', + ], + ], + + 'modal' => [ + 'confirm' => [ + 'agree-btn' => 'Agree', + 'disagree-btn' => 'Disagree', + 'message' => 'Are you sure you want to perform this action?', + 'title' => 'Are you sure?', + ], + ], + + 'tags' => [ + 'index' => [ + 'title' => 'Tags', + 'added-tags' => 'Added Tags', + 'save-btn' => 'Save Tag', + 'placeholder' => 'Type to search tags', + 'add-tag' => 'Add \":term\"...', + 'aquarelle-red' => 'Aquarelle Red', + 'crushed-cashew' => 'Crushed Cashew', + 'beeswax' => 'Beeswax', + 'lemon-chiffon' => 'Lemon Chiffon', + 'snow-flurry' => 'Snow Flurry', + 'honeydew' => 'Honeydew', + ], + ], + + 'layouts' => [ + 'powered-by' => [ + 'description' => 'Powered by :krayin, an open-source project by :webkul.', + ], + + 'header' => [ + 'mega-search' => [ + 'title' => 'Mega Search', + + 'tabs' => [ + 'leads' => 'Leads', + 'quotes' => 'Quotes', + 'persons' => 'Persons', + 'products' => 'Products', + ], + + 'explore-all-products' => 'Explore all Products', + 'explore-all-leads' => 'Explore all Leads', + 'explore-all-contacts' => 'Explore all Contacts', + 'explore-all-quotes' => 'Explore all Quotes', + 'explore-all-matching-products' => 'Explore all products matching ":query" (:count)', + 'explore-all-matching-leads' => 'Explore all leads matching ":query" (:count)', + 'explore-all-matching-contacts' => 'Explore all contacts matching ":query" (:count)', + 'explore-all-matching-quotes' => 'Explore all quotes matching ":query" (:count)', + ], + ], + ], + + 'attributes' => [ + 'edit' => [ + 'delete' => 'Delete', + ], + + 'lookup' => [ + 'click-to-add' => 'Click to add', + 'search' => 'Search', + 'no-result-found' => 'No result found', + 'search' => 'Search...', + ], + ], + + 'lookup' => [ + 'click-to-add' => 'Click to Add', + 'no-results' => 'No Results Found', + 'add-as-new' => 'Add as New', + 'search' => 'Search...', + ], + + 'flash-group' => [ + 'success' => 'Success', + 'error' => 'Error', + 'warning' => 'Warning', + 'info' => 'Info', + ], + + 'tiny-mce' => [ + 'http-error' => 'HTTP Error', + 'invalid-json' => 'Invalid JSON response from the server.', + 'upload-failed' => 'File upload failed. Please try again.', + ], + ], + + 'quotes' => [ + 'index' => [ + 'title' => 'Quotes', + 'create-btn' => 'Create Quote', + 'create-success' => 'Quote created successfully.', + 'update-success' => 'Quote updated successfully.', + 'delete-success' => 'Quote deleted successfully.', + 'delete-failed' => 'Quote can not be deleted.', + + 'datagrid' => [ + 'subject' => 'Subject', + 'sales-person' => 'Sales Person', + 'expired-at' => 'Expired At', + 'created-at' => 'Created At', + 'person' => 'Person', + 'subtotal' => 'Subtotal', + 'discount' => 'Discount', + 'tax' => 'Tax', + 'adjustment' => 'Adjustment', + 'grand-total' => 'Grand Total', + 'edit' => 'Edit', + 'delete' => 'Delete', + 'print' => 'Print', + ], + + 'pdf' => [ + 'adjustment' => 'Adjustment', + 'amount' => 'Amount', + 'billing-address' => 'Billing Address', + 'date' => 'Date', + 'discount' => 'Discount', + 'expired-at' => 'Expired At', + 'grand-total' => 'Grand Total', + 'person' => 'Person', + 'price' => 'Price', + 'product-name' => 'Product Name', + 'quantity' => 'Quantity', + 'quote-id' => 'Quote ID', + 'sales-person' => 'Sales Person', + 'shipping-address' => 'Shipping Address', + 'sku' => 'SKU', + 'sub-total' => 'Sub Total', + 'subject' => 'Subject', + 'tax' => 'Tax', + 'title' => 'Quote', + ], + ], + + 'create' => [ + 'title' => 'Create Quote', + 'save-btn' => 'Save Quote', + 'quote-info' => 'Quote Information', + 'quote-info-info' => 'Put the basic information of the quote.', + 'address-info' => 'Address Information', + 'address-info-info' => 'Information about the address related to quote.', + 'quote-items' => 'Quote Items', + 'search-products' => 'Search Products', + 'link-to-lead' => 'Link to lead', + 'quote-item-info' => 'Add Product Request for this quote.', + 'quote-name' => 'Quote name', + 'quantity' => 'Quantity', + 'price' => 'Price', + 'discount' => 'Discount', + 'tax' => 'Tax', + 'total' => 'Total', + 'amount' => 'Amount', + 'add-item' => '+ Add Item', + 'sub-total' => 'Sub Total (:symbol)', + 'total-discount' => 'Discount (:symbol)', + 'total-tax' => 'Tax (:symbol)', + 'total-adjustment' => 'Adjustment (:symbol)', + 'grand-total' => 'Grand Total (:symbol)', + 'discount-amount' => 'Discount amount', + 'tax-amount' => 'Tax amount', + 'adjustment-amount' => 'Adjustment amount', + 'product-name' => 'Product Name', + 'action' => 'Action', + ], + + 'edit' => [ + 'title' => 'Edit Quote', + 'save-btn' => 'Save Quote', + 'quote-info' => 'Quote Information', + 'quote-info-info' => 'Put the basic information of the quote.', + 'address-info' => 'Address Information', + 'address-info-info' => 'Information about the address related to quote.', + 'quote-items' => 'Quote Items', + 'link-to-lead' => 'Link to lead', + 'quote-item-info' => 'Add Product Request for this quote.', + 'quote-name' => 'Quote name', + 'quantity' => 'Quantity', + 'price' => 'Price', + 'search-products' => 'Search Products', + 'discount' => 'Discount', + 'tax' => 'Tax', + 'total' => 'Total', + 'amount' => 'Amount', + 'add-item' => '+ Add Item', + 'sub-total' => 'Sub Total (:symbol)', + 'total-discount' => 'Discount (:symbol)', + 'total-tax' => 'Tax (:symbol)', + 'total-adjustment' => 'Adjustment (:symbol)', + 'grand-total' => 'Grand Total (:symbol)', + 'discount-amount' => 'Discount amount', + 'tax-amount' => 'Tax amount', + 'adjustment-amount' => 'Adjustment amount', + 'product-name' => 'Product Name', + 'action' => 'Action', + ], + ], + + 'contacts' => [ + 'persons' => [ + 'index' => [ + 'title' => 'Persons', + 'create-btn' => 'Create Person', + 'create-success' => 'Person created successfully.', + 'update-success' => 'Person updated successfully.', + 'all-delete-success' => 'All selected persons were deleted successfully.', + 'partial-delete-warning' => 'Some persons were deleted successfully. Others could not be deleted because they are linked to leads.', + 'none-delete-warning' => 'None of the selected persons could be deleted because they are linked to leads.', + 'no-selection' => 'No persons were selected for deletion.', + 'delete-failed' => 'Failed to delete selected persons.', + + 'datagrid' => [ + 'contact-numbers' => 'Contact Numbers', + 'delete' => 'Delete', + 'edit' => 'Edit', + 'emails' => 'Emails', + 'id' => 'ID', + 'view' => 'View', + 'name' => 'Name', + 'organization-name' => 'Organization Name', + ], + ], + + 'view' => [ + 'title' => ':name', + 'about-person' => 'About Person', + 'about-organization' => 'About Organization', + + 'activities' => [ + 'index' => [ + 'all' => 'All', + 'calls' => 'Calls', + 'meetings' => 'Meetings', + 'lunches' => 'Lunches', + 'files' => 'Files', + 'quotes' => 'Quotes', + 'notes' => 'Notes', + 'emails' => 'Emails', + 'by-user' => 'By :user', + 'scheduled-on' => 'Scheduled on', + 'location' => 'Location', + 'participants' => 'Participants', + 'mark-as-done' => 'Mark as Done', + 'delete' => 'Delete', + 'edit' => 'Edit', + ], + + 'actions' => [ + 'mail' => [ + 'btn' => 'Mail', + 'title' => 'Compose Mail', + 'to' => 'To', + 'cc' => 'CC', + 'bcc' => 'BCC', + 'subject' => 'Subject', + 'send-btn' => 'Send', + 'message' => 'Message', + ], + + 'file' => [ + 'btn' => 'File', + 'title' => 'Add File', + 'title-control' => 'Title', + 'name' => 'File Name', + 'description' => 'Description', + 'file' => 'File', + 'save-btn' => 'Save File', + ], + + 'note' => [ + 'btn' => 'Note', + 'title' => 'Add Note', + 'comment' => 'Comment', + 'save-btn' => 'Save Note', + ], + + 'activity' => [ + 'btn' => 'Activity', + 'title' => 'Add Activity', + 'title-control' => 'Title', + 'description' => 'Description', + 'schedule-from' => 'Schedule From', + 'schedule-to' => 'Schedule To', + 'location' => 'Location', + 'call' => 'Call', + 'meeting' => 'Meeting', + 'lunch' => 'Lunch', + 'save-btn' => 'Save Activity', + ], + ], + ], + + 'tags' => [ + 'create-success' => 'Tag created successfully.', + 'destroy-success' => 'Tag deleted successfully.', + ], + ], + + 'create' => [ + 'title' => 'Create Person', + 'save-btn' => 'Save Person', + ], + + 'edit' => [ + 'title' => 'Edit Person', + 'save-btn' => 'Save Person', + ], + ], + + 'organizations' => [ + 'index' => [ + 'title' => 'Organizations', + 'create-btn' => 'Create Organization', + 'create-success' => 'Organization created successfully.', + 'update-success' => 'Organization updated successfully.', + 'delete-success' => 'Organization deleted successfully.', + 'delete-failed' => 'Organization can not be deleted.', + + 'datagrid' => [ + 'delete' => 'Delete', + 'edit' => 'Edit', + 'id' => 'ID', + 'name' => 'Name', + 'persons-count' => 'Person Count', + ], + ], + + 'create' => [ + 'title' => 'Create Organization', + 'save-btn' => 'Save Organization', + ], + + 'edit' => [ + 'title' => 'Edit Organization', + 'save-btn' => 'Save Organization', + ], + ], + ], + + 'products' => [ + 'index' => [ + 'title' => 'Products', + 'create-btn' => 'Create Product', + 'create-success' => 'Product created successfully.', + 'update-success' => 'Product updated successfully.', + 'delete-success' => 'Product deleted successfully.', + 'delete-failed' => 'Product can not be deleted.', + + 'datagrid' => [ + 'allocated' => 'Allocated', + 'delete' => 'Delete', + 'edit' => 'Edit', + 'id' => 'ID', + 'in-stock' => 'In Stock', + 'name' => 'Name', + 'on-hand' => 'On Hand', + 'tag-name' => 'Tag Name', + 'price' => 'Price', + 'sku' => 'SKU', + 'view' => 'View', + ], + ], + + 'create' => [ + 'save-btn' => 'Save Products', + 'title' => 'Create Products', + 'general' => 'General', + 'price' => 'Price', + ], + + 'edit' => [ + 'title' => 'Edit Products', + 'save-btn' => 'Save Products', + 'general' => 'General', + 'price' => 'Price', + ], + + 'view' => [ + 'sku' => 'SKU', + 'all' => 'All', + 'notes' => 'Notes', + 'files' => 'Files', + 'inventories' => 'Inventory', + 'change-logs' => 'Changelogs', + + 'attributes' => [ + 'about-product' => 'About Product', + ], + + 'inventory' => [ + 'source' => 'Source', + 'in-stock' => 'In Stock', + 'allocated' => 'Allocated', + 'on-hand' => 'On Hand', + 'actions' => 'Actions', + 'assign' => 'Assign', + 'add-source' => 'Add Source', + 'location' => 'Location', + 'add-more' => 'Add More', + 'save' => 'Save', + ], + ], + ], + + 'settings' => [ + 'title' => 'Settings', + + 'groups' => [ + 'index' => [ + 'create-btn' => 'Create Group', + 'title' => 'Groups', + 'create-success' => 'Group created successfully.', + 'update-success' => 'Group updated successfully.', + 'destroy-success' => 'Group deleted successfully.', + 'delete-failed' => 'Group can not be deleted.', + 'delete-failed-associated-users' => 'Group can not be deleted, as this is being used by users.', + + 'datagrid' => [ + 'delete' => 'Delete', + 'description' => 'Description', + 'edit' => 'Edit', + 'id' => 'ID', + 'name' => 'Name', + ], + + 'edit' => [ + 'title' => 'Edit Group', + ], + + 'create' => [ + 'name' => 'Name', + 'title' => 'Create Group', + 'description' => 'Description', + 'save-btn' => 'Save Group', + ], + ], + ], + + 'roles' => [ + 'index' => [ + 'being-used' => 'Role can not be deleted, as this is being used in admin user.', + 'create-btn' => 'Create Roles', + 'create-success' => 'Role created successfully.', + 'current-role-delete-error' => 'Can not delete role assigned to the current user.', + 'delete-failed' => 'Role can not be deleted.', + 'delete-success' => 'Role deleted successfully.', + 'last-delete-error' => 'At least one role is required.', + 'settings' => 'Settings', + 'title' => 'Roles', + 'update-success' => 'Role updated successfully.', + 'user-define-error' => 'Can not delete system role.', + + 'datagrid' => [ + 'all' => 'All', + 'custom' => 'Custom', + 'delete' => 'Delete', + 'description' => 'Description', + 'edit' => 'Edit', + 'id' => 'ID', + 'name' => 'Name', + 'permission-type' => 'Permission Type', + ], + ], + + 'create' => [ + 'access-control' => 'Access Control', + 'all' => 'All', + 'back-btn' => 'Back', + 'custom' => 'Custom', + 'description' => 'Description', + 'general' => 'General', + 'name' => 'Name', + 'permissions' => 'Permissions', + 'save-btn' => 'Save Role', + 'title' => 'Create Role', + ], + + 'edit' => [ + 'access-control' => 'Access Control', + 'all' => 'All', + 'back-btn' => 'Back', + 'custom' => 'Custom', + 'description' => 'Description', + 'general' => 'General', + 'name' => 'Name', + 'permissions' => 'Permissions', + 'save-btn' => 'Save Role', + 'title' => 'Edit Role', + ], + ], + + 'types' => [ + 'index' => [ + 'create-btn' => 'Create Type', + 'create-success' => 'Type created successfully.', + 'delete-failed' => 'Type can not be deleted.', + 'delete-success' => 'Type deleted successfully.', + 'title' => 'Types', + 'update-success' => 'Type updated successfully.', + + 'datagrid' => [ + 'delete' => 'Delete', + 'description' => 'Description', + 'edit' => 'Edit', + 'id' => 'ID', + 'name' => 'Name', + ], + + 'create' => [ + 'name' => 'Name', + 'save-btn' => 'Save Type', + 'title' => 'Create Type', + ], + + 'edit' => [ + 'title' => 'Edit Type', + ], + ], + ], + + 'sources' => [ + 'index' => [ + 'title' => 'Sources', + 'create-btn' => 'Create Source', + 'create-success' => 'Source created successfully.', + 'delete-failed' => 'Source can not be deleted.', + 'delete-success' => 'Source deleted successfully.', + 'update-success' => 'Source updated successfully.', + 'delete-failed-associated-leads' => 'Source cannot be deleted because it is associated with existing leads. Please detach or update those leads before deletion.', + + 'datagrid' => [ + 'delete' => 'Delete', + 'edit' => 'Edit', + 'id' => 'ID', + 'name' => 'Name', + ], + + 'create' => [ + 'name' => 'Name', + 'save-btn' => 'Save Source', + 'title' => 'Create Source', + ], + + 'edit' => [ + 'title' => 'Edit Source', + ], + ], + ], + + 'workflows' => [ + 'index' => [ + 'title' => 'Workflows', + 'create-btn' => 'Create Workflow', + 'create-success' => 'Workflow created successfully.', + 'update-success' => 'Workflow updated successfully.', + 'delete-success' => 'Workflow deleted successfully.', + 'delete-failed' => 'Workflow can not be deleted.', + 'datagrid' => [ + 'delete' => 'Delete', + 'description' => 'Description', + 'edit' => 'Edit', + 'id' => 'ID', + 'name' => 'Name', + ], + ], + + 'helpers' => [ + 'update-related-leads' => 'Update related leads', + 'send-email-to-sales-owner' => 'Send email to sales owner', + 'send-email-to-participants' => 'Send email to participants', + 'add-webhook' => 'Add Webhook', + 'update-lead' => 'Update Lead', + 'update-person' => 'Update Person', + 'send-email-to-person' => 'Send email to person', + 'add-tag' => 'Add Tag', + 'add-note-as-activity' => 'Add Note as Activity', + 'update-quote' => 'Update Quote', + ], + + 'create' => [ + 'title' => 'Create Workflow', + 'event' => 'Event', + 'back-btn' => 'Back', + 'save-btn' => 'Save Workflow', + 'name' => 'Name', + 'basic-details' => 'Basic Details', + 'description' => 'Description', + 'actions' => 'Actions', + 'basic-details-info' => 'Put the basic information of the workflow.', + 'event-info' => 'An event triggers, checks, conditions, and performs predefined actions.', + 'conditions' => 'Conditions', + 'conditions-info' => 'Conditions are rules checking scenarios, triggered on specific occasions.', + 'actions-info' => 'An action not only reduces the workload but also make it quite easier for CRM automation', + 'value' => 'Value', + 'condition-type' => 'Condition Type', + 'all-condition-are-true' => 'All condition are true', + 'any-condition-are-true' => 'Any condition are true', + 'add-condition' => 'Add Condition', + 'add-action' => 'Add Action', + 'yes' => 'Yes', + 'no' => 'No', + 'email' => 'Email', + 'is-equal-to' => 'Is equal to', + 'is-not-equal-to' => 'Is not equal to', + 'equals-or-greater-than' => 'Equals or greater than', + 'equals-or-less-than' => 'Equals or less than', + 'greater-than' => 'Greater than', + 'less-than' => 'Less than', + 'type' => 'Type', + 'contain' => 'Contain', + 'contains' => 'Contains', + 'does-not-contain' => 'Does not contain', + ], + + 'edit' => [ + 'title' => 'Edit Workflow', + 'event' => 'Event', + 'back-btn' => 'Back', + 'save-btn' => 'Save Workflow', + 'name' => 'Name', + 'basic-details' => 'Basic Details', + 'description' => 'Description', + 'actions' => 'Actions', + 'type' => 'Type', + 'basic-details-info' => 'Put the basic information of the workflow.', + 'event-info' => 'An event triggers, checks, conditions, and performs predefined actions.', + 'conditions' => 'Conditions', + 'conditions-info' => 'Conditions are rules checking scenarios, triggered on specific occasions.', + 'actions-info' => 'An action not only reduces the workload but also make it quite easier for CRM automation', + 'value' => 'Value', + 'condition-type' => 'Condition Type', + 'all-condition-are-true' => 'All condition are true', + 'any-condition-are-true' => 'Any condition are true', + 'add-condition' => 'Add Condition', + 'add-action' => 'Add Action', + 'yes' => 'Yes', + 'no' => 'No', + 'email' => 'Email', + 'is-equal-to' => 'Is equal to', + 'is-not-equal-to' => 'Is not equal to', + 'equals-or-greater-than' => 'Equals or greater than', + 'equals-or-less-than' => 'Equals or less than', + 'greater-than' => 'Greater than', + 'less-than' => 'Less than', + 'contain' => 'Contain', + 'contains' => 'Contains', + 'does-not-contain' => 'Does not contain', + ], + ], + + 'webforms' => [ + 'index' => [ + 'title' => 'Webforms', + 'create-btn' => 'Create Webform', + 'create-success' => 'Webform created successfully.', + 'update-success' => 'Webform updated successfully.', + 'delete-success' => 'Webform deleted successfully.', + 'delete-failed' => 'Webform can not be deleted.', + + 'datagrid' => [ + 'id' => 'ID', + 'title' => 'Title', + 'edit' => 'Edit', + 'delete' => 'Delete', + ], + ], + + 'create' => [ + 'title' => 'Create Webform', + 'add-attribute-btn' => 'Add Attribute Button', + 'attribute-label-color' => 'Attribute Label Color', + 'attributes' => 'Attributes', + 'attributes-info' => 'Add custom attributes to the form.', + 'background-color' => 'Background Color', + 'create-lead' => 'Create Lead', + 'customize-webform' => 'Customize Webform', + 'customize-webform-info' => 'Customize your web form with element colors of your choosing.', + 'description' => 'Description', + 'display-custom-message' => 'Display custom message', + 'form-background-color' => 'Form Background Color', + 'form-submit-btn-color' => 'Form Submit Button Color', + 'form-submit-button-color' => 'Form Submit Button Color', + 'form-title-color' => 'Form Title Color', + 'general' => 'General', + 'leads' => 'Leads', + 'person' => 'Person', + 'save-btn' => 'Save Webform', + 'submit-button-label' => 'Submit Button Label', + 'submit-success-action' => 'Submit Success Action', + 'redirect-to-url' => 'Redirect To Url', + 'choose-value' => 'Choose Value', + 'select-file' => 'Select File', + 'select-image' => 'Select Image', + 'enter-value' => 'Enter Value', + ], + + 'edit' => [ + 'add-attribute-btn' => 'Add Attribute Button', + 'attribute-label-color' => 'Attribute Label Color', + 'attributes' => 'Attributes', + 'attributes-info' => 'Add custom attributes to the form.', + 'background-color' => 'Background Color', + 'choose-value' => 'Choose Value', + 'code-snippet' => 'Code Snippet', + 'copied' => 'Copied', + 'copy' => 'Copy', + 'create-lead' => 'Create Lead', + 'customize-webform' => 'Customize Webform', + 'customize-webform-info' => 'Customize your web form with element colors of your choosing.', + 'description' => 'Description', + 'display-custom-message' => 'Display custom message', + 'embed' => 'Embed', + 'enter-value' => 'Enter Value', + 'form-background-color' => 'Form Background Color', + 'form-submit-btn-color' => 'Form Submit Button Color', + 'form-submit-button-color' => 'Form Submit Button Color', + 'form-title-color' => 'Form Title Color', + 'general' => 'General', + 'leads' => 'Leads', + 'person' => 'Person', + 'preview' => 'Preview', + 'public-url' => 'Public URL', + 'redirect-to-url' => 'Redirect To URL', + 'save-btn' => 'Save Webform', + 'select-file' => 'Select File', + 'select-image' => 'Select Image', + 'submit-button-label' => 'Submit Button Label', + 'submit-success-action' => 'Submit Success Action', + 'title' => 'Edit Webform', + ], + ], + + 'email-template' => [ + 'index' => [ + 'create-btn' => 'Create Email Template', + 'title' => 'Email Templates', + 'create-success' => 'Email Template created successfully.', + 'update-success' => 'Email Template updated successfully.', + 'delete-success' => 'Email Template deleted successfully.', + 'delete-failed' => 'Email Template can not be deleted.', + + 'datagrid' => [ + 'delete' => 'Delete', + 'edit' => 'Edit', + 'id' => 'ID', + 'name' => 'Name', + 'subject' => 'Subject', + ], + ], + + 'create' => [ + 'title' => 'Create Email Template', + 'save-btn' => 'Save Email Template', + 'email-template' => 'Email Template', + 'subject' => 'Subject', + 'content' => 'Content', + 'subject-placeholders' => 'Subject Placeholders', + 'general' => 'General', + 'name' => 'Name', + ], + + 'edit' => [ + 'title' => 'Edit Email Template', + 'save-btn' => 'Save Email Template', + 'email-template' => 'Email Template', + 'subject' => 'Subject', + 'content' => 'Content', + 'subject-placeholders' => 'Subject Placeholders', + 'general' => 'General', + 'name' => 'Name', + ], + ], + + 'marketing' => [ + 'events' => [ + 'index' => [ + 'create-btn' => 'Create Event', + 'title' => 'Events', + 'create-success' => 'Event created successfully.', + 'update-success' => 'Event updated successfully.', + 'delete-success' => 'Event deleted successfully.', + 'delete-failed' => 'Event can not be deleted.', + 'mass-delete-success' => 'Events deleted successfully', + + 'datagrid' => [ + 'delete' => 'Delete', + 'edit' => 'Edit', + 'id' => 'ID', + 'name' => 'Name', + 'description' => 'Description', + 'date' => 'Date', + ], + + 'create' => [ + 'title' => 'Create Event', + 'name' => 'Name', + 'date' => 'Date', + 'description' => 'Description', + 'save-btn' => 'Save Event', + ], + + 'edit' => [ + 'title' => 'Edit Event', + ], + ], + ], + + 'campaigns' => [ + 'index' => [ + 'create-btn' => 'Create Campaigns', + 'title' => 'Campaigns', + 'create-success' => 'Campaign created successfully.', + 'update-success' => 'Campaign updated successfully.', + 'delete-success' => 'Campaign deleted successfully.', + 'delete-failed' => 'Campaign can not be deleted.', + 'mass-delete-success' => 'Campaigns deleted successfully.', + + 'datagrid' => [ + 'id' => 'ID', + 'name' => 'Name', + 'subject' => 'Subject', + 'status' => 'Status', + 'active' => 'Active', + 'inactive' => 'Inactive', + 'edit' => 'Edit', + 'delete' => 'Delete', + ], + + 'create' => [ + 'title' => 'Create Campaign', + 'name' => 'Name', + 'type' => 'Type', + 'subject' => 'Subject', + 'event' => 'Event', + 'email-template' => 'Email Template', + 'status' => 'Status', + ], + + 'edit' => [ + 'title' => 'Edit Campaign', + ], + ], + ], + ], + + 'tags' => [ + 'index' => [ + 'create-btn' => 'Create Tag', + 'title' => 'Tags', + 'create-success' => 'Tag created successfully.', + 'update-success' => 'Tag updated successfully.', + 'delete-success' => 'Tag deleted successfully.', + 'delete-failed' => 'Tag can not be deleted.', + + 'datagrid' => [ + 'delete' => 'Delete', + 'edit' => 'Edit', + 'id' => 'ID', + 'name' => 'Name', + 'users' => 'Users', + 'created-at' => 'Created At', + ], + + 'create' => [ + 'name' => 'Name', + 'save-btn' => 'Save Tag', + 'title' => 'Create Tag', + 'color' => 'Color', + ], + + 'edit' => [ + 'title' => 'Edit Tag', + ], + ], + ], + + 'users' => [ + 'index' => [ + 'create-btn' => 'Create User', + 'create-success' => 'User created successfully.', + 'delete-failed' => 'User can not be deleted.', + 'delete-success' => 'User deleted successfully.', + 'last-delete-error' => 'At least one user is required.', + 'mass-delete-failed' => 'Users can not be deleted.', + 'mass-delete-success' => 'Users deleted successfully.', + 'mass-update-failed' => 'Users can not be updated.', + 'mass-update-success' => 'Users updated successfully.', + 'title' => 'Users', + 'update-success' => 'User updated successfully.', + 'user-define-error' => 'Can not delete system user.', + 'active' => 'Active', + 'inactive' => 'Inactive', + + 'datagrid' => [ + 'active' => 'Active', + 'created-at' => 'Created At', + 'delete' => 'Delete', + 'edit' => 'Edit', + 'email' => 'Email', + 'id' => 'ID', + 'inactive' => 'Inactive', + 'name' => 'Name', + 'status' => 'Status', + 'update-status' => 'Update Status', + 'users' => 'Users', + ], + + 'create' => [ + 'confirm-password' => 'Confirm Password', + 'email' => 'Email', + 'general' => 'General', + 'global' => 'Global', + 'group' => 'Group', + 'individual' => 'Individual', + 'name' => 'Name', + 'password' => 'Password', + 'permission' => 'Permission', + 'role' => 'Role', + 'save-btn' => 'Save User', + 'status' => 'Status', + 'title' => 'Create User', + 'view-permission' => 'View Permission', + 'select-at-lest-one-group' => 'Select at least one group', + ], + + 'edit' => [ + 'title' => 'Edit User', + ], + ], + ], + + 'pipelines' => [ + 'index' => [ + 'title' => 'Pipelines', + 'create-btn' => 'Create Pipeline', + 'create-success' => 'Pipeline created successfully.', + 'update-success' => 'Pipeline updated successfully.', + 'default-required' => 'At least one default pipeline is required.', + 'delete-success' => 'Pipeline deleted successfully.', + 'delete-failed' => 'Pipeline can not be deleted.', + 'default-delete-error' => 'Default pipeline can not be deleted.', + + 'datagrid' => [ + 'delete' => 'Delete', + 'edit' => 'Edit', + 'id' => 'ID', + 'is-default' => 'Is Default', + 'name' => 'Name', + 'no' => 'No', + 'rotten-days' => 'Rotten Days', + 'yes' => 'Yes', + ], + ], + + 'create' => [ + 'title' => 'Create Pipeline', + 'save-btn' => 'Save Pipeline', + 'name' => 'Name', + 'rotten-days' => 'Rotten Days', + 'mark-as-default' => 'Mark as Default', + 'general' => 'General', + 'probability' => 'Probability(%)', + 'new-stage' => 'New', + 'won-stage' => 'Won', + 'lost-stage' => 'Lost', + 'stage-btn' => 'Add Stage', + 'stages' => 'Stages', + 'duplicate-name' => 'The "Name" field cannot be duplicate', + 'delete-stage' => 'Delete Stage', + 'add-new-stages' => 'Add New Stages', + 'add-stage-info' => 'Add new stage for your Pipeline', + 'newly-added' => 'Newly Added', + 'stage-delete-success' => 'Stage Deleted Successfully', + ], + + 'edit' => [ + 'title' => 'Edit Pipeline', + 'save-btn' => 'Save Pipeline', + 'name' => 'Name', + 'rotten-days' => 'Rotten Days', + 'mark-as-default' => 'Mark as Default', + 'general' => 'General', + 'probability' => 'Probability(%)', + 'new-stage' => 'New', + 'won-stage' => 'Won', + 'lost-stage' => 'Lost', + 'stage-btn' => 'Add Stage', + 'stages' => 'Stages', + 'duplicate-name' => 'The "Name" field cannot be duplicate', + 'delete-stage' => 'Delete Stage', + 'add-new-stages' => 'Add New Stages', + 'add-stage-info' => 'Add new stage for your Pipeline', + 'stage-delete-success' => 'Stage Deleted Successfully', + ], + ], + + 'webhooks' => [ + 'index' => [ + 'title' => 'Webhooks', + 'create-btn' => 'Create Webhook', + 'create-success' => 'Webhook created successfully.', + 'update-success' => 'Webhook updated successfully.', + 'delete-success' => 'Webhook deleted successfully.', + 'delete-failed' => 'Webhook can not be deleted.', + + 'datagrid' => [ + 'id' => 'ID', + 'delete' => 'Delete', + 'edit' => 'Edit', + 'name' => 'Name', + 'entity-type' => 'Entity Type', + 'end-point' => 'End Point', + ], + ], + + 'create' => [ + 'title' => 'Create Webhook', + 'save-btn' => 'Save Webhook', + 'info' => 'Enter the details of webhooks', + 'url-and-parameters' => 'URL And Parameters', + 'method' => 'Method', + 'post' => 'Post', + 'put' => 'Put', + 'url-endpoint' => 'Url Endpoint', + 'parameters' => 'Parameters', + 'add-new-parameter' => 'Add New Parameter', + 'url-preview' => 'Url Preview:', + 'headers' => 'Headers', + 'add-new-header' => 'Add New Header', + 'body' => 'Body', + 'default' => 'Default', + 'x-www-form-urlencoded' => 'x-www-form-urlencoded', + 'key-and-value' => 'Key and Value', + 'add-new-payload' => 'Add new payload', + 'raw' => 'Raw', + 'general' => 'General', + 'name' => 'Name', + 'entity-type' => 'Entity Type', + 'insert-placeholder' => 'Insert Placeholder', + 'description' => 'Description', + 'json' => 'Json', + 'text' => 'Text', + ], + + 'edit' => [ + 'title' => 'Edit Webhook', + 'edit-btn' => 'Save Webhook', + 'save-btn' => 'Save Webhook', + 'info' => 'Enter the details of webhooks', + 'url-and-parameters' => 'URL And Parameters', + 'method' => 'Method', + 'post' => 'Post', + 'put' => 'Put', + 'url-endpoint' => 'Url Endpoint', + 'parameters' => 'Parameters', + 'add-new-parameter' => 'Add New Parameter', + 'url-preview' => 'Url Preview:', + 'headers' => 'Headers', + 'add-new-header' => 'Add New Header', + 'body' => 'Body', + 'default' => 'Default', + 'x-www-form-urlencoded' => 'x-www-form-urlencoded', + 'key-and-value' => 'Key and Value', + 'add-new-payload' => 'Add new payload', + 'raw' => 'Raw', + 'general' => 'General', + 'name' => 'Name', + 'entity-type' => 'Entity Type', + 'insert-placeholder' => 'Insert Placeholder', + 'description' => 'Description', + 'json' => 'Json', + 'text' => 'Text', + ], + ], + + 'warehouses' => [ + 'index' => [ + 'title' => 'Warehouses', + 'create-btn' => 'Create Warehouse', + 'create-success' => 'Warehouse created successfully.', + 'name-exists' => 'Warehouse name already exists.', + 'update-success' => 'Warehouse updated successfully.', + 'delete-success' => 'Warehouse deleted successfully.', + 'delete-failed' => 'Warehouse can not be deleted.', + + 'datagrid' => [ + 'id' => 'ID', + 'name' => 'Name', + 'contact-name' => 'Contact Name', + 'delete' => 'Delete', + 'edit' => 'Edit', + 'view' => 'View', + 'created-at' => 'Created At', + 'products' => 'Products', + 'contact-emails' => 'Contact Emails', + 'contact-numbers' => 'Contact Numbers', + ], + ], + + 'create' => [ + 'title' => 'Create Warehouse', + 'save-btn' => 'Save Warehouse', + 'contact-info' => 'Contact Information', + ], + + 'edit' => [ + 'title' => 'Edit Warehouse', + 'save-btn' => 'Save Warehouse', + 'contact-info' => 'Contact Information', + ], + + 'view' => [ + 'all' => 'All', + 'notes' => 'Notes', + 'files' => 'Files', + 'location' => 'Location', + 'change-logs' => 'Changelogs', + + 'locations' => [ + 'action' => 'Action', + 'add-location' => 'Add Location', + 'create-success' => 'Location created successfully.', + 'delete' => 'Delete', + 'delete-failed' => 'Location can not be deleted.', + 'delete-success' => 'Location deleted successfully.', + 'name' => 'Name', + 'save-btn' => 'Save', + ], + + 'general-information' => [ + 'title' => 'General Information', + ], + + 'contact-information' => [ + 'title' => 'Contact Information', + ], + ], + ], + + 'attributes' => [ + 'index' => [ + 'title' => 'Attributes', + 'create-btn' => 'Create Attribute', + 'create-success' => 'Attribute created successfully.', + 'update-success' => 'Attribute updated successfully.', + 'delete-success' => 'Attribute deleted successfully.', + 'delete-failed' => 'Attribute can not be deleted.', + 'user-define-error' => 'Can not delete system attribute.', + 'mass-delete-failed' => 'System attributes can not be deleted.', + + 'datagrid' => [ + 'yes' => 'Yes', + 'no' => 'No', + 'id' => 'ID', + 'code' => 'Code', + 'name' => 'Name', + 'entity-type' => 'Entity Type', + 'type' => 'Type', + 'is-default' => 'Is Default', + 'edit' => 'Edit', + 'delete' => 'Delete', + + 'entity-types' => [ + 'leads' => 'Leads', + 'organizations' => 'Organizations', + 'persons' => 'Persons', + 'products' => 'Products', + 'quotes' => 'Quotes', + 'warehouses' => 'Warehouses', + ], + + 'types' => [ + 'text' => 'Text', + 'textarea' => 'Textarea', + 'price' => 'Price', + 'boolean' => 'Boolean', + 'select' => 'Select', + 'multiselect' => 'Multiselect', + 'checkbox' => 'Checkbox', + 'email' => 'Email', + 'address' => 'Address', + 'phone' => 'Phone', + 'lookup' => 'Lookup', + 'datetime' => 'Datetime', + 'date' => 'Date', + 'image' => 'Image', + 'file' => 'File', + ], + ], + ], + + 'create' => [ + 'title' => 'Create Attribute', + 'save-btn' => 'Save Attribute', + 'code' => 'Code', + 'name' => 'Name', + 'entity-type' => 'Entity Type', + 'type' => 'Type', + 'validations' => 'Validations', + 'is-required' => 'Is Required', + 'input-validation' => 'Input Validation', + 'is-unique' => 'Is Unique', + 'labels' => 'Labels', + 'general' => 'General', + 'numeric' => 'Numeric', + 'decimal' => 'Decimal', + 'url' => 'Url', + 'options' => 'Options', + 'option-type' => 'Option Type', + 'lookup-type' => 'Lookup Type', + 'add-option' => 'Add Option', + 'save-option' => 'Save Option', + 'option-name' => 'Option Name', + 'add-attribute-options' => 'Add Attribute Options', + 'text' => 'Text', + 'textarea' => 'Textarea', + 'price' => 'Price', + 'boolean' => 'Boolean', + 'select' => 'Select', + 'multiselect' => 'Multiselect', + 'email' => 'Email', + 'address' => 'Address', + 'phone' => 'Phone', + 'datetime' => 'Datetime', + 'date' => 'Date', + 'image' => 'Image', + 'file' => 'File', + 'lookup' => 'Lookup', + 'entity_type' => 'Entity type', + 'checkbox' => 'Checkbox', + 'is_required' => 'Is Required', + 'is_unique' => 'Is Unique', + 'actions' => 'Actions', + ], + + 'edit' => [ + 'actions' => 'Actions', + 'add-attribute-options' => 'Add Attribute Options', + 'add-option' => 'Add Option', + 'address' => 'Address', + 'boolean' => 'Boolean', + 'checkbox' => 'Checkbox', + 'code' => 'Code', + 'date' => 'Date', + 'datetime' => 'Datetime', + 'decimal' => 'Decimal', + 'email' => 'Email', + 'entity-type' => 'Entity Type', + 'entity_type' => 'Entity type', + 'file' => 'File', + 'general' => 'General', + 'image' => 'Image', + 'input-validation' => 'Input Validation', + 'is-required' => 'Is Required', + 'is-unique' => 'Is Unique', + 'is_required' => 'Is Required', + 'is_unique' => 'Is Unique', + 'labels' => 'Labels', + 'lookup' => 'Lookup', + 'lookup-type' => 'Lookup Type', + 'multiselect' => 'Multiselect', + 'name' => 'Name', + 'numeric' => 'Numeric', + 'option-deleted' => 'Attribute Option is deleted successfully', + 'option-name' => 'Option Name', + 'option-type' => 'Option Type', + 'options' => 'Options', + 'phone' => 'Phone', + 'price' => 'Price', + 'save-btn' => 'Save Attribute', + 'save-option' => 'Save Option', + 'select' => 'Select', + 'text' => 'Text', + 'textarea' => 'Textarea', + 'title' => 'Edit Attribute', + 'type' => 'Type', + 'url' => 'Url', + 'validations' => 'Validations', + ], + ], + + 'data-transfer' => [ + 'imports' => [ + 'create' => [ + 'action' => 'Action', + 'allowed-errors' => 'Allowed Errors', + 'back-btn' => 'Back', + 'create-update' => 'Create/Update', + 'delete' => 'Delete', + 'download-sample' => 'Download Sample', + 'field-separator' => 'Field Separator', + 'file' => 'File', + 'general' => 'General', + 'images-directory' => 'Images Directory Path', + 'process-in-queue' => 'Process In Queue', + 'results' => 'Results', + 'save-btn' => 'Save Import', + 'settings' => 'Settings', + 'skip-errors' => 'Skip Errors', + 'stop-on-errors' => 'Stop on Errors', + 'title' => 'Create Import', + 'type' => 'Type', + 'validation-strategy' => 'Validation Strategy', + ], + + 'edit' => [ + 'action' => 'Action', + 'allowed-errors' => 'Allowed Errors', + 'back-btn' => 'Back', + 'create-update' => 'Create/Update', + 'delete' => 'Delete', + 'download-sample' => 'Download Sample', + 'field-separator' => 'Field Separator', + 'file' => 'File', + 'general' => 'General', + 'images-directory' => 'Images Directory Path', + 'process-in-queue' => 'Process In Queue', + 'results' => 'Results', + 'save-btn' => 'Save Import', + 'settings' => 'Settings', + 'skip-errors' => 'Skip Errors', + 'stop-on-errors' => 'Stop on Errors', + 'title' => 'Edit Import', + 'type' => 'Type', + 'validation-strategy' => 'Validation Strategy', + ], + + 'index' => [ + 'button-title' => 'Create Import', + 'title' => 'Imports', + + 'datagrid' => [ + 'actions' => 'Actions', + 'completed-at' => 'Completed At', + 'created' => 'Created', + 'delete' => 'Delete', + 'deleted' => 'Deleted', + 'edit' => 'Edit', + 'error-file' => 'Error File', + 'id' => 'ID', + 'started-at' => 'Started At', + 'state' => 'State', + 'summary' => 'Summary', + 'type' => 'Type', + 'updated' => 'Updated', + 'uploaded-file' => 'Uploaded File', + ], + ], + + 'import' => [ + 'back-btn' => 'Back', + 'completed-batches' => 'Total Batches Completed:', + 'download-error-report' => 'Download Full Report', + 'edit-btn' => 'Edit', + 'imported-info' => 'Congratulations! Your import was successful.', + 'importing-info' => 'Import In Process', + 'indexing-info' => 'Resources Indexing (Price, Inventory and Elastic Search) In Progress', + 'linking-info' => 'Resources Linking In Progress', + 'progress' => 'Progress:', + 'title' => 'Import', + 'total-batches' => 'Total Batches:', + 'total-created' => 'Total Records Created:', + 'total-deleted' => 'Total Records Deleted:', + 'total-errors' => 'Total Errors:', + 'total-invalid-rows' => 'Total Invalid Rows:', + 'total-rows-processed' => 'Total Rows Processed:', + 'total-updated' => 'Total Records Updated:', + 'validate' => 'Validate', + 'validate-info' => 'Click on Validate Data to check your import.', + 'validating-info' => 'The data started reading and Validating', + 'validation-failed-info' => 'Your import is invalid. Please fix the following errors and try again.', + 'validation-success-info' => 'Your import is valid. Click on Import to start the import process.', + ], + + 'create-success' => 'Import created successfully.', + 'delete-failed' => 'Import deletion failed unexpectedly.', + 'delete-success' => 'Import deleted successfully.', + 'not-valid' => 'Import is invalid', + 'nothing-to-import' => 'There are no resources to import.', + 'setup-queue-error' => 'Please change your queue driver to "database" or "redis" to start the import process.', + 'update-success' => 'Import updated successfully.', + ], + ], + ], + + 'activities' => [ + 'index' => [ + 'title' => 'Activities', + + 'datagrid' => [ + 'comment' => 'Comment', + 'created_at' => 'Created At', + 'created_by' => 'Created By', + 'edit' => 'Edit', + 'id' => 'ID', + 'done' => 'Is Done', + 'not-done' => 'Not Done', + 'lead' => 'Lead', + 'mass-delete' => 'Mass Delete', + 'mass-update' => 'Mass Update', + 'schedule-from' => 'Schedule From', + 'schedule-to' => 'Schedule To', + 'schedule_from' => 'Schedule From', + 'schedule_to' => 'Schedule To', + 'title' => 'Title', + 'is_done' => 'Is Done', + 'type' => 'Type', + 'update' => 'Update', + 'call' => 'Call', + 'meeting' => 'Meeting', + 'lunch' => 'Lunch', + ], + ], + + 'edit' => [ + 'title' => 'Edit Activity', + 'back-btn' => 'Back', + 'save-btn' => 'Save Activity', + 'type' => 'Activity Type', + 'call' => 'Call', + 'meeting' => 'Meeting', + 'lunch' => 'Lunch', + 'schedule_to' => 'Schedule To', + 'schedule_from' => 'Schedule From', + 'location' => 'Location', + 'comment' => 'Comment', + 'lead' => 'Lead', + 'participants' => 'Participants', + 'general' => 'General', + 'persons' => 'Persons', + 'no-result-found' => 'Records not found.', + 'users' => 'Users', + ], + + 'updated' => 'Updated :attribute', + 'created' => 'Created', + 'duration-overlapping' => 'Participants have another meeting at this time. Do you want to continue?', + 'create-success' => 'Activity created successfully.', + 'update-success' => 'Activity updated successfully.', + 'overlapping-error' => 'Participants have another meeting at this time.', + 'destroy-success' => 'Activity deleted successfully.', + 'delete-failed' => 'Activity can not be deleted.', + 'mass-update-success' => 'Activities updated successfully.', + 'mass-destroy-success' => 'Activities deleted successfully.', + 'mass-delete-failed' => 'Activities can not be deleted.', + ], + + 'mail' => [ + 'index' => [ + 'compose' => 'Compose', + 'draft' => 'Draft', + 'inbox' => 'Inbox', + 'outbox' => 'Outbox', + 'sent' => 'Sent', + 'trash' => 'Trash', + 'compose-mail-btn' => 'Compose Mail', + 'btn' => 'Mail', + 'mail' => [ + 'title' => 'Compose Mail', + 'to' => 'To', + 'enter-emails' => 'Press enter to add emails', + 'cc' => 'CC', + 'bcc' => 'BCC', + 'subject' => 'Subject', + 'send-btn' => 'Send', + 'message' => 'Message', + 'draft' => 'Draft', + ], + + 'datagrid' => [ + 'id' => 'ID', + 'from' => 'From', + 'to' => 'To', + 'subject' => 'Subject', + 'tags' => 'Tags', + 'content' => 'Content', + 'attachments' => 'Attachments', + 'date' => 'Date', + 'move-to-inbox' => 'Moved To Inbox', + 'move-to-trash' => 'Moved To Trash', + 'edit' => 'Edit', + 'view' => 'View', + 'delete' => 'Delete', + ], + ], + + 'create-success' => 'Email sent successfully.', + 'update-success' => 'Email updated successfully.', + 'mass-update-success' => 'Emails updated successfully.', + 'delete-success' => 'Email deleted successfully.', + 'delete-failed' => 'Email can not be deleted.', + + 'view' => [ + 'title' => 'Mails', + 'subject' => ':subject', + 'link-mail' => 'Link Mail', + 'to' => 'To', + 'cc' => 'CC', + 'bcc' => 'BCC', + 'reply' => 'Reply', + 'reply-all' => 'Reply All', + 'forward' => 'Forward', + 'delete' => 'Delete', + 'enter-mails' => 'Enter email id', + 'rotten-days' => 'Lead is rotten for :days days', + 'search-an-existing-lead' => 'Search an existing lead', + 'search-an-existing-contact' => 'Search an existing contact', + 'message' => 'Message', + 'add-attachments' => 'Add Attachments', + 'discard' => 'Discard', + 'send' => 'Send', + 'no-result-found' => 'No Results found', + 'add-new-contact' => 'Add New Contact', + 'description' => 'Description', + 'search' => 'Search...', + 'add-new-lead' => 'Add New Lead', + 'create-new-contact' => 'Create New Contact', + 'save-contact' => 'Save Contact', + 'create-lead' => 'Create Lead', + 'linked-contact' => 'Linked Contact', + 'link-to-contact' => 'Link To Contact', + 'link-to-lead' => 'Link To Lead', + 'linked-lead' => 'Linked Lead', + 'lead-details' => 'Lead Details', + 'contact-person' => 'Contact Person', + 'product' => 'Product', + + 'tags' => [ + 'create-success' => 'Tag created successfully.', + 'destroy-success' => 'Tag deleted successfully.', + ], + ], + ], + + 'common' => [ + 'custom-attributes' => [ + 'add-more' => 'Add More', + 'address' => 'Address', + 'city' => 'City', + 'contact' => 'Contact Numbers', + 'country' => 'Country', + 'email' => 'Email', + 'home' => 'Home', + 'postcode' => 'Postcode', + 'save' => 'Save', + 'select' => 'Select', + 'select-country' => 'Select Country', + 'select-state' => 'Select State', + 'state' => 'State', + 'update-contact-title' => 'Update Contact Numbers', + 'update-emails-title' => 'Update Contact Emails', + 'work' => 'Work', + ], + ], + + 'leads' => [ + 'create-success' => 'Lead created successfully.', + 'update-success' => 'Leads updated successfully.', + 'update-failed' => 'Leads can not be deleted.', + 'destroy-success' => 'Lead deleted successfully.', + 'destroy-failed' => 'Lead can not be deleted.', + + 'file' => [ + 'data-not-found' => 'Data not found.', + 'empty-content' => 'PDF content is empty or could not be extracted.', + 'failed-extract' => 'Failed to extract text from file.', + 'insufficient-info' => 'Due to insufficient data, we are unable to process your request at the moment.', + 'invalid-base64' => 'Invalid base64 format.', + 'invalid-format' => 'Invalid JSON format.', + 'invalid-response' => 'Invalid AI response format.', + 'missing-api-key' => 'Missing API key or model configuration.', + 'not-found' => 'File not found.', + 'recursive-call' => 'Recursive call detected.', + 'text-generation-failed' => 'Text extraction failed. The file might be empty or unreadable.', + ], + + 'index' => [ + 'title' => 'Leads', + 'create-btn' => 'Create Lead', + + 'datagrid' => [ + 'id' => 'ID', + 'sales-person' => 'Sales Person', + 'subject' => 'Subject', + 'source' => 'Source', + 'lead-value' => 'Lead Value', + 'lead-type' => 'Lead Type', + 'tag-name' => 'Tag Name', + 'contact-person' => 'Contact Person', + 'stage' => 'Stage', + 'rotten-lead' => 'Rotten Lead', + 'date-to' => 'Date To', + 'created-at' => 'Created At', + 'no' => 'No', + 'yes' => 'Yes', + 'delete' => 'Delete', + 'mass-delete' => 'Mass Delete', + 'mass-update' => 'Mass Update', + ], + + 'kanban' => [ + 'rotten-days' => 'Lead is rotten for :days days', + 'empty-list' => 'Your Leads List is Empty', + 'empty-list-description' => 'Create a lead to organize your goals.', + 'create-lead-btn' => 'Create Lead', + + 'columns' => [ + 'contact-person' => 'Contact Person', + 'id' => 'ID', + 'lead-type' => 'Lead Type', + 'lead-value' => 'Lead Value', + 'sales-person' => 'Sales Person', + 'source' => 'Source', + 'title' => 'Title', + 'tags' => 'Tags', + 'expected-close-date' => 'Expected Close Date', + 'created-at' => 'Created At', + ], + + 'toolbar' => [ + 'search' => [ + 'title' => 'Search by Title', + ], + + 'filters' => [ + 'apply-filters' => 'Apply Filters', + 'clear-all' => 'Clear All', + 'filter' => 'Filter', + 'filters' => 'Filters', + 'from' => 'From', + 'select' => 'Select', + 'to' => 'To', + ], + ], + ], + + 'view-switcher' => [ + 'all-pipelines' => 'All Pipelines', + 'create-new-pipeline' => 'Create New Pipeline', + ], + + 'upload' => [ + 'create-lead' => 'Create Lead Using AI', + 'file' => 'File Upload', + 'file-info' => 'Only pdf,bmp,jpg,jpeg,png format files are accepted.', + 'file-required' => 'Please select at least one valid file to proceed.', + 'save-btn' => 'Save', + 'upload-file' => 'Upload File', + ], + ], + + 'create' => [ + 'title' => 'Create Lead', + 'save-btn' => 'Save', + 'details' => 'Details', + 'details-info' => 'Put The Basic Information of the Lead', + 'contact-person' => 'Contact Person', + 'contact-info' => 'Information About the Contact Person', + 'products' => 'Products', + 'products-info' => 'Information About the Products', + ], + + 'edit' => [ + 'title' => 'Edit Lead', + 'save-btn' => 'Save', + 'details' => 'Details', + 'details-info' => 'Put The Basic Information of the Lead', + 'contact-person' => 'Contact Person', + 'contact-info' => 'Information About the Contact Person', + 'products' => 'Products', + 'products-info' => 'Information About the Products', + ], + + 'common' => [ + 'contact' => [ + 'name' => 'Name', + 'email' => 'Email', + 'contact-number' => 'Contact Number', + 'organization' => 'Organization', + ], + + 'products' => [ + 'product-name' => 'Product Name', + 'quantity' => 'Quantity', + 'price' => 'Price', + 'amount' => 'Amount', + 'action' => 'Action', + 'add-more' => 'Add More', + 'total' => 'Total', + ], + ], + + 'view' => [ + 'title' => 'Lead: :title', + 'rotten-days' => ':days Days', + + 'tabs' => [ + 'description' => 'Description', + 'products' => 'Products', + 'quotes' => 'Quotes', + ], + + 'attributes' => [ + 'title' => 'About Lead', + ], + + 'quotes' => [ + 'subject' => 'Subject', + 'expired-at' => 'Expired At', + 'sub-total' => 'Sub Total', + 'discount' => 'Discount', + 'tax' => 'Tax', + 'adjustment' => 'Adjustment', + 'grand-total' => 'Grand Total', + 'delete' => 'Delete', + 'edit' => 'Edit', + 'download' => 'Download', + 'destroy-success' => 'Quote deleted successfully.', + 'empty-title' => 'No Quotes Found', + 'empty-info' => 'No Quotes Found for this Lead', + 'add-btn' => 'Add Quote', + ], + + 'products' => [ + 'product-name' => 'Product Name', + 'quantity' => 'Quantity', + 'price' => 'Price', + 'amount' => 'Amount', + 'action' => 'Action', + 'add-more' => 'Add More', + 'total' => 'Total', + 'empty-title' => 'No Products Found', + 'empty-info' => 'No Products Found for this Lead', + 'add-product' => 'Add Product', + ], + + 'persons' => [ + 'title' => 'About Persons', + 'job-title' => ':job_title at :organization', + ], + + 'stages' => [ + 'won-lost' => 'Won/Lost', + 'won' => 'Won', + 'lost' => 'Lost', + 'need-more-info' => 'Need More Details', + 'closed-at' => 'Closed At', + 'won-value' => 'Won Value', + 'lost-reason' => 'Lost Reason', + 'save-btn' => 'Save', + ], + + 'tags' => [ + 'create-success' => 'Tag created successfully.', + 'destroy-success' => 'Tag deleted successfully.', + ], + ], + ], + + 'configuration' => [ + 'index' => [ + 'back' => 'Back', + 'delete' => 'Delete', + 'save-btn' => 'Save Configuration', + 'save-success' => 'Configuration Saved Successfully.', + 'search' => 'Search', + 'select-country' => 'Select Country', + 'select-state' => 'Select State', + 'title' => 'Configuration', + + 'general' => [ + 'title' => 'General', + 'info' => 'General Configuration', + + 'general' => [ + 'title' => 'General', + 'info' => 'Update your general settings here.', + 'locale-settings' => [ + 'title' => 'Locale Settings', + 'title-info' => 'Defines the language used in the user interface, such as Arabic (ar), English (en), Spanish (es), Persian(fa) and Turkish (tr).', + ], + + 'admin-logo' => [ + 'logo-image' => 'Logo Image', + 'title' => 'Admin Logo', + 'title-info' => 'Configure logo image for your admin panel.', + ], + ], + + 'settings' => [ + 'title' => 'Settings', + 'info' => 'Update your settings here.', + + 'footer' => [ + 'info' => 'We can configure the powered by section here.', + 'powered-by' => 'Powered by text editor', + 'title' => 'Powered by Section Configurations', + ], + + 'menu' => [ + 'activities' => 'Activities', + 'configuration' => 'Configuration', + 'contacts' => 'Contacts', + 'dashboard' => 'Dashboard', + 'draft' => 'Draft', + 'inbox' => 'Inbox', + 'info' => 'We can configure the menu items name here.', + 'leads' => 'Leads', + 'mail' => 'Mail', + 'organizations' => 'Organizations', + 'outbox' => 'Outbox', + 'persons' => 'Persons', + 'products' => 'Products', + 'quotes' => 'Quotes', + 'sent' => 'Sent', + 'settings' => 'Settings', + 'title' => 'Menu Item Configurations', + 'trash' => 'Trash', + ], + + 'menu-color' => [ + 'brand-color' => 'Brand Color', + 'info' => 'We can change the menu items colors here.', + 'title' => 'Menu Item Color Configurations', + ], + ], + ], + + 'email' => [ + 'title' => 'Email Settings', + 'info' => 'Email configuration for the application.', + + 'imap' => [ + 'title' => 'IMAP Settings', + 'info' => 'IMAP email configuration for receiving emails.', + + 'account' => [ + 'title' => 'IMAP Account', + 'title-info' => 'Configure your IMAP account settings here.', + 'host' => 'Host', + 'port' => 'Port', + 'encryption' => 'Encryption Type', + 'validate-cert' => 'Validate SSL Certificate', + 'username' => 'IMAP Username', + 'password' => 'IMAP Password', + ], + ], + ], + + 'magic-ai' => [ + 'title' => 'Magic AI', + 'info' => 'Magic AI configuration for the application.', + + 'settings' => [ + 'api-key' => 'API Key', + 'api-key-info' => 'Remember to use a OpenRouter API key for each model. It\'s a simple step to enhance security and performance.', + 'enable' => 'Enable', + 'info' => 'Enhance your Magic AI experience with your OpenRouter API Key. Integrate it now for a seamless, personalized AI adventure tailored just for you! Effortlessly customize settings and take control of your AI journey.', + 'other' => 'Other Model', + 'other-model' => 'For other models, use the Model ID from OpenRouter.', + 'doc-generation' => 'DOC Generation', + 'doc-generation-info' => 'Enable the DOC Generation feature to automatically extract data from DOC files and convert them into text format. Enhance your productivity and efficiency by enabling this feature to streamline your workflow.', + 'title' => 'General Settings', + + 'models' => [ + 'deepseek-r1' => 'Deepseek R1 Distill-llama-8b', + 'gemini-2-0-flash-001' => 'Gemini 2.0 flash-001', + 'gpt-4o' => 'GPT-4.0', + 'gpt-4o-mini' => 'GPT-4.0 mini', + 'grok-2-1212' => 'Grok 2.12', + 'llama-3-2-3b-instruct' => 'Llama 3.2 3b Instruct', + 'title' => 'Models', + ], + ], + ], + ], + ], + + 'dashboard' => [ + 'index' => [ + 'title' => 'Dashboard', + + 'revenue' => [ + 'lost-revenue' => 'Lost Revenue', + 'won-revenue' => 'Won Revenue', + ], + + 'over-all' => [ + 'average-lead-value' => 'Average Lead Value', + 'total-leads' => 'Total Leads', + 'average-leads-per-day' => 'Average Leads Per Day', + 'total-quotations' => 'Total Quotations', + 'total-persons' => 'Total Persons', + 'total-organizations' => 'Total Organizations', + ], + + 'total-leads' => [ + 'title' => 'Leads', + 'total' => 'Total Leads', + 'won' => 'Won Leads', + 'lost' => 'Lost Leads', + ], + + 'revenue-by-sources' => [ + 'title' => 'Revenue By Sources', + 'empty-title' => 'No Data Available', + 'empty-info' => 'No data available for selected interval', + ], + + 'revenue-by-types' => [ + 'title' => 'Revenue By Types', + 'empty-title' => 'No Data Available', + 'empty-info' => 'No data available for selected interval', + ], + + 'top-selling-products' => [ + 'title' => 'Top Products', + 'empty-title' => 'No Products Found', + 'empty-info' => 'No products available for selected interval', + ], + + 'top-persons' => [ + 'title' => 'Top Persons', + 'empty-title' => 'No Persons Found', + 'empty-info' => 'No persons available for selected interval', + ], + + 'open-leads-by-states' => [ + 'title' => 'Open Leads By Stages', + 'empty-title' => 'No Data Available', + 'empty-info' => 'No data available for selected interval', + ], + ], + ], + + 'layouts' => [ + 'app-version' => 'Version: :version', + 'dashboard' => 'Dashboard', + 'leads' => 'Leads', + 'quotes' => 'Quotes', + 'quote' => 'Quote', + 'mail' => [ + 'title' => 'Mail', + 'compose' => 'Compose', + 'inbox' => 'Inbox', + 'draft' => 'Draft', + 'outbox' => 'Outbox', + 'sent' => 'Sent', + 'trash' => 'Trash', + 'setting' => 'Setting', + ], + 'activities' => 'Activities', + 'contacts' => 'Contacts', + 'persons' => 'Persons', + 'person' => 'Person', + 'organizations' => 'Organizations', + 'organization' => 'Organization', + 'products' => 'Products', + 'product' => 'Product', + 'settings' => 'Settings', + 'user' => 'User', + 'user-info' => 'Manage all your users and their permissions in the CRM, what they’re allowed to do.', + 'groups' => 'Groups', + 'groups-info' => 'Add, edit or delete groups from CRM', + 'roles' => 'Roles', + 'role' => 'Role', + 'roles-info' => 'Add, edit or delete roles from CRM', + 'users' => 'Users', + 'users-info' => 'Add, edit or delete users from CRM', + 'lead' => 'Lead', + 'lead-info' => 'Manage all your leads related settings in the CRM', + 'pipelines' => 'Pipelines', + 'pipelines-info' => 'Add, edit or delete pipelines from CRM', + 'sources' => 'Sources', + 'sources-info' => 'Add, edit or delete sources from CRM', + 'types' => 'Types', + 'types-info' => 'Add, edit or delete types from CRM', + 'automation' => 'Automation', + 'automation-info' => 'Manage all your automation related settings in the CRM', + 'attributes' => 'Attributes', + 'attribute' => 'Attribute', + 'attributes-info' => 'Add, edit or delete attributes from CRM', + 'email-templates' => 'Email Templates', + 'email' => 'Email', + 'email-templates-info' => 'Add, edit or delete email templates from CRM', + 'events' => 'Events', + 'events-info' => 'Add, edit or delete events from CRM', + 'campaigns' => 'Campaigns', + 'campaigns-info' => 'Add, edit or delete campaigns from CRM', + 'workflows' => 'Workflows', + 'workflows-info' => 'Add, edit or delete workflows from CRM', + 'webhooks' => 'Webhooks', + 'webhooks-info' => 'Add, edit or delete webhooks from CRM', + 'other-settings' => 'Other Settings', + 'other-settings-info' => 'Manage all your extra settings in the CRM', + 'tags' => 'Tags', + 'tags-info' => 'Add, edit or delete tags from CRM', + 'my-account' => 'My Account', + 'sign-out' => 'Sign Out', + 'back' => 'Back', + 'name' => 'Name', + 'configuration' => 'Configuration', + 'activities' => 'Activities', + 'howdy' => 'Howdy!', + 'warehouses' => 'Warehouses', + 'warehouse' => 'Warehouse', + 'warehouses-info' => 'Add, edit or delete warehouses from CRM', + 'data_transfer' => 'Data Transfer', + 'data_transfer_info' => 'Manage persons, products and leads data transfer related settings in the CRM', + ], + + 'user' => [ + 'account' => [ + 'name' => 'Name', + 'email' => 'Email', + 'password' => 'Password', + 'my_account' => 'My account', + 'update_details' => 'Update Details', + 'current_password' => 'Current password', + 'confirm_password' => 'Confirm password', + 'password-match' => 'Current password does not match.', + 'account-save' => 'Account changes saved successfully.', + 'permission-denied' => 'Permission Denied', + 'remove-image' => 'Remove Image', + 'upload_image_pix' => 'Upload a Profile Image (100px x 100px)', + 'upload_image_format' => 'in PNG or JPG Format', + 'image_upload_message' => 'Only images (.jpeg, .jpg, .png, ..) are allowed.', + ], + ], + + 'emails' => [ + 'common' => [ + 'dear' => 'Dear :name', + 'cheers' => 'Cheers,
Team :app_name', + + 'user' => [ + 'dear' => 'Dear :username', + 'create-subject' => 'You are added as a member.', + 'create-body' => 'Congratulations! You are now a member of our team.', + + 'forget-password' => [ + 'subject' => 'Customer Reset Password', + 'dear' => 'Dear :username', + 'reset-password' => 'Reset Password', + 'info' => 'You are receiving this email because we received a password reset request for your account', + 'final-summary' => 'If you did not request a password reset, no further action is required', + 'thanks' => 'Thanks!', + ], + ], + ], + ], + + 'validations' => [ + 'message' => [ + 'decimal' => 'The :attribute must be a decimal.', + ], + ], + + 'errors' => [ + 'dashboard' => 'Dashboard', + 'go-back' => 'Go Back', + 'support' => 'If the problem persists, reach out to us at :email for assistance.', + + '404' => [ + 'description' => 'Oops! The page you\'re looking for is on vacation. It seems we couldn\'t find what you were searching for.', + 'title' => '404 Page Not Found', + ], + + '401' => [ + 'description' => 'Oops! Looks like you\'re not allowed to access this page. It seems you\'re missing the necessary credentials.', + 'title' => '401 Unauthorized', + ], + + '403' => [ + 'description' => 'Oops! This page is off-limits. It appears you don\'t have the required permissions to view this content.', + 'title' => '403 Forbidden', + ], + + '500' => [ + 'description' => 'Oops! Something went wrong. It seems we\'re having trouble loading the page you\'re looking for.', + 'title' => '500 Internal Server Error', + ], + + '503' => [ + 'description' => 'Oops! Looks like we\'re temporarily down for maintenance. Please check back in a bit.', + 'title' => '503 Service Unavailable', + ], + ], + + 'export' => [ + 'csv' => 'CSV', + 'download' => 'Download', + 'export' => 'Export', + 'no-records' => 'Nothing to export', + 'xls' => 'XLS', + 'xlsx' => 'XLSX', + ], +]; diff --git a/packages/Webkul/Admin/src/Resources/lang/es/app.php b/packages/Webkul/Admin/src/Resources/lang/es/app.php new file mode 100644 index 0000000..4a2ce92 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/lang/es/app.php @@ -0,0 +1,2225 @@ + [ + 'leads' => 'Clientes potenciales', + 'lead' => 'Cliente potencial', + 'quotes' => 'Cotizaciones', + 'mail' => 'Correo', + 'inbox' => 'Bandeja de entrada', + 'draft' => 'Borradores', + 'outbox' => 'Bandeja de salida', + 'sent' => 'Enviados', + 'trash' => 'Papelera', + 'activities' => 'Actividades', + 'webhook' => 'Webhook', + 'contacts' => 'Contactos', + 'persons' => 'Personas', + 'organizations' => 'Organizaciones', + 'products' => 'Productos', + 'settings' => 'Configuraciones', + 'groups' => 'Grupos', + 'roles' => 'Roles', + 'users' => 'Usuarios', + 'user' => 'Usuario', + 'automation' => 'Automatización', + 'attributes' => 'Atributos', + 'pipelines' => 'Canales', + 'sources' => 'Fuentes', + 'types' => 'Tipos', + 'email-templates' => 'Plantillas de correo electrónico', + 'workflows' => 'Flujos de trabajo', + 'other-settings' => 'Otras configuraciones', + 'tags' => 'Etiquetas', + 'configuration' => 'Configuración', + 'create' => 'Crear', + 'edit' => 'Editar', + 'view' => 'Ver', + 'print' => 'Imprimir', + 'delete' => 'Eliminar', + 'export' => 'Exportar', + 'mass-delete' => 'Eliminar en masa', + 'data-transfer' => 'Transferencia de Datos', + 'imports' => 'Importaciones', + 'import' => 'Importar', + 'event' => 'Evento', + 'campaigns' => 'Campañas', + ], + 'users' => [ + 'activate-warning' => 'Tu cuenta aún no está activada. Por favor, contacta al administrador.', + 'login-error' => 'Las credenciales no coinciden con nuestros registros.', + 'not-permission' => 'No tienes permiso para acceder al panel de administración.', + 'login' => [ + 'email' => 'Dirección de correo electrónico', + 'forget-password-link' => '¿Olvidaste tu contraseña?', + 'password' => 'Contraseña', + 'submit-btn' => 'Iniciar sesión', + 'title' => 'Iniciar sesión', + ], + 'forget-password' => [ + 'create' => [ + 'email' => 'Correo electrónico registrado', + 'email-not-exist' => 'El correo electrónico no existe', + 'page-title' => 'Olvidé mi contraseña', + 'reset-link-sent' => 'Enlace para restablecer la contraseña enviado', + 'sign-in-link' => '¿Volver a iniciar sesión?', + 'submit-btn' => 'Restablecer', + 'title' => 'Recuperar contraseña', + ], + ], + 'reset-password' => [ + 'back-link-title' => '¿Volver a iniciar sesión?', + 'confirm-password' => 'Confirmar contraseña', + 'email' => 'Correo electrónico registrado', + 'password' => 'Contraseña', + 'submit-btn' => 'Restablecer contraseña', + 'title' => 'Restablecer contraseña', + ], + ], + 'account' => [ + 'edit' => [ + 'back-btn' => 'Regresar', + 'change-password' => 'Cambiar contraseña', + 'confirm-password' => 'Confirmar contraseña', + 'current-password' => 'Contraseña actual', + 'email' => 'Correo electrónico', + 'general' => 'General', + 'invalid-password' => 'La contraseña actual que ingresaste es incorrecta.', + 'name' => 'Nombre', + 'password' => 'Contraseña', + 'profile-image' => 'Imagen de perfil', + 'save-btn' => 'Guardar cuenta', + 'title' => 'Mi cuenta', + 'update-success' => 'Cuenta actualizada con éxito', + 'upload-image-info' => 'Sube una imagen de perfil (110 px × 110 px) en formato PNG o JPG', + ], + ], + 'components' => [ + 'activities' => [ + 'actions' => [ + 'mail' => [ + 'btn' => 'Correo', + 'title' => 'Redactar correo', + 'to' => 'Para', + 'enter-emails' => 'Presiona Enter para agregar direcciones de correo electrónico', + 'cc' => 'CC', + 'bcc' => 'CCO', + 'subject' => 'Asunto', + 'send-btn' => 'Enviar', + 'message' => 'Mensaje', + ], + 'file' => [ + 'btn' => 'Archivo', + 'title' => 'Agregar archivo', + 'title-control' => 'Título', + 'name' => 'Nombre', + 'description' => 'Descripción', + 'file' => 'Archivo', + 'save-btn' => 'Guardar archivo', + ], + 'note' => [ + 'btn' => 'Nota', + 'title' => 'Agregar nota', + 'comment' => 'Comentario', + 'save-btn' => 'Guardar nota', + ], + 'activity' => [ + 'btn' => 'Actividad', + 'title' => 'Agregar actividad', + 'title-control' => 'Título', + 'description' => 'Descripción', + 'schedule-from' => 'Programar desde', + 'schedule-to' => 'Programar hasta', + 'location' => 'Ubicación', + 'call' => 'Llamada', + 'meeting' => 'Reunión', + 'lunch' => 'Almuerzo', + 'save-btn' => 'Guardar actividad', + 'participants' => [ + 'title' => 'Participantes', + 'placeholder' => 'Escribe para buscar participantes', + 'users' => 'Usuarios', + 'persons' => 'Personas', + 'no-results' => 'No se encontraron resultados...', + ], + ], + ], + 'index' => [ + 'all' => 'Todo', + 'bcc' => 'CCO', + 'by-user' => 'Por :user', + 'calls' => 'Llamadas', + 'cc' => 'CC', + 'change-log' => 'Registros de cambios', + 'delete' => 'Eliminar', + 'edit' => 'Editar', + 'emails' => 'Correos electrónicos', + 'empty' => 'Vacío', + 'files' => 'Archivos', + 'from' => 'De', + 'location' => 'Ubicación', + 'lunches' => 'Almuerzos', + 'mark-as-done' => 'Marcar como hecho', + 'meetings' => 'Reuniones', + 'notes' => 'Notas', + 'participants' => 'Participantes', + 'planned' => 'Planificado', + 'quotes' => 'Cotizaciones', + 'scheduled-on' => 'Programado en', + 'system' => 'Sistema', + 'to' => 'A', + 'unlink' => 'Desvincular', + 'view' => 'Ver', + 'empty-placeholders' => [ + 'all' => [ + 'title' => 'No se encontraron actividades', + 'description' => 'No se encontraron actividades para esto. Puedes agregar actividades haciendo clic en el botón Actividad en el panel izquierdo.', + ], + 'planned' => [ + 'title' => 'No se encontraron actividades planificadas', + 'description' => 'No se encontraron actividades planificadas para esto. Puedes agregarlas haciendo clic en el botón Actividad en el panel izquierdo.', + ], + 'notes' => [ + 'title' => 'No se encontraron notas', + 'description' => 'No se encontraron notas para esto. Puedes agregarlas haciendo clic en el botón Nota en el panel izquierdo.', + ], + 'calls' => [ + 'title' => 'No se encontraron llamadas', + 'description' => 'No se encontraron llamadas para esto. Puedes agregarlas haciendo clic en el botón Actividad en el panel izquierdo y seleccionando el tipo Llamada.', + ], + 'meetings' => [ + 'title' => 'No se encontraron reuniones', + 'description' => 'No se encontraron reuniones para esto. Puedes agregarlas haciendo clic en el botón Actividad en el panel izquierdo y seleccionando el tipo Reunión.', + ], + 'lunches' => [ + 'title' => 'No se encontraron almuerzos', + 'description' => 'No se encontraron almuerzos para esto. Puedes agregarlos haciendo clic en el botón Actividad en el panel izquierdo y seleccionando el tipo Almuerzo.', + ], + 'files' => [ + 'title' => 'No se encontraron archivos', + 'description' => 'No se encontraron archivos para esto. Puedes agregarlos haciendo clic en el botón Archivo en el panel izquierdo.', + ], + 'emails' => [ + 'title' => 'No se encontraron correos electrónicos', + 'description' => 'No se encontraron correos electrónicos para esto. Puedes agregarlos haciendo clic en el botón Correo en el panel izquierdo.', + ], + 'system' => [ + 'title' => 'No se encontraron registros de cambios', + 'description' => 'No se encontraron registros de cambios para esto.', + ], + ], + ], + ], + 'media' => [ + 'images' => [ + 'add-image-btn' => 'Agregar imagen', + 'ai-add-image-btn' => 'Inteligencia artificial mágica', + 'allowed-types' => 'png, jpeg, jpg', + 'not-allowed-error' => 'Solo se aceptan archivos de imagen (.jpeg, .jpg, .png, ..)', + 'placeholders' => [ + 'front' => 'Frontal', + 'next' => 'Siguiente', + 'size' => 'Tamaño', + 'use-cases' => 'Casos de uso', + 'zoom' => 'Acercar', + ], + ], + 'videos' => [ + 'add-video-btn' => 'Agregar video', + 'allowed-types' => 'mp4, webm, mkv', + 'not-allowed-error' => 'Solo se aceptan archivos de video (.mp4, .mov, .ogg ..)', + ], + ], + 'datagrid' => [ + 'index' => [ + 'no-records-selected' => 'No se han seleccionado registros.', + 'must-select-a-mass-action-option' => 'Debes seleccionar una opción de acción en masa.', + 'must-select-a-mass-action' => 'Debes seleccionar una acción en masa.', + ], + 'toolbar' => [ + 'length-of' => ':length de', + 'of' => 'de', + 'per-page' => 'Por Página', + 'results' => ':total Resultados', + 'delete' => 'Eliminar', + 'selected' => ':total Elementos Seleccionados', + 'mass-actions' => [ + 'submit' => 'Enviar', + 'select-option' => 'Seleccionar Opción', + 'select-action' => 'Seleccionar Acción', + ], + 'filter' => [ + 'apply-filters-btn' => 'Aplicar Filtros', + 'back-btn' => 'Regresar', + 'create-new-filter' => 'Crear Nuevo Filtro', + 'custom-filters' => 'Filtros Personalizados', + 'delete-error' => 'Hubo un error al eliminar el filtro, por favor intente de nuevo.', + 'delete-success' => 'Filtro eliminado con éxito.', + 'empty-description' => 'No hay filtros seleccionados disponibles para guardar. Por favor, seleccione filtros para guardar.', + 'empty-title' => 'Agregar Filtros para Guardar', + 'name' => 'Nombre', + 'quick-filters' => 'Filtros Rápidos', + 'save-btn' => 'Guardar', + 'save-filter' => 'Guardar Filtro', + 'saved-success' => 'Filtro guardado con éxito.', + 'selected-filters' => 'Filtros Seleccionados', + 'title' => 'Filtro', + 'update' => 'Actualizar', + 'update-filter' => 'Actualizar Filtro', + 'updated-success' => 'Filtro actualizado con éxito.', + ], + 'search' => [ + 'title' => 'Buscar', + ], + ], + 'filters' => [ + 'select' => 'Seleccionar', + 'title' => 'Filtros', + 'dropdown' => [ + 'searchable' => [ + 'at-least-two-chars' => 'Escribe al menos 2 caracteres...', + 'no-results' => 'No se encontraron resultados...', + ], + ], + 'custom-filters' => [ + 'clear-all' => 'Borrar Todo', + 'title' => 'Filtros Personalizados', + ], + 'boolean-options' => [ + 'false' => 'Falso', + 'true' => 'Verdadero', + ], + 'date-options' => [ + 'last-month' => 'Mes Pasado', + 'last-six-months' => 'Últimos 6 Meses', + 'last-three-months' => 'Últimos 3 Meses', + 'this-month' => 'Este Mes', + 'this-week' => 'Esta Semana', + 'this-year' => 'Este Año', + 'today' => 'Hoy', + 'yesterday' => 'Ayer', + ], + ], + 'table' => [ + 'actions' => 'Acciones', + 'no-records-available' => 'No hay Registros Disponibles.', + ], + ], + 'modal' => [ + 'confirm' => [ + 'agree-btn' => 'Aceptar', + 'disagree-btn' => 'Rechazar', + 'message' => '¿Estás seguro de que quieres realizar esta acción?', + 'title' => '¿Estás seguro?', + ], + ], + 'tags' => [ + 'index' => [ + 'title' => 'Etiquetas', + 'added-tags' => 'Etiquetas Agregadas', + 'save-btn' => 'Guardar Etiqueta', + 'placeholder' => 'Escribe para buscar etiquetas', + 'add-tag' => 'Agregar \\":term\\"...', + 'aquarelle-red' => 'Rojo Aquarelle', + 'crushed-cashew' => 'Anacardo Triturado', + 'beeswax' => 'Cera de Abejas', + 'lemon-chiffon' => 'Chiffon de Limón', + 'snow-flurry' => 'Tormenta de Nieve', + 'honeydew' => 'Melón', + ], + ], + 'layouts' => [ + 'powered-by' => [ + 'description' => 'Desarrollado por :krayin, un proyecto de código abierto de :webkul.', + ], + 'header' => [ + 'mega-search' => [ + 'title' => 'Búsqueda Mega', + 'tabs' => [ + 'leads' => 'Oportunidades', + 'quotes' => 'Cotizaciones', + 'persons' => 'Personas', + 'products' => 'Productos', + ], + 'explore-all-products' => 'Explorar todos los Productos', + 'explore-all-leads' => 'Explorar todas las Oportunidades', + 'explore-all-contacts' => 'Explorar todos los Contactos', + 'explore-all-quotes' => 'Explorar todas las Cotizaciones', + 'explore-all-matching-products' => 'Explorar todos los productos que coinciden con ":query" (:count)', + 'explore-all-matching-leads' => 'Explorar todas las oportunidades que coinciden con ":query" (:count)', + 'explore-all-matching-contacts' => 'Explorar todos los contactos que coinciden con ":query" (:count)', + 'explore-all-matching-quotes' => 'Explorar todas las cotizaciones que coinciden con ":query" (:count)', + ], + ], + ], + 'attributes' => [ + 'edit' => [ + 'delete' => 'Eliminar', + ], + 'lookup' => [ + 'click-to-add' => 'Haz clic para agregar', + 'search' => 'Buscar...', + 'no-result-found' => 'No se encontraron resultados', + ], + ], + 'lookup' => [ + 'click-to-add' => 'Haz clic para agregar', + 'no-results' => 'No se encontraron resultados', + 'add-as-new' => 'Agregar como nuevo', + 'search' => 'Buscar...', + ], + 'flash-group' => [ + 'success' => 'Éxito', + 'error' => 'Error', + 'warning' => 'Advertencia', + 'info' => 'Información', + ], + 'tiny-mce' => [ + 'http-error' => 'Error HTTP', + 'invalid-json' => 'Respuesta JSON no válida del servidor.', + 'upload-failed' => 'Error al subir el archivo. Por favor, inténtelo de nuevo.', + ], + ], + 'quotes' => [ + 'index' => [ + 'title' => 'Cotizaciones', + 'create-btn' => 'Crear Cotización', + 'create-success' => 'Cotización creada con éxito.', + 'update-success' => 'Cotización actualizada con éxito.', + 'delete-success' => 'Cotización eliminada con éxito.', + 'delete-failed' => 'No se puede eliminar la cotización.', + 'datagrid' => [ + 'subject' => 'Asunto', + 'sales-person' => 'Vendedor', + 'expired-at' => 'Vence en', + 'created-at' => 'Creado en', + 'person' => 'Persona', + 'subtotal' => 'Subtotal', + 'discount' => 'Descuento', + 'tax' => 'Impuesto', + 'adjustment' => 'Ajuste', + 'grand-total' => 'Total General', + 'edit' => 'Editar', + 'delete' => 'Eliminar', + 'print' => 'Imprimir', + ], + 'pdf' => [ + 'adjustment' => 'Ajuste', + 'amount' => 'Monto', + 'billing-address' => 'Dirección de Facturación', + 'date' => 'Fecha', + 'discount' => 'Descuento', + 'expired-at' => 'Vence en', + 'grand-total' => 'Total General', + 'person' => 'Persona', + 'price' => 'Precio', + 'product-name' => 'Nombre del Producto', + 'quantity' => 'Cantidad', + 'quote-id' => 'ID de Cotización', + 'sales-person' => 'Vendedor', + 'shipping-address' => 'Dirección de Envío', + 'sku' => 'SKU', + 'sub-total' => 'Subtotal', + 'subject' => 'Asunto', + 'tax' => 'Impuesto', + 'title' => 'Cotización', + ], + ], + 'create' => [ + 'title' => 'Crear Cotización', + 'save-btn' => 'Guardar Cotización', + 'quote-info' => 'Información de la Cotización', + 'quote-info-info' => 'Introduce la información básica de la cotización.', + 'address-info' => 'Información de la Dirección', + 'address-info-info' => 'Información sobre la dirección relacionada con la cotización.', + 'quote-items' => 'Artículos de la Cotización', + 'search-products' => 'Buscar Productos', + 'link-to-lead' => 'Vincular a cliente potencial', + 'quote-item-info' => 'Agregar Solicitud de Producto para esta cotización.', + 'quote-name' => 'Nombre de la Cotización', + 'quantity' => 'Cantidad', + 'price' => 'Precio', + 'discount' => 'Descuento', + 'tax' => 'Impuesto', + 'total' => 'Total', + 'amount' => 'Monto', + 'add-item' => '+ Agregar Artículo', + 'sub-total' => 'Subtotal (:symbol)', + 'total-discount' => 'Descuento (:symbol)', + 'total-tax' => 'Impuesto (:symbol)', + 'total-adjustment' => 'Ajuste (:symbol)', + 'grand-total' => 'Total General (:symbol)', + 'discount-amount' => 'Monto del Descuento', + 'tax-amount' => 'Monto del Impuesto', + 'adjustment-amount' => 'Monto del Ajuste', + 'product-name' => 'Nombre del Producto', + 'action' => 'Acción', + ], + 'edit' => [ + 'title' => 'Editar Cotización', + 'save-btn' => 'Guardar Cotización', + 'quote-info' => 'Información de la Cotización', + 'quote-info-info' => 'Introduce la información básica de la cotización.', + 'address-info' => 'Información de la Dirección', + 'address-info-info' => 'Información sobre la dirección relacionada con la cotización.', + 'quote-items' => 'Artículos de la Cotización', + 'link-to-lead' => 'Vincular a cliente potencial', + 'quote-item-info' => 'Agregar Solicitud de Producto para esta cotización.', + 'quote-name' => 'Nombre de la Cotización', + 'quantity' => 'Cantidad', + 'price' => 'Precio', + 'search-products' => 'Buscar Productos', + 'discount' => 'Descuento', + 'tax' => 'Impuesto', + 'total' => 'Total', + 'amount' => 'Monto', + 'add-item' => '+ Agregar Artículo', + 'sub-total' => 'Subtotal (:symbol)', + 'total-discount' => 'Descuento (:symbol)', + 'total-tax' => 'Impuesto (:symbol)', + 'total-adjustment' => 'Ajuste (:symbol)', + 'grand-total' => 'Total General (:symbol)', + 'discount-amount' => 'Monto del Descuento', + 'tax-amount' => 'Monto del Impuesto', + 'adjustment-amount' => 'Monto del Ajuste', + 'product-name' => 'Nombre del Producto', + 'action' => 'Acción', + ], + ], + 'contacts' => [ + 'persons' => [ + 'index' => [ + 'title' => 'Personas', + 'create-btn' => 'Crear Persona', + 'create-success' => 'Persona creada con éxito.', + 'update-success' => 'Persona actualizada con éxito.', + 'all-delete-success' => 'Todas las personas seleccionadas fueron eliminadas exitosamente.', + 'partial-delete-warning' => 'Algunas personas fueron eliminadas con éxito. Otras no se pudieron eliminar porque están vinculadas a clientes potenciales.', + 'none-delete-warning' => 'Ninguna de las personas seleccionadas pudo ser eliminada porque están vinculadas a clientes potenciales.', + 'no-selection' => 'No se seleccionaron personas para eliminar.', + 'delete-failed' => 'No se pudieron eliminar las personas seleccionadas.', + 'datagrid' => [ + 'contact-numbers' => 'Números de Contacto', + 'delete' => 'Eliminar', + 'edit' => 'Editar', + 'emails' => 'Correos Electrónicos', + 'id' => 'ID', + 'view' => 'Ver', + 'name' => 'Nombre', + 'organization-name' => 'Nombre de la Organización', + ], + ], + 'view' => [ + 'title' => ':name', + 'about-person' => 'Sobre la Persona', + 'about-organization' => 'Acerca de la organización', + 'activities' => [ + 'index' => [ + 'all' => 'Todos', + 'calls' => 'Llamadas', + 'meetings' => 'Reuniones', + 'lunches' => 'Almuerzos', + 'files' => 'Archivos', + 'quotes' => 'Cotizaciones', + 'notes' => 'Notas', + 'emails' => 'Correos Electrónicos', + 'by-user' => 'Por :user', + 'scheduled-on' => 'Programado para', + 'location' => 'Ubicación', + 'participants' => 'Participantes', + 'mark-as-done' => 'Marcar como Hecho', + 'delete' => 'Eliminar', + 'edit' => 'Editar', + ], + 'actions' => [ + 'mail' => [ + 'btn' => 'Correo', + 'title' => 'Redactar Correo', + 'to' => 'Para', + 'cc' => 'CC', + 'bcc' => 'CCO', + 'subject' => 'Asunto', + 'send-btn' => 'Enviar', + 'message' => 'Mensaje', + ], + 'file' => [ + 'btn' => 'Archivo', + 'title' => 'Agregar Archivo', + 'title-control' => 'Título', + 'name' => 'Nombre del Archivo', + 'description' => 'Descripción', + 'file' => 'Archivo', + 'save-btn' => 'Guardar Archivo', + ], + 'note' => [ + 'btn' => 'Nota', + 'title' => 'Agregar Nota', + 'comment' => 'Comentario', + 'save-btn' => 'Guardar Nota', + ], + 'activity' => [ + 'btn' => 'Actividad', + 'title' => 'Agregar Actividad', + 'title-control' => 'Título', + 'description' => 'Descripción', + 'schedule-from' => 'Programar Desde', + 'schedule-to' => 'Programar Hasta', + 'location' => 'Ubicación', + 'call' => 'Llamada', + 'meeting' => 'Reunión', + 'lunch' => 'Almuerzo', + 'save-btn' => 'Guardar Actividad', + ], + ], + ], + 'tags' => [ + 'create-success' => 'Etiqueta creada con éxito.', + 'destroy-success' => 'Etiqueta eliminada con éxito.', + ], + ], + 'create' => [ + 'title' => 'Crear Persona', + 'save-btn' => 'Guardar Persona', + ], + 'edit' => [ + 'title' => 'Editar Persona', + 'save-btn' => 'Guardar Persona', + ], + ], + 'organizations' => [ + 'index' => [ + 'title' => 'Organizaciones', + 'create-btn' => 'Crear Organización', + 'create-success' => 'Organización creada con éxito.', + 'update-success' => 'Organización actualizada con éxito.', + 'delete-success' => 'Organización eliminada con éxito.', + 'delete-failed' => 'No se puede eliminar la organización.', + 'datagrid' => [ + 'delete' => 'Eliminar', + 'edit' => 'Editar', + 'id' => 'ID', + 'name' => 'Nombre', + 'persons-count' => 'Número de Personas', + ], + ], + 'create' => [ + 'title' => 'Crear Organización', + 'save-btn' => 'Guardar Organización', + ], + 'edit' => [ + 'title' => 'Editar Organización', + 'save-btn' => 'Guardar Organización', + ], + ], + ], + 'products' => [ + 'index' => [ + 'title' => 'Productos', + 'create-btn' => 'Crear Producto', + 'create-success' => 'Producto creado con éxito.', + 'update-success' => 'Producto actualizado con éxito.', + 'delete-success' => 'Producto eliminado con éxito.', + 'delete-failed' => 'No se puede eliminar el producto.', + 'datagrid' => [ + 'allocated' => 'Asignado', + 'delete' => 'Eliminar', + 'edit' => 'Editar', + 'id' => 'ID', + 'in-stock' => 'En Stock', + 'name' => 'Nombre', + 'on-hand' => 'Disponible', + 'tag-name' => 'Nombre de etiqueta', + 'price' => 'Precio', + 'sku' => 'SKU', + 'view' => 'Ver', + ], + ], + 'create' => [ + 'save-btn' => 'Guardar Productos', + 'title' => 'Crear Productos', + 'general' => 'General', + 'price' => 'Precio', + ], + 'edit' => [ + 'title' => 'Editar Productos', + 'save-btn' => 'Guardar Productos', + 'general' => 'General', + 'price' => 'Precio', + ], + 'view' => [ + 'sku' => 'SKU', + 'all' => 'Todos', + 'notes' => 'Notas', + 'files' => 'Archivos', + 'inventories' => 'Inventario', + 'change-logs' => 'Registros de Cambios', + 'attributes' => [ + 'about-product' => 'Sobre el Producto', + ], + 'inventory' => [ + 'source' => 'Fuente', + 'in-stock' => 'En Stock', + 'allocated' => 'Asignado', + 'on-hand' => 'Disponible', + 'actions' => 'Acciones', + 'assign' => 'Asignar', + 'add-source' => 'Agregar Fuente', + 'location' => 'Ubicación', + 'add-more' => 'Agregar Más', + 'save' => 'Guardar', + ], + ], + ], + 'settings' => [ + 'title' => 'Configuraciones', + 'groups' => [ + 'index' => [ + 'create-btn' => 'Crear Grupo', + 'title' => 'Grupos', + 'create-success' => 'Grupo creado con éxito.', + 'update-success' => 'Grupo actualizado con éxito.', + 'destroy-success' => 'Grupo eliminado con éxito.', + 'delete-failed' => 'No se puede eliminar el grupo.', + 'delete-failed-associated-users' => 'No se puede eliminar el grupo, ya que está siendo utilizado por usuarios.', + 'datagrid' => [ + 'delete' => 'Eliminar', + 'description' => 'Descripción', + 'edit' => 'Editar', + 'id' => 'ID', + 'name' => 'Nombre', + ], + 'edit' => [ + 'title' => 'Editar Grupo', + ], + 'create' => [ + 'name' => 'Nombre', + 'title' => 'Crear Grupo', + 'description' => 'Descripción', + 'save-btn' => 'Guardar Grupo', + ], + ], + ], + 'roles' => [ + 'index' => [ + 'being-used' => 'El rol no se puede eliminar, ya que está siendo utilizado por un usuario administrador.', + 'create-btn' => 'Crear Roles', + 'create-success' => 'Rol creado con éxito.', + 'current-role-delete-error' => 'No se puede eliminar el rol asignado al usuario actual.', + 'delete-failed' => 'No se puede eliminar el rol.', + 'delete-success' => 'Rol eliminado con éxito.', + 'last-delete-error' => 'Se requiere al menos un rol.', + 'settings' => 'Configuraciones', + 'title' => 'Roles', + 'update-success' => 'Rol actualizado con éxito.', + 'user-define-error' => 'No se puede eliminar el rol del sistema.', + 'datagrid' => [ + 'all' => 'Todos', + 'custom' => 'Personalizado', + 'delete' => 'Eliminar', + 'description' => 'Descripción', + 'edit' => 'Editar', + 'id' => 'ID', + 'name' => 'Nombre', + 'permission-type' => 'Tipo de Permiso', + ], + ], + 'create' => [ + 'access-control' => 'Control de Acceso', + 'all' => 'Todos', + 'back-btn' => 'Volver', + 'custom' => 'Personalizado', + 'description' => 'Descripción', + 'general' => 'General', + 'name' => 'Nombre', + 'permissions' => 'Permisos', + 'save-btn' => 'Guardar Rol', + 'title' => 'Crear Rol', + ], + 'edit' => [ + 'access-control' => 'Control de Acceso', + 'all' => 'Todos', + 'back-btn' => 'Volver', + 'custom' => 'Personalizado', + 'description' => 'Descripción', + 'general' => 'General', + 'name' => 'Nombre', + 'permissions' => 'Permisos', + 'save-btn' => 'Guardar Rol', + 'title' => 'Editar Rol', + ], + ], + 'types' => [ + 'index' => [ + 'create-btn' => 'Crear Tipo', + 'create-success' => 'Tipo creado con éxito.', + 'delete-failed' => 'No se puede eliminar el tipo.', + 'delete-success' => 'Tipo eliminado con éxito.', + 'title' => 'Tipos', + 'update-success' => 'Tipo actualizado con éxito.', + 'datagrid' => [ + 'delete' => 'Eliminar', + 'description' => 'Descripción', + 'edit' => 'Editar', + 'id' => 'ID', + 'name' => 'Nombre', + ], + 'create' => [ + 'name' => 'Nombre', + 'save-btn' => 'Guardar Tipo', + 'title' => 'Crear Tipo', + ], + 'edit' => [ + 'title' => 'Editar Tipo', + ], + ], + ], + 'sources' => [ + 'index' => [ + 'title' => 'Fuentes', + 'create-btn' => 'Crear Fuente', + 'create-success' => 'Fuente creada con éxito.', + 'delete-failed' => 'No se puede eliminar la fuente.', + 'delete-success' => 'Fuente eliminada con éxito.', + 'update-success' => 'Fuente actualizada con éxito.', + 'delete-failed-associated-leads' => 'No se puede eliminar la fuente porque está asociada a clientes potenciales existentes. Por favor, desvincúlelos o actualícelos antes de eliminar.', + 'datagrid' => [ + 'delete' => 'Eliminar', + 'edit' => 'Editar', + 'id' => 'ID', + 'name' => 'Nombre', + ], + 'create' => [ + 'name' => 'Nombre', + 'save-btn' => 'Guardar fuente', + 'title' => 'Crear fuente', + ], + 'edit' => [ + 'title' => 'Editar fuente', + ], + ], + ], + 'workflows' => [ + 'index' => [ + 'title' => 'Flujos de Trabajo', + 'create-btn' => 'Crear Flujo de Trabajo', + 'create-success' => 'Flujo de trabajo creado con éxito.', + 'update-success' => 'Flujo de trabajo actualizado con éxito.', + 'delete-success' => 'Flujo de trabajo eliminado con éxito.', + 'delete-failed' => 'No se puede eliminar el flujo de trabajo.', + 'datagrid' => [ + 'delete' => 'Eliminar', + 'description' => 'Descripción', + 'edit' => 'Editar', + 'id' => 'ID', + 'name' => 'Nombre', + ], + ], + 'helpers' => [ + 'update-related-leads' => 'Actualizar leads relacionados', + 'send-email-to-sales-owner' => 'Enviar correo al propietario de ventas', + 'send-email-to-participants' => 'Enviar correo a los participantes', + 'add-webhook' => 'Agregar Webhook', + 'update-lead' => 'Actualizar Lead', + 'update-person' => 'Actualizar Persona', + 'send-email-to-person' => 'Enviar correo a la persona', + 'add-tag' => 'Agregar Etiqueta', + 'add-note-as-activity' => 'Agregar Nota como Actividad', + 'update-quote' => 'Actualizar cotización', + ], + 'create' => [ + 'title' => 'Crear Flujo de Trabajo', + 'event' => 'Evento', + 'back-btn' => 'Volver', + 'save-btn' => 'Guardar Flujo de Trabajo', + 'name' => 'Nombre', + 'basic-details' => 'Detalles Básicos', + 'description' => 'Descripción', + 'actions' => 'Acciones', + 'basic-details-info' => 'Coloque la información básica del flujo de trabajo.', + 'event-info' => 'Un evento desencadena, verifica, condiciones y realiza acciones predefinidas.', + 'conditions' => 'Condiciones', + 'conditions-info' => 'Las condiciones son reglas que verifican escenarios, desencadenadas en ocasiones específicas.', + 'actions-info' => 'Una acción no solo reduce la carga de trabajo, sino que también facilita la automatización de CRM.', + 'value' => 'Valor', + 'condition-type' => 'Tipo de Condición', + 'all-condition-are-true' => 'Todas las condiciones son verdaderas', + 'any-condition-are-true' => 'Cualquiera de las condiciones es verdadera', + 'add-condition' => 'Agregar Condición', + 'add-action' => 'Agregar Acción', + 'yes' => 'Sí', + 'no' => 'No', + 'email' => 'Correo Electrónico', + 'is-equal-to' => 'Es igual a', + 'is-not-equal-to' => 'No es igual a', + 'equals-or-greater-than' => 'Es igual o mayor que', + 'equals-or-less-than' => 'Es igual o menor que', + 'greater-than' => 'Mayor que', + 'less-than' => 'Menor que', + 'type' => 'Tipo', + 'contain' => 'Contiene', + 'contains' => 'Contiene', + 'does-not-contain' => 'No contiene', + ], + 'edit' => [ + 'title' => 'Editar Flujo de Trabajo', + 'event' => 'Evento', + 'back-btn' => 'Volver', + 'save-btn' => 'Guardar Flujo de Trabajo', + 'name' => 'Nombre', + 'basic-details' => 'Detalles Básicos', + 'description' => 'Descripción', + 'actions' => 'Acciones', + 'type' => 'Tipo', + 'basic-details-info' => 'Coloque la información básica del flujo de trabajo.', + 'event-info' => 'Un evento desencadena, verifica, condiciones y realiza acciones predefinidas.', + 'conditions' => 'Condiciones', + 'conditions-info' => 'Las condiciones son reglas que verifican escenarios, desencadenadas en ocasiones específicas.', + 'actions-info' => 'Una acción no solo reduce la carga de trabajo, sino que también facilita la automatización de CRM.', + 'value' => 'Valor', + 'condition-type' => 'Tipo de Condición', + 'all-condition-are-true' => 'Todas las condiciones son verdaderas', + 'any-condition-are-true' => 'Cualquiera de las condiciones es verdadera', + 'add-condition' => 'Agregar Condición', + 'add-action' => 'Agregar Acción', + 'yes' => 'Sí', + 'no' => 'No', + 'email' => 'Correo Electrónico', + 'is-equal-to' => 'Es igual a', + 'is-not-equal-to' => 'No es igual a', + 'equals-or-greater-than' => 'Es igual o mayor que', + 'equals-or-less-than' => 'Es igual o menor que', + 'greater-than' => 'Mayor que', + 'less-than' => 'Menor que', + 'contain' => 'Contiene', + 'contains' => 'Contiene', + 'does-not-contain' => 'No contiene', + ], + ], + 'webforms' => [ + 'index' => [ + 'title' => 'Webforms', + 'create-btn' => 'Crear Webform', + 'create-success' => 'Webform creado con éxito.', + 'update-success' => 'Webform actualizado con éxito.', + 'delete-success' => 'Webform eliminado con éxito.', + 'delete-failed' => 'No se puede eliminar el Webform.', + 'datagrid' => [ + 'id' => 'ID', + 'title' => 'Título', + 'edit' => 'Editar', + 'delete' => 'Eliminar', + ], + ], + 'create' => [ + 'title' => 'Crear formulario web', + 'add-attribute-btn' => 'Agregar Botón de Atributo', + 'attribute-label-color' => 'Color de Etiqueta del Atributo', + 'attributes' => 'Atributos', + 'attributes-info' => 'Agregue atributos personalizados al formulario.', + 'background-color' => 'Color de Fondo', + 'create-lead' => 'Crear Lead', + 'customize-webform' => 'Personalizar Webform', + 'customize-webform-info' => 'Personalice su formulario web con los colores de los elementos de su elección.', + 'description' => 'Descripción', + 'display-custom-message' => 'Mostrar mensaje personalizado', + 'form-background-color' => 'Color de Fondo del Formulario', + 'form-submit-btn-color' => 'Color del Botón de Enviar del Formulario', + 'form-submit-button-color' => 'Color del Botón de Enviar del Formulario', + 'form-title-color' => 'Color del Título del Formulario', + 'general' => 'General', + 'leads' => 'Leads', + 'person' => 'Persona', + 'save-btn' => 'Guardar Webform', + 'submit-button-label' => 'Etiqueta del Botón de Enviar', + 'submit-success-action' => 'Acción en caso de éxito de envío', + 'redirect-to-url' => 'Redirigir a la URL', + 'choose-value' => 'Elige un valor', + 'select-file' => 'Seleccionar archivo', + 'select-image' => 'Seleccionar imagen', + 'enter-value' => 'Introducir valor', + ], + 'edit' => [ + 'add-attribute-btn' => 'Agregar Botón de Atributo', + 'attribute-label-color' => 'Color de Etiqueta del Atributo', + 'attributes' => 'Atributos', + 'attributes-info' => 'Agregue atributos personalizados al formulario.', + 'background-color' => 'Color de Fondo', + 'choose-value' => 'Elige un valor', + 'code-snippet' => 'Fragmento de Código', + 'copied' => 'Copiado', + 'copy' => 'Copiar', + 'create-lead' => 'Crear Lead', + 'customize-webform' => 'Personalizar Webform', + 'customize-webform-info' => 'Personalice su formulario web con los colores de los elementos de su elección.', + 'description' => 'Descripción', + 'display-custom-message' => 'Mostrar mensaje personalizado', + 'embed' => 'Incrustar', + 'enter-value' => 'Introducir valor', + 'form-background-color' => 'Color de Fondo del Formulario', + 'form-submit-btn-color' => 'Color del Botón de Enviar del Formulario', + 'form-submit-button-color' => 'Color del Botón de Enviar del Formulario', + 'form-title-color' => 'Color del Título del Formulario', + 'general' => 'General', + 'leads' => 'Leads', + 'person' => 'Persona', + 'preview' => 'Vista Previa', + 'public-url' => 'URL Pública', + 'redirect-to-url' => 'Redirigir a la URL', + 'save-btn' => 'Guardar Webform', + 'select-file' => 'Seleccionar archivo', + 'select-image' => 'Seleccionar imagen', + 'submit-button-label' => 'Etiqueta del Botón de Enviar', + 'submit-success-action' => 'Acción en caso de éxito de envío', + 'title' => 'Editar formulario web', + ], + ], + 'email-template' => [ + 'index' => [ + 'create-btn' => 'Crear Plantilla de Correo Electrónico', + 'title' => 'Plantillas de Correo Electrónico', + 'create-success' => 'Plantilla de Correo Electrónico creada exitosamente.', + 'update-success' => 'Plantilla de Correo Electrónico actualizada exitosamente.', + 'delete-success' => 'Plantilla de Correo Electrónico eliminada exitosamente.', + 'delete-failed' => 'No se puede eliminar la Plantilla de Correo Electrónico.', + 'datagrid' => [ + 'delete' => 'Eliminar', + 'edit' => 'Editar', + 'id' => 'ID', + 'name' => 'Nombre', + 'subject' => 'Asunto', + ], + ], + 'create' => [ + 'title' => 'Crear Plantilla de Correo Electrónico', + 'save-btn' => 'Guardar Plantilla de Correo Electrónico', + 'email-template' => 'Plantilla de Correo Electrónico', + 'subject' => 'Asunto', + 'content' => 'Contenido', + 'subject-placeholders' => 'Marcadores de Posición del Asunto', + 'general' => 'General', + 'name' => 'Nombre', + ], + 'edit' => [ + 'title' => 'Editar Plantilla de Correo Electrónico', + 'save-btn' => 'Guardar Plantilla de Correo Electrónico', + 'email-template' => 'Plantilla de Correo Electrónico', + 'subject' => 'Asunto', + 'content' => 'Contenido', + 'subject-placeholders' => 'Marcadores de Posición del Asunto', + 'general' => 'General', + 'name' => 'Nombre', + ], + ], + 'marketing' => [ + 'events' => [ + 'index' => [ + 'create-btn' => 'Crear Evento', + 'title' => 'Eventos', + 'create-success' => 'Evento creado con éxito.', + 'update-success' => 'Evento actualizado con éxito.', + 'delete-success' => 'Evento eliminado con éxito.', + 'delete-failed' => 'No se puede eliminar el evento.', + 'mass-delete-success' => 'Eventos eliminados con éxito', + 'datagrid' => [ + 'delete' => 'Eliminar', + 'edit' => 'Editar', + 'id' => 'ID', + 'name' => 'Nombre', + 'description' => 'Descripción', + 'date' => 'Fecha', + ], + 'create' => [ + 'title' => 'Crear Evento', + 'name' => 'Nombre', + 'date' => 'Fecha', + 'description' => 'Descripción', + 'save-btn' => 'Guardar Evento', + ], + 'edit' => [ + 'title' => 'Editar Evento', + ], + ], + ], + 'campaigns' => [ + 'index' => [ + 'create-btn' => 'Crear Campaña', + 'title' => 'Campañas', + 'create-success' => 'Campaña creada con éxito.', + 'update-success' => 'Campaña actualizada con éxito.', + 'delete-success' => 'Campaña eliminada con éxito.', + 'delete-failed' => 'No se puede eliminar la campaña.', + 'mass-delete-success' => 'Campañas eliminadas con éxito.', + 'datagrid' => [ + 'id' => 'ID', + 'name' => 'Nombre', + 'subject' => 'Asunto', + 'status' => 'Estado', + 'active' => 'Activo', + 'inactive' => 'Inactivo', + 'edit' => 'Editar', + 'delete' => 'Eliminar', + ], + 'create' => [ + 'title' => 'Crear Campaña', + 'name' => 'Nombre', + 'type' => 'Tipo', + 'subject' => 'Asunto', + 'event' => 'Evento', + 'email-template' => 'Plantilla de Correo', + 'status' => 'Estado', + ], + 'edit' => [ + 'title' => 'Editar Campaña', + ], + ], + ], + ], + 'tags' => [ + 'index' => [ + 'create-btn' => 'Crear Etiqueta', + 'title' => 'Etiquetas', + 'create-success' => 'Etiqueta creada exitosamente.', + 'update-success' => 'Etiqueta actualizada exitosamente.', + 'delete-success' => 'Etiqueta eliminada exitosamente.', + 'delete-failed' => 'No se puede eliminar la Etiqueta.', + 'datagrid' => [ + 'delete' => 'Eliminar', + 'edit' => 'Editar', + 'id' => 'ID', + 'name' => 'Nombre', + 'users' => 'Usuarios', + 'created-at' => 'Creado En', + ], + 'create' => [ + 'name' => 'Nombre', + 'save-btn' => 'Guardar Etiqueta', + 'title' => 'Crear Etiqueta', + 'color' => 'Color', + ], + 'edit' => [ + 'title' => 'Editar Etiqueta', + ], + ], + ], + 'users' => [ + 'index' => [ + 'create-btn' => 'Crear Usuario', + 'create-success' => 'Usuario creado exitosamente.', + 'delete-failed' => 'No se puede eliminar el Usuario.', + 'delete-success' => 'Usuario eliminado exitosamente.', + 'last-delete-error' => 'Se requiere al menos un usuario.', + 'mass-delete-failed' => 'No se pueden eliminar los Usuarios.', + 'mass-delete-success' => 'Usuarios eliminados exitosamente.', + 'mass-update-failed' => 'No se pueden actualizar los Usuarios.', + 'mass-update-success' => 'Usuarios actualizados exitosamente.', + 'title' => 'Usuarios', + 'update-success' => 'Usuario actualizado exitosamente.', + 'user-define-error' => 'No se puede eliminar el usuario del sistema.', + 'active' => 'Activo', + 'inactive' => 'Inactivo', + 'datagrid' => [ + 'active' => 'Activo', + 'created-at' => 'Creado En', + 'delete' => 'Eliminar', + 'edit' => 'Editar', + 'email' => 'Correo Electrónico', + 'id' => 'ID', + 'inactive' => 'Inactivo', + 'name' => 'Nombre', + 'status' => 'Estado', + 'update-status' => 'Actualizar Estado', + 'users' => 'Usuarios', + ], + 'create' => [ + 'confirm-password' => 'Confirmar Contraseña', + 'email' => 'Correo Electrónico', + 'general' => 'General', + 'global' => 'Global', + 'group' => 'Grupo', + 'individual' => 'Individual', + 'name' => 'Nombre', + 'password' => 'Contraseña', + 'permission' => 'Permiso', + 'role' => 'Rol', + 'save-btn' => 'Guardar Usuario', + 'status' => 'Estado', + 'title' => 'Crear Usuario', + 'view-permission' => 'Ver Permiso', + 'select-at-lest-one-group' => 'Select at least one group', + ], + 'edit' => [ + 'title' => 'Editar Usuario', + ], + ], + ], + 'pipelines' => [ + 'index' => [ + 'title' => 'Canales', + 'create-btn' => 'Crear Canal', + 'create-success' => 'Canal creado exitosamente.', + 'update-success' => 'Canal actualizado exitosamente.', + 'default-required' => 'Se requiere al menos una canalización predeterminada.', + 'delete-success' => 'Canal eliminado exitosamente.', + 'delete-failed' => 'No se puede eliminar el Canal.', + 'default-delete-error' => 'No se puede eliminar el canal predeterminado.', + 'datagrid' => [ + 'delete' => 'Eliminar', + 'edit' => 'Editar', + 'id' => 'ID', + 'is-default' => 'Es Predeterminado', + 'name' => 'Nombre', + 'no' => 'No', + 'rotten-days' => 'Días de Pudrición', + 'yes' => 'Sí', + ], + ], + 'create' => [ + 'title' => 'Crear Canal', + 'save-btn' => 'Guardar Canal', + 'name' => 'Nombre', + 'rotten-days' => 'Días de Pudrición', + 'mark-as-default' => 'Marcar como Predeterminado', + 'general' => 'General', + 'probability' => 'Probabilidad (%)', + 'new-stage' => 'Nuevo', + 'won-stage' => 'Ganado', + 'lost-stage' => 'Perdido', + 'stage-btn' => 'Añadir Etapa', + 'stages' => 'Etapas', + 'duplicate-name' => 'El campo "Nombre" no puede ser duplicado', + 'delete-stage' => 'Eliminar Etapa', + 'add-new-stages' => 'Añadir Nuevas Etapas', + 'add-stage-info' => 'Añadir nueva etapa para tu Canal', + 'newly-added' => 'Añadido Recientemente', + 'stage-delete-success' => 'Etapa Eliminada Exitosamente', + ], + 'edit' => [ + 'title' => 'Editar Canal', + 'save-btn' => 'Guardar Canal', + 'name' => 'Nombre', + 'rotten-days' => 'Días de Pudrición', + 'mark-as-default' => 'Marcar como Predeterminado', + 'general' => 'General', + 'probability' => 'Probabilidad (%)', + 'new-stage' => 'Nuevo', + 'won-stage' => 'Ganado', + 'lost-stage' => 'Perdido', + 'stage-btn' => 'Añadir Etapa', + 'stages' => 'Etapas', + 'duplicate-name' => 'El campo "Nombre" no puede ser duplicado', + 'delete-stage' => 'Eliminar Etapa', + 'add-new-stages' => 'Añadir Nuevas Etapas', + 'add-stage-info' => 'Añadir nueva etapa para tu Canal', + 'stage-delete-success' => 'Etapa Eliminada Exitosamente', + ], + ], + 'webhooks' => [ + 'index' => [ + 'title' => 'Webhooks', + 'create-btn' => 'Crear Webhook', + 'create-success' => 'Webhook creado exitosamente.', + 'update-success' => 'Webhook actualizado exitosamente.', + 'delete-success' => 'Webhook eliminado exitosamente.', + 'delete-failed' => 'No se puede eliminar el Webhook.', + 'datagrid' => [ + 'id' => 'ID', + 'delete' => 'Eliminar', + 'edit' => 'Editar', + 'name' => 'Nombre', + 'entity-type' => 'Tipo de Entidad', + 'end-point' => 'Punto Final', + ], + ], + 'create' => [ + 'title' => 'Crear Webhook', + 'save-btn' => 'Guardar Webhook', + 'info' => 'Ingrese los detalles del webhook', + 'url-and-parameters' => 'URL Y Parámetros', + 'method' => 'Método', + 'post' => 'Post', + 'put' => 'Put', + 'url-endpoint' => 'Punto Final de URL', + 'parameters' => 'Parámetros', + 'add-new-parameter' => 'Añadir Nuevo Parámetro', + 'url-preview' => 'Vista Previa de URL:', + 'headers' => 'Encabezados', + 'add-new-header' => 'Añadir Nuevo Encabezado', + 'body' => 'Cuerpo', + 'default' => 'Predeterminado', + 'x-www-form-urlencoded' => 'x-www-form-urlencoded', + 'key-and-value' => 'Clave y Valor', + 'add-new-payload' => 'Añadir nueva carga', + 'raw' => 'Crudo', + 'general' => 'General', + 'name' => 'Nombre', + 'entity-type' => 'Tipo de Entidad', + 'insert-placeholder' => 'Insertar Marcador de Posición', + 'description' => 'Descripción', + 'json' => 'Json', + 'text' => 'Texto', + ], + 'edit' => [ + 'title' => 'Editar Webhook', + 'edit-btn' => 'Guardar Webhook', + 'save-btn' => 'Guardar Webhook', + 'info' => 'Ingrese los detalles del webhook', + 'url-and-parameters' => 'URL Y Parámetros', + 'method' => 'Método', + 'post' => 'Post', + 'put' => 'Put', + 'url-endpoint' => 'Punto Final de URL', + 'parameters' => 'Parámetros', + 'add-new-parameter' => 'Añadir Nuevo Parámetro', + 'url-preview' => 'Vista Previa de URL:', + 'headers' => 'Encabezados', + 'add-new-header' => 'Añadir Nuevo Encabezado', + 'body' => 'Cuerpo', + 'default' => 'Predeterminado', + 'x-www-form-urlencoded' => 'x-www-form-urlencoded', + 'key-and-value' => 'Clave y Valor', + 'add-new-payload' => 'Añadir nueva carga', + 'raw' => 'Crudo', + 'general' => 'General', + 'name' => 'Nombre', + 'entity-type' => 'Tipo de Entidad', + 'insert-placeholder' => 'Insertar Marcador de Posición', + 'description' => 'Descripción', + 'json' => 'Json', + 'text' => 'Texto', + ], + ], + 'warehouses' => [ + 'index' => [ + 'title' => 'Almacenes', + 'create-btn' => 'Crear Almacén', + 'create-success' => 'Almacén creado con éxito.', + 'name-exists' => 'El nombre del almacén ya existe.', + 'update-success' => 'Almacén actualizado con éxito.', + 'delete-success' => 'Almacén eliminado con éxito.', + 'delete-failed' => 'No se puede eliminar el almacén.', + 'datagrid' => [ + 'id' => 'ID', + 'name' => 'Nombre', + 'contact-name' => 'Nombre del Contacto', + 'delete' => 'Eliminar', + 'edit' => 'Editar', + 'view' => 'Ver', + 'created-at' => 'Creado En', + 'products' => 'Productos', + 'contact-emails' => 'Correos Electrónicos de Contacto', + 'contact-numbers' => 'Números de Teléfono de Contacto', + ], + ], + 'create' => [ + 'title' => 'Crear Almacén', + 'save-btn' => 'Guardar Almacén', + 'contact-info' => 'Información de Contacto', + ], + 'edit' => [ + 'title' => 'Editar Almacén', + 'save-btn' => 'Guardar Almacén', + 'contact-info' => 'Información de Contacto', + ], + 'view' => [ + 'all' => 'Todos', + 'notes' => 'Notas', + 'files' => 'Archivos', + 'location' => 'Ubicación', + 'change-logs' => 'Registros de Cambios', + 'locations' => [ + 'action' => 'Acción', + 'add-location' => 'Agregar Ubicación', + 'create-success' => 'Ubicación creada con éxito.', + 'delete' => 'Eliminar', + 'delete-failed' => 'No se puede eliminar la ubicación.', + 'delete-success' => 'Ubicación eliminada con éxito.', + 'name' => 'Nombre', + 'save-btn' => 'Guardar', + ], + 'general-information' => [ + 'title' => 'Información General', + ], + 'contact-information' => [ + 'title' => 'Información de Contacto', + ], + ], + ], + 'attributes' => [ + 'index' => [ + 'title' => 'Atributos', + 'create-btn' => 'Crear Atributo', + 'create-success' => 'Atributo creados con éxito.', + 'update-success' => 'Atributo actualizados con éxito.', + 'delete-success' => 'Atributo eliminados con éxito.', + 'delete-failed' => 'No se pueden eliminar los atributo.', + 'user-define-error' => 'No se puede eliminar el atributo del sistema.', + 'mass-delete-failed' => 'No se pueden eliminar los atributos del sistema.', + 'datagrid' => [ + 'yes' => 'Sí', + 'no' => 'No', + 'id' => 'ID', + 'code' => 'Código', + 'name' => 'Nombre', + 'entity-type' => 'Tipo de Entidad', + 'type' => 'Tipo', + 'is-default' => 'Es Predeterminado', + 'edit' => 'Editar', + 'delete' => 'Eliminar', + 'entity-types' => [ + 'leads' => 'Clientes potenciales', + 'organizations' => 'Organizaciones', + 'persons' => 'Personas', + 'products' => 'Productos', + 'quotes' => 'Cotizaciones', + 'warehouses' => 'Almacenes', + ], + 'types' => [ + 'text' => 'Texto', + 'textarea' => 'Área de texto', + 'price' => 'Precio', + 'boolean' => 'Booleano', + 'select' => 'Seleccionar', + 'multiselect' => 'Selección múltiple', + 'checkbox' => 'Casilla de verificación', + 'email' => 'Correo electrónico', + 'address' => 'Dirección', + 'phone' => 'Teléfono', + 'lookup' => 'Búsqueda', + 'datetime' => 'Fecha y hora', + 'date' => 'Fecha', + 'image' => 'Imagen', + 'file' => 'Archivo', + ], + ], + ], + 'create' => [ + 'title' => 'Crear Atributo', + 'save-btn' => 'Guardar Atributo', + 'code' => 'Código', + 'name' => 'Nombre', + 'entity-type' => 'Tipo de Entidad', + 'type' => 'Tipo', + 'validations' => 'Validaciones', + 'is-required' => 'Es Requerido', + 'input-validation' => 'Validación de Entrada', + 'is-unique' => 'Es Único', + 'labels' => 'Etiquetas', + 'general' => 'General', + 'numeric' => 'Numérico', + 'decimal' => 'Decimal', + 'url' => 'Url', + 'options' => 'Opciones', + 'option-type' => 'Tipo de Opción', + 'lookup-type' => 'Tipo de Búsqueda', + 'add-option' => 'Agregar Opción', + 'save-option' => 'Guardar Opción', + 'option-name' => 'Nombre de Opción', + 'add-attribute-options' => 'Agregar Opciones de Atributo', + 'text' => 'Texto', + 'textarea' => 'Área de Texto', + 'price' => 'Precio', + 'boolean' => 'Booleano', + 'select' => 'Seleccionar', + 'multiselect' => 'Selección Múltiple', + 'email' => 'Correo Electrónico', + 'address' => 'Dirección', + 'phone' => 'Teléfono', + 'datetime' => 'Fecha y Hora', + 'date' => 'Fecha', + 'image' => 'Imagen', + 'file' => 'Archivo', + 'lookup' => 'Búsqueda', + 'entity_type' => 'Tipo de Entidad', + 'checkbox' => 'Casilla de Verificación', + 'is_required' => 'Es Requerido', + 'is_unique' => 'Es Único', + 'actions' => 'Acciones', + ], + 'edit' => [ + 'actions' => 'Acciones', + 'add-attribute-options' => 'Agregar Opciones de Atributo', + 'add-option' => 'Agregar Opción', + 'address' => 'Dirección', + 'boolean' => 'Booleano', + 'checkbox' => 'Casilla de Verificación', + 'code' => 'Código', + 'date' => 'Fecha', + 'datetime' => 'Fecha y Hora', + 'decimal' => 'Decimal', + 'email' => 'Correo Electrónico', + 'entity-type' => 'Tipo de Entidad', + 'entity_type' => 'Tipo de Entidad', + 'file' => 'Archivo', + 'general' => 'General', + 'image' => 'Imagen', + 'input-validation' => 'Validación de Entrada', + 'is-required' => 'Es Requerido', + 'is-unique' => 'Es Único', + 'is_required' => 'Es Requerido', + 'is_unique' => 'Es Único', + 'labels' => 'Etiquetas', + 'lookup' => 'Búsqueda', + 'lookup-type' => 'Tipo de Búsqueda', + 'multiselect' => 'Selección Múltiple', + 'name' => 'Nombre', + 'numeric' => 'Numérico', + 'option-deleted' => 'Attribute Option is deleted successfully', + 'option-name' => 'Nombre de Opción', + 'option-type' => 'Tipo de Opción', + 'options' => 'Opciones', + 'phone' => 'Teléfono', + 'price' => 'Precio', + 'save-btn' => 'Guardar Atributo', + 'save-option' => 'Guardar Opción', + 'select' => 'Seleccionar', + 'text' => 'Texto', + 'textarea' => 'Área de Texto', + 'title' => 'Editar Atributo', + 'type' => 'Tipo', + 'url' => 'Url', + 'validations' => 'Validaciones', + ], + ], + 'data-transfer' => [ + 'imports' => [ + 'create' => [ + 'action' => 'Acción', + 'allowed-errors' => 'Errores Permitidos', + 'back-btn' => 'Atrás', + 'create-update' => 'Crear/Actualizar', + 'delete' => 'Eliminar', + 'download-sample' => 'Descargar Muestra', + 'field-separator' => 'Separador de Campos', + 'file' => 'Archivo', + 'general' => 'General', + 'images-directory' => 'Ruta del Directorio de Imágenes', + 'process-in-queue' => 'Procesar en Cola', + 'results' => 'Resultados', + 'save-btn' => 'Guardar Importación', + 'settings' => 'Configuraciones', + 'skip-errors' => 'Omitir Errores', + 'stop-on-errors' => 'Detener en Errores', + 'title' => 'Crear Importación', + 'type' => 'Tipo', + 'validation-strategy' => 'Estrategia de Validación', + ], + 'edit' => [ + 'action' => 'Acción', + 'allowed-errors' => 'Errores Permitidos', + 'back-btn' => 'Atrás', + 'create-update' => 'Crear/Actualizar', + 'delete' => 'Eliminar', + 'download-sample' => 'Descargar Muestra', + 'field-separator' => 'Separador de Campos', + 'file' => 'Archivo', + 'general' => 'General', + 'images-directory' => 'Ruta del Directorio de Imágenes', + 'process-in-queue' => 'Procesar en Cola', + 'results' => 'Resultados', + 'save-btn' => 'Guardar Importación', + 'settings' => 'Configuraciones', + 'skip-errors' => 'Omitir Errores', + 'stop-on-errors' => 'Detener en Errores', + 'title' => 'Editar Importación', + 'type' => 'Tipo', + 'validation-strategy' => 'Estrategia de Validación', + ], + 'index' => [ + 'button-title' => 'Crear Importación', + 'title' => 'Importaciones', + 'datagrid' => [ + 'actions' => 'Acciones', + 'completed-at' => 'Completado en', + 'created' => 'Creado', + 'delete' => 'Eliminar', + 'deleted' => 'Eliminado', + 'edit' => 'Editar', + 'error-file' => 'Archivo de Errores', + 'id' => 'ID', + 'started-at' => 'Iniciado en', + 'state' => 'Estado', + 'summary' => 'Resumen', + 'type' => 'Tipo', + 'updated' => 'Actualizado', + 'uploaded-file' => 'Archivo Subido', + ], + ], + 'import' => [ + 'back-btn' => 'Atrás', + 'completed-batches' => 'Total de Lotes Completados:', + 'download-error-report' => 'Descargar Informe Completo', + 'edit-btn' => 'Editar', + 'imported-info' => '¡Felicidades! Tu importación fue exitosa.', + 'importing-info' => 'Importación en Proceso', + 'indexing-info' => 'Indexación de Recursos (Precios, Inventario y Elastic Search) en Progreso', + 'linking-info' => 'Vinculación de Recursos en Progreso', + 'progress' => 'Progreso:', + 'title' => 'Importación', + 'total-batches' => 'Total de Lotes:', + 'total-created' => 'Total de Registros Creados:', + 'total-deleted' => 'Total de Registros Eliminados:', + 'total-errors' => 'Total de Errores:', + 'total-invalid-rows' => 'Total de Filas Inválidas:', + 'total-rows-processed' => 'Total de Filas Procesadas:', + 'total-updated' => 'Total de Registros Actualizados:', + 'validate' => 'Validar', + 'validate-info' => 'Haz clic en Validar Datos para comprobar tu importación.', + 'validating-info' => 'La lectura y validación de los datos ha comenzado', + 'validation-failed-info' => 'Tu importación no es válida. Por favor, corrige los siguientes errores e intenta de nuevo.', + 'validation-success-info' => 'Tu importación es válida. Haz clic en Importar para iniciar el proceso de importación.', + ], + 'create-success' => 'Importación creada exitosamente.', + 'delete-failed' => 'La eliminación de la importación falló inesperadamente.', + 'delete-success' => 'Importación eliminada exitosamente.', + 'not-valid' => 'La importación no es válida', + 'nothing-to-import' => 'No hay recursos para importar.', + 'setup-queue-error' => 'Por favor, cambia tu controlador de cola a "database" o "redis" para iniciar el proceso de importación.', + 'update-success' => 'Importación actualizada exitosamente.', + ], + ], + ], + 'activities' => [ + 'index' => [ + 'title' => 'Actividades', + 'datagrid' => [ + 'comment' => 'Comentario', + 'created_at' => 'Creado En', + 'created_by' => 'Creado Por', + 'edit' => 'Editar', + 'id' => 'ID', + 'done' => 'Completado', + 'not-done' => 'No Completado', + 'lead' => 'Oportunidad', + 'mass-delete' => 'Eliminación Masiva', + 'mass-update' => 'Actualización Masiva', + 'schedule-from' => 'Programar Desde', + 'schedule-to' => 'Programar Hasta', + 'schedule_from' => 'Programar Desde', + 'schedule_to' => 'Programar Hasta', + 'title' => 'Título', + 'is_done' => 'Completado', + 'type' => 'Tipo', + 'update' => 'Actualizar', + 'call' => 'Llamada', + 'meeting' => 'Reunión', + 'lunch' => 'Almuerzo', + ], + ], + 'edit' => [ + 'title' => 'Editar Actividad', + 'back-btn' => 'Volver', + 'save-btn' => 'Guardar Actividad', + 'type' => 'Tipo de Actividad', + 'call' => 'Llamada', + 'meeting' => 'Reunión', + 'lunch' => 'Almuerzo', + 'schedule_to' => 'Programar Hasta', + 'schedule_from' => 'Programar Desde', + 'location' => 'Ubicación', + 'comment' => 'Comentario', + 'lead' => 'Oportunidad', + 'participants' => 'Participantes', + 'general' => 'General', + 'persons' => 'Personas', + 'no-result-found' => 'No se encontraron registros.', + 'users' => 'Usuarios', + ], + 'updated' => 'Actualizado :attribute', + 'created' => 'Creado', + 'duration-overlapping' => 'Los participantes tienen otra reunión en este momento. ¿Deseas continuar?', + 'create-success' => 'Actividad creada con éxito.', + 'update-success' => 'Actividad actualizada con éxito.', + 'overlapping-error' => 'Los participantes tienen otra reunión en este momento.', + 'destroy-success' => 'Actividad eliminada con éxito.', + 'delete-failed' => 'No se puede eliminar la actividad.', + 'mass-update-success' => 'Actividades actualizadas con éxito.', + 'mass-destroy-success' => 'Actividades eliminadas con éxito.', + 'mass-delete-failed' => 'No se pueden eliminar las actividades.', + ], + 'mail' => [ + 'index' => [ + 'compose' => 'Redactar', + 'draft' => 'Borrador', + 'inbox' => 'Bandeja de entrada', + 'outbox' => 'Bandeja de salida', + 'sent' => 'Enviados', + 'trash' => 'Papelera', + 'compose-mail-btn' => 'Redactar Correo', + 'btn' => 'Correo', + 'mail' => [ + 'title' => 'Redactar Correo', + 'to' => 'Para', + 'enter-emails' => 'Presiona enter para añadir correos', + 'cc' => 'CC', + 'bcc' => 'BCC', + 'subject' => 'Asunto', + 'send-btn' => 'Enviar', + 'message' => 'Mensaje', + 'draft' => 'Borrador', + ], + 'datagrid' => [ + 'id' => 'ID', + 'from' => 'De', + 'to' => 'Para', + 'subject' => 'Asunto', + 'tags' => 'Etiquetas', + 'content' => 'Contenido', + 'attachments' => 'Archivos adjuntos', + 'date' => 'Fecha', + 'move-to-inbox' => 'Mover a la bandeja de entrada', + 'move-to-trash' => 'Movido a la papelera', + 'edit' => 'Editar', + 'view' => 'Ver', + 'delete' => 'Eliminar', + ], + ], + 'create-success' => 'Correo enviado con éxito.', + 'update-success' => 'Correo actualizado con éxito.', + 'mass-update-success' => 'Correos actualizados con éxito.', + 'delete-success' => 'Correo eliminado con éxito.', + 'delete-failed' => 'No se puede eliminar el correo.', + 'view' => [ + 'title' => 'Correos', + 'subject' => ':subject', + 'link-mail' => 'Enlace de Correo', + 'to' => 'Para', + 'cc' => 'CC', + 'bcc' => 'BCC', + 'reply' => 'Responder', + 'reply-all' => 'Responder a Todos', + 'forward' => 'Reenviar', + 'delete' => 'Eliminar', + 'enter-mails' => 'Ingresar id de correo', + 'rotten-days' => 'El lead está en estado crítico por :days días', + 'search-an-existing-lead' => 'Buscar un lead existente', + 'search-an-existing-contact' => 'Buscar un contacto existente', + 'message' => 'Mensaje', + 'add-attachments' => 'Añadir Archivos Adjuntos', + 'discard' => 'Descartar', + 'send' => 'Enviar', + 'no-result-found' => 'No se encontraron resultados', + 'add-new-contact' => 'Añadir Nuevo Contacto', + 'description' => 'Descripción', + 'search' => 'Buscar...', + 'add-new-lead' => 'Añadir Nuevo Lead', + 'create-new-contact' => 'Crear Nuevo Contacto', + 'save-contact' => 'Guardar Contacto', + 'create-lead' => 'Crear Lead', + 'linked-contact' => 'Contacto Vinculado', + 'link-to-contact' => 'Vincular a Contacto', + 'link-to-lead' => 'Vincular a Lead', + 'linked-lead' => 'Lead Vinculado', + 'lead-details' => 'Detalles del Lead', + 'contact-person' => 'Persona de Contacto', + 'product' => 'Producto', + 'tags' => [ + 'create-success' => 'Etiqueta creada con éxito.', + 'destroy-success' => 'Etiqueta eliminada con éxito.', + ], + ], + ], + 'common' => [ + 'custom-attributes' => [ + 'add-more' => 'Añadir Más', + 'address' => 'Dirección', + 'city' => 'Ciudad', + 'contact' => 'Números de Contacto', + 'country' => 'País', + 'email' => 'Correo Electrónico', + 'home' => 'Hogar', + 'postcode' => 'Código Postal', + 'save' => 'Guardar', + 'select' => 'Seleccionar', + 'select-country' => 'Seleccionar País', + 'select-state' => 'Seleccionar Estado', + 'state' => 'Estado', + 'update-contact-title' => 'Actualizar Números de Contacto', + 'update-emails-title' => 'Actualizar Correos Electrónicos de Contacto', + 'work' => 'Trabajo', + ], + ], + 'leads' => [ + 'create-success' => 'Lead creado exitosamente.', + 'update-success' => 'Lead actualizado exitosamente.', + 'update-failed' => 'No se pueden eliminar los clientes potenciales.', + 'destroy-success' => 'Lead eliminado exitosamente.', + 'destroy-failed' => 'No se puede eliminar el lead.', + 'file' => [ + 'data-not-found' => 'Datos no encontrados.', + 'empty-content' => 'El contenido del PDF está vacío o no se pudo extraer.', + 'failed-extract' => 'No se pudo extraer el texto del archivo.', + 'insufficient-info' => 'Debido a datos insuficientes, no podemos procesar su solicitud en este momento.', + 'invalid-base64' => 'Formato base64 inválido.', + 'invalid-format' => 'Formato JSON inválido.', + 'invalid-response' => 'Formato de respuesta de IA inválido.', + 'missing-api-key' => 'Falta la clave API o la configuración del modelo.', + 'not-found' => 'Archivo no encontrado.', + 'recursive-call' => 'Se detectó una llamada recursiva.', + 'text-generation-failed' => 'La extracción de texto falló. El archivo podría estar vacío o ilegible.', + ], + 'index' => [ + 'title' => 'Leads', + 'create-btn' => 'Crear Lead', + 'datagrid' => [ + 'id' => 'ID', + 'sales-person' => 'Persona de Ventas', + 'subject' => 'Asunto', + 'source' => 'Fuente', + 'lead-value' => 'Valor del Lead', + 'lead-type' => 'Tipo de cliente potencial', + 'tag-name' => 'Nombre de la etiqueta', + 'contact-person' => 'Persona de Contacto', + 'stage' => 'Etapa', + 'rotten-lead' => 'Lead Podrido', + 'date-to' => 'Fecha Hasta', + 'created-at' => 'Creado En', + 'no' => 'No', + 'yes' => 'Sí', + 'delete' => 'Eliminar', + 'mass-delete' => 'Eliminar en Masa', + 'mass-update' => 'Actualizar en Masa', + ], + 'kanban' => [ + 'rotten-days' => 'El lead está podrido desde hace :days días', + 'empty-list' => 'Tu lista de leads está vacía', + 'empty-list-description' => 'Crea un lead para organizar tus objetivos.', + 'create-lead-btn' => 'Crear Lead', + 'columns' => [ + 'contact-person' => 'Persona de Contacto', + 'id' => 'ID', + 'lead-type' => 'Tipo de Lead', + 'lead-value' => 'Valor del Lead', + 'sales-person' => 'Persona de Ventas', + 'source' => 'Fuente', + 'title' => 'Título', + 'tags' => 'Etiquetas', + 'expected-close-date' => 'Fecha de Cierre Esperada', + 'created-at' => 'Creado En', + ], + 'toolbar' => [ + 'search' => [ + 'title' => 'Buscar por título', + ], + 'filters' => [ + 'apply-filters' => 'Aplicar Filtros', + 'clear-all' => 'Limpiar Todo', + 'filter' => 'Filtrar', + 'filters' => 'Filtros', + 'from' => 'De', + 'select' => 'Seleccionar', + 'to' => 'A', + ], + ], + ], + 'view-switcher' => [ + 'all-pipelines' => 'Todos los Canales', + 'create-new-pipeline' => 'Crear Nuevo Canal', + ], + 'upload' => [ + 'create-lead' => 'Crear Lead Usando IA', + 'file' => 'Carga de archivo', + 'file-info' => 'Solo se aceptan archivos en formato pdf, bmp, jpg, jpeg, png.', + 'file-required' => 'Por favor, selecciona al menos un archivo válido para continuar.', + 'save-btn' => 'Guardar', + 'upload-file' => 'Subir archivo', + ], + ], + 'create' => [ + 'title' => 'Crear Lead', + 'save-btn' => 'Guardar', + 'details' => 'Detalles', + 'details-info' => 'Introduce la Información Básica del Lead', + 'contact-person' => 'Persona de Contacto', + 'contact-info' => 'Información Sobre la Persona de Contacto', + 'products' => 'Productos', + 'products-info' => 'Información Sobre los Productos', + ], + 'edit' => [ + 'title' => 'Editar Lead', + 'save-btn' => 'Guardar', + 'details' => 'Detalles', + 'details-info' => 'Introduce la Información Básica del Lead', + 'contact-person' => 'Persona de Contacto', + 'contact-info' => 'Información Sobre la Persona de Contacto', + 'products' => 'Productos', + 'products-info' => 'Información Sobre los Productos', + ], + 'common' => [ + 'contact' => [ + 'name' => 'Nombre', + 'email' => 'Correo Electrónico', + 'contact-number' => 'Número de Contacto', + 'organization' => 'Organización', + ], + 'products' => [ + 'product-name' => 'Nombre del Producto', + 'quantity' => 'Cantidad', + 'price' => 'Precio', + 'amount' => 'Monto', + 'action' => 'Acción', + 'add-more' => 'Agregar Más', + 'total' => 'Total', + ], + ], + 'view' => [ + 'title' => 'Lead: :title', + 'rotten-days' => ':days Días', + 'tabs' => [ + 'description' => 'Descripción', + 'products' => 'Productos', + 'quotes' => 'Cotizaciones', + ], + 'attributes' => [ + 'title' => 'Sobre el Lead', + ], + 'quotes' => [ + 'subject' => 'Asunto', + 'expired-at' => 'Expirado En', + 'sub-total' => 'Subtotal', + 'discount' => 'Descuento', + 'tax' => 'Impuesto', + 'adjustment' => 'Ajuste', + 'grand-total' => 'Total General', + 'delete' => 'Eliminar', + 'edit' => 'Editar', + 'download' => 'Descargar', + 'destroy-success' => 'Cotización eliminada exitosamente.', + 'empty-title' => 'No se Encontraron Cotizaciones', + 'empty-info' => 'No se Encontraron Cotizaciones para este Lead', + 'add-btn' => 'Agregar Cotización', + ], + 'products' => [ + 'product-name' => 'Nombre del Producto', + 'quantity' => 'Cantidad', + 'price' => 'Precio', + 'amount' => 'Monto', + 'action' => 'Acción', + 'add-more' => 'Agregar Más', + 'total' => 'Total', + 'empty-title' => 'No se Encontraron Productos', + 'empty-info' => 'No se Encontraron Productos para este Lead', + 'add-product' => 'Agregar Producto', + ], + 'persons' => [ + 'title' => 'Sobre las Personas', + 'job-title' => ':job_title en :organization', + ], + 'stages' => [ + 'won-lost' => 'Ganado/Perdido', + 'won' => 'Ganado', + 'lost' => 'Perdido', + 'need-more-info' => 'Necesita Más Información', + 'closed-at' => 'Cerrado En', + 'won-value' => 'Valor Ganado', + 'lost-reason' => 'Razón de la Pérdida', + 'save-btn' => 'Guardar', + ], + 'tags' => [ + 'create-success' => 'Etiqueta creada con éxito.', + 'destroy-success' => 'Etiqueta eliminada con éxito.', + ], + ], + ], + 'configuration' => [ + 'index' => [ + 'back' => 'Regresar', + 'delete' => 'Eliminar', + 'save-btn' => 'Guardar Configuración', + 'save-success' => 'Configuración Guardada Exitosamente.', + 'search' => 'Buscar', + 'select-country' => 'Seleccionar País', + 'select-state' => 'Seleccionar Estado', + 'title' => 'Configuración', + 'general' => [ + 'title' => 'General', + 'info' => 'Configuración General', + 'general' => [ + 'title' => 'General', + 'info' => 'Actualiza tus configuraciones generales aquí.', + 'locale-settings' => [ + 'title' => 'Configuraciones de Idioma', + 'title-info' => 'Define el idioma utilizado en la interfaz de usuario, como Árabe (ar), Inglés (en), Español (es), Persa (fa) y Turco (tr).', + ], + 'admin-logo' => [ + 'logo-image' => 'Imagen del Logo', + 'title' => 'Logo del Administrador', + 'title-info' => 'Configura la imagen del logo para tu panel de administración.', + ], + ], + 'settings' => [ + 'title' => 'Configuraciones', + 'info' => 'Actualiza tus configuraciones aquí.', + 'footer' => [ + 'info' => 'Podemos configurar la sección de powered by aquí.', + 'powered-by' => 'Editor de texto impulsado por', + 'title' => 'Configuraciones de la Sección Powered by', + ], + 'menu' => [ + 'activities' => 'Actividades', + 'configuration' => 'Configuración', + 'contacts' => 'Contactos', + 'dashboard' => 'Tablero', + 'draft' => 'Borrador', + 'inbox' => 'Bandeja de Entrada', + 'info' => 'Podemos configurar los nombres de los elementos del menú aquí.', + 'leads' => 'Leads', + 'mail' => 'Correo', + 'organizations' => 'Organizaciones', + 'outbox' => 'Bandeja de Salida', + 'persons' => 'Personas', + 'products' => 'Productos', + 'quotes' => 'Cotizaciones', + 'sent' => 'Enviados', + 'settings' => 'Configuraciones', + 'title' => 'Configuraciones de Elementos del Menú', + 'trash' => 'Papelera', + ], + 'menu-color' => [ + 'brand-color' => 'Brand Color', + 'info' => 'Podemos cambiar los colores de los elementos del menú aquí.', + 'title' => 'Configuraciones de Color de Elementos del Menú', + ], + ], + ], + 'email' => [ + 'title' => 'Configuración de Correo Electrónico', + 'info' => 'Configuración de correo electrónico para la aplicación.', + 'imap' => [ + 'title' => 'Configuración IMAP', + 'info' => 'Configuración de correo electrónico IMAP para recibir correos electrónicos.', + 'account' => [ + 'title' => 'Cuenta IMAP', + 'title-info' => 'Configura los ajustes de tu cuenta IMAP aquí.', + 'host' => 'Host', + 'port' => 'Puerto', + 'encryption' => 'Tipo de Cifrado', + 'validate-cert' => 'Validar Certificado SSL', + 'username' => 'Nombre de Usuario IMAP', + 'password' => 'Contraseña IMAP', + ], + ], + ], + 'magic-ai' => [ + 'title' => 'Magic AI', + 'info' => 'Configuración de Magic AI para la aplicación.', + 'settings' => [ + 'api-key' => 'Clave API', + 'api-key-info' => 'Recuerda usar una clave API de OpenRouter para cada modelo. Es un paso simple para mejorar la seguridad y el rendimiento.', + 'enable' => 'Habilitar', + 'info' => 'Mejora tu experiencia con Magic AI con tu clave API de OpenRouter. ¡Intégrala ahora para una aventura de IA personalizada y sin problemas, hecha a tu medida! Personaliza la configuración sin esfuerzo y toma el control de tu viaje de IA.', + 'other' => 'Otro Modelo', + 'other-model' => 'Para otros modelos, usa el ID del Modelo de OpenRouter.', + 'doc-generation' => 'Generación de DOC', + 'doc-generation-info' => 'Habilita la función de generación de DOC para extraer automáticamente datos de archivos DOC y convertirlos a formato de texto. Mejora tu productividad y eficiencia habilitando esta función para agilizar tu flujo de trabajo.', + 'title' => 'Configuraciones Generales', + 'models' => [ + 'deepseek-r1' => 'Deepseek R1 Distill-llama-8b', + 'gemini-2-0-flash-001' => 'Gemini 2.0 flash-001', + 'gpt-4o' => 'GPT-4.0', + 'gpt-4o-mini' => 'GPT-4.0 mini', + 'grok-2-1212' => 'Grok 2.12', + 'llama-3-2-3b-instruct' => 'Llama 3.2 3b Instruct', + 'title' => 'Modelos', + ], + ], + ], + ], + ], + 'dashboard' => [ + 'index' => [ + 'title' => 'Tablero', + 'revenue' => [ + 'lost-revenue' => 'Ingresos Perdidos', + 'won-revenue' => 'Ingresos Ganados', + ], + 'over-all' => [ + 'average-lead-value' => 'Valor Promedio de Lead', + 'total-leads' => 'Total de Leads', + 'average-leads-per-day' => 'Leads Promedio por Día', + 'total-quotations' => 'Total de Cotizaciones', + 'total-persons' => 'Total de Personas', + 'total-organizations' => 'Total de Organizaciones', + ], + 'total-leads' => [ + 'title' => 'Leads', + 'total' => 'Total de Leads', + 'won' => 'Leads Ganados', + 'lost' => 'Leads Perdidos', + ], + 'revenue-by-sources' => [ + 'title' => 'Ingresos por Fuentes', + 'empty-title' => 'No Hay Datos Disponibles', + 'empty-info' => 'No hay datos disponibles para el intervalo seleccionado', + ], + 'revenue-by-types' => [ + 'title' => 'Ingresos por Tipos', + 'empty-title' => 'No Hay Datos Disponibles', + 'empty-info' => 'No hay datos disponibles para el intervalo seleccionado', + ], + 'top-selling-products' => [ + 'title' => 'Productos Más Vendidos', + 'empty-title' => 'No Se Encontraron Productos', + 'empty-info' => 'No hay productos disponibles para el intervalo seleccionado', + ], + 'top-persons' => [ + 'title' => 'Personas Más Destacadas', + 'empty-title' => 'No Se Encontraron Personas', + 'empty-info' => 'No hay personas disponibles para el intervalo seleccionado', + ], + 'open-leads-by-states' => [ + 'title' => 'Leads Abiertos por Etapas', + 'empty-title' => 'No Hay Datos Disponibles', + 'empty-info' => 'No hay datos disponibles para el intervalo seleccionado', + ], + ], + ], + 'layouts' => [ + 'app-version' => 'Versión: :version', + 'dashboard' => 'Tablero', + 'leads' => 'Leads', + 'quotes' => 'Cotizaciones', + 'quote' => 'Cotización', + 'mail' => [ + 'title' => 'Correo', + 'compose' => 'Redactar', + 'inbox' => 'Bandeja de Entrada', + 'draft' => 'Borradores', + 'outbox' => 'Enviados', + 'sent' => 'Enviados', + 'trash' => 'Papelera', + 'setting' => 'Configuración', + ], + 'activities' => 'Actividades', + 'contacts' => 'Contactos', + 'persons' => 'Personas', + 'person' => 'Persona', + 'organizations' => 'Organizaciones', + 'organization' => 'Organización', + 'products' => 'Productos', + 'product' => 'Producto', + 'settings' => 'Configuraciones', + 'user' => 'Usuario', + 'user-info' => 'Administra todos tus usuarios y sus permisos en el CRM, lo que están autorizados a hacer.', + 'groups' => 'Grupos', + 'groups-info' => 'Agregar, editar o eliminar grupos del CRM', + 'roles' => 'Roles', + 'role' => 'Rol', + 'roles-info' => 'Agregar, editar o eliminar roles del CRM', + 'users' => 'Usuarios', + 'users-info' => 'Agregar, editar o eliminar usuarios del CRM', + 'lead' => 'Lead', + 'lead-info' => 'Administra todas las configuraciones relacionadas con los leads en el CRM', + 'pipelines' => 'Pipelines', + 'pipelines-info' => 'Agregar, editar o eliminar pipelines del CRM', + 'sources' => 'Fuentes', + 'sources-info' => 'Agregar, editar o eliminar fuentes del CRM', + 'types' => 'Tipos', + 'types-info' => 'Agregar, editar o eliminar tipos del CRM', + 'automation' => 'Automatización', + 'automation-info' => 'Administra todas las configuraciones relacionadas con la automatización en el CRM', + 'attributes' => 'Atributos', + 'attribute' => 'Atributo', + 'attributes-info' => 'Agregar, editar o eliminar atributos del CRM', + 'email-templates' => 'Plantillas de Correo', + 'email' => 'Correo', + 'email-templates-info' => 'Agregar, editar o eliminar plantillas de correo del CRM', + 'events' => 'Eventos', + 'events-info' => 'Agregar, editar o eliminar eventos del CRM', + 'campaigns' => 'Campañas', + 'campaigns-info' => 'Agregar, editar o eliminar campañas del CRM', + 'workflows' => 'Flujos de Trabajo', + 'workflows-info' => 'Agregar, editar o eliminar flujos de trabajo del CRM', + 'webhooks' => 'Webhooks', + 'webhooks-info' => 'Agregar, editar o eliminar webhooks desde CRM', + 'other-settings' => 'Otras Configuraciones', + 'other-settings-info' => 'Administra todas tus configuraciones adicionales en el CRM', + 'tags' => 'Etiquetas', + 'tags-info' => 'Agregar, editar o eliminar etiquetas del CRM', + 'my-account' => 'Mi Cuenta', + 'sign-out' => 'Cerrar Sesión', + 'back' => 'Volver', + 'name' => 'Nombre', + 'configuration' => 'Configuración', + 'howdy' => '¡Hola!', + 'warehouses' => 'Almacenes', + 'warehouse' => 'Almacén', + 'warehouses-info' => 'Agregar, editar o eliminar almacenes del CRM', + 'data_transfer' => 'Transferencia de Datos', + 'data_transfer_info' => 'Gestionar la configuración relacionada con la transferencia de datos de personas, productos y clientes potenciales en el CRM', + ], + 'user' => [ + 'account' => [ + 'name' => 'Nombre', + 'email' => 'Correo Electrónico', + 'password' => 'Contraseña', + 'my_account' => 'Mi cuenta', + 'update_details' => 'Actualizar Detalles', + 'current_password' => 'Contraseña Actual', + 'confirm_password' => 'Confirmar Contraseña', + 'password-match' => 'La contraseña actual no coincide.', + 'account-save' => 'Cambios en la cuenta guardados exitosamente.', + 'permission-denied' => 'Permiso Denegado', + 'remove-image' => 'Eliminar Imagen', + 'upload_image_pix' => 'Sube una Imagen de Perfil (100px x 100px)', + 'upload_image_format' => 'en formato PNG o JPG', + 'image_upload_message' => 'Solo se permiten imágenes (.jpeg, .jpg, .png, ..).', + ], + ], + 'emails' => [ + 'common' => [ + 'dear' => 'Estimado/a :name', + 'cheers' => 'Saludos,
Equipo :app_name', + 'user' => [ + 'dear' => 'Estimado/a :username', + 'create-subject' => 'Has sido agregado como miembro.', + 'create-body' => '¡Felicidades! Ahora eres miembro de nuestro equipo.', + 'forget-password' => [ + 'subject' => 'Restablecimiento de Contraseña del Cliente', + 'dear' => 'Estimado/a :username', + 'reset-password' => 'Restablecer Contraseña', + 'info' => 'Estás recibiendo este correo porque recibimos una solicitud de restablecimiento de contraseña para tu cuenta', + 'final-summary' => 'Si no solicitaste el restablecimiento de contraseña, no se requiere ninguna acción adicional', + 'thanks' => '¡Gracias!', + ], + ], + ], + ], + 'validations' => [ + 'message' => [ + 'decimal' => 'El :attribute debe ser un número decimal.', + ], + ], + 'errors' => [ + 'dashboard' => 'Tablero', + 'go-back' => 'Volver', + 'support' => 'Si el problema persiste, contáctanos en :email para obtener ayuda.', + '404' => [ + 'description' => '¡Ups! La página que estás buscando está de vacaciones. Parece que no pudimos encontrar lo que estabas buscando.', + 'title' => '404 Página No Encontrada', + ], + '401' => [ + 'description' => '¡Ups! Parece que no tienes permiso para acceder a esta página. Parece que te faltan las credenciales necesarias.', + 'title' => '401 No Autorizado', + ], + '403' => [ + 'description' => '¡Ups! Esta página está fuera de límites. Parece que no tienes los permisos necesarios para ver este contenido.', + 'title' => '403 Prohibido', + ], + '500' => [ + 'description' => '¡Ups! Algo salió mal. Parece que tenemos problemas para cargar la página que estás buscando.', + 'title' => '500 Error Interno del Servidor', + ], + '503' => [ + 'description' => '¡Ups! Parece que estamos temporalmente fuera de servicio por mantenimiento. Vuelve a intentarlo en un rato.', + 'title' => '503 Servicio No Disponible', + ], + ], + 'export' => [ + 'csv' => 'CSV', + 'download' => 'Descargar', + 'export' => 'Exportar', + 'no-records' => 'No se encontraron registros.', + 'xls' => 'XLS', + 'xlsx' => 'XLSX', + ], +]; diff --git a/packages/Webkul/Admin/src/Resources/lang/fa/app.php b/packages/Webkul/Admin/src/Resources/lang/fa/app.php new file mode 100644 index 0000000..51b15ee --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/lang/fa/app.php @@ -0,0 +1,2225 @@ + [ + 'leads' => 'سرنخ‌ها', + 'lead' => 'سرنخ', + 'quotes' => 'پیشنهادات', + 'mail' => 'ایمیل', + 'inbox' => 'صندوق ورودی', + 'draft' => 'پیش‌نویس', + 'outbox' => 'صندوق خروجی', + 'sent' => 'ارسال شده', + 'trash' => 'زباله‌دان', + 'activities' => 'فعالیت‌ها', + 'webhook' => 'وب‌هوک', + 'contacts' => 'مخاطبین', + 'persons' => 'افراد', + 'organizations' => 'سازمان‌ها', + 'products' => 'محصولات', + 'settings' => 'تنظیمات', + 'groups' => 'گروه‌ها', + 'roles' => 'نقش‌ها', + 'users' => 'کاربران', + 'user' => 'کاربر', + 'automation' => 'اتوماسیون', + 'attributes' => 'ویژگی‌ها', + 'pipelines' => 'لوله‌ها', + 'sources' => 'منابع', + 'types' => 'انواع', + 'email-templates' => 'قالب‌های ایمیل', + 'workflows' => 'جریان‌کار', + 'other-settings' => 'سایر تنظیمات', + 'tags' => 'برچسب‌ها', + 'configuration' => 'پیکربندی', + 'create' => 'ایجاد', + 'edit' => 'ویرایش', + 'view' => 'نمایش', + 'print' => 'چاپ', + 'delete' => 'حذف', + 'export' => 'صادر کردن', + 'mass-delete' => 'حذف انبوه', + 'data-transfer' => 'انتقال داده', + 'imports' => 'واردات', + 'import' => 'وارد کردن', + 'event' => 'رویداد', + 'campaigns' => 'کمپین‌ها', + ], + 'users' => [ + 'activate-warning' => 'حساب شما هنوز فعال نشده است. لطفاً با مدیر سیستم تماس بگیرید.', + 'login-error' => 'اطلاعات وارد شده با سوابق ما مطابقت ندارد.', + 'not-permission' => 'شما اجازه دسترسی به پنل مدیریت را ندارید.', + 'login' => [ + 'email' => 'آدرس ایمیل', + 'forget-password-link' => 'فراموشی رمز عبور؟', + 'password' => 'رمز عبور', + 'submit-btn' => 'ورود', + 'title' => 'ورود', + ], + 'forget-password' => [ + 'create' => [ + 'email' => 'ایمیل ثبت‌شده', + 'email-not-exist' => 'ایمیل وجود ندارد', + 'page-title' => 'فراموشی رمز عبور', + 'reset-link-sent' => 'لینک بازنشانی رمز عبور ارسال شد', + 'sign-in-link' => 'بازگشت به ورود؟', + 'submit-btn' => 'بازنشانی', + 'title' => 'بازیابی رمز عبور', + ], + ], + 'reset-password' => [ + 'back-link-title' => 'بازگشت به ورود؟', + 'confirm-password' => 'تأیید رمز عبور', + 'email' => 'ایمیل ثبت‌شده', + 'password' => 'رمز عبور', + 'submit-btn' => 'بازنشانی رمز عبور', + 'title' => 'بازنشانی رمز عبور', + ], + ], + 'account' => [ + 'edit' => [ + 'back-btn' => 'بازگشت', + 'change-password' => 'تغییر رمز عبور', + 'confirm-password' => 'تایید رمز عبور', + 'current-password' => 'رمز عبور فعلی', + 'email' => 'ایمیل', + 'general' => 'عمومی', + 'invalid-password' => 'رمز عبور فعلی شما نادرست است.', + 'name' => 'نام', + 'password' => 'رمز عبور', + 'profile-image' => 'تصویر پروفایل', + 'save-btn' => 'ذخیره حساب کاربری', + 'title' => 'حساب من', + 'update-success' => 'حساب کاربری با موفقیت به‌روزرسانی شد', + 'upload-image-info' => 'آپلود یک تصویر پروفایل (110px X 110px) در فرمت PNG یا JPG', + ], + ], + 'components' => [ + 'activities' => [ + 'actions' => [ + 'mail' => [ + 'btn' => 'ایمیل', + 'title' => 'نگارش ایمیل', + 'to' => 'به', + 'enter-emails' => 'برای افزودن ایمیل‌ها اینتر را فشار دهید', + 'cc' => 'کپی', + 'bcc' => 'کپی مخفی', + 'subject' => 'موضوع', + 'send-btn' => 'ارسال', + 'message' => 'پیام', + ], + 'file' => [ + 'btn' => 'فایل', + 'title' => 'افزودن فایل', + 'title-control' => 'عنوان', + 'name' => 'نام', + 'description' => 'توضیحات', + 'file' => 'فایل', + 'save-btn' => 'ذخیره فایل', + ], + 'note' => [ + 'btn' => 'یادداشت', + 'title' => 'افزودن یادداشت', + 'comment' => 'نظر', + 'save-btn' => 'ذخیره یادداشت', + ], + 'activity' => [ + 'btn' => 'فعالیت', + 'title' => 'افزودن فعالیت', + 'title-control' => 'عنوان', + 'description' => 'توضیحات', + 'schedule-from' => 'زمان‌بندی از', + 'schedule-to' => 'زمان‌بندی تا', + 'location' => 'محل', + 'call' => 'تماس', + 'meeting' => 'جلسه', + 'lunch' => 'ناهار', + 'save-btn' => 'ذخیره فعالیت', + 'participants' => [ + 'title' => 'شرکت‌کنندگان', + 'placeholder' => 'برای جستجوی شرکت‌کنندگان تایپ کنید', + 'users' => 'کاربران', + 'persons' => 'افراد', + 'no-results' => 'هیچ نتیجه‌ای یافت نشد...', + ], + ], + ], + 'index' => [ + 'all' => 'همه', + 'bcc' => 'کپی مخفی', + 'by-user' => 'توسط :user', + 'calls' => 'تماس‌ها', + 'cc' => 'کپی', + 'change-log' => 'تغییرات', + 'delete' => 'حذف', + 'edit' => 'ویرایش', + 'emails' => 'ایمیل‌ها', + 'empty' => 'خالی', + 'files' => 'فایل‌ها', + 'from' => 'از', + 'location' => 'محل', + 'lunches' => 'ناهارها', + 'mark-as-done' => 'علامت زدن به عنوان انجام شده', + 'meetings' => 'جلسات', + 'notes' => 'یادداشت‌ها', + 'participants' => 'شرکت‌کنندگان', + 'planned' => 'برنامه‌ریزی شده', + 'quotes' => 'نقل قول‌ها', + 'scheduled-on' => 'برنامه‌ریزی شده در', + 'system' => 'سیستم', + 'to' => 'تا', + 'unlink' => 'لغو پیوند', + 'view' => 'مشاهده', + 'empty-placeholders' => [ + 'all' => [ + 'title' => 'هیچ فعالیتی یافت نشد', + 'description' => 'هیچ فعالیتی برای این مورد یافت نشد. می‌توانید با کلیک روی دکمه "فعالیت" در پنل سمت چپ، فعالیت اضافه کنید.', + ], + 'planned' => [ + 'title' => 'هیچ فعالیت برنامه‌ریزی‌شده‌ای یافت نشد', + 'description' => 'هیچ فعالیت برنامه‌ریزی‌شده‌ای برای این مورد یافت نشد. می‌توانید با کلیک روی دکمه "فعالیت" در پنل سمت چپ، فعالیت اضافه کنید.', + ], + 'notes' => [ + 'title' => 'یادداشتی یافت نشد', + 'description' => 'هیچ یادداشتی برای این مورد یافت نشد. می‌توانید با کلیک روی دکمه "یادداشت" در پنل سمت چپ، یادداشت اضافه کنید.', + ], + 'calls' => [ + 'title' => 'تماسی یافت نشد', + 'description' => 'هیچ تماسی برای این مورد یافت نشد. می‌توانید با کلیک روی دکمه "فعالیت" و انتخاب نوع تماس، تماس اضافه کنید.', + ], + 'meetings' => [ + 'title' => 'ملاقاتی یافت نشد', + 'description' => 'هیچ ملاقاتی برای این مورد یافت نشد. می‌توانید با کلیک روی دکمه "فعالیت" و انتخاب نوع جلسه، جلسه اضافه کنید.', + ], + 'lunches' => [ + 'title' => 'ناهاری یافت نشد', + 'description' => 'هیچ ناهاری برای این مورد یافت نشد. می‌توانید با کلیک روی دکمه "فعالیت" و انتخاب نوع ناهار، ناهار اضافه کنید.', + ], + 'files' => [ + 'title' => 'فایلی یافت نشد', + 'description' => 'هیچ فایلی برای این مورد یافت نشد. می‌توانید با کلیک روی دکمه "فایل" در پنل سمت چپ، فایل اضافه کنید.', + ], + 'emails' => [ + 'title' => 'ایمیلی یافت نشد', + 'description' => 'هیچ ایمیلی برای این مورد یافت نشد. می‌توانید با کلیک روی دکمه "ایمیل" در پنل سمت چپ، ایمیل اضافه کنید.', + ], + 'system' => [ + 'title' => 'تغییری ثبت نشده است', + 'description' => 'هیچ گزارش تغییری برای این مورد یافت نشد.', + ], + ], + ], + ], + 'media' => [ + 'images' => [ + 'add-image-btn' => 'افزودن تصویر', + 'ai-add-image-btn' => 'هوش مصنوعی جادویی', + 'allowed-types' => 'png, jpeg, jpg', + 'not-allowed-error' => 'فقط فایل‌های تصویری (.jpeg, .jpg, .png, ..) مجاز هستند.', + 'placeholders' => [ + 'front' => 'جلو', + 'next' => 'بعدی', + 'size' => 'اندازه', + 'use-cases' => 'موارد استفاده', + 'zoom' => 'بزرگنمایی', + ], + ], + 'videos' => [ + 'add-video-btn' => 'افزودن ویدیو', + 'allowed-types' => 'mp4, webm, mkv', + 'not-allowed-error' => 'فقط فایل‌های ویدیویی (.mp4, .mov, .ogg ..) مجاز هستند.', + ], + ], + 'datagrid' => [ + 'index' => [ + 'no-records-selected' => 'هیچ رکوردی انتخاب نشده است.', + 'must-select-a-mass-action-option' => 'باید یک گزینه از اقدامات انبوه را انتخاب کنید.', + 'must-select-a-mass-action' => 'باید یک اقدام انبوه را انتخاب کنید.', + ], + 'toolbar' => [ + 'length-of' => ':length از', + 'of' => 'از', + 'per-page' => 'در هر صفحه', + 'results' => ':total نتایج', + 'delete' => 'حذف', + 'selected' => ':total موارد انتخاب شده', + 'mass-actions' => [ + 'submit' => 'ارسال', + 'select-option' => 'انتخاب گزینه', + 'select-action' => 'انتخاب اقدام', + ], + 'filter' => [ + 'apply-filters-btn' => 'اعمال فیلترها', + 'back-btn' => 'بازگشت', + 'create-new-filter' => 'ایجاد فیلتر جدید', + 'custom-filters' => 'فیلترهای سفارشی', + 'delete-error' => 'خطایی در هنگام حذف فیلتر رخ داد، لطفاً دوباره تلاش کنید.', + 'delete-success' => 'فیلتر با موفقیت حذف شد.', + 'empty-description' => 'هیچ فیلتری برای ذخیره انتخاب نشده است. لطفاً فیلترها را برای ذخیره انتخاب کنید.', + 'empty-title' => 'افزودن فیلترها برای ذخیره', + 'name' => 'نام', + 'quick-filters' => 'فیلترهای سریع', + 'save-btn' => 'ذخیره', + 'save-filter' => 'ذخیره فیلتر', + 'saved-success' => 'فیلتر با موفقیت ذخیره شد.', + 'selected-filters' => 'فیلترهای انتخاب شده', + 'title' => 'فیلتر', + 'update' => 'به‌روزرسانی', + 'update-filter' => 'به‌روزرسانی فیلتر', + 'updated-success' => 'فیلتر با موفقیت به‌روزرسانی شد.', + ], + 'search' => [ + 'title' => 'جستجو', + ], + ], + 'filters' => [ + 'select' => 'انتخاب', + 'title' => 'فیلترها', + 'dropdown' => [ + 'searchable' => [ + 'at-least-two-chars' => 'حداقل ۲ حرف تایپ کنید...', + 'no-results' => 'هیچ نتیجه‌ای یافت نشد...', + ], + ], + 'custom-filters' => [ + 'clear-all' => 'پاک کردن همه', + 'title' => 'فیلترهای سفارشی', + ], + 'boolean-options' => [ + 'false' => 'نادرست', + 'true' => 'درست', + ], + 'date-options' => [ + 'last-month' => 'ماه گذشته', + 'last-six-months' => '۶ ماه گذشته', + 'last-three-months' => '۳ ماه گذشته', + 'this-month' => 'این ماه', + 'this-week' => 'این هفته', + 'this-year' => 'امسال', + 'today' => 'امروز', + 'yesterday' => 'دیروز', + ], + ], + 'table' => [ + 'actions' => 'اقدامات', + 'no-records-available' => 'رکوردی موجود نیست.', + ], + ], + 'modal' => [ + 'confirm' => [ + 'agree-btn' => 'موافقم', + 'disagree-btn' => 'مخالفم', + 'message' => 'آیا مطمئن هستید که می‌خواهید این عمل را انجام دهید؟', + 'title' => 'آیا مطمئن هستید؟', + ], + ], + 'tags' => [ + 'index' => [ + 'title' => 'برچسب‌ها', + 'added-tags' => 'برچسب‌های اضافه شده', + 'save-btn' => 'ذخیره برچسب', + 'placeholder' => 'برای جستجوی برچسب‌ها تایپ کنید', + 'add-tag' => 'اضافه کردن ":term"...', + 'aquarelle-red' => 'قرمز آبرنگی', + 'crushed-cashew' => 'بادام هندی خرد شده', + 'beeswax' => 'موم عسل', + 'lemon-chiffon' => 'لیمویی', + 'snow-flurry' => 'برف سبک', + 'honeydew' => 'شهد عسل', + ], + ], + 'layouts' => [ + 'powered-by' => [ + 'description' => 'توسعه یافته توسط :krayin، یک پروژه متن باز از :webkul.', + ], + 'header' => [ + 'mega-search' => [ + 'title' => 'جستجوی بزرگ', + 'tabs' => [ + 'leads' => 'سرنخ‌ها', + 'quotes' => 'پیشنهادات', + 'persons' => 'افراد', + 'products' => 'محصولات', + ], + 'explore-all-products' => 'کاوش در تمامی محصولات', + 'explore-all-leads' => 'کاوش در تمامی سرنخ‌ها', + 'explore-all-contacts' => 'کاوش در تمامی مخاطبین', + 'explore-all-quotes' => 'کاوش در تمامی پیشنهادات', + 'explore-all-matching-products' => 'کاوش در تمامی محصولات مطابق ":query" (:count)', + 'explore-all-matching-leads' => 'کاوش در تمامی سرنخ‌های مطابق ":query" (:count)', + 'explore-all-matching-contacts' => 'کاوش در تمامی مخاطبین مطابق ":query" (:count)', + 'explore-all-matching-quotes' => 'کاوش در تمامی پیشنهادات مطابق ":query" (:count)', + ], + ], + ], + 'attributes' => [ + 'edit' => [ + 'delete' => 'حذف', + ], + 'lookup' => [ + 'click-to-add' => 'برای اضافه کردن کلیک کنید', + 'search' => 'جستجو...', + 'no-result-found' => 'نتیجه‌ای یافت نشد', + ], + ], + 'lookup' => [ + 'click-to-add' => 'برای اضافه کردن کلیک کنید', + 'no-results' => 'نتیجه‌ای یافت نشد', + 'add-as-new' => 'اضافه کردن به عنوان جدید', + 'search' => 'جستجو...', + ], + 'flash-group' => [ + 'success' => 'موفقیت', + 'error' => 'خطا', + 'warning' => 'هشدار', + 'info' => 'اطلاعات', + ], + 'tiny-mce' => [ + 'http-error' => 'خطای HTTP', + 'invalid-json' => 'پاسخ JSON نامعتبر از سرور.', + 'upload-failed' => 'آپلود فایل ناموفق بود. لطفاً دوباره تلاش کنید.', + ], + ], + 'quotes' => [ + 'index' => [ + 'title' => 'نقل‌قول‌ها', + 'create-btn' => 'ایجاد نقل‌قول', + 'create-success' => 'نقل‌قول با موفقیت ایجاد شد.', + 'update-success' => 'نقل‌قول با موفقیت به‌روزرسانی شد.', + 'delete-success' => 'نقل‌قول با موفقیت حذف شد.', + 'delete-failed' => 'حذف نقل‌قول ممکن نیست.', + 'datagrid' => [ + 'subject' => 'موضوع', + 'sales-person' => 'فروشنده', + 'expired-at' => 'تاریخ انقضا', + 'created-at' => 'تاریخ ایجاد', + 'person' => 'شخص', + 'subtotal' => 'جمع جزء', + 'discount' => 'تخفیف', + 'tax' => 'مالیات', + 'adjustment' => 'تنظیم', + 'grand-total' => 'جمع کل', + 'edit' => 'ویرایش', + 'delete' => 'حذف', + 'print' => 'چاپ', + ], + 'pdf' => [ + 'adjustment' => 'تنظیم', + 'amount' => 'مقدار', + 'billing-address' => 'آدرس صورتحساب', + 'date' => 'تاریخ', + 'discount' => 'تخفیف', + 'expired-at' => 'تاریخ انقضا', + 'grand-total' => 'جمع کل', + 'person' => 'شخص', + 'price' => 'قیمت', + 'product-name' => 'نام محصول', + 'quantity' => 'تعداد', + 'quote-id' => 'شناسه نقل‌قول', + 'sales-person' => 'فروشنده', + 'shipping-address' => 'آدرس ارسال', + 'sku' => 'کد SKU', + 'sub-total' => 'جمع جزء', + 'subject' => 'موضوع', + 'tax' => 'مالیات', + 'title' => 'نقل‌قول', + ], + ], + 'create' => [ + 'title' => 'ایجاد نقل‌قول', + 'save-btn' => 'ذخیره نقل‌قول', + 'quote-info' => 'اطلاعات نقل‌قول', + 'quote-info-info' => 'اطلاعات پایه نقل‌قول را وارد کنید.', + 'address-info' => 'اطلاعات آدرس', + 'address-info-info' => 'اطلاعات مربوط به آدرس مرتبط با نقل‌قول.', + 'quote-items' => 'موارد نقل‌قول', + 'search-products' => 'جستجوی محصولات', + 'link-to-lead' => 'پیوند به سرنخ', + 'quote-item-info' => 'درخواست محصول را برای این نقل‌قول اضافه کنید.', + 'quote-name' => 'نام نقل‌قول', + 'quantity' => 'تعداد', + 'price' => 'قیمت', + 'discount' => 'تخفیف', + 'tax' => 'مالیات', + 'total' => 'مجموع', + 'amount' => 'مقدار', + 'add-item' => '+ افزودن مورد', + 'sub-total' => 'جمع جزء (:symbol)', + 'total-discount' => 'تخفیف (:symbol)', + 'total-tax' => 'مالیات (:symbol)', + 'total-adjustment' => 'تنظیم (:symbol)', + 'grand-total' => 'جمع کل (:symbol)', + 'discount-amount' => 'مقدار تخفیف', + 'tax-amount' => 'مقدار مالیات', + 'adjustment-amount' => 'مقدار تنظیم', + 'product-name' => 'نام محصول', + 'action' => 'عملیات', + ], + 'edit' => [ + 'title' => 'ویرایش نقل‌قول', + 'save-btn' => 'ذخیره نقل‌قول', + 'quote-info' => 'اطلاعات نقل‌قول', + 'quote-info-info' => 'اطلاعات پایه نقل‌قول را وارد کنید.', + 'address-info' => 'اطلاعات آدرس', + 'address-info-info' => 'اطلاعات مربوط به آدرس مرتبط با نقل‌قول.', + 'quote-items' => 'موارد نقل‌قول', + 'link-to-lead' => 'پیوند به سرنخ', + 'quote-item-info' => 'درخواست محصول را برای این نقل‌قول اضافه کنید.', + 'quote-name' => 'نام نقل‌قول', + 'quantity' => 'تعداد', + 'price' => 'قیمت', + 'search-products' => 'جستجوی محصولات', + 'discount' => 'تخفیف', + 'tax' => 'مالیات', + 'total' => 'مجموع', + 'amount' => 'مقدار', + 'add-item' => '+ افزودن مورد', + 'sub-total' => 'جمع جزء (:symbol)', + 'total-discount' => 'تخفیف (:symbol)', + 'total-tax' => 'مالیات (:symbol)', + 'total-adjustment' => 'تنظیم (:symbol)', + 'grand-total' => 'جمع کل (:symbol)', + 'discount-amount' => 'مقدار تخفیف', + 'tax-amount' => 'مقدار مالیات', + 'adjustment-amount' => 'مقدار تنظیم', + 'product-name' => 'نام محصول', + 'action' => 'عملیات', + ], + ], + 'contacts' => [ + 'persons' => [ + 'index' => [ + 'title' => 'اشخاص', + 'create-btn' => 'ایجاد شخص', + 'create-success' => 'شخص با موفقیت ایجاد شد.', + 'update-success' => 'شخص با موفقیت به‌روزرسانی شد.', + 'all-delete-success' => 'همه افراد انتخاب‌شده با موفقیت حذف شدند.', + 'partial-delete-warning' => 'برخی از افراد با موفقیت حذف شدند. بقیه به دلیل مرتبط بودن با سرنخ‌ها حذف نشدند.', + 'none-delete-warning' => 'هیچ‌یک از افراد انتخاب‌شده به دلیل مرتبط بودن با سرنخ‌ها حذف نشدند.', + 'no-selection' => 'هیچ فردی برای حذف انتخاب نشده است.', + 'delete-failed' => 'حذف افراد انتخاب‌شده با شکست مواجه شد.', + 'datagrid' => [ + 'contact-numbers' => 'شماره‌های تماس', + 'delete' => 'حذف', + 'edit' => 'ویرایش', + 'emails' => 'ایمیل‌ها', + 'id' => 'شناسه', + 'view' => 'مشاهده', + 'name' => 'نام', + 'organization-name' => 'نام سازمان', + ], + ], + 'view' => [ + 'title' => ':name', + 'about-person' => 'درباره شخص', + 'about-organization' => 'درباره سازمان', + 'activities' => [ + 'index' => [ + 'all' => 'همه', + 'calls' => 'تماس‌ها', + 'meetings' => 'جلسات', + 'lunches' => 'ناهارها', + 'files' => 'فایل‌ها', + 'quotes' => 'نقل‌قول‌ها', + 'notes' => 'یادداشت‌ها', + 'emails' => 'ایمیل‌ها', + 'by-user' => 'توسط :user', + 'scheduled-on' => 'برنامه‌ریزی شده در', + 'location' => 'مکان', + 'participants' => 'شرکت‌کنندگان', + 'mark-as-done' => 'علامت‌گذاری به‌عنوان انجام شده', + 'delete' => 'حذف', + 'edit' => 'ویرایش', + ], + 'actions' => [ + 'mail' => [ + 'btn' => 'ایمیل', + 'title' => 'ایمیل جدید', + 'to' => 'به', + 'cc' => 'کپی (CC)', + 'bcc' => 'کپی مخفی (BCC)', + 'subject' => 'موضوع', + 'send-btn' => 'ارسال', + 'message' => 'پیام', + ], + 'file' => [ + 'btn' => 'فایل', + 'title' => 'افزودن فایل', + 'title-control' => 'عنوان', + 'name' => 'نام فایل', + 'description' => 'توضیحات', + 'file' => 'فایل', + 'save-btn' => 'ذخیره فایل', + ], + 'note' => [ + 'btn' => 'یادداشت', + 'title' => 'افزودن یادداشت', + 'comment' => 'نظر', + 'save-btn' => 'ذخیره یادداشت', + ], + 'activity' => [ + 'btn' => 'فعالیت', + 'title' => 'افزودن فعالیت', + 'title-control' => 'عنوان', + 'description' => 'توضیحات', + 'schedule-from' => 'برنامه‌ریزی از', + 'schedule-to' => 'برنامه‌ریزی تا', + 'location' => 'مکان', + 'call' => 'تماس', + 'meeting' => 'جلسه', + 'lunch' => 'ناهار', + 'save-btn' => 'ذخیره فعالیت', + ], + ], + ], + 'tags' => [ + 'create-success' => 'برچسب با موفقیت ایجاد شد.', + 'destroy-success' => 'برچسب با موفقیت حذف شد.', + ], + ], + 'create' => [ + 'title' => 'ایجاد شخص', + 'save-btn' => 'ذخیره شخص', + ], + 'edit' => [ + 'title' => 'ویرایش شخص', + 'save-btn' => 'ذخیره شخص', + ], + ], + 'organizations' => [ + 'index' => [ + 'title' => 'سازمان‌ها', + 'create-btn' => 'ایجاد سازمان', + 'create-success' => 'سازمان با موفقیت ایجاد شد.', + 'update-success' => 'سازمان با موفقیت به‌روزرسانی شد.', + 'delete-success' => 'سازمان با موفقیت حذف شد.', + 'delete-failed' => 'سازمان قابل حذف نیست.', + 'datagrid' => [ + 'delete' => 'حذف', + 'edit' => 'ویرایش', + 'id' => 'شناسه', + 'name' => 'نام', + 'persons-count' => 'تعداد اشخاص', + ], + ], + 'create' => [ + 'title' => 'ایجاد سازمان', + 'save-btn' => 'ذخیره سازمان', + ], + 'edit' => [ + 'title' => 'ویرایش سازمان', + 'save-btn' => 'ذخیره سازمان', + ], + ], + ], + 'products' => [ + 'index' => [ + 'title' => 'محصولات', + 'create-btn' => 'ایجاد محصول', + 'create-success' => 'محصول با موفقیت ایجاد شد.', + 'update-success' => 'محصول با موفقیت به‌روزرسانی شد.', + 'delete-success' => 'محصول با موفقیت حذف شد.', + 'delete-failed' => 'محصول قابل حذف نیست.', + 'datagrid' => [ + 'allocated' => 'اختصاص داده شده', + 'delete' => 'حذف', + 'edit' => 'ویرایش', + 'id' => 'شناسه', + 'in-stock' => 'در انبار', + 'name' => 'نام', + 'on-hand' => 'موجودی', + 'tag-name' => 'نام برچسب', + 'price' => 'قیمت', + 'sku' => 'SKU', + 'view' => 'مشاهده', + ], + ], + 'create' => [ + 'save-btn' => 'ذخیره محصولات', + 'title' => 'ایجاد محصولات', + 'general' => 'عمومی', + 'price' => 'قیمت', + ], + 'edit' => [ + 'title' => 'ویرایش محصولات', + 'save-btn' => 'ذخیره محصولات', + 'general' => 'عمومی', + 'price' => 'قیمت', + ], + 'view' => [ + 'sku' => 'SKU', + 'all' => 'همه', + 'notes' => 'یادداشت‌ها', + 'files' => 'فایل‌ها', + 'inventories' => 'موجودی', + 'change-logs' => 'تغییرات', + 'attributes' => [ + 'about-product' => 'درباره محصول', + ], + 'inventory' => [ + 'source' => 'منبع', + 'in-stock' => 'در انبار', + 'allocated' => 'اختصاص داده شده', + 'on-hand' => 'موجودی', + 'actions' => 'عملیات', + 'assign' => 'اختصاص دادن', + 'add-source' => 'افزودن منبع', + 'location' => 'مکان', + 'add-more' => 'افزودن بیشتر', + 'save' => 'ذخیره', + ], + ], + ], + 'settings' => [ + 'title' => 'تنظیمات', + 'groups' => [ + 'index' => [ + 'create-btn' => 'ایجاد گروه', + 'title' => 'گروه‌ها', + 'create-success' => 'گروه با موفقیت ایجاد شد.', + 'update-success' => 'گروه با موفقیت به‌روزرسانی شد.', + 'destroy-success' => 'گروه با موفقیت حذف شد.', + 'delete-failed' => 'امکان حذف گروه وجود ندارد.', + 'delete-failed-associated-users' => 'امکان حذف گروه وجود ندارد زیرا توسط کاربران استفاده می‌شود.', + 'datagrid' => [ + 'delete' => 'حذف', + 'description' => 'توضیحات', + 'edit' => 'ویرایش', + 'id' => 'شناسه', + 'name' => 'نام', + ], + 'edit' => [ + 'title' => 'ویرایش گروه', + ], + 'create' => [ + 'name' => 'نام', + 'title' => 'ایجاد گروه', + 'description' => 'توضیحات', + 'save-btn' => 'ذخیره گروه', + ], + ], + ], + 'roles' => [ + 'index' => [ + 'being-used' => 'نقش قابل حذف نیست، زیرا در کاربر مدیر استفاده می‌شود.', + 'create-btn' => 'ایجاد نقش‌ها', + 'create-success' => 'نقش با موفقیت ایجاد شد.', + 'current-role-delete-error' => 'نقش اختصاص داده شده به کاربر فعلی قابل حذف نیست.', + 'delete-failed' => 'نقش قابل حذف نیست.', + 'delete-success' => 'نقش با موفقیت حذف شد.', + 'last-delete-error' => 'حداقل یک نقش لازم است.', + 'settings' => 'تنظیمات', + 'title' => 'نقش‌ها', + 'update-success' => 'نقش با موفقیت به‌روزرسانی شد.', + 'user-define-error' => 'نقش سیستمی قابل حذف نیست.', + 'datagrid' => [ + 'all' => 'همه', + 'custom' => 'سفارشی', + 'delete' => 'حذف', + 'description' => 'توضیحات', + 'edit' => 'ویرایش', + 'id' => 'شناسه', + 'name' => 'نام', + 'permission-type' => 'نوع مجوز', + ], + ], + 'create' => [ + 'access-control' => 'کنترل دسترسی', + 'all' => 'همه', + 'back-btn' => 'بازگشت', + 'custom' => 'سفارشی', + 'description' => 'توضیحات', + 'general' => 'عمومی', + 'name' => 'نام', + 'permissions' => 'مجوزها', + 'save-btn' => 'ذخیره نقش', + 'title' => 'ایجاد نقش', + ], + 'edit' => [ + 'access-control' => 'کنترل دسترسی', + 'all' => 'همه', + 'back-btn' => 'بازگشت', + 'custom' => 'سفارشی', + 'description' => 'توضیحات', + 'general' => 'عمومی', + 'name' => 'نام', + 'permissions' => 'مجوزها', + 'save-btn' => 'ذخیره نقش', + 'title' => 'ویرایش نقش', + ], + ], + 'types' => [ + 'index' => [ + 'create-btn' => 'ایجاد نوع', + 'create-success' => 'نوع با موفقیت ایجاد شد.', + 'delete-failed' => 'نوع قابل حذف نیست.', + 'delete-success' => 'نوع با موفقیت حذف شد.', + 'title' => 'نوع‌ها', + 'update-success' => 'نوع با موفقیت به‌روزرسانی شد.', + 'datagrid' => [ + 'delete' => 'حذف', + 'description' => 'توضیحات', + 'edit' => 'ویرایش', + 'id' => 'شناسه', + 'name' => 'نام', + ], + 'create' => [ + 'name' => 'نام', + 'save-btn' => 'ذخیره نوع', + 'title' => 'ایجاد نوع', + ], + 'edit' => [ + 'title' => 'ویرایش نوع', + ], + ], + ], + 'sources' => [ + 'index' => [ + 'title' => 'منابع', + 'create-btn' => 'ایجاد منبع', + 'create-success' => 'منبع با موفقیت ایجاد شد.', + 'delete-failed' => 'امکان حذف منبع وجود ندارد.', + 'delete-success' => 'منبع با موفقیت حذف شد.', + 'update-success' => 'منبع با موفقیت به‌روزرسانی شد.', + 'delete-failed-associated-leads' => 'نمی‌توان منبع را حذف کرد زیرا با سرنخ‌های موجود مرتبط است. لطفاً ابتدا آن‌ها را جدا کرده یا به‌روزرسانی کنید.', + 'datagrid' => [ + 'delete' => 'حذف', + 'edit' => 'ویرایش', + 'id' => 'شناسه', + 'name' => 'نام', + ], + 'create' => [ + 'name' => 'نام', + 'save-btn' => 'ذخیره منبع', + 'title' => 'ایجاد منبع', + ], + 'edit' => [ + 'title' => 'ویرایش منبع', + ], + ], + ], + 'workflows' => [ + 'index' => [ + 'title' => 'جریان‌های کاری', + 'create-btn' => 'ایجاد جریان کاری', + 'create-success' => 'جریان کاری با موفقیت ایجاد شد.', + 'update-success' => 'جریان کاری با موفقیت به‌روزرسانی شد.', + 'delete-success' => 'جریان کاری با موفقیت حذف شد.', + 'delete-failed' => 'جریان کاری قابل حذف نیست.', + 'datagrid' => [ + 'delete' => 'حذف', + 'description' => 'توضیحات', + 'edit' => 'ویرایش', + 'id' => 'شناسه', + 'name' => 'نام', + ], + ], + 'helpers' => [ + 'update-related-leads' => 'به‌روزرسانی سرنخ‌های مرتبط', + 'send-email-to-sales-owner' => 'ارسال ایمیل به صاحب فروش', + 'send-email-to-participants' => 'ارسال ایمیل به شرکت‌کنندگان', + 'add-webhook' => 'افزودن وب‌هوک', + 'update-lead' => 'به‌روزرسانی سرنخ', + 'update-person' => 'به‌روزرسانی شخص', + 'send-email-to-person' => 'ارسال ایمیل به شخص', + 'add-tag' => 'افزودن برچسب', + 'add-note-as-activity' => 'افزودن یادداشت به‌عنوان فعالیت', + 'update-quote' => 'به‌روزرسانی نقل‌قول', + ], + 'create' => [ + 'title' => 'ایجاد جریان کاری', + 'event' => 'رویداد', + 'back-btn' => 'بازگشت', + 'save-btn' => 'ذخیره جریان کاری', + 'name' => 'نام', + 'basic-details' => 'جزئیات پایه', + 'description' => 'توضیحات', + 'actions' => 'اقدامات', + 'basic-details-info' => 'اطلاعات پایه جریان کاری را وارد کنید.', + 'event-info' => 'یک رویداد triggers، چک‌ها، شرایط و اقدامات از پیش تعریف شده را انجام می‌دهد.', + 'conditions' => 'شرایط', + 'conditions-info' => 'شرایط قوانینی هستند که سناریوها را بررسی می‌کنند و در مواقع خاص فعال می‌شوند.', + 'actions-info' => 'یک اقدام نه تنها بار کاری را کاهش می‌دهد بلکه فرآیند اتوماسیون CRM را بسیار آسان‌تر می‌کند.', + 'value' => 'مقدار', + 'condition-type' => 'نوع شرط', + 'all-condition-are-true' => 'تمام شرایط صحیح هستند', + 'any-condition-are-true' => 'هر شرطی صحیح است', + 'add-condition' => 'افزودن شرط', + 'add-action' => 'افزودن اقدام', + 'yes' => 'بله', + 'no' => 'خیر', + 'email' => 'ایمیل', + 'is-equal-to' => 'برابر است با', + 'is-not-equal-to' => 'برابر نیست با', + 'equals-or-greater-than' => 'برابر یا بزرگ‌تر از', + 'equals-or-less-than' => 'برابر یا کوچک‌تر از', + 'greater-than' => 'بزرگ‌تر از', + 'less-than' => 'کوچک‌تر از', + 'type' => 'نوع', + 'contain' => 'شامل', + 'contains' => 'شامل می‌شود', + 'does-not-contain' => 'شامل نمی‌شود', + ], + 'edit' => [ + 'title' => 'ویرایش جریان کاری', + 'event' => 'رویداد', + 'back-btn' => 'بازگشت', + 'save-btn' => 'ذخیره جریان کاری', + 'name' => 'نام', + 'basic-details' => 'جزئیات پایه', + 'description' => 'توضیحات', + 'actions' => 'اقدامات', + 'type' => 'نوع', + 'basic-details-info' => 'اطلاعات پایه جریان کاری را وارد کنید.', + 'event-info' => 'یک رویداد triggers، چک‌ها، شرایط و اقدامات از پیش تعریف شده را انجام می‌دهد.', + 'conditions' => 'شرایط', + 'conditions-info' => 'شرایط قوانینی هستند که سناریوها را بررسی می‌کنند و در مواقع خاص فعال می‌شوند.', + 'actions-info' => 'یک اقدام نه تنها بار کاری را کاهش می‌دهد بلکه فرآیند اتوماسیون CRM را بسیار آسان‌تر می‌کند.', + 'value' => 'مقدار', + 'condition-type' => 'نوع شرط', + 'all-condition-are-true' => 'تمام شرایط صحیح هستند', + 'any-condition-are-true' => 'هر شرطی صحیح است', + 'add-condition' => 'افزودن شرط', + 'add-action' => 'افزودن اقدام', + 'yes' => 'بله', + 'no' => 'خیر', + 'email' => 'ایمیل', + 'is-equal-to' => 'برابر است با', + 'is-not-equal-to' => 'برابر نیست با', + 'equals-or-greater-than' => 'برابر یا بزرگ‌تر از', + 'equals-or-less-than' => 'برابر یا کوچک‌تر از', + 'greater-than' => 'بزرگ‌تر از', + 'less-than' => 'کوچک‌تر از', + 'contain' => 'شامل', + 'contains' => 'شامل می‌شود', + 'does-not-contain' => 'شامل نمی‌شود', + ], + ], + 'webforms' => [ + 'index' => [ + 'title' => 'فرم‌های وب', + 'create-btn' => 'ایجاد فرم وب', + 'create-success' => 'فرم وب با موفقیت ایجاد شد.', + 'update-success' => 'فرم وب با موفقیت به‌روزرسانی شد.', + 'delete-success' => 'فرم وب با موفقیت حذف شد.', + 'delete-failed' => 'فرم وب قابل حذف نیست.', + 'datagrid' => [ + 'id' => 'شناسه', + 'title' => 'عنوان', + 'edit' => 'ویرایش', + 'delete' => 'حذف', + ], + ], + 'create' => [ + 'title' => 'ایجاد فرم وب', + 'add-attribute-btn' => 'افزودن دکمه ویژگی', + 'attribute-label-color' => 'رنگ برچسب ویژگی', + 'attributes' => 'ویژگی‌ها', + 'attributes-info' => 'ویژگی‌های سفارشی را به فرم اضافه کنید.', + 'background-color' => 'رنگ پس‌زمینه', + 'create-lead' => 'ایجاد سرب', + 'customize-webform' => 'سفارشی‌سازی فرم وب', + 'customize-webform-info' => 'فرم وب خود را با رنگ‌های انتخابی سفارشی‌سازی کنید.', + 'description' => 'توضیحات', + 'display-custom-message' => 'نمایش پیام سفارشی', + 'form-background-color' => 'رنگ پس‌زمینه فرم', + 'form-submit-btn-color' => 'رنگ دکمه ارسال فرم', + 'form-submit-button-color' => 'رنگ دکمه ارسال فرم', + 'form-title-color' => 'رنگ عنوان فرم', + 'general' => 'عمومی', + 'leads' => 'سرنخ‌ها', + 'person' => 'شخص', + 'save-btn' => 'ذخیره فرم وب', + 'submit-button-label' => 'برچسب دکمه ارسال', + 'submit-success-action' => 'عملکرد موفقیت آمیز ارسال', + 'redirect-to-url' => 'انتقال به آدرس', + 'choose-value' => 'انتخاب مقدار', + 'select-file' => 'انتخاب فایل', + 'select-image' => 'انتخاب تصویر', + 'enter-value' => 'مقدار را وارد کنید', + ], + 'edit' => [ + 'add-attribute-btn' => 'افزودن دکمه ویژگی', + 'attribute-label-color' => 'رنگ برچسب ویژگی', + 'attributes' => 'ویژگی‌ها', + 'attributes-info' => 'ویژگی‌های سفارشی را به فرم اضافه کنید.', + 'background-color' => 'رنگ پس‌زمینه', + 'choose-value' => 'انتخاب مقدار', + 'code-snippet' => 'کد نمونه', + 'copied' => 'کپی شد', + 'copy' => 'کپی', + 'create-lead' => 'ایجاد سرب', + 'customize-webform' => 'سفارشی‌سازی فرم وب', + 'customize-webform-info' => 'فرم وب خود را با رنگ‌های انتخابی سفارشی‌سازی کنید.', + 'description' => 'توضیحات', + 'display-custom-message' => 'نمایش پیام سفارشی', + 'embed' => 'گنجاندن', + 'enter-value' => 'مقدار را وارد کنید', + 'form-background-color' => 'رنگ پس‌زمینه فرم', + 'form-submit-btn-color' => 'رنگ دکمه ارسال فرم', + 'form-submit-button-color' => 'رنگ دکمه ارسال فرم', + 'form-title-color' => 'رنگ عنوان فرم', + 'general' => 'عمومی', + 'leads' => 'سرنخ‌ها', + 'person' => 'شخص', + 'preview' => 'پیش‌نمایش', + 'public-url' => 'آدرس عمومی', + 'redirect-to-url' => 'انتقال به آدرس', + 'save-btn' => 'ذخیره فرم وب', + 'select-file' => 'انتخاب فایل', + 'select-image' => 'انتخاب تصویر', + 'submit-button-label' => 'برچسب دکمه ارسال', + 'submit-success-action' => 'عملکرد موفقیت آمیز ارسال', + 'title' => 'ویرایش فرم وب', + ], + ], + 'email-template' => [ + 'index' => [ + 'create-btn' => 'ایجاد قالب ایمیل', + 'title' => 'قالب‌های ایمیل', + 'create-success' => 'قالب ایمیل با موفقیت ایجاد شد.', + 'update-success' => 'قالب ایمیل با موفقیت به‌روزرسانی شد.', + 'delete-success' => 'قالب ایمیل با موفقیت حذف شد.', + 'delete-failed' => 'قالب ایمیل قابل حذف نیست.', + 'datagrid' => [ + 'delete' => 'حذف', + 'edit' => 'ویرایش', + 'id' => 'شناسه', + 'name' => 'نام', + 'subject' => 'موضوع', + ], + ], + 'create' => [ + 'title' => 'ایجاد قالب ایمیل', + 'save-btn' => 'ذخیره قالب ایمیل', + 'email-template' => 'قالب ایمیل', + 'subject' => 'موضوع', + 'content' => 'محتوا', + 'subject-placeholders' => 'متغیرهای موضوع', + 'general' => 'عمومی', + 'name' => 'نام', + ], + 'edit' => [ + 'title' => 'ویرایش قالب ایمیل', + 'save-btn' => 'ذخیره قالب ایمیل', + 'email-template' => 'قالب ایمیل', + 'subject' => 'موضوع', + 'content' => 'محتوا', + 'subject-placeholders' => 'متغیرهای موضوع', + 'general' => 'عمومی', + 'name' => 'نام', + ], + ], + 'marketing' => [ + 'events' => [ + 'index' => [ + 'create-btn' => 'ایجاد رویداد', + 'title' => 'رویدادها', + 'create-success' => 'رویداد با موفقیت ایجاد شد.', + 'update-success' => 'رویداد با موفقیت به‌روزرسانی شد.', + 'delete-success' => 'رویداد با موفقیت حذف شد.', + 'delete-failed' => 'رویداد قابل حذف نیست.', + 'mass-delete-success' => 'رویدادها با موفقیت حذف شدند', + 'datagrid' => [ + 'delete' => 'حذف', + 'edit' => 'ویرایش', + 'id' => 'شناسه', + 'name' => 'نام', + 'description' => 'توضیحات', + 'date' => 'تاریخ', + ], + 'create' => [ + 'title' => 'ایجاد رویداد', + 'name' => 'نام', + 'date' => 'تاریخ', + 'description' => 'توضیحات', + 'save-btn' => 'ذخیره رویداد', + ], + 'edit' => [ + 'title' => 'ویرایش رویداد', + ], + ], + ], + 'campaigns' => [ + 'index' => [ + 'create-btn' => 'ایجاد کمپین', + 'title' => 'کمپین‌ها', + 'create-success' => 'کمپین با موفقیت ایجاد شد.', + 'update-success' => 'کمپین با موفقیت به‌روزرسانی شد.', + 'delete-success' => 'کمپین با موفقیت حذف شد.', + 'delete-failed' => 'کمپین قابل حذف نیست.', + 'mass-delete-success' => 'کمپین‌ها با موفقیت حذف شدند', + 'datagrid' => [ + 'id' => 'شناسه', + 'name' => 'نام', + 'subject' => 'موضوع', + 'status' => 'وضعیت', + 'active' => 'فعال', + 'inactive' => 'غیرفعال', + 'edit' => 'ویرایش', + 'delete' => 'حذف', + ], + 'create' => [ + 'title' => 'ایجاد کمپین', + 'name' => 'نام', + 'type' => 'نوع', + 'subject' => 'موضوع', + 'event' => 'رویداد', + 'email-template' => 'قالب ایمیل', + 'status' => 'وضعیت', + ], + 'edit' => [ + 'title' => 'ویرایش کمپین', + ], + ], + ], + ], + 'tags' => [ + 'index' => [ + 'create-btn' => 'ایجاد برچسب', + 'title' => 'برچسب‌ها', + 'create-success' => 'برچسب با موفقیت ایجاد شد.', + 'update-success' => 'برچسب با موفقیت به‌روزرسانی شد.', + 'delete-success' => 'برچسب با موفقیت حذف شد.', + 'delete-failed' => 'برچسب قابل حذف نیست.', + 'datagrid' => [ + 'delete' => 'حذف', + 'edit' => 'ویرایش', + 'id' => 'شناسه', + 'name' => 'نام', + 'users' => 'کاربران', + 'created-at' => 'تاریخ ایجاد', + ], + 'create' => [ + 'name' => 'نام', + 'save-btn' => 'ذخیره برچسب', + 'title' => 'ایجاد برچسب', + 'color' => 'رنگ', + ], + 'edit' => [ + 'title' => 'ویرایش برچسب', + ], + ], + ], + 'users' => [ + 'index' => [ + 'create-btn' => 'ایجاد کاربر', + 'create-success' => 'کاربر با موفقیت ایجاد شد.', + 'delete-failed' => 'کاربر قابل حذف نیست.', + 'delete-success' => 'کاربر با موفقیت حذف شد.', + 'last-delete-error' => 'حداقل یک کاربر لازم است.', + 'mass-delete-failed' => 'کاربران قابل حذف نیستند.', + 'mass-delete-success' => 'کاربران با موفقیت حذف شدند.', + 'mass-update-failed' => 'کاربران قابل به‌روزرسانی نیستند.', + 'mass-update-success' => 'کاربران با موفقیت به‌روزرسانی شدند.', + 'title' => 'کاربران', + 'update-success' => 'کاربر با موفقیت به‌روزرسانی شد.', + 'user-define-error' => 'قابل حذف نیست.', + 'active' => 'فعال', + 'inactive' => 'غیرفعال', + 'datagrid' => [ + 'active' => 'فعال', + 'created-at' => 'تاریخ ایجاد', + 'delete' => 'حذف', + 'edit' => 'ویرایش', + 'email' => 'ایمیل', + 'id' => 'شناسه', + 'inactive' => 'غیرفعال', + 'name' => 'نام', + 'status' => 'وضعیت', + 'update-status' => 'به‌روزرسانی وضعیت', + 'users' => 'کاربران', + ], + 'create' => [ + 'confirm-password' => 'تأیید رمز عبور', + 'email' => 'ایمیل', + 'general' => 'عمومی', + 'global' => 'سراسری', + 'group' => 'گروه', + 'individual' => 'فردی', + 'name' => 'نام', + 'password' => 'رمز عبور', + 'permission' => 'مجوز', + 'role' => 'نقش', + 'save-btn' => 'ذخیره کاربر', + 'status' => 'وضعیت', + 'title' => 'ایجاد کاربر', + 'view-permission' => 'مجوز مشاهده', + 'select-at-lest-one-group' => 'Select at least one group', + ], + 'edit' => [ + 'title' => 'ویرایش کاربر', + ], + ], + ], + 'pipelines' => [ + 'index' => [ + 'title' => 'پایپ‌لاین‌ها', + 'create-btn' => 'ایجاد پایپ‌لاین', + 'create-success' => 'پایپ‌لاین با موفقیت ایجاد شد.', + 'update-success' => 'پایپ‌لاین با موفقیت به‌روزرسانی شد.', + 'default-required' => 'حداقل یک پایپ‌لاین پیش‌فرض مورد نیاز است.', + 'delete-success' => 'پایپ‌لاین با موفقیت حذف شد.', + 'delete-failed' => 'پایپ‌لاین قابل حذف نیست.', + 'default-delete-error' => 'پایپ‌لاین پیش‌فرض قابل حذف نیست.', + 'datagrid' => [ + 'delete' => 'حذف', + 'edit' => 'ویرایش', + 'id' => 'شناسه', + 'is-default' => 'پیش‌فرض', + 'name' => 'نام', + 'no' => 'خیر', + 'rotten-days' => 'روزهای فاسد', + 'yes' => 'بله', + ], + ], + 'create' => [ + 'title' => 'ایجاد پایپ‌لاین', + 'save-btn' => 'ذخیره پایپ‌لاین', + 'name' => 'نام', + 'rotten-days' => 'روزهای فاسد', + 'mark-as-default' => 'علامت‌گذاری به‌عنوان پیش‌فرض', + 'general' => 'عمومی', + 'probability' => 'احتمال(%)', + 'new-stage' => 'جدید', + 'won-stage' => 'برنده', + 'lost-stage' => 'بازنده', + 'stage-btn' => 'افزودن مرحله', + 'stages' => 'مراحل', + 'duplicate-name' => 'فیلد "نام" نمی‌تواند تکراری باشد', + 'delete-stage' => 'حذف مرحله', + 'add-new-stages' => 'افزودن مراحل جدید', + 'add-stage-info' => 'مرحله جدیدی برای پایپ‌لاین خود اضافه کنید', + 'newly-added' => 'تازه اضافه شده', + 'stage-delete-success' => 'مرحله با موفقیت حذف شد', + ], + 'edit' => [ + 'title' => 'ویرایش پایپ‌لاین', + 'save-btn' => 'ذخیره پایپ‌لاین', + 'name' => 'نام', + 'rotten-days' => 'روزهای فاسد', + 'mark-as-default' => 'علامت‌گذاری به‌عنوان پیش‌فرض', + 'general' => 'عمومی', + 'probability' => 'احتمال(%)', + 'new-stage' => 'جدید', + 'won-stage' => 'برنده', + 'lost-stage' => 'بازنده', + 'stage-btn' => 'افزودن مرحله', + 'stages' => 'مراحل', + 'duplicate-name' => 'فیلد "نام" نمی‌تواند تکراری باشد', + 'delete-stage' => 'حذف مرحله', + 'add-new-stages' => 'افزودن مراحل جدید', + 'add-stage-info' => 'مرحله جدیدی برای پایپ‌لاین خود اضافه کنید', + 'stage-delete-success' => 'مرحله با موفقیت حذف شد', + ], + ], + 'webhooks' => [ + 'index' => [ + 'title' => 'وب‌هوک‌ها', + 'create-btn' => 'ایجاد وب‌هوک', + 'create-success' => 'وب‌هوک با موفقیت ایجاد شد.', + 'update-success' => 'وب‌هوک با موفقیت به‌روزرسانی شد.', + 'delete-success' => 'وب‌هوک با موفقیت حذف شد.', + 'delete-failed' => 'وب‌هوک قابل حذف نیست.', + 'datagrid' => [ + 'id' => 'شناسه', + 'delete' => 'حذف', + 'edit' => 'ویرایش', + 'name' => 'نام', + 'entity-type' => 'نوع موجودیت', + 'end-point' => 'پایان نقطه', + ], + ], + 'create' => [ + 'title' => 'ایجاد وب‌هوک', + 'save-btn' => 'ذخیره وب‌هوک', + 'info' => 'جزئیات وب‌هوک‌ها را وارد کنید', + 'url-and-parameters' => 'آدرس و پارامترها', + 'method' => 'متد', + 'post' => 'پست', + 'put' => 'پوت', + 'url-endpoint' => 'آدرس پایان', + 'parameters' => 'پارامترها', + 'add-new-parameter' => 'افزودن پارامتر جدید', + 'url-preview' => 'پیش‌نمایش آدرس:', + 'headers' => 'هدینگ‌ها', + 'add-new-header' => 'افزودن هدینگ جدید', + 'body' => 'بدن', + 'default' => 'پیش‌فرض', + 'x-www-form-urlencoded' => 'x-www-form-urlencoded', + 'key-and-value' => 'کلید و مقدار', + 'add-new-payload' => 'اضافه کردن بار جدید', + 'raw' => 'خام', + 'general' => 'عمومی', + 'name' => 'نام', + 'entity-type' => 'نوع موجودیت', + 'insert-placeholder' => 'درج نشانه‌گذاری', + 'description' => 'توضیحات', + 'json' => 'جی‌سان', + 'text' => 'متن', + ], + 'edit' => [ + 'title' => 'ویرایش وب‌هوک', + 'edit-btn' => 'ذخیره وب‌هوک', + 'save-btn' => 'ذخیره وب‌هوک', + 'info' => 'جزئیات وب‌هوک‌ها را وارد کنید', + 'url-and-parameters' => 'آدرس و پارامترها', + 'method' => 'متد', + 'post' => 'پست', + 'put' => 'پوت', + 'url-endpoint' => 'آدرس پایان', + 'parameters' => 'پارامترها', + 'add-new-parameter' => 'افزودن پارامتر جدید', + 'url-preview' => 'پیش‌نمایش آدرس:', + 'headers' => 'هدینگ‌ها', + 'add-new-header' => 'افزودن هدینگ جدید', + 'body' => 'بدن', + 'default' => 'پیش‌فرض', + 'x-www-form-urlencoded' => 'x-www-form-urlencoded', + 'key-and-value' => 'کلید و مقدار', + 'add-new-payload' => 'اضافه کردن بار جدید', + 'raw' => 'خام', + 'general' => 'عمومی', + 'name' => 'نام', + 'entity-type' => 'نوع موجودیت', + 'insert-placeholder' => 'درج نشانه‌گذاری', + 'description' => 'توضیحات', + 'json' => 'جی‌سان', + 'text' => 'متن', + ], + ], + 'warehouses' => [ + 'index' => [ + 'title' => 'انبارها', + 'create-btn' => 'ایجاد انبار', + 'create-success' => 'انبار با موفقیت ایجاد شد.', + 'name-exists' => 'نام انبار قبلاً موجود است.', + 'update-success' => 'انبار با موفقیت به‌روزرسانی شد.', + 'delete-success' => 'انبار با موفقیت حذف شد.', + 'delete-failed' => 'انبار قابل حذف نیست.', + 'datagrid' => [ + 'id' => 'شناسه', + 'name' => 'نام', + 'contact-name' => 'نام تماس', + 'delete' => 'حذف', + 'edit' => 'ویرایش', + 'view' => 'مشاهده', + 'created-at' => 'تاریخ ایجاد', + 'products' => 'محصولات', + 'contact-emails' => 'ایمیل‌های تماس', + 'contact-numbers' => 'شماره‌های تماس', + ], + ], + 'create' => [ + 'title' => 'ایجاد انبار', + 'save-btn' => 'ذخیره انبار', + 'contact-info' => 'اطلاعات تماس', + ], + 'edit' => [ + 'title' => 'ویرایش انبار', + 'save-btn' => 'ذخیره انبار', + 'contact-info' => 'اطلاعات تماس', + ], + 'view' => [ + 'all' => 'همه', + 'notes' => 'یادداشت‌ها', + 'files' => 'فایل‌ها', + 'location' => 'مکان', + 'change-logs' => 'لاگ‌های تغییرات', + 'locations' => [ + 'action' => 'عملیات', + 'add-location' => 'افزودن مکان', + 'create-success' => 'مکان با موفقیت ایجاد شد.', + 'delete' => 'حذف', + 'delete-failed' => 'مکان قابل حذف نیست.', + 'delete-success' => 'مکان با موفقیت حذف شد.', + 'name' => 'نام', + 'save-btn' => 'ذخیره', + ], + 'general-information' => [ + 'title' => 'اطلاعات عمومی', + ], + 'contact-information' => [ + 'title' => 'اطلاعات تماس', + ], + ], + ], + 'attributes' => [ + 'index' => [ + 'title' => 'ویژگی‌ها', + 'create-btn' => 'ایجاد ویژگی', + 'create-success' => 'ویژگی با موفقیت ایجاد شد.', + 'update-success' => 'ویژگی با موفقیت به‌روزرسانی شد.', + 'delete-success' => 'ویژگی با موفقیت حذف شد.', + 'delete-failed' => 'ویژگی قابل حذف نیست.', + 'user-define-error' => 'قادر به حذف ویژگی سیستم نیست.', + 'mass-delete-failed' => 'ویژگی‌های سیستمی قابل حذف نیستند.', + 'datagrid' => [ + 'yes' => 'بله', + 'no' => 'خیر', + 'id' => 'شناسه', + 'code' => 'کد', + 'name' => 'نام', + 'entity-type' => 'نوع موجودیت', + 'type' => 'نوع', + 'is-default' => 'پیش‌فرض است', + 'edit' => 'ویرایش', + 'delete' => 'حذف', + 'entity-types' => [ + 'leads' => 'سرنخ‌ها', + 'organizations' => 'سازمان‌ها', + 'persons' => 'افراد', + 'products' => 'محصولات', + 'quotes' => 'نقل‌قول‌ها', + 'warehouses' => 'انبارها', + ], + 'types' => [ + 'text' => 'متن', + 'textarea' => 'ناحیه متنی', + 'price' => 'قیمت', + 'boolean' => 'بولی', + 'select' => 'انتخاب', + 'multiselect' => 'چند انتخابی', + 'checkbox' => 'چک‌باکس', + 'email' => 'ایمیل', + 'address' => 'آدرس', + 'phone' => 'تلفن', + 'lookup' => 'جستجو', + 'datetime' => 'تاریخ و زمان', + 'date' => 'تاریخ', + 'image' => 'تصویر', + 'file' => 'فایل', + ], + ], + ], + 'create' => [ + 'title' => 'ایجاد ویژگی', + 'save-btn' => 'ذخیره ویژگی', + 'code' => 'کد', + 'name' => 'نام', + 'entity-type' => 'نوع موجودیت', + 'type' => 'نوع', + 'validations' => 'اعتبارسنجی‌ها', + 'is-required' => 'الزامی است', + 'input-validation' => 'اعتبارسنجی ورودی', + 'is-unique' => 'منحصربه‌فرد است', + 'labels' => 'برچسب‌ها', + 'general' => 'عمومی', + 'numeric' => 'عددی', + 'decimal' => 'اعشاری', + 'url' => 'آدرس', + 'options' => 'گزینه‌ها', + 'option-type' => 'نوع گزینه', + 'lookup-type' => 'نوع جستجو', + 'add-option' => 'افزودن گزینه', + 'save-option' => 'ذخیره گزینه', + 'option-name' => 'نام گزینه', + 'add-attribute-options' => 'افزودن گزینه‌های ویژگی', + 'text' => 'متن', + 'textarea' => 'میدان متن', + 'price' => 'قیمت', + 'boolean' => 'بولی', + 'select' => 'انتخاب', + 'multiselect' => 'چند انتخابی', + 'email' => 'ایمیل', + 'address' => 'آدرس', + 'phone' => 'تلفن', + 'datetime' => 'تاریخ و زمان', + 'date' => 'تاریخ', + 'image' => 'تصویر', + 'file' => 'فایل', + 'lookup' => 'جستجو', + 'entity_type' => 'نوع موجودیت', + 'checkbox' => 'چک باکس', + 'is_required' => 'الزامی است', + 'is_unique' => 'منحصربه‌فرد است', + 'actions' => 'عملیات', + ], + 'edit' => [ + 'actions' => 'عملیات', + 'add-attribute-options' => 'افزودن گزینه‌های ویژگی', + 'add-option' => 'افزودن گزینه', + 'address' => 'آدرس', + 'boolean' => 'بولی', + 'checkbox' => 'چک باکس', + 'code' => 'کد', + 'date' => 'تاریخ', + 'datetime' => 'تاریخ و زمان', + 'decimal' => 'اعشاری', + 'email' => 'ایمیل', + 'entity-type' => 'نوع موجودیت', + 'entity_type' => 'نوع موجودیت', + 'file' => 'فایل', + 'general' => 'عمومی', + 'image' => 'تصویر', + 'input-validation' => 'اعتبارسنجی ورودی', + 'is-required' => 'الزامی است', + 'is-unique' => 'منحصربه‌فرد است', + 'is_required' => 'الزامی است', + 'is_unique' => 'منحصربه‌فرد است', + 'labels' => 'برچسب‌ها', + 'lookup' => 'جستجو', + 'lookup-type' => 'نوع جستجو', + 'multiselect' => 'چند انتخابی', + 'name' => 'نام', + 'numeric' => 'عددی', + 'option-deleted' => 'Attribute Option is deleted successfully', + 'option-name' => 'نام گزینه', + 'option-type' => 'نوع گزینه', + 'options' => 'گزینه‌ها', + 'phone' => 'تلفن', + 'price' => 'قیمت', + 'save-btn' => 'ذخیره ویژگی', + 'save-option' => 'ذخیره گزینه', + 'select' => 'انتخاب', + 'text' => 'متن', + 'textarea' => 'میدان متن', + 'title' => 'ویرایش ویژگی', + 'type' => 'نوع', + 'url' => 'آدرس', + 'validations' => 'اعتبارسنجی‌ها', + ], + ], + 'data-transfer' => [ + 'imports' => [ + 'create' => [ + 'action' => 'عملیات', + 'allowed-errors' => 'خطاهای مجاز', + 'back-btn' => 'بازگشت', + 'create-update' => 'ایجاد/به‌روزرسانی', + 'delete' => 'حذف', + 'download-sample' => 'دانلود نمونه', + 'field-separator' => 'جداکننده فیلد', + 'file' => 'فایل', + 'general' => 'عمومی', + 'images-directory' => 'مسیر پوشه تصاویر', + 'process-in-queue' => 'پردازش در صف', + 'results' => 'نتایج', + 'save-btn' => 'ذخیره واردات', + 'settings' => 'تنظیمات', + 'skip-errors' => 'رد کردن خطاها', + 'stop-on-errors' => 'توقف در صورت خطا', + 'title' => 'ایجاد واردات', + 'type' => 'نوع', + 'validation-strategy' => 'استراتژی اعتبارسنجی', + ], + 'edit' => [ + 'action' => 'عملیات', + 'allowed-errors' => 'خطاهای مجاز', + 'back-btn' => 'بازگشت', + 'create-update' => 'ایجاد/به‌روزرسانی', + 'delete' => 'حذف', + 'download-sample' => 'دانلود نمونه', + 'field-separator' => 'جداکننده فیلد', + 'file' => 'فایل', + 'general' => 'عمومی', + 'images-directory' => 'مسیر پوشه تصاویر', + 'process-in-queue' => 'پردازش در صف', + 'results' => 'نتایج', + 'save-btn' => 'ذخیره واردات', + 'settings' => 'تنظیمات', + 'skip-errors' => 'رد کردن خطاها', + 'stop-on-errors' => 'توقف در صورت خطا', + 'title' => 'ویرایش واردات', + 'type' => 'نوع', + 'validation-strategy' => 'استراتژی اعتبارسنجی', + ], + 'index' => [ + 'button-title' => 'ایجاد واردات', + 'title' => 'واردات‌ها', + 'datagrid' => [ + 'actions' => 'عملیات', + 'completed-at' => 'تکمیل شده در', + 'created' => 'ایجاد شده', + 'delete' => 'حذف', + 'deleted' => 'حذف شده', + 'edit' => 'ویرایش', + 'error-file' => 'فایل خطا', + 'id' => 'شناسه', + 'started-at' => 'شروع شده در', + 'state' => 'وضعیت', + 'summary' => 'خلاصه', + 'type' => 'نوع', + 'updated' => 'به‌روزرسانی شده', + 'uploaded-file' => 'فایل آپلود شده', + ], + ], + 'import' => [ + 'back-btn' => 'بازگشت', + 'completed-batches' => 'کل دسته‌های تکمیل شده:', + 'download-error-report' => 'دانلود گزارش کامل', + 'edit-btn' => 'ویرایش', + 'imported-info' => 'تبریک! واردات شما با موفقیت انجام شد.', + 'importing-info' => 'واردات در حال انجام است', + 'indexing-info' => 'ایندکس‌گذاری منابع (قیمت، موجودی و Elastic Search) در حال پیشرفت است', + 'linking-info' => 'پیونددهی منابع در حال انجام است', + 'progress' => 'پیشرفت:', + 'title' => 'واردات', + 'total-batches' => 'کل دسته‌ها:', + 'total-created' => 'کل رکوردهای ایجاد شده:', + 'total-deleted' => 'کل رکوردهای حذف شده:', + 'total-errors' => 'کل خطاها:', + 'total-invalid-rows' => 'کل ردیف‌های نامعتبر:', + 'total-rows-processed' => 'کل ردیف‌های پردازش شده:', + 'total-updated' => 'کل رکوردهای به‌روزرسانی شده:', + 'validate' => 'اعتبارسنجی', + 'validate-info' => 'برای بررسی واردات خود، روی "اعتبارسنجی داده‌ها" کلیک کنید.', + 'validating-info' => 'خواندن و اعتبارسنجی داده‌ها آغاز شده است', + 'validation-failed-info' => 'واردات شما نامعتبر است. لطفاً خطاهای زیر را رفع کرده و دوباره تلاش کنید.', + 'validation-success-info' => 'واردات شما معتبر است. برای شروع فرآیند واردات، روی "واردات" کلیک کنید.', + ], + 'create-success' => 'واردات با موفقیت ایجاد شد.', + 'delete-failed' => 'حذف واردات به طور غیرمنتظره‌ای ناکام ماند.', + 'delete-success' => 'واردات با موفقیت حذف شد.', + 'not-valid' => 'واردات نامعتبر است', + 'nothing-to-import' => 'هیچ منبعی برای واردات وجود ندارد.', + 'setup-queue-error' => 'لطفاً درایور صف خود را به "database" یا "redis" تغییر دهید تا فرآیند واردات شروع شود.', + 'update-success' => 'واردات با موفقیت به‌روزرسانی شد.', + ], + ], + ], + 'activities' => [ + 'index' => [ + 'title' => 'فعالیت‌ها', + 'datagrid' => [ + 'comment' => 'نظر', + 'created_at' => 'تاریخ ایجاد', + 'created_by' => 'ایجاد شده توسط', + 'edit' => 'ویرایش', + 'id' => 'شناسه', + 'done' => 'انجام شده', + 'not-done' => 'انجام نشده', + 'lead' => 'سرنخ', + 'mass-delete' => 'حذف انبوه', + 'mass-update' => 'به‌روزرسانی انبوه', + 'schedule-from' => 'برنامه‌ریزی از', + 'schedule-to' => 'برنامه‌ریزی تا', + 'schedule_from' => 'برنامه‌ریزی از', + 'schedule_to' => 'برنامه‌ریزی تا', + 'title' => 'عنوان', + 'is_done' => 'انجام شده', + 'type' => 'نوع', + 'update' => 'به‌روزرسانی', + 'call' => 'تماس', + 'meeting' => 'جلسه', + 'lunch' => 'ناهار', + ], + ], + 'edit' => [ + 'title' => 'ویرایش فعالیت', + 'back-btn' => 'برگشت', + 'save-btn' => 'ذخیره فعالیت', + 'type' => 'نوع فعالیت', + 'call' => 'تماس', + 'meeting' => 'جلسه', + 'lunch' => 'ناهار', + 'schedule_to' => 'برنامه‌ریزی تا', + 'schedule_from' => 'برنامه‌ریزی از', + 'location' => 'مکان', + 'comment' => 'نظر', + 'lead' => 'سرنخ', + 'participants' => 'شرکت‌کنندگان', + 'general' => 'عمومی', + 'persons' => 'افراد', + 'no-result-found' => 'سوابقی یافت نشد.', + 'users' => 'کاربران', + ], + 'updated' => 'به‌روزرسانی شد :attribute', + 'created' => 'ایجاد شد', + 'duration-overlapping' => 'شرکت‌کنندگان در این زمان جلسه دیگری دارند. آیا می‌خواهید ادامه دهید؟', + 'create-success' => 'فعالیت با موفقیت ایجاد شد.', + 'update-success' => 'فعالیت با موفقیت به‌روزرسانی شد.', + 'overlapping-error' => 'شرکت‌کنندگان در این زمان جلسه دیگری دارند.', + 'destroy-success' => 'فعالیت با موفقیت حذف شد.', + 'delete-failed' => 'امکان حذف فعالیت وجود ندارد.', + 'mass-update-success' => 'فعالیت‌ها با موفقیت به‌روزرسانی شدند.', + 'mass-destroy-success' => 'فعالیت‌ها با موفقیت حذف شدند.', + 'mass-delete-failed' => 'امکان حذف فعالیت‌ها وجود ندارد.', + ], + 'mail' => [ + 'index' => [ + 'compose' => 'نوشتن', + 'draft' => 'پیش‌نویس', + 'inbox' => 'صندوق ورودی', + 'outbox' => 'صندوق خروجی', + 'sent' => 'ارسال شده', + 'trash' => 'سطل زباله', + 'compose-mail-btn' => 'نوشتن ایمیل', + 'btn' => 'ایمیل', + 'mail' => [ + 'title' => 'نوشتن ایمیل', + 'to' => 'به', + 'enter-emails' => 'برای اضافه کردن ایمیل‌ها، کلید Enter را فشار دهید', + 'cc' => 'CC', + 'bcc' => 'BCC', + 'subject' => 'موضوع', + 'send-btn' => 'ارسال', + 'message' => 'پیام', + 'draft' => 'پیش‌نویس', + ], + 'datagrid' => [ + 'id' => 'شناسه', + 'from' => 'از', + 'to' => 'به', + 'subject' => 'موضوع', + 'tags' => 'برچسب‌ها', + 'content' => 'محتوا', + 'attachments' => 'پیوست‌ها', + 'date' => 'تاریخ', + 'move-to-inbox' => 'انتقال به صندوق ورودی', + 'move-to-trash' => 'به سطل زباله منتقل شد', + 'edit' => 'ویرایش', + 'view' => 'نمایش', + 'delete' => 'حذف', + ], + ], + 'create-success' => 'ایمیل با موفقیت ارسال شد.', + 'update-success' => 'ایمیل با موفقیت به‌روزرسانی شد.', + 'mass-update-success' => 'ایمیل‌ها با موفقیت به‌روزرسانی شدند.', + 'delete-success' => 'ایمیل با موفقیت حذف شد.', + 'delete-failed' => 'ایمیل قابل حذف نیست.', + 'view' => [ + 'title' => 'ایمیل‌ها', + 'subject' => ':subject', + 'link-mail' => 'لینک ایمیل', + 'to' => 'به', + 'cc' => 'CC', + 'bcc' => 'BCC', + 'reply' => 'پاسخ', + 'reply-all' => 'پاسخ به همه', + 'forward' => 'فوروارد', + 'delete' => 'حذف', + 'enter-mails' => 'شناسه ایمیل را وارد کنید', + 'rotten-days' => 'سرنخ به مدت :days روز خراب شده است', + 'search-an-existing-lead' => 'جستجوی سرنخ موجود', + 'search-an-existing-contact' => 'جستجوی مخاطب موجود', + 'message' => 'پیام', + 'add-attachments' => 'اضافه کردن پیوست‌ها', + 'discard' => 'لغو', + 'send' => 'ارسال', + 'no-result-found' => 'نتیجه‌ای یافت نشد', + 'add-new-contact' => 'افزودن مخاطب جدید', + 'description' => 'توضیحات', + 'search' => 'جستجو...', + 'add-new-lead' => 'افزودن سرنخ جدید', + 'create-new-contact' => 'ایجاد مخاطب جدید', + 'save-contact' => 'ذخیره مخاطب', + 'create-lead' => 'ایجاد سرنخ', + 'linked-contact' => 'مخاطب مرتبط', + 'link-to-contact' => 'لینک به مخاطب', + 'link-to-lead' => 'لینک به سرنخ', + 'linked-lead' => 'سرنخ مرتبط', + 'lead-details' => 'جزئیات سرنخ', + 'contact-person' => 'شخص تماس', + 'product' => 'محصول', + 'tags' => [ + 'create-success' => 'برچسب با موفقیت ایجاد شد.', + 'destroy-success' => 'برچسب با موفقیت حذف شد.', + ], + ], + ], + 'common' => [ + 'custom-attributes' => [ + 'add-more' => 'افزودن بیشتر', + 'address' => 'آدرس', + 'city' => 'شهر', + 'contact' => 'شماره‌های تماس', + 'country' => 'کشور', + 'email' => 'ایمیل', + 'home' => 'خانه', + 'postcode' => 'کد پستی', + 'save' => 'ذخیره', + 'select' => 'انتخاب', + 'select-country' => 'انتخاب کشور', + 'select-state' => 'انتخاب ایالت', + 'state' => 'ایالت', + 'update-contact-title' => 'به‌روزرسانی شماره‌های تماس', + 'update-emails-title' => 'به‌روزرسانی ایمیل‌های تماس', + 'work' => 'محل کار', + ], + ], + 'leads' => [ + 'create-success' => 'سرنخ با موفقیت ایجاد شد.', + 'update-success' => 'سرنخ با موفقیت به‌روزرسانی شد.', + 'update-failed' => 'سرنخ‌ها قابل حذف نیستند.', + 'destroy-success' => 'سرنخ با موفقیت حذف شد.', + 'destroy-failed' => 'سرنخ قابل حذف نیست.', + 'file' => [ + 'data-not-found' => 'داده‌ای یافت نشد.', + 'empty-content' => 'محتوای PDF خالی است یا نمی‌توان آن را استخراج کرد.', + 'failed-extract' => 'استخراج متن از فایل ناموفق بود.', + 'insufficient-info' => 'به دلیل اطلاعات ناکافی، در حال حاضر نمی‌توانیم درخواست شما را پردازش کنیم.', + 'invalid-base64' => 'فرمت base64 نامعتبر است.', + 'invalid-format' => 'فرمت JSON نامعتبر است.', + 'invalid-response' => 'فرمت پاسخ هوش مصنوعی نامعتبر است.', + 'missing-api-key' => 'کلید API یا پیکربندی مدل مفقود است.', + 'not-found' => 'فایل یافت نشد.', + 'recursive-call' => 'تماس بازگشتی شناسایی شد.', + 'text-generation-failed' => 'استخراج متن ناموفق بود. فایل ممکن است خالی یا غیرقابل خواندن باشد.', + ], + 'index' => [ + 'title' => 'سرنخ‌ها', + 'create-btn' => 'ایجاد سرنخ', + 'datagrid' => [ + 'id' => 'شناسه', + 'sales-person' => 'کارشناس فروش', + 'subject' => 'موضوع', + 'source' => 'منبع', + 'lead-value' => 'ارزش سرنخ', + 'lead-type' => 'نوع سرنخ', + 'tag-name' => 'نام برچسب', + 'contact-person' => 'شخص تماس', + 'stage' => 'مرحله', + 'rotten-lead' => 'سرنخ خراب شده', + 'date-to' => 'تاریخ تا', + 'created-at' => 'تاریخ ایجاد', + 'no' => 'خیر', + 'yes' => 'بله', + 'delete' => 'حذف', + 'mass-delete' => 'حذف گروهی', + 'mass-update' => 'به‌روزرسانی گروهی', + ], + 'kanban' => [ + 'rotten-days' => 'سرنخ برای :days روز خراب شده است', + 'empty-list' => 'لیست سرنخ‌های شما خالی است', + 'empty-list-description' => 'یک سرنخ ایجاد کنید تا اهداف خود را سازماندهی کنید.', + 'create-lead-btn' => 'ایجاد سرنخ', + 'columns' => [ + 'contact-person' => 'شخص تماس', + 'id' => 'شناسه', + 'lead-type' => 'نوع سرنخ', + 'lead-value' => 'ارزش سرنخ', + 'sales-person' => 'کارشناس فروش', + 'source' => 'منبع', + 'title' => 'عنوان', + 'tags' => 'برچسب‌ها', + 'expected-close-date' => 'تاریخ بسته شدن مورد انتظار', + 'created-at' => 'تاریخ ایجاد', + ], + 'toolbar' => [ + 'search' => [ + 'title' => 'جستجو بر اساس عنوان', + ], + 'filters' => [ + 'apply-filters' => 'اعمال فیلترها', + 'clear-all' => 'پاک کردن همه', + 'filter' => 'فیلتر', + 'filters' => 'فیلترها', + 'from' => 'از', + 'select' => 'انتخاب', + 'to' => 'تا', + ], + ], + ], + 'view-switcher' => [ + 'all-pipelines' => 'تمام خطوط تولید', + 'create-new-pipeline' => 'ایجاد خط تولید جدید', + ], + 'upload' => [ + 'create-lead' => 'ایجاد سرنخ با استفاده از هوش مصنوعی', + 'file' => 'آپلود فایل', + 'file-info' => 'فقط فایل‌های با فرمت pdf, bmp, jpg, jpeg, png پذیرفته می‌شوند.', + 'file-required' => 'لطفاً حداقل یک فایل معتبر برای ادامه انتخاب کنید.', + 'save-btn' => 'ذخیره', + 'upload-file' => 'بارگذاری فایل', + ], + ], + 'create' => [ + 'title' => 'ایجاد سرنخ', + 'save-btn' => 'ذخیره', + 'details' => 'جزئیات', + 'details-info' => 'اطلاعات پایه سرنخ را وارد کنید', + 'contact-person' => 'شخص تماس', + 'contact-info' => 'اطلاعات درباره شخص تماس', + 'products' => 'محصولات', + 'products-info' => 'اطلاعات درباره محصولات', + ], + 'edit' => [ + 'title' => 'ویرایش سرنخ', + 'save-btn' => 'ذخیره', + 'details' => 'جزئیات', + 'details-info' => 'اطلاعات پایه سرنخ را وارد کنید', + 'contact-person' => 'شخص تماس', + 'contact-info' => 'اطلاعات درباره شخص تماس', + 'products' => 'محصولات', + 'products-info' => 'اطلاعات درباره محصولات', + ], + 'common' => [ + 'contact' => [ + 'name' => 'نام', + 'email' => 'ایمیل', + 'contact-number' => 'شماره تماس', + 'organization' => 'سازمان', + ], + 'products' => [ + 'product-name' => 'نام محصول', + 'quantity' => 'تعداد', + 'price' => 'قیمت', + 'amount' => 'مقدار', + 'action' => 'عملیات', + 'add-more' => 'افزودن بیشتر', + 'total' => 'جمع', + ], + ], + 'view' => [ + 'title' => 'سرنخ: :title', + 'rotten-days' => ':days روز', + 'tabs' => [ + 'description' => 'توضیحات', + 'products' => 'محصولات', + 'quotes' => 'نقل‌قول‌ها', + ], + 'attributes' => [ + 'title' => 'درباره سرنخ', + ], + 'quotes' => [ + 'subject' => 'موضوع', + 'expired-at' => 'تاریخ انقضا', + 'sub-total' => 'جمع جزئی', + 'discount' => 'تخفیف', + 'tax' => 'مالیات', + 'adjustment' => 'تنظیمات', + 'grand-total' => 'جمع کل', + 'delete' => 'حذف', + 'edit' => 'ویرایش', + 'download' => 'دانلود', + 'destroy-success' => 'پیشنهاد با موفقیت حذف شد.', + 'empty-title' => 'هیچ پیشنهادی یافت نشد', + 'empty-info' => 'هیچ پیشنهادی برای این سرنخ یافت نشد', + 'add-btn' => 'افزودن پیشنهاد', + ], + 'products' => [ + 'product-name' => 'نام محصول', + 'quantity' => 'تعداد', + 'price' => 'قیمت', + 'amount' => 'مقدار', + 'action' => 'عملیات', + 'add-more' => 'افزودن بیشتر', + 'total' => 'جمع', + 'empty-title' => 'هیچ محصولی یافت نشد', + 'empty-info' => 'هیچ محصولی برای این سرنخ یافت نشد', + 'add-product' => 'افزودن محصول', + ], + 'persons' => [ + 'title' => 'درباره افراد', + 'job-title' => ':job_title در :organization', + ], + 'stages' => [ + 'won-lost' => 'برد/باخت', + 'won' => 'برد', + 'lost' => 'باخت', + 'need-more-info' => 'نیاز به اطلاعات بیشتر', + 'closed-at' => 'بسته شده در', + 'won-value' => 'ارزش برد', + 'lost-reason' => 'دلیل باخت', + 'save-btn' => 'ذخیره', + ], + 'tags' => [ + 'create-success' => 'برچسب با موفقیت ایجاد شد.', + 'destroy-success' => 'برچسب با موفقیت حذف شد.', + ], + ], + ], + 'configuration' => [ + 'index' => [ + 'back' => 'بازگشت', + 'delete' => 'حذف', + 'save-btn' => 'ذخیره پیکربندی', + 'save-success' => 'پیکربندی با موفقیت ذخیره شد.', + 'search' => 'جستجو', + 'select-country' => 'انتخاب کشور', + 'select-state' => 'انتخاب ایالت', + 'title' => 'پیکربندی', + 'general' => [ + 'title' => 'عمومی', + 'info' => 'پیکربندی عمومی', + 'general' => [ + 'title' => 'عمومی', + 'info' => 'تنظیمات عمومی خود را اینجا به‌روزرسانی کنید.', + 'locale-settings' => [ + 'title' => 'تنظیمات محلی', + 'title-info' => 'زبان مورد استفاده در رابط کاربری را تعریف می‌کند، مانند عربی (ar)، انگلیسی (en)، اسپانیایی (es)، فارسی (fa) و ترکی (tr).', + ], + 'admin-logo' => [ + 'logo-image' => 'تصویر لوگو', + 'title' => 'لوگوی مدیر', + 'title-info' => 'تصویر لوگو برای پنل مدیریت خود را پیکربندی کنید.', + ], + ], + 'settings' => [ + 'title' => 'تنظیمات', + 'info' => 'تنظیمات خود را اینجا به‌روزرسانی کنید.', + 'footer' => [ + 'info' => 'ما می‌توانیم بخش "توسعه یافته توسط" را اینجا پیکربندی کنیم.', + 'powered-by' => 'توسعه یافته توسط ویرایشگر متن', + 'title' => 'پیکربندی بخش "توسعه یافته توسط"', + ], + 'menu' => [ + 'activities' => 'فعالیت‌ها', + 'configuration' => 'پیکربندی', + 'contacts' => 'مخاطبین', + 'dashboard' => 'داشبورد', + 'draft' => 'پیش‌نویس', + 'inbox' => 'صندوق ورودی', + 'info' => 'ما می‌توانیم نام آیتم‌های منو را اینجا پیکربندی کنیم.', + 'leads' => 'سرنخ‌ها', + 'mail' => 'ایمیل', + 'organizations' => 'سازمان‌ها', + 'outbox' => 'صندوق خروجی', + 'persons' => 'افراد', + 'products' => 'محصولات', + 'quotes' => 'نقل‌قول‌ها', + 'sent' => 'ارسال شده', + 'settings' => 'تنظیمات', + 'title' => 'پیکربندی آیتم‌های منو', + 'trash' => 'زباله‌دان', + ], + 'menu-color' => [ + 'brand-color' => 'Brand Color', + 'info' => 'ما می‌توانیم رنگ آیتم‌های منو را اینجا تغییر دهیم.', + 'title' => 'پیکربندی رنگ آیتم‌های منو', + ], + ], + ], + 'email' => [ + 'title' => 'تنظیمات ایمیل', + 'info' => 'پیکربندی ایمیل برای برنامه.', + 'imap' => [ + 'title' => 'تنظیمات IMAP', + 'info' => 'پیکربندی ایمیل IMAP برای دریافت ایمیل‌ها.', + 'account' => [ + 'title' => 'حساب IMAP', + 'title-info' => 'تنظیمات حساب IMAP خود را اینجا پیکربندی کنید.', + 'host' => 'میزبان', + 'port' => 'پورت', + 'encryption' => 'نوع رمزگذاری', + 'validate-cert' => 'اعتبارسنجی گواهی SSL', + 'username' => 'نام کاربری IMAP', + 'password' => 'رمز عبور IMAP', + ], + ], + ], + 'magic-ai' => [ + 'title' => 'هوش مصنوعی جادویی', + 'info' => 'پیکربندی هوش مصنوعی جادویی برای برنامه.', + 'settings' => [ + 'api-key' => 'کلید API', + 'api-key-info' => 'به یاد داشته باشید که برای هر مدل از کلید API OpenRouter استفاده کنید. این یک گام ساده برای افزایش امنیت و عملکرد است.', + 'enable' => 'فعال کردن', + 'info' => 'تجربه هوش مصنوعی جادویی خود را با کلید API OpenRouter خود بهبود بخشید. اکنون آن را یکپارچه کنید تا یک ماجراجویی هوش مصنوعی شخصی‌سازی شده و بدون درز برای شما فراهم شود! به راحتی تنظیمات را سفارشی کنید و کنترل سفر هوش مصنوعی خود را به دست بگیرید.', + 'other' => 'مدل دیگر', + 'other-model' => 'برای مدل‌های دیگر، از شناسه مدل از OpenRouter استفاده کنید.', + 'doc-generation' => 'تولید DOC', + 'doc-generation-info' => 'ویژگی تولید DOC را فعال کنید تا به‌صورت خودکار داده‌ها را از فایل‌های DOC استخراج و به فرمت متنی تبدیل کند. با فعال‌سازی این ویژگی، بهره‌وری و کارایی خود را افزایش دهید و فرآیند کاری را ساده‌تر کنید.', + 'title' => 'تنظیمات عمومی', + 'models' => [ + 'deepseek-r1' => 'Deepseek R1 Distill-llama-8b', + 'gemini-2-0-flash-001' => 'Gemini 2.0 flash-001', + 'gpt-4o' => 'GPT-4.0', + 'gpt-4o-mini' => 'GPT-4.0 mini', + 'grok-2-1212' => 'Grok 2.12', + 'llama-3-2-3b-instruct' => 'Llama 3.2 3b Instruct', + 'title' => 'مدل‌ها', + ], + ], + ], + ], + ], + 'dashboard' => [ + 'index' => [ + 'title' => 'داشبورد', + 'revenue' => [ + 'lost-revenue' => 'درآمد از دست رفته', + 'won-revenue' => 'درآمد برنده', + ], + 'over-all' => [ + 'average-lead-value' => 'میانگین ارزش لید', + 'total-leads' => 'کل لیدها', + 'average-leads-per-day' => 'میانگین لیدها در روز', + 'total-quotations' => 'کل نقل قول‌ها', + 'total-persons' => 'کل افراد', + 'total-organizations' => 'کل سازمان‌ها', + ], + 'total-leads' => [ + 'title' => 'لیدها', + 'total' => 'کل لیدها', + 'won' => 'لیدهای برنده', + 'lost' => 'لیدهای از دست رفته', + ], + 'revenue-by-sources' => [ + 'title' => 'درآمد بر اساس منابع', + 'empty-title' => 'هیچ داده‌ای موجود نیست', + 'empty-info' => 'داده‌ای برای بازه زمانی انتخاب شده وجود ندارد', + ], + 'revenue-by-types' => [ + 'title' => 'درآمد بر اساس انواع', + 'empty-title' => 'هیچ داده‌ای موجود نیست', + 'empty-info' => 'داده‌ای برای بازه زمانی انتخاب شده وجود ندارد', + ], + 'top-selling-products' => [ + 'title' => 'محصولات برتر', + 'empty-title' => 'هیچ محصولی پیدا نشد', + 'empty-info' => 'محصولی برای بازه زمانی انتخاب شده موجود نیست', + ], + 'top-persons' => [ + 'title' => 'افراد برتر', + 'empty-title' => 'هیچ فردی پیدا نشد', + 'empty-info' => 'فردی برای بازه زمانی انتخاب شده موجود نیست', + ], + 'open-leads-by-states' => [ + 'title' => 'سرنخ‌های باز بر اساس مراحل', + 'empty-title' => 'هیچ داده‌ای موجود نیست', + 'empty-info' => 'داده‌ای برای بازه زمانی انتخاب شده وجود ندارد', + ], + ], + ], + 'layouts' => [ + 'app-version' => 'نسخه: :version', + 'dashboard' => 'داشبورد', + 'leads' => 'لیدها', + 'quotes' => 'نقل قول‌ها', + 'quote' => 'نقل قول', + 'mail' => [ + 'title' => 'ایمیل', + 'compose' => 'تدوین', + 'inbox' => 'صندوق ورودی', + 'draft' => 'پیش‌نویس', + 'outbox' => 'صندوق خروجی', + 'sent' => 'ارسال شده', + 'trash' => 'زباله‌دان', + 'setting' => 'تنظیمات', + ], + 'activities' => 'فعالیت‌ها', + 'contacts' => 'مخاطبین', + 'persons' => 'افراد', + 'person' => 'فرد', + 'organizations' => 'سازمان‌ها', + 'organization' => 'سازمان', + 'products' => 'محصولات', + 'product' => 'محصول', + 'settings' => 'تنظیمات', + 'user' => 'کاربر', + 'user-info' => 'مدیریت همه کاربران و مجوزهای آنها در CRM، آنچه که اجازه دارند انجام دهند.', + 'groups' => 'گروه‌ها', + 'groups-info' => 'اضافه، ویرایش یا حذف گروه‌ها از CRM', + 'roles' => 'نقش‌ها', + 'role' => 'نقش', + 'roles-info' => 'اضافه، ویرایش یا حذف نقش‌ها از CRM', + 'users' => 'کاربران', + 'users-info' => 'اضافه، ویرایش یا حذف کاربران از CRM', + 'lead' => 'لید', + 'lead-info' => 'مدیریت همه تنظیمات مربوط به لیدها در CRM', + 'pipelines' => 'پایپ‌لاین‌ها', + 'pipelines-info' => 'اضافه، ویرایش یا حذف پایپ‌لاین‌ها از CRM', + 'sources' => 'منابع', + 'sources-info' => 'اضافه، ویرایش یا حذف منابع از CRM', + 'types' => 'انواع', + 'types-info' => 'اضافه، ویرایش یا حذف انواع از CRM', + 'automation' => 'اتوماسیون', + 'automation-info' => 'مدیریت همه تنظیمات مربوط به اتوماسیون در CRM', + 'attributes' => 'ویژگی‌ها', + 'attribute' => 'ویژگی', + 'attributes-info' => 'اضافه، ویرایش یا حذف ویژگی‌ها از CRM', + 'email-templates' => 'قالب‌های ایمیل', + 'email' => 'ایمیل', + 'email-templates-info' => 'اضافه، ویرایش یا حذف قالب‌های ایمیل از CRM', + 'events' => 'رویدادها', + 'events-info' => 'افزودن، ویرایش یا حذف رویدادها از CRM', + 'campaigns' => 'کمپین‌ها', + 'campaigns-info' => 'افزودن، ویرایش یا حذف کمپین‌ها از CRM', + 'workflows' => 'فرایندها', + 'workflows-info' => 'اضافه، ویرایش یا حذف فرایندها از CRM', + 'webhooks' => 'وب‌هوک‌ها', + 'webhooks-info' => 'افزودن، ویرایش یا حذف وب‌هوک‌ها از CRM', + 'other-settings' => 'تنظیمات دیگر', + 'other-settings-info' => 'مدیریت همه تنظیمات اضافی در CRM', + 'tags' => 'برچسب‌ها', + 'tags-info' => 'اضافه، ویرایش یا حذف برچسب‌ها از CRM', + 'my-account' => 'حساب من', + 'sign-out' => 'خروج', + 'back' => 'برگشت', + 'name' => 'نام', + 'configuration' => 'پیکربندی', + 'howdy' => 'سلام!', + 'warehouses' => 'انبارها', + 'warehouse' => 'انبار', + 'warehouses-info' => 'اضافه، ویرایش یا حذف انبارها از CRM', + 'data_transfer' => 'انتقال داده', + 'data_transfer_info' => 'مدیریت تنظیمات مربوط به انتقال داده‌های اشخاص، محصولات و سرنخ‌ها در CRM', + ], + 'user' => [ + 'account' => [ + 'name' => 'نام', + 'email' => 'ایمیل', + 'password' => 'رمز عبور', + 'my_account' => 'حساب من', + 'update_details' => 'بروزرسانی جزئیات', + 'current_password' => 'رمز عبور فعلی', + 'confirm_password' => 'تأیید رمز عبور', + 'password-match' => 'رمز عبور فعلی مطابقت ندارد.', + 'account-save' => 'تغییرات حساب با موفقیت ذخیره شد.', + 'permission-denied' => 'دسترسی مجاز نیست', + 'remove-image' => 'حذف تصویر', + 'upload_image_pix' => 'بارگذاری تصویر پروفایل (100px x 100px)', + 'upload_image_format' => 'در فرمت PNG یا JPG', + 'image_upload_message' => 'فقط تصاویر (.jpeg, .jpg, .png, ..) مجاز هستند.', + ], + ], + 'emails' => [ + 'common' => [ + 'dear' => 'عزیز :name', + 'cheers' => 'با احترام،
تیم :app_name', + 'user' => [ + 'dear' => 'سلام :username', + 'create-subject' => 'شما به عنوان عضو اضافه شدید.', + 'create-body' => 'تبریک می‌گوییم! شما اکنون عضو تیم ما هستید.', + 'forget-password' => [ + 'subject' => 'بازنشانی رمز عبور مشتری', + 'dear' => 'سلام :username', + 'reset-password' => 'بازنشانی رمز عبور', + 'info' => 'شما این ایمیل را دریافت کرده‌اید زیرا ما درخواست بازنشانی رمز عبور برای حساب شما دریافت کرده‌ایم', + 'final-summary' => 'اگر درخواست بازنشانی رمز عبور نکرده‌اید، نیازی به انجام اقدام دیگری نیست', + 'thanks' => 'متشکریم!', + ], + ], + ], + ], + 'validations' => [ + 'message' => [ + 'decimal' => ':attribute باید یک عدد اعشاری باشد.', + ], + ], + 'errors' => [ + 'dashboard' => 'داشبورد', + 'go-back' => 'بازگشت', + 'support' => 'اگر مشکل ادامه داشت، برای کمک با ما از طریق :email تماس بگیرید.', + '404' => [ + 'description' => 'اوه! به نظر می‌رسد صفحه‌ای که دنبال آن بودید، در دسترس نیست. نتوانستیم چیزی که دنبالش بودید را پیدا کنیم.', + 'title' => '404 صفحه پیدا نشد', + ], + '401' => [ + 'description' => 'اوه! به نظر می‌رسد که شما مجاز به دسترسی به این صفحه نیستید. شما مجوزهای لازم را ندارید.', + 'title' => '401 مجاز نیست', + ], + '403' => [ + 'description' => 'اوه! این صفحه ممنوع است. به نظر می‌رسد شما مجوزهای لازم برای مشاهده این محتوا را ندارید.', + 'title' => '403 ممنوع', + ], + '500' => [ + 'description' => 'اوه! مشکلی پیش آمده است. به نظر می‌رسد مشکلی در بارگذاری صفحه مورد نظر شما وجود دارد.', + 'title' => '500 خطای سرور داخلی', + ], + '503' => [ + 'description' => 'اوه! به نظر می‌رسد که به طور موقت برای نگهداری آفلاین هستیم. لطفاً بعداً دوباره بررسی کنید.', + 'title' => '503 سرویس در دسترس نیست', + ], + ], + 'export' => [ + 'csv' => 'CSV', + 'download' => 'دانلود', + 'export' => 'صادر کردن', + 'no-records' => 'هیچ سوابقی برای صادر کردن وجود ندارد.', + 'xls' => 'XLS', + 'xlsx' => 'XLSX', + ], +]; diff --git a/packages/Webkul/Admin/src/Resources/lang/pt_BR/app.php b/packages/Webkul/Admin/src/Resources/lang/pt_BR/app.php new file mode 100644 index 0000000..7c65b31 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/lang/pt_BR/app.php @@ -0,0 +1,2308 @@ + [ + 'leads' => 'Oportunidades', + 'lead' => 'Oportunidade', + 'quotes' => 'Cotações', + 'mail' => 'E-mail', + 'inbox' => 'Caixa de Entrada', + 'draft' => 'Rascunho', + 'outbox' => 'Caixa de Saída', + 'sent' => 'Enviados', + 'trash' => 'Lixeira', + 'activities' => 'Atividades', + 'webhook' => 'Webhook', + 'contacts' => 'Contatos', + 'persons' => 'Pessoas', + 'organizations' => 'Empresas', + 'products' => 'Produtos', + 'settings' => 'Ajustes', + 'groups' => 'Grupos', + 'roles' => 'Funções', + 'users' => 'Usuários', + 'user' => 'Usuário', + 'automation' => 'Automação', + 'attributes' => 'Atributos', + 'pipelines' => 'Funil', + 'sources' => 'Origem', + 'types' => 'Tipos', + 'email-templates' => 'Modelos de E-mail', + 'workflows' => 'Fluxos de Trabalho', + 'other-settings' => 'Outros Ajustes', + 'tags' => 'Tags', + 'configuration' => 'Ajustes', + 'create' => 'Adicionar', + 'edit' => 'Editar', + 'view' => 'Visualizar', + 'print' => 'Imprimir', + 'delete' => 'Excluir', + 'export' => 'Exportar', + 'mass-delete' => 'Exclusão em Massa', + 'data-transfer' => 'Transferência de Dados', + 'imports' => 'Importações', + 'import' => 'Importar', + 'event' => 'Evento', + 'campaigns' => 'Campanhas', + ], + 'users' => [ + 'activate-warning' => 'Sua conta ainda não foi ativada. Por favor, entre em contato com o administrador.', + 'login-error' => 'As credenciais não correspondem aos nossos registros.', + 'not-permission' => 'You do not have permission to access the admin panel.', + 'login' => [ + 'email' => 'Endereço de E-mail', + 'forget-password-link' => 'Esqueceu a Senha?', + 'password' => 'Senha', + 'submit-btn' => 'Acessar', + 'title' => 'Acessar', + ], + 'forget-password' => [ + 'create' => [ + 'email' => 'E-mail Registrado', + 'email-not-exist' => 'E-mail Não Existe', + 'page-title' => 'Esqueceu a Senha', + 'reset-link-sent' => 'Link para redefinir a senha foi enviado', + 'sign-in-link' => 'Voltar para tela de acesso?', + 'submit-btn' => 'Redefinir', + 'title' => 'Recuperar Senha', + ], + ], + 'reset-password' => [ + 'back-link-title' => 'Voltar para tela de acesso?', + 'confirm-password' => 'Confirmar Senha', + 'email' => 'E-mail Registrado', + 'password' => 'Senha', + 'submit-btn' => 'Redefinir Senha', + 'title' => 'Redefinir Senha', + ], + ], + 'account' => [ + 'edit' => [ + 'back-btn' => 'Voltar', + 'change-password' => 'Alterar Senha', + 'confirm-password' => 'Confirmar Senha', + 'current-password' => 'Senha Atual', + 'email' => 'E-mail', + 'general' => 'Geral', + 'invalid-password' => 'A senha atual que você digitou está incorreta.', + 'name' => 'Nome', + 'password' => 'Senha', + 'profile-image' => 'Imagem de Perfil', + 'save-btn' => 'Salvar Conta', + 'title' => 'Minha Conta', + 'update-success' => 'Conta atualizada com sucesso', + 'upload-image-info' => 'Carregue uma imagem de perfil (110px X 110px) no formato PNG ou JPG', + ], + ], + 'components' => [ + 'activities' => [ + 'actions' => [ + 'mail' => [ + 'btn' => 'E-mail', + 'title' => 'Escrever e-mail', + 'to' => 'Para', + 'enter-emails' => 'Pressione Enter para adicionar e-mails', + 'cc' => 'Cópia', + 'bcc' => 'Cópia oculta', + 'subject' => 'Assunto', + 'send-btn' => 'Enviar', + 'message' => 'Mensagem', + ], + 'file' => [ + 'btn' => 'Arquivo', + 'title' => 'Adicionar Arquivo', + 'title-control' => 'Título', + 'name' => 'Nome', + 'description' => 'Descrição', + 'file' => 'Arquivo', + 'save-btn' => 'Salvar Arquivo', + ], + 'note' => [ + 'btn' => 'Nota', + 'title' => 'Adicionar Nota', + 'comment' => 'Comentário', + 'save-btn' => 'Salvar Nota', + ], + 'activity' => [ + 'btn' => 'Atividade', + 'title' => 'Adicionar Atividade', + 'title-control' => 'Título', + 'description' => 'Descrição', + 'schedule-from' => 'Agendar De', + 'schedule-to' => 'Agendar Até', + 'location' => 'Localização', + 'call' => 'Chamada', + 'meeting' => 'Reunião', + 'lunch' => 'Almoço', + 'save-btn' => 'Salvar Atividade', + 'participants' => [ + 'title' => 'Participantes', + 'placeholder' => 'Digite para pesquisar participantes', + 'users' => 'Usuários', + 'persons' => 'Pessoas', + 'no-results' => 'Nenhum resultado encontrado...', + ], + ], + ], + 'index' => [ + 'all' => 'Todos', + 'bcc' => 'Cópia oculta', + 'by-user' => 'Por usuário', + 'calls' => 'Chamadas', + 'cc' => 'Cópia', + 'change-log' => 'Logs de Alterações', + 'delete' => 'Excluir', + 'edit' => 'Editar', + 'emails' => 'E-mails', + 'empty' => 'Vazio', + 'files' => 'Arquivos', + 'from' => 'De', + 'location' => 'Localização', + 'lunches' => 'Almoços', + 'mark-as-done' => 'Marcar como Concluído', + 'meetings' => 'Reuniões', + 'notes' => 'Notas', + 'participants' => 'Participantes', + 'planned' => 'Planejado', + 'quotes' => 'Cotações', + 'scheduled-on' => 'Agendado em', + 'system' => 'Sistema', + 'to' => 'Para', + 'unlink' => 'Desvincular', + 'view' => 'Visualizar', + 'empty-placeholders' => [ + 'all' => [ + 'title' => 'Nenhuma atividade encontrada', + 'description' => 'Nenhuma atividade foi encontrada para este item. Você pode adicionar atividades clicando no botão Atividade no painel à esquerda.', + ], + 'planned' => [ + 'title' => 'Nenhuma atividade planejada encontrada', + 'description' => 'Nenhuma atividade planejada foi encontrada. Adicione uma clicando no botão Atividade no painel à esquerda.', + ], + 'notes' => [ + 'title' => 'Nenhuma nota encontrada', + 'description' => 'Nenhuma nota foi encontrada. Adicione notas clicando no botão Nota no painel à esquerda.', + ], + 'calls' => [ + 'title' => 'Nenhuma chamada encontrada', + 'description' => 'Nenhuma chamada foi encontrada. Adicione chamadas clicando no botão Atividade e selecionando o tipo Chamada.', + ], + 'meetings' => [ + 'title' => 'Nenhuma reunião encontrada', + 'description' => 'Nenhuma reunião foi encontrada. Adicione reuniões clicando no botão Atividade e selecionando o tipo Reunião.', + ], + 'lunches' => [ + 'title' => 'Nenhum almoço encontrado', + 'description' => 'Nenhum almoço foi encontrado. Adicione almoços clicando no botão Atividade e selecionando o tipo Almoço.', + ], + 'files' => [ + 'title' => 'Nenhum arquivo encontrado', + 'description' => 'Nenhum arquivo foi encontrado. Adicione arquivos clicando no botão Arquivo no painel à esquerda.', + ], + 'emails' => [ + 'title' => 'Nenhum e-mail encontrado', + 'description' => 'Nenhum e-mail foi encontrado. Adicione e-mails clicando no botão Correio no painel à esquerda.', + ], + 'system' => [ + 'title' => 'Nenhum registro de alteração encontrado', + 'description' => 'Nenhum registro de alteração foi encontrado.', + ], + ], + ], + ], + 'media' => [ + 'images' => [ + 'add-image-btn' => 'Adicionar Imagem', + 'ai-add-image-btn' => 'Mágica AI', + 'allowed-types' => 'png, jpeg, jpg', + 'not-allowed-error' => 'Apenas arquivos de imagem (.jpeg, .jpg, .png, ..) são permitidos.', + 'placeholders' => [ + 'front' => 'Frente', + 'next' => 'Próximo', + 'size' => 'Tamanho', + 'use-cases' => 'Casos de Uso', + 'zoom' => 'Zoom', + ], + ], + 'videos' => [ + 'add-video-btn' => 'Adicionar Vídeo', + 'allowed-types' => 'mp4, webm, mkv', + 'not-allowed-error' => 'Apenas arquivos de vídeo (.mp4, .mov, .ogg ..) são permitidos.', + ], + ], + 'datagrid' => [ + 'index' => [ + 'no-records-selected' => 'Nenhum registro foi selecionado.', + 'must-select-a-mass-action-option' => 'Você deve selecionar uma opção de ação em massa.', + 'must-select-a-mass-action' => 'Você deve selecionar uma ação em massa.', + ], + 'toolbar' => [ + 'length-of' => 'tamanho de', + 'of' => 'de', + 'per-page' => 'Por Página', + 'results' => 'Resultados', + 'delete' => 'Excluir', + 'selected' => 'Itens Selecionados', + 'mass-actions' => [ + 'submit' => 'Enviar', + 'select-option' => 'Selecionar Opção', + 'select-action' => 'Selecionar Ação', + ], + 'filter' => [ + 'apply-filters-btn' => 'Aplicar Filtros', + 'back-btn' => 'Voltar', + 'create-new-filter' => 'Adicionar novo Filtro', + 'custom-filters' => 'Filtros Personalizados', + 'delete-error' => 'Algo deu errado ao excluir o filtro, por favor tente novamente.', + 'delete-success' => 'Filtro excluído com sucesso.', + 'empty-description' => 'Não há filtros selecionados disponíveis para salvar. Por favor, selecione filtros para salvar.', + 'empty-title' => 'Adicionar Filtros para Salvar', + 'name' => 'Nome', + 'quick-filters' => 'Filtros Rápidos', + 'save-btn' => 'Salvar', + 'save-filter' => 'Salvar Filtro', + 'saved-success' => 'Filtro salvo com sucesso.', + 'selected-filters' => 'Filtros Selecionados', + 'title' => 'Filtro', + 'update' => 'Atualizar', + 'update-filter' => 'Atualizar Filtro', + 'updated-success' => 'Filtro atualizado com sucesso.', + ], + 'search' => [ + 'title' => 'Pesquisar', + ], + ], + 'filters' => [ + 'select' => 'Selecionar', + 'title' => 'Filtros', + 'dropdown' => [ + 'searchable' => [ + 'at-least-two-chars' => 'Digite pelo menos 2 caracteres...', + 'no-results' => 'Nenhum resultado encontrado...', + ], + ], + 'custom-filters' => [ + 'clear-all' => 'Limpar Todos', + 'title' => 'Filtros Personalizados', + ], + 'boolean-options' => [ + 'false' => 'Falso', + 'true' => 'Verdadeiro', + ], + 'date-options' => [ + 'last-month' => 'Último Mês', + 'last-six-months' => 'Últimos 6 Meses', + 'last-three-months' => 'Últimos 3 Meses', + 'this-month' => 'Este Mês', + 'this-week' => 'Esta Semana', + 'this-year' => 'Este Ano', + 'today' => 'Hoje', + 'yesterday' => 'Ontem', + ], + ], + 'table' => [ + 'actions' => 'Ações', + 'no-records-available' => 'Nenhum Registro Disponível.', + ], + ], + 'modal' => [ + 'confirm' => [ + 'agree-btn' => 'Concordar', + 'disagree-btn' => 'Discordar', + 'message' => 'Você tem certeza de que deseja realizar esta ação?', + 'title' => 'Você tem certeza?', + ], + ], + 'tags' => [ + 'index' => [ + 'title' => 'Tags', + 'added-tags' => 'Tags Adicionadas', + 'save-btn' => 'Salvar Tag', + 'placeholder' => 'Digite para procurar tags', + 'add-tag' => 'Adicionar Tag', + 'aquarelle-red' => 'Vermelho', + 'crushed-cashew' => 'Castanho', + 'beeswax' => 'Amarelado', + 'lemon-chiffon' => 'Limão', + 'snow-flurry' => 'Neve', + 'honeydew' => 'Melão', + ], + ], + 'layouts' => [ + 'app-version' => 'Versão: :version', + 'dashboard' => 'Dashboard', + 'leads' => 'Oportunidades', + 'quotes' => 'Cotações', + 'quote' => 'Cotação', + 'mail' => [ + 'title' => 'E-mail', + 'compose' => 'Escrever', + 'inbox' => 'Caixa de Entrada', + 'draft' => 'Rascunhos', + 'outbox' => 'Caixa de Saída', + 'sent' => 'Enviados', + 'trash' => 'Lixeira', + 'setting' => 'Configuração', + ], + 'activities' => 'Atividades', + 'contacts' => 'Contatos', + 'persons' => 'Pessoas', + 'person' => 'Pessoa', + 'organizations' => 'Empresas', + 'organization' => 'Empresa', + 'products' => 'Produtos', + 'product' => 'Produto', + 'settings' => 'Configurações', + 'user' => 'Usuário', + 'user-info' => 'Gerencie todos os seus usuários e suas permissões no CRM, o que eles podem fazer.', + 'groups' => 'Grupos', + 'groups-info' => 'Adicionar, editar ou excluir grupos do CRM', + 'roles' => 'Funções', + 'role' => 'Função', + 'roles-info' => 'Adicionar, editar ou excluir funções do CRM', + 'users' => 'Usuários', + 'users-info' => 'Adicionar, editar ou excluir usuários do CRM', + 'lead' => 'Oportunidade', + 'lead-info' => 'Gerencie todas as configurações relacionadas às suas oportunidades no CRM', + 'pipelines' => 'Funis', + 'pipelines-info' => 'Adicionar, editar ou excluir funis do CRM', + 'sources' => 'Fontes', + 'sources-info' => 'Adicionar, editar ou excluir fontes do CRM', + 'types' => 'Tipos', + 'types-info' => 'Adicionar, editar ou excluir tipos do CRM', + 'automation' => 'Automação', + 'automation-info' => 'Gerencie todas as configurações relacionadas à automação no CRM', + 'attributes' => 'Atributos', + 'attribute' => 'Atributo', + 'attributes-info' => 'Adicionar, editar ou excluir atributos do CRM', + 'email-templates' => 'Modelos de E-mail', + 'email' => 'E-mail', + 'email-templates-info' => 'Adicionar, editar ou excluir modelos de e-mail do CRM', + 'events' => 'Eventos', + 'events-info' => 'Adicionar, editar ou excluir eventos do CRM', + 'campaigns' => 'Campanhas', + 'campaigns-info' => 'Adicionar, editar ou excluir campanhas do CRM', + 'workflows' => 'Fluxos de Trabalho', + 'workflows-info' => 'Adicionar, editar ou excluir fluxos de trabalho do CRM', + 'webhooks' => 'Webhooks', + 'webhooks-info' => 'Adicionar, editar ou excluir webhooks do CRM', + 'other-settings' => 'Outras Configurações', + 'other-settings-info' => 'Gerencie todas as suas configurações extras no CRM', + 'tags' => 'Tags', + 'tags-info' => 'Adicionar, editar ou excluir tags do CRM', + 'my-account' => 'Minha Conta', + 'sign-out' => 'Sair', + 'back' => 'Voltar', + 'name' => 'Nome', + 'configuration' => 'Configuração', + 'activities' => 'Atividades', + 'howdy' => 'Olá!', + 'warehouses' => 'Depósitos', + 'warehouse' => 'Depósito', + 'warehouses-info' => 'Adicionar, editar ou excluir depósitos do CRM', + 'data_transfer' => 'Transferência de Dados', + 'data_transfer_info' => 'Gerencie as configurações relacionadas à transferência de dados de pessoas, produtos e oportunidades no CRM', + + 'powered-by' => [ + 'description' => 'Desenvolvido por :krayin, um projeto de código aberto da :webkul.', + ], + 'header' => [ + 'mega-search' => [ + 'title' => 'Busca rápida', + 'tabs' => [ + 'leads' => 'Oportunidades', + 'quotes' => 'Cotações', + 'persons' => 'Pessoas', + 'products' => 'Produtos', + ], + 'explore-all-products' => 'Explorar todos os Produtos', + 'explore-all-leads' => 'Explorar todos as Oportunidades', + 'explore-all-contacts' => 'Explorar todos os Contatos', + 'explore-all-quotes' => 'Explorar todas as Cotações', + 'explore-all-matching-products' => 'Explorar todos os produtos correspondentes a ":query" (:count)', + 'explore-all-matching-leads' => 'Explorar todos os negócios correspondentes a ":query" (:count)', + 'explore-all-matching-contacts' => 'Explorar todos os contatos correspondentes a ":query" (:count)', + 'explore-all-matching-quotes' => 'Explorar todas as cotações correspondentes a ":query" (:count)', + ], + ], + ], + 'attributes' => [ + 'edit' => [ + 'delete' => 'Excluir', + ], + 'lookup' => [ + 'click-to-add' => 'Clique para adicionar', + 'search' => 'Pesquisar...', + 'no-result-found' => 'Nenhum resultado encontrado', + ], + ], + 'lookup' => [ + 'click-to-add' => 'Clique para Adicionar', + 'no-results' => 'Nenhum Resultado Encontrado', + 'add-as-new' => 'Adicionar como Novo', + 'search' => 'Pesquisar...', + ], + 'flash-group' => [ + 'success' => 'Sucesso', + 'error' => 'Erro', + 'warning' => 'Aviso', + 'info' => 'Informação', + ], + 'tiny-mce' => [ + 'http-error' => 'Erro HTTP', + 'invalid-json' => 'Resposta JSON inválida do servidor.', + 'upload-failed' => 'Falha no upload do arquivo. Por favor, tente novamente.', + ], + ], + 'quotes' => [ + 'index' => [ + 'title' => 'Cotações', + 'create-btn' => 'Adicionar Cotação', + 'create-success' => 'Cotação adicionada com sucesso.', + 'update-success' => 'Cotação atualizada com sucesso.', + 'delete-success' => 'Cotação excluída com sucesso.', + 'delete-failed' => 'Não é possível excluir a cotação.', + 'datagrid' => [ + 'subject' => 'Assunto', + 'sales-person' => 'Vendedor', + 'expired-at' => 'Expirado em', + 'created-at' => 'Criado em', + 'person' => 'Pessoa', + 'subtotal' => 'Subtotal', + 'discount' => 'Desconto', + 'tax' => 'Imposto', + 'adjustment' => 'Ajuste', + 'grand-total' => 'Total Geral', + 'edit' => 'Editar', + 'delete' => 'Excluir', + 'print' => 'Imprimir', + ], + 'pdf' => [ + 'adjustment' => 'Ajuste', + 'amount' => 'Valor', + 'billing-address' => 'Endereço de Cobrança', + 'date' => 'Data', + 'discount' => 'Desconto', + 'expired-at' => 'Expirado em', + 'grand-total' => 'Total Geral', + 'person' => 'Pessoa', + 'price' => 'Preço', + 'product-name' => 'Nome do Produto', + 'quantity' => 'Quantidade', + 'quote-id' => 'ID da Cotação', + 'sales-person' => 'Vendedor', + 'shipping-address' => 'Endereço de Envio', + 'sku' => 'Código', + 'sub-total' => 'Subtotal', + 'subject' => 'Assunto', + 'tax' => 'Imposto', + 'title' => 'Cotação', + ], + ], + 'create' => [ + 'title' => 'Adicionar Cotação', + 'save-btn' => 'Salvar Cotação', + 'quote-info' => 'Informações da Cotação', + 'quote-info-info' => 'Informe as informações básicas da cotação.', + 'address-info' => 'Informações de Endereço', + 'address-info-info' => 'Informações sobre o endereço relacionado à cotação.', + 'quote-items' => 'Itens da Cotação', + 'search-products' => 'Pesquisar Produtos', + 'link-to-lead' => 'Vincular a um negócio', + 'quote-item-info' => 'Adicionar solicitação de produto para esta cotação.', + 'quote-name' => 'Nome da Cotação', + 'quantity' => 'Quantidade', + 'price' => 'Preço', + 'discount' => 'Desconto', + 'tax' => 'Imposto', + 'total' => 'Total', + 'amount' => 'Valor', + 'add-item' => '+ Adicionar Item', + 'sub-total' => 'Subtotal (:symbol)', + 'total-discount' => 'Desconto (:symbol)', + 'total-tax' => 'Imposto (:symbol)', + 'total-adjustment' => 'Ajuste (:symbol)', + 'grand-total' => 'Total Geral (:symbol)', + 'discount-amount' => 'Valor do Desconto', + 'tax-amount' => 'Valor do Imposto', + 'adjustment-amount' => 'Valor do Ajuste', + 'product-name' => 'Nome do Produto', + 'action' => 'Ação', + ], + 'edit' => [ + 'title' => 'Editar Cotação', + 'save-btn' => 'Salvar Cotação', + 'quote-info' => 'Informações da Cotação', + 'quote-info-info' => 'Informe as informações básicas da cotação.', + 'address-info' => 'Informações de Endereço', + 'address-info-info' => 'Informações sobre o endereço relacionado à cotação.', + 'quote-items' => 'Itens da Cotação', + 'link-to-lead' => 'Vincular a um negócio', + 'quote-item-info' => 'Adicionar solicitação de produto para esta cotação.', + 'quote-name' => 'Nome da Cotação', + 'quantity' => 'Quantidade', + 'price' => 'Preço', + 'search-products' => 'Pesquisar Produtos', + 'discount' => 'Desconto', + 'tax' => 'Imposto', + 'total' => 'Total', + 'amount' => 'Valor', + 'add-item' => '+ Adicionar Item', + 'sub-total' => 'Subtotal (:symbol)', + 'total-discount' => 'Desconto (:symbol)', + 'total-tax' => 'Imposto (:symbol)', + 'total-adjustment' => 'Ajuste (:symbol)', + 'grand-total' => 'Total Geral (:symbol)', + 'discount-amount' => 'Valor do Desconto', + 'tax-amount' => 'Valor do Imposto', + 'adjustment-amount' => 'Valor do Ajuste', + 'product-name' => 'Nome do Produto', + 'action' => 'Ação', + ], + ], + 'contacts' => [ + 'persons' => [ + 'index' => [ + 'title' => 'Pessoas', + 'create-btn' => 'Adicionar Pessoa', + 'create-success' => 'Pessoa adicionada com sucesso.', + 'update-success' => 'Pessoa atualizada com sucesso.', + 'all-delete-success' => 'Todas as pessoas selecionadas foram excluídas com sucesso.', + 'partial-delete-warning' => 'Algumas pessoas foram excluídas com sucesso. Outras não puderam ser excluídas porque estão vinculadas a leads.', + 'none-delete-warning' => 'Nenhuma das pessoas selecionadas pôde ser excluída porque estão vinculadas a leads.', + 'no-selection' => 'Nenhuma pessoa foi selecionada para exclusão.', + 'delete-failed' => 'Falha ao excluir as pessoas selecionadas.', + 'datagrid' => [ + 'contact-numbers' => 'Números de Contato', + 'delete' => 'Excluir', + 'edit' => 'Editar', + 'emails' => 'E-mails', + 'id' => 'ID', + 'view' => 'Visualizar', + 'name' => 'Nome', + 'organization-name' => 'Nome da Empresa', + ], + ], + 'view' => [ + 'title' => ':name', + 'about-person' => 'Sobre a Pessoa', + 'about-organization' => 'Sobre a Empresa', + 'activities' => [ + 'index' => [ + 'all' => 'Todos', + 'calls' => 'Chamadas', + 'meetings' => 'Reuniões', + 'lunches' => 'Almoços', + 'files' => 'Arquivos', + 'quotes' => 'Cotações', + 'notes' => 'Notas', + 'emails' => 'E-mails', + 'by-user' => 'Por usuário', + 'scheduled-on' => 'Agendado em', + 'location' => 'Localização', + 'participants' => 'Participantes', + 'mark-as-done' => 'Marcar como Concluído', + 'delete' => 'Excluir', + 'edit' => 'Editar', + ], + 'actions' => [ + 'mail' => [ + 'btn' => 'E-mail', + 'title' => 'Escrever e-mail', + 'to' => 'Para', + 'cc' => 'Cópia', + 'bcc' => 'Cópia oculta', + 'subject' => 'Assunto', + 'send-btn' => 'Enviar', + 'message' => 'Mensagem', + ], + 'file' => [ + 'btn' => 'Arquivo', + 'title' => 'Adicionar Arquivo', + 'title-control' => 'Título', + 'name' => 'Nome do Arquivo', + 'description' => 'Descrição', + 'file' => 'Arquivo', + 'save-btn' => 'Salvar Arquivo', + ], + 'note' => [ + 'btn' => 'Nota', + 'title' => 'Adicionar Nota', + 'comment' => 'Comentário', + 'save-btn' => 'Salvar Nota', + ], + 'activity' => [ + 'btn' => 'Atividade', + 'title' => 'Adicionar Atividade', + 'title-control' => 'Título', + 'description' => 'Descrição', + 'schedule-from' => 'Agendar De', + 'schedule-to' => 'Agendar Até', + 'location' => 'Localização', + 'call' => 'Chamada', + 'meeting' => 'Reunião', + 'lunch' => 'Almoço', + 'save-btn' => 'Salvar Atividade', + ], + ], + ], + 'tags' => [ + 'create-success' => 'Tag criada com sucesso.', + 'destroy-success' => 'Tag excluída com sucesso.', + ], + ], + 'create' => [ + 'title' => 'Adicionar Pessoa', + 'save-btn' => 'Salvar Pessoa', + ], + 'edit' => [ + 'title' => 'Editar Pessoa', + 'save-btn' => 'Salvar Pessoa', + ], + ], + 'organizations' => [ + 'index' => [ + 'title' => 'Empresas', + 'create-btn' => 'Adicionar Empresa', + 'create-success' => 'Empresa adicionada com sucesso.', + 'update-success' => 'Empresa atualizada com sucesso.', + 'delete-success' => 'Empresa excluída com sucesso.', + 'delete-failed' => 'Não foi possível excluir a empresa.', + 'datagrid' => [ + 'delete' => 'Excluir', + 'edit' => 'Editar', + 'id' => 'ID', + 'name' => 'Nome', + 'persons-count' => 'Quantidade de Pessoas', + ], + ], + 'create' => [ + 'title' => 'Adicionar Empresa', + 'save-btn' => 'Salvar Empresa', + ], + 'edit' => [ + 'title' => 'Editar Empresa', + 'save-btn' => 'Salvar Empresa', + ], + ], + ], + 'products' => [ + 'index' => [ + 'title' => 'Produtos', + 'create-btn' => 'Adicionar Produto', + 'create-success' => 'Produto adicionado com sucesso.', + 'update-success' => 'Produto atualizado com sucesso.', + 'delete-success' => 'Produto excluído com sucesso.', + 'delete-failed' => 'Não foi possível excluir o produto.', + 'datagrid' => [ + 'allocated' => 'Alocado', + 'delete' => 'Excluir', + 'edit' => 'Editar', + 'id' => 'ID', + 'in-stock' => 'Em Estoque', + 'name' => 'Nome', + 'on-hand' => 'Disponível', + 'tag-name' => 'Nome da Tag', + 'price' => 'Preço', + 'sku' => 'Código', + 'view' => 'Visualizar', + ], + ], + 'create' => [ + 'save-btn' => 'Salvar Produtos', + 'title' => 'Adicionar Produtos', + 'general' => 'Geral', + 'price' => 'Preço', + ], + 'edit' => [ + 'title' => 'Editar Produtos', + 'save-btn' => 'Salvar Produtos', + 'general' => 'Geral', + 'price' => 'Preço', + ], + 'view' => [ + 'sku' => 'Código', + 'all' => 'Todos', + 'notes' => 'Notas', + 'files' => 'Arquivos', + 'inventories' => 'Inventário', + 'change-logs' => 'Histórico de Alterações', + 'attributes' => [ + 'about-product' => 'Sobre o Produto', + ], + 'inventory' => [ + 'source' => 'Origem', + 'in-stock' => 'Em Estoque', + 'allocated' => 'Alocado', + 'on-hand' => 'Disponível', + 'actions' => 'Ações', + 'assign' => 'Atribuir', + 'add-source' => 'Adicionar Origem', + 'location' => 'Localização', + 'add-more' => 'Adicionar Mais', + 'save' => 'Salvar', + ], + ], + ], + 'settings' => [ + 'title' => 'Configurações', + 'groups' => [ + 'index' => [ + 'create-btn' => 'Criar Grupo', + 'title' => 'Grupos', + 'create-success' => 'Grupo criado com sucesso.', + 'update-success' => 'Grupo atualizado com sucesso.', + 'destroy-success' => 'Grupo excluído com sucesso.', + 'delete-failed' => 'Não foi possível excluir o grupo.', + 'delete-failed-associated-users' => 'Não foi possível excluir o grupo, pois está sendo utilizado por usuários.', + 'datagrid' => [ + 'delete' => 'Excluir', + 'description' => 'Descrição', + 'edit' => 'Editar', + 'id' => 'ID', + 'name' => 'Nome', + ], + 'edit' => [ + 'title' => 'Editar Grupo', + ], + 'create' => [ + 'name' => 'Nome', + 'title' => 'Adicionar Grupo', + 'description' => 'Descrição', + 'save-btn' => 'Salvar Grupo', + ], + ], + ], + 'roles' => [ + 'index' => [ + 'being-used' => 'Não é possível excluir o cargo, pois está sendo usado por um usuário administrador.', + 'create-btn' => 'Adicionar Cargos', + 'create-success' => 'Cargo adicionado com sucesso.', + 'current-role-delete-error' => 'Não é possível excluir o cargo atribuído ao usuário atual.', + 'delete-failed' => 'Não foi possível excluir o cargo.', + 'delete-success' => 'Cargo excluído com sucesso.', + 'last-delete-error' => 'É necessário pelo menos um cargo.', + 'settings' => 'Configurações', + 'title' => 'Cargos', + 'update-success' => 'Cargo atualizado com sucesso.', + 'user-define-error' => 'Não é possível excluir cargo do sistema.', + 'datagrid' => [ + 'all' => 'Todos', + 'custom' => 'Personalizado', + 'delete' => 'Excluir', + 'description' => 'Descrição', + 'edit' => 'Editar', + 'id' => 'ID', + 'name' => 'Nome', + 'permission-type' => 'Tipo de Permissão', + ], + ], + 'create' => [ + 'access-control' => 'Controle de Acesso', + 'all' => 'Todos', + 'back-btn' => 'Voltar', + 'custom' => 'Personalizado', + 'description' => 'Descrição', + 'general' => 'Geral', + 'name' => 'Nome', + 'permissions' => 'Permissões', + 'save-btn' => 'Salvar Cargo', + 'title' => 'Adicionar Cargo', + ], + 'edit' => [ + 'access-control' => 'Controle de Acesso', + 'all' => 'Todos', + 'back-btn' => 'Voltar', + 'custom' => 'Personalizado', + 'description' => 'Descrição', + 'general' => 'Geral', + 'name' => 'Nome', + 'permissions' => 'Permissões', + 'save-btn' => 'Salvar Cargo', + 'title' => 'Editar Cargo', + ], + ], + 'types' => [ + 'index' => [ + 'create-btn' => 'Adicionar Tipo', + 'create-success' => 'Tipo adicionado com sucesso.', + 'delete-failed' => 'Não é possível excluir o tipo.', + 'delete-success' => 'Tipo excluído com sucesso.', + 'title' => 'Tipos', + 'update-success' => 'Tipo atualizado com sucesso.', + 'datagrid' => [ + 'delete' => 'Excluir', + 'description' => 'Descrição', + 'edit' => 'Editar', + 'id' => 'ID', + 'name' => 'Nome', + ], + 'create' => [ + 'name' => 'Nome', + 'save-btn' => 'Salvar Tipo', + 'title' => 'Adicionar Tipo', + ], + 'edit' => [ + 'title' => 'Editar Tipo', + ], + ], + ], + 'sources' => [ + 'index' => [ + 'title' => 'Fontes', + 'create-btn' => 'Criar Fonte', + 'create-success' => 'Fonte criada com sucesso.', + 'delete-failed' => 'Não foi possível excluir a fonte.', + 'delete-success' => 'Fonte excluída com sucesso.', + 'update-success' => 'Fonte atualizada com sucesso.', + 'delete-failed-associated-leads' => 'Não é possível excluir a fonte porque está associada a leads existentes. Por favor, desvincule ou atualize esses leads antes da exclusão.', + 'datagrid' => [ + 'delete' => 'Excluir', + 'edit' => 'Editar', + 'id' => 'ID', + 'name' => 'Nome', + ], + 'create' => [ + 'name' => 'Nome', + 'save-btn' => 'Salvar Origem', + 'title' => 'Adicionar Origem', + ], + 'edit' => [ + 'title' => 'Editar Origem', + ], + ], + ], + 'workflows' => [ + 'index' => [ + 'title' => 'Workflows', + 'create-btn' => 'Adicionar Workflow', + 'create-success' => 'Workflow adicionado com sucesso.', + 'update-success' => 'Workflow atualizado com sucesso.', + 'delete-success' => 'Workflow excluído com sucesso.', + 'delete-failed' => 'Não é possível excluir o Workflow.', + 'datagrid' => [ + 'delete' => 'Excluir', + 'description' => 'Descrição', + 'edit' => 'Editar', + 'id' => 'ID', + 'name' => 'Nome', + ], + ], + 'helpers' => [ + 'update-related-leads' => 'Atualizar leads relacionados', + 'send-email-to-sales-owner' => 'Enviar e-mail para o proprietário de vendas', + 'send-email-to-participants' => 'Enviar e-mail para os participantes', + 'add-webhook' => 'Adicionar Webhook', + 'update-lead' => 'Atualizar Oportunidade', + 'update-person' => 'Atualizar Pessoa', + 'send-email-to-person' => 'Enviar e-mail para a pessoa', + 'add-tag' => 'Adicionar Tag', + 'add-note-as-activity' => 'Adicionar Nota como Atividade', + 'update-quote' => 'Update Quote', + ], + 'create' => [ + 'title' => 'Adicionar Workflow', + 'event' => 'Evento', + 'back-btn' => 'Voltar', + 'save-btn' => 'Salvar Workflow', + 'name' => 'Nome', + 'basic-details' => 'Detalhes Básicos', + 'description' => 'Descrição', + 'actions' => 'Ações', + 'basic-details-info' => 'Informe as informações básicas do workflow.', + 'event-info' => 'Um evento dispara, verifica, aplica condições e executa ações predefinidas.', + 'conditions' => 'Condições', + 'conditions-info' => 'As condições são regras que verificam cenários, acionadas em ocasiões específicas.', + 'actions-info' => 'Uma ação não apenas reduz a carga de trabalho, mas também facilita a automação do CRM.', + 'value' => 'Valor', + 'condition-type' => 'Tipo de Condição', + 'all-condition-are-true' => 'Todas as condições são verdadeiras', + 'any-condition-are-true' => 'Qualquer condição é verdadeira', + 'add-condition' => 'Adicionar Condição', + 'add-action' => 'Adicionar Ação', + 'yes' => 'Sim', + 'no' => 'Não', + 'email' => 'E-mail', + 'is-equal-to' => 'É igual a', + 'is-not-equal-to' => 'Não é igual a', + 'equals-or-greater-than' => 'É igual ou maior que', + 'equals-or-less-than' => 'É igual ou menor que', + 'greater-than' => 'Maior que', + 'less-than' => 'Menor que', + 'type' => 'Tipo', + 'contain' => 'Contém', + 'contains' => 'Contém', + 'does-not-contain' => 'Não contém', + ], + 'edit' => [ + 'title' => 'Editar Workflow', + 'event' => 'Evento', + 'back-btn' => 'Voltar', + 'save-btn' => 'Salvar Workflow', + 'name' => 'Nome', + 'basic-details' => 'Detalhes Básicos', + 'description' => 'Descrição', + 'actions' => 'Ações', + 'type' => 'Tipo', + 'basic-details-info' => 'Informe as informações básicas do workflow.', + 'event-info' => 'Um evento dispara, verifica, aplica condições e executa ações predefinidas.', + 'conditions' => 'Condições', + 'conditions-info' => 'As condições são regras que verificam cenários, acionadas em ocasiões específicas.', + 'actions-info' => 'Uma ação não apenas reduz a carga de trabalho, mas também facilita a automação do CRM.', + 'value' => 'Valor', + 'condition-type' => 'Tipo de Condição', + 'all-condition-are-true' => 'Todas as condições são verdadeiras', + 'any-condition-are-true' => 'Qualquer condição é verdadeira', + 'add-condition' => 'Adicionar Condição', + 'add-action' => 'Adicionar Ação', + 'yes' => 'Sim', + 'no' => 'Não', + 'email' => 'E-mail', + 'is-equal-to' => 'É igual a', + 'is-not-equal-to' => 'Não é igual a', + 'equals-or-greater-than' => 'É igual ou maior que', + 'equals-or-less-than' => 'É igual ou menor que', + 'greater-than' => 'Maior que', + 'less-than' => 'Menor que', + 'contain' => 'Contém', + 'contains' => 'Contém', + 'does-not-contain' => 'Não contém', + ], + ], + 'webforms' => [ + 'index' => [ + 'title' => 'Webforms', + 'create-btn' => 'Adicionar Webform', + 'create-success' => 'Webform adicionado com sucesso.', + 'update-success' => 'Webform atualizado com sucesso.', + 'delete-success' => 'Webform excluído com sucesso.', + 'delete-failed' => 'Não é possível excluir o Webform.', + 'datagrid' => [ + 'id' => 'ID', + 'title' => 'Título', + 'edit' => 'Editar', + 'delete' => 'Excluir', + ], + ], + 'create' => [ + 'title' => 'Adicionar Webform', + 'add-attribute-btn' => 'Adicionar Botão de Atributo', + 'attribute-label-color' => 'Cor do Rótulo do Atributo', + 'attributes' => 'Atributos', + 'attributes-info' => 'Adicione atributos personalizados ao formulário.', + 'background-color' => 'Cor de Fundo', + 'create-lead' => 'Adicionar Oportunidade', + 'customize-webform' => 'Personalizar Webform', + 'customize-webform-info' => 'Personalize seu formulário com as cores dos elementos de sua escolha.', + 'description' => 'Descrição', + 'display-custom-message' => 'Exibir mensagem personalizada', + 'form-background-color' => 'Cor de Fundo do Formulário', + 'form-submit-btn-color' => 'Cor do Botão de Envio do Formulário', + 'form-submit-button-color' => 'Cor do Botão de Envio do Formulário', + 'form-title-color' => 'Cor do Título do Formulário', + 'general' => 'Geral', + 'leads' => 'Oportunidades', + 'person' => 'Pessoa', + 'save-btn' => 'Salvar Webform', + 'submit-button-label' => 'Rótulo do Botão de Envio', + 'submit-success-action' => 'Ação de Sucesso ao Enviar', + 'redirect-to-url' => 'Redirecionar Para URL', + 'choose-value' => 'Escolher Valor', + 'select-file' => 'Selecionar Arquivo', + 'select-image' => 'Selecionar Imagem', + 'enter-value' => 'Inserir Valor', + ], + 'edit' => [ + 'add-attribute-btn' => 'Adicionar Botão de Atributo', + 'attribute-label-color' => 'Cor do Rótulo do Atributo', + 'attributes' => 'Atributos', + 'attributes-info' => 'Adicione atributos personalizados ao formulário.', + 'background-color' => 'Cor de Fundo', + 'choose-value' => 'Escolher Valor', + 'code-snippet' => 'Trecho de Código', + 'copied' => 'Copiado', + 'copy' => 'Copiar', + 'create-lead' => 'Adicionar Oportunidade', + 'customize-webform' => 'Personalizar Webform', + 'customize-webform-info' => 'Personalize seu formulário com as cores dos elementos de sua escolha.', + 'description' => 'Descrição', + 'display-custom-message' => 'Exibir mensagem personalizada', + 'embed' => 'Incorporar', + 'enter-value' => 'Inserir Valor', + 'form-background-color' => 'Cor de Fundo do Formulário', + 'form-submit-btn-color' => 'Cor do Botão de Envio do Formulário', + 'form-submit-button-color' => 'Cor do Botão de Envio do Formulário', + 'form-title-color' => 'Cor do Título do Formulário', + 'general' => 'Geral', + 'leads' => 'Oportunidades', + 'person' => 'Pessoa', + 'preview' => 'Visualizar', + 'public-url' => 'URL Pública', + 'redirect-to-url' => 'Redirecionar Para URL', + 'save-btn' => 'Salvar Webform', + 'select-file' => 'Selecionar Arquivo', + 'select-image' => 'Selecionar Imagem', + 'submit-button-label' => 'Rótulo do Botão de Envio', + 'submit-success-action' => 'Ação de Sucesso ao Enviar', + 'title' => 'Editar Webform', + ], + ], + 'email-template' => [ + 'index' => [ + 'create-btn' => 'Adicionar Modelo de E-mail', + 'title' => 'Modelos de E-mail', + 'create-success' => 'Modelo de E-mail adicionado com sucesso.', + 'update-success' => 'Modelo de E-mail atualizado com sucesso.', + 'delete-success' => 'Modelo de E-mail excluído com sucesso.', + 'delete-failed' => 'Não é possível excluir o Modelo de E-mail.', + 'datagrid' => [ + 'delete' => 'Excluir', + 'edit' => 'Editar', + 'id' => 'ID', + 'name' => 'Nome', + 'subject' => 'Assunto', + ], + ], + 'create' => [ + 'title' => 'Adicionar Modelo de E-mail', + 'save-btn' => 'Salvar Modelo de E-mail', + 'email-template' => 'Modelo de E-mail', + 'subject' => 'Assunto', + 'content' => 'Conteúdo', + 'subject-placeholders' => 'Descrição do Assunto', + 'general' => 'Geral', + 'name' => 'Nome', + ], + 'edit' => [ + 'title' => 'Editar Modelo de E-mail', + 'save-btn' => 'Salvar Modelo de E-mail', + 'email-template' => 'Modelo de E-mail', + 'subject' => 'Assunto', + 'content' => 'Conteúdo', + 'subject-placeholders' => 'Descrição do Assunto', + 'general' => 'Geral', + 'name' => 'Nome', + ], + ], + 'marketing' => [ + 'events' => [ + 'index' => [ + 'create-btn' => 'Adicionar Evento', + 'title' => 'Eventos', + 'create-success' => 'Evento adicionado com sucesso.', + 'update-success' => 'Evento atualizado com sucesso.', + 'delete-success' => 'Evento excluído com sucesso.', + 'delete-failed' => 'Não é possível excluir o evento.', + 'mass-delete-success' => 'Eventos excluídos com sucesso', + 'datagrid' => [ + 'delete' => 'Excluir', + 'edit' => 'Editar', + 'id' => 'ID', + 'name' => 'Nome', + 'description' => 'Descrição', + 'date' => 'Data', + ], + 'create' => [ + 'title' => 'Adicionar Evento', + 'name' => 'Nome', + 'date' => 'Data', + 'description' => 'Descrição', + 'save-btn' => 'Salvar Evento', + ], + 'edit' => [ + 'title' => 'Editar Evento', + ], + ], + ], + 'campaigns' => [ + 'index' => [ + 'create-btn' => 'Adcionar Campanha', + 'title' => 'Campanhas', + 'create-success' => 'Campanha adicionada com sucesso.', + 'update-success' => 'Campanha atualizada com sucesso.', + 'delete-success' => 'Campanha excluída com sucesso.', + 'delete-failed' => 'Não é possível excluir a campanha.', + 'mass-delete-success' => 'Campanhas excluídas com sucesso', + 'datagrid' => [ + 'id' => 'ID', + 'name' => 'Nome', + 'subject' => 'Assunto', + 'status' => 'Status', + 'active' => 'Ativo', + 'inactive' => 'Inativo', + 'edit' => 'Editar', + 'delete' => 'Excluir', + ], + 'create' => [ + 'title' => 'Adicionar Campanha', + 'name' => 'Nome', + 'type' => 'Tipo', + 'subject' => 'Assunto', + 'event' => 'Evento', + 'email-template' => 'Modelo de E-mail', + 'status' => 'Status', + ], + 'edit' => [ + 'title' => 'Editar Campanha', + ], + ], + ], + ], + 'tags' => [ + 'index' => [ + 'create-btn' => 'Adicionar Tag', + 'title' => 'Tags', + 'create-success' => 'Tag adicionada com sucesso.', + 'update-success' => 'Tag atualizada com sucesso.', + 'delete-success' => 'Tag excluída com sucesso.', + 'delete-failed' => 'Não é possível excluir a Tag.', + 'datagrid' => [ + 'delete' => 'Excluir', + 'edit' => 'Editar', + 'id' => 'ID', + 'name' => 'Nome', + 'users' => 'Usuários', + 'created-at' => 'Criado Em', + ], + 'create' => [ + 'name' => 'Nome', + 'save-btn' => 'Salvar Tag', + 'title' => 'Adicionar Tag', + 'color' => 'Cor', + ], + 'edit' => [ + 'title' => 'Editar Tag', + ], + ], + ], + 'users' => [ + 'index' => [ + 'create-btn' => 'Adicionar Usuário', + 'create-success' => 'Usuário adicionado com sucesso.', + 'delete-failed' => 'Não foi possível excluir o usuário.', + 'delete-success' => 'Usuário excluído com sucesso.', + 'last-delete-error' => 'É necessário pelo menos um usuário.', + 'mass-delete-failed' => 'Não foi possível excluir os usuários.', + 'mass-delete-success' => 'Usuários excluídos com sucesso.', + 'mass-update-failed' => 'Não foi possível atualizar os usuários.', + 'mass-update-success' => 'Usuários atualizados com sucesso.', + 'title' => 'Usuários', + 'update-success' => 'Usuário atualizado com sucesso.', + 'user-define-error' => 'Não é possível excluir o usuário do sistema.', + 'active' => 'Ativo', + 'inactive' => 'Inativo', + 'datagrid' => [ + 'active' => 'Ativo', + 'created-at' => 'Criado Em', + 'delete' => 'Excluir', + 'edit' => 'Editar', + 'email' => 'E-mail', + 'id' => 'ID', + 'inactive' => 'Inativo', + 'name' => 'Nome', + 'status' => 'Status', + 'update-status' => 'Atualizar Status', + 'users' => 'Usuários', + ], + 'create' => [ + 'confirm-password' => 'Confirmar Senha', + 'email' => 'E-mail', + 'general' => 'Geral', + 'global' => 'Global', + 'group' => 'Grupo', + 'individual' => 'Individual', + 'name' => 'Nome', + 'password' => 'Senha', + 'permission' => 'Permissão', + 'role' => 'Função', + 'save-btn' => 'Salvar Usuário', + 'status' => 'Status', + 'title' => 'Adicionar Usuário', + 'view-permission' => 'Visualizar Permissão', + 'select-at-lest-one-group' => 'Select at least one group', + ], + 'edit' => [ + 'title' => 'Editar Usuário', + ], + ], + ], + 'pipelines' => [ + 'index' => [ + 'title' => 'Funis', + 'create-btn' => 'Adicionar Funil', + 'create-success' => 'Funil adicionado com sucesso.', + 'update-success' => 'Funil atualizado com sucesso.', + 'default-required' => 'É necessário pelo menos um pipeline padrão.', + 'delete-success' => 'Funil excluído com sucesso.', + 'delete-failed' => 'Não foi possível excluir o funil.', + 'default-delete-error' => 'Não é possível excluir o funil padrão.', + 'datagrid' => [ + 'delete' => 'Excluir', + 'edit' => 'Editar', + 'id' => 'ID', + 'is-default' => 'É Padrão', + 'name' => 'Nome', + 'no' => 'Não', + 'rotten-days' => 'Dias parado nesta etapa', + 'yes' => 'Sim', + ], + ], + 'create' => [ + 'title' => 'Adicionar Funil', + 'save-btn' => 'Salvar Funil', + 'name' => 'Nome', + 'rotten-days' => 'Dias parado nesta etapa', + 'mark-as-default' => 'Marcar como Padrão', + 'general' => 'Geral', + 'probability' => 'Probabilidade (%)', + 'new-stage' => 'Novo', + 'won-stage' => 'Ganho', + 'lost-stage' => 'Perdido', + 'stage-btn' => 'Adicionar Estágio', + 'stages' => 'Estágios', + 'duplicate-name' => 'O campo "Nome" não pode ser duplicado', + 'delete-stage' => 'Excluir Estágio', + 'add-new-stages' => 'Adicionar Novos Estágios', + 'add-stage-info' => 'Adicionar novo estágio para o seu Funil', + 'newly-added' => 'Adicionado Recentemente', + 'stage-delete-success' => 'Estágio excluído com sucesso', + ], + 'edit' => [ + 'title' => 'Editar Funil', + 'save-btn' => 'Salvar Funil', + 'name' => 'Nome', + 'rotten-days' => 'Dias parado nesta etapa', + 'mark-as-default' => 'Marcar como Padrão', + 'general' => 'Geral', + 'probability' => 'Probabilidade (%)', + 'new-stage' => 'Novo', + 'won-stage' => 'Ganho', + 'lost-stage' => 'Perdido', + 'stage-btn' => 'Adicionar Estágio', + 'stages' => 'Estágios', + 'duplicate-name' => 'O campo "Nome" não pode ser duplicado', + 'delete-stage' => 'Excluir Estágio', + 'add-new-stages' => 'Adicionar Novos Estágios', + 'add-stage-info' => 'Adicionar novo estágio para o seu Funil', + 'stage-delete-success' => 'Estágio excluído com sucesso', + ], + ], + 'webhooks' => [ + 'index' => [ + 'title' => 'Webhooks', + 'create-btn' => 'Adicionar Webhook', + 'create-success' => 'Webhook adicionado com sucesso.', + 'update-success' => 'Webhook atualizado com sucesso.', + 'delete-success' => 'Webhook deletado com sucesso.', + 'delete-failed' => 'Webhook não pode ser deletado.', + 'datagrid' => [ + 'id' => 'ID', + 'delete' => 'Deletar', + 'edit' => 'Editar', + 'name' => 'Nome', + 'entity-type' => 'Tipo de Entidade', + 'end-point' => 'Ponto de Acesso', + ], + ], + 'create' => [ + 'title' => 'Adcionar Webhook', + 'save-btn' => 'Salvar Webhook', + 'info' => 'Digite os detalhes dos webhooks', + 'url-and-parameters' => 'URL e Parâmetros', + 'method' => 'Método', + 'post' => 'Post', + 'put' => 'Put', + 'url-endpoint' => 'Endpoint da URL', + 'parameters' => 'Parâmetros', + 'add-new-parameter' => 'Adicionar Novo Parâmetro', + 'url-preview' => 'Pré-visualização da URL:', + 'headers' => 'Cabeçalhos', + 'add-new-header' => 'Adicionar Novo Cabeçalho', + 'body' => 'Corpo', + 'default' => 'Padrão', + 'x-www-form-urlencoded' => 'x-www-form-urlencoded', + 'key-and-value' => 'Chave e Valor', + 'add-new-payload' => 'Adicionar novo payload', + 'raw' => 'Raw', + 'general' => 'Geral', + 'name' => 'Nome', + 'entity-type' => 'Tipo de Entidade', + 'insert-placeholder' => 'Inserir Placeholder', + 'description' => 'Descrição', + 'json' => 'Json', + 'text' => 'Texto', + ], + 'edit' => [ + 'title' => 'Editar Webhook', + 'edit-btn' => 'Salvar Webhook', + 'save-btn' => 'Salvar Webhook', + 'info' => 'Digite os detalhes dos webhooks', + 'url-and-parameters' => 'URL e Parâmetros', + 'method' => 'Método', + 'post' => 'Post', + 'put' => 'Put', + 'url-endpoint' => 'Endpoint da URL', + 'parameters' => 'Parâmetros', + 'add-new-parameter' => 'Adicionar Novo Parâmetro', + 'url-preview' => 'Pré-visualização da URL:', + 'headers' => 'Cabeçalhos', + 'add-new-header' => 'Adicionar Novo Cabeçalho', + 'body' => 'Corpo', + 'default' => 'Padrão', + 'x-www-form-urlencoded' => 'x-www-form-urlencoded', + 'key-and-value' => 'Chave e Valor', + 'add-new-payload' => 'Adicionar novo payload', + 'raw' => 'Raw', + 'general' => 'Geral', + 'name' => 'Nome', + 'entity-type' => 'Tipo de Entidade', + 'insert-placeholder' => 'Inserir Placeholder', + 'description' => 'Descrição', + 'json' => 'Json', + 'text' => 'Texto', + ], + ], + 'warehouses' => [ + 'index' => [ + 'title' => 'Depósitos', + 'create-btn' => 'Adicionar Depósito', + 'create-success' => 'Depósito adicionado com sucesso.', + 'name-exists' => 'Nome do depósito já existe.', + 'update-success' => 'Depósito atualizado com sucesso.', + 'delete-success' => 'Depósito deletado com sucesso.', + 'delete-failed' => 'Depósito não pode ser deletado.', + 'datagrid' => [ + 'id' => 'ID', + 'name' => 'Nome', + 'contact-name' => 'Nome de Contato', + 'delete' => 'Deletar', + 'edit' => 'Editar', + 'view' => 'Visualizar', + 'created-at' => 'Criado em', + 'products' => 'Produtos', + 'contact-emails' => 'Emails de Contato', + 'contact-numbers' => 'Números de Contato', + ], + ], + 'create' => [ + 'title' => 'Adicionar Depósito', + 'save-btn' => 'Salvar Depósito', + 'contact-info' => 'Informações de Contato', + ], + 'edit' => [ + 'title' => 'Editar Depósito', + 'save-btn' => 'Salvar Depósito', + 'contact-info' => 'Informações de Contato', + ], + 'view' => [ + 'all' => 'Todos', + 'notes' => 'Notas', + 'files' => 'Arquivos', + 'location' => 'Localização', + 'change-logs' => 'Registros de Alterações', + 'locations' => [ + 'action' => 'Ação', + 'add-location' => 'Adicionar Localização', + 'create-success' => 'Localização adicionada com sucesso.', + 'delete' => 'Deletar', + 'delete-failed' => 'Localização não pode ser deletada.', + 'delete-success' => 'Localização deletada com sucesso.', + 'name' => 'Nome', + 'save-btn' => 'Salvar', + ], + 'general-information' => [ + 'title' => 'Informações Gerais', + ], + 'contact-information' => [ + 'title' => 'Informações de Contato', + ], + ], + ], + 'attributes' => [ + 'index' => [ + 'title' => 'Atributos', + 'create-btn' => 'Adicionar Atributo', + 'create-success' => 'Atributo criados com sucesso.', + 'update-success' => 'Atributo atualizados com sucesso.', + 'delete-success' => 'Atributo deletados com sucesso.', + 'delete-failed' => 'Atributo não podem ser deletados.', + 'user-define-error' => 'Não é possível deletar atributos do sistema.', + 'mass-delete-failed' => 'Atributos do sistema não podem ser deletados.', + 'datagrid' => [ + 'yes' => 'Sim', + 'no' => 'Não', + 'id' => 'ID', + 'code' => 'Código', + 'name' => 'Nome', + 'entity-type' => 'Tipo de Entidade', + 'type' => 'Tipo', + 'is-default' => 'É Padrão', + 'edit' => 'Editar', + 'delete' => 'Deletar', + 'entity-types' => [ + 'leads' => 'Oportunidades', + 'organizations' => 'Empresas', + 'persons' => 'Pessoas', + 'products' => 'Produtos', + 'quotes' => 'Cotações', + 'warehouses' => 'Depósitos', + ], + 'types' => [ + 'text' => 'Texto', + 'textarea' => 'Área de texto', + 'price' => 'Preço', + 'boolean' => 'Booleano', + 'select' => 'Selecionar', + 'multiselect' => 'Seleção múltipla', + 'checkbox' => 'Caixa de seleção', + 'email' => 'Email', + 'address' => 'Endereço', + 'phone' => 'Telefone', + 'lookup' => 'Busca', + 'datetime' => 'Data e hora', + 'date' => 'Data', + 'image' => 'Imagem', + 'file' => 'Arquivo', + ], + ], + ], + 'create' => [ + 'title' => 'Adicionar Atributo', + 'save-btn' => 'Salvar Atributo', + 'code' => 'Código', + 'name' => 'Nome', + 'entity-type' => 'Tipo de Entidade', + 'type' => 'Tipo', + 'validations' => 'Validações', + 'is-required' => 'É Obrigatório', + 'input-validation' => 'Validação de Entrada', + 'is-unique' => 'É Único', + 'labels' => 'Rótulos', + 'general' => 'Geral', + 'numeric' => 'Numérico', + 'decimal' => 'Decimal', + 'url' => 'URL', + 'options' => 'Opções', + 'option-type' => 'Tipo de Opção', + 'lookup-type' => 'Tipo de Pesquisa', + 'add-option' => 'Adicionar Opção', + 'save-option' => 'Salvar Opção', + 'option-name' => 'Nome da Opção', + 'add-attribute-options' => 'Adicionar Opções de Atributo', + 'text' => 'Texto', + 'textarea' => 'Área de Texto', + 'price' => 'Preço', + 'boolean' => 'Verdadeiro ou falso', + 'select' => 'Seleção', + 'multiselect' => 'Multiseleção', + 'email' => 'E-mail', + 'address' => 'Endereço', + 'phone' => 'Telefone', + 'datetime' => 'Data e Hora', + 'date' => 'Data', + 'image' => 'Imagem', + 'file' => 'Arquivo', + 'lookup' => 'Pesquisa', + 'entity_type' => 'Tipo de Entidade', + 'checkbox' => 'Caixa de Seleção', + 'is_required' => 'É Obrigatório', + 'is_unique' => 'É Único', + 'actions' => 'Ações', + ], + 'edit' => [ + 'actions' => 'Ações', + 'add-attribute-options' => 'Adicionar Opções de Atributo', + 'add-option' => 'Adicionar Opção', + 'address' => 'Endereço', + 'boolean' => 'Verdadeiro ou falso', + 'checkbox' => 'Caixa de Seleção', + 'code' => 'Código', + 'date' => 'Data', + 'datetime' => 'Data e Hora', + 'decimal' => 'Decimal', + 'email' => 'E-mail', + 'entity-type' => 'Tipo de Entidade', + 'entity_type' => 'Tipo de Entidade', + 'file' => 'Arquivo', + 'general' => 'Geral', + 'image' => 'Imagem', + 'input-validation' => 'Validação de Entrada', + 'is-required' => 'É Obrigatório', + 'is-unique' => 'É Único', + 'is_required' => 'É Obrigatório', + 'is_unique' => 'É Único', + 'labels' => 'Rótulos', + 'lookup' => 'Pesquisa', + 'lookup-type' => 'Tipo de Pesquisa', + 'multiselect' => 'Multiseleção', + 'name' => 'Nome', + 'numeric' => 'Numérico', + 'option-deleted' => 'Attribute Option is deleted successfully', + 'option-name' => 'Nome da Opção', + 'option-type' => 'Tipo de Opção', + 'options' => 'Opções', + 'phone' => 'Telefone', + 'price' => 'Preço', + 'save-btn' => 'Salvar Atributo', + 'save-option' => 'Salvar Opção', + 'select' => 'Seleção', + 'text' => 'Texto', + 'textarea' => 'Área de Texto', + 'title' => 'Editar Atributo', + 'type' => 'Tipo', + 'url' => 'URL', + 'validations' => 'Validações', + ], + ], + 'data-transfer' => [ + 'imports' => [ + 'create' => [ + 'action' => 'Action', + 'allowed-errors' => 'Allowed Errors', + 'back-btn' => 'Back', + 'create-update' => 'Create/Update', + 'delete' => 'Delete', + 'download-sample' => 'Download Sample', + 'field-separator' => 'Field Separator', + 'file' => 'File', + 'general' => 'General', + 'images-directory' => 'Images Directory Path', + 'process-in-queue' => 'Process In Queue', + 'results' => 'Results', + 'save-btn' => 'Save Import', + 'settings' => 'Settings', + 'skip-errors' => 'Skip Errors', + 'stop-on-errors' => 'Stop on Errors', + 'title' => 'Create Import', + 'type' => 'Type', + 'validation-strategy' => 'Validation Strategy', + ], + 'edit' => [ + 'action' => 'Action', + 'allowed-errors' => 'Allowed Errors', + 'back-btn' => 'Back', + 'create-update' => 'Create/Update', + 'delete' => 'Delete', + 'download-sample' => 'Download Sample', + 'field-separator' => 'Field Separator', + 'file' => 'File', + 'general' => 'General', + 'images-directory' => 'Images Directory Path', + 'process-in-queue' => 'Process In Queue', + 'results' => 'Results', + 'save-btn' => 'Save Import', + 'settings' => 'Settings', + 'skip-errors' => 'Skip Errors', + 'stop-on-errors' => 'Stop on Errors', + 'title' => 'Edit Import', + 'type' => 'Type', + 'validation-strategy' => 'Validation Strategy', + ], + 'index' => [ + 'button-title' => 'Create Import', + 'title' => 'Imports', + 'datagrid' => [ + 'actions' => 'Actions', + 'completed-at' => 'Completed At', + 'created' => 'Created', + 'delete' => 'Delete', + 'deleted' => 'Deleted', + 'edit' => 'Edit', + 'error-file' => 'Error File', + 'id' => 'ID', + 'started-at' => 'Started At', + 'state' => 'State', + 'summary' => 'Summary', + 'type' => 'Type', + 'updated' => 'Updated', + 'uploaded-file' => 'Uploaded File', + ], + ], + 'import' => [ + 'back-btn' => 'Back', + 'completed-batches' => 'Total Batches Completed:', + 'download-error-report' => 'Download Full Report', + 'edit-btn' => 'Edit', + 'imported-info' => 'Congratulations! Your import was successful.', + 'importing-info' => 'Import In Process', + 'indexing-info' => 'Resources Indexing (Price, Inventory and Elastic Search) In Progress', + 'linking-info' => 'Resources Linking In Progress', + 'progress' => 'Progress:', + 'title' => 'Import', + 'total-batches' => 'Total Batches:', + 'total-created' => 'Total Records Created:', + 'total-deleted' => 'Total Records Deleted:', + 'total-errors' => 'Total Errors:', + 'total-invalid-rows' => 'Total Invalid Rows:', + 'total-rows-processed' => 'Total Rows Processed:', + 'total-updated' => 'Total Records Updated:', + 'validate' => 'Validate', + 'validate-info' => 'Click on Validate Data to check your import.', + 'validating-info' => 'The data started reading and Validating', + 'validation-failed-info' => 'Your import is invalid. Please fix the following errors and try again.', + 'validation-success-info' => 'Your import is valid. Click on Import to start the import process.', + ], + 'create-success' => 'Import created successfully.', + 'delete-failed' => 'Import deletion failed unexpectedly.', + 'delete-success' => 'Import deleted successfully.', + 'not-valid' => 'Import is invalid', + 'nothing-to-import' => 'There are no resources to import.', + 'setup-queue-error' => 'Please change your queue driver to "database" or "redis" to start the import process.', + 'update-success' => 'Import updated successfully.', + ], + ], + ], + 'activities' => [ + 'index' => [ + 'title' => 'Atividades', + 'datagrid' => [ + 'comment' => 'Comentário', + 'created_at' => 'Criado Em', + 'created_by' => 'Criado Por', + 'edit' => 'Editar', + 'id' => 'ID', + 'done' => 'Concluído', + 'not-done' => 'Não Concluído', + 'lead' => 'Oportunidade', + 'mass-delete' => 'Excluir em Massa', + 'mass-update' => 'Atualizar em Massa', + 'schedule-from' => 'Agendado de', + 'schedule-to' => 'Agendado até', + 'schedule_from' => 'Agendado de', + 'schedule_to' => 'Agendado até', + 'title' => 'Título', + 'is_done' => 'Está Concluído', + 'type' => 'Tipo', + 'update' => 'Atualizar', + 'call' => 'Chamada', + 'meeting' => 'Reunião', + 'lunch' => 'Almoço', + ], + ], + 'edit' => [ + 'title' => 'Editar Atividade', + 'back-btn' => 'Voltar', + 'save-btn' => 'Salvar Atividade', + 'type' => 'Tipo de Atividade', + 'call' => 'Chamada', + 'meeting' => 'Reunião', + 'lunch' => 'Almoço', + 'schedule_to' => 'Agendado até', + 'schedule_from' => 'Agendado de', + 'location' => 'Localização', + 'comment' => 'Comentário', + 'lead' => 'Oportunidade', + 'participants' => 'Participantes', + 'general' => 'Geral', + 'persons' => 'Pessoas', + 'no-result-found' => 'Nenhum registro encontrado.', + 'users' => 'Usuários', + ], + 'updated' => 'Atualizado', + 'created' => 'Criado', + 'duration-overlapping' => 'Os participantes têm outra reunião neste horário. Deseja continuar?', + 'create-success' => 'Atividade adicionada com sucesso.', + 'update-success' => 'Atividade atualizada com sucesso.', + 'overlapping-error' => 'Os participantes têm outra reunião neste horário.', + 'destroy-success' => 'Atividade deletada com sucesso.', + 'delete-failed' => 'A atividade não pode ser deletada.', + 'mass-update-success' => 'Atividades atualizadas com sucesso.', + 'mass-destroy-success' => 'Activities deleted successfully.', + 'mass-delete-failed' => 'Activities can not be deleted.', + ], + 'mail' => [ + 'index' => [ + 'compose' => 'Escrever', + 'draft' => 'Rascunho', + 'inbox' => 'Caixa de Entrada', + 'outbox' => 'Caixa de Saída', + 'sent' => 'Enviado', + 'trash' => 'Lixeira', + 'compose-mail-btn' => 'Escrever E-mail', + 'btn' => 'E-mail', + 'mail' => [ + 'title' => 'Escrever E-mail', + 'to' => 'Para', + 'enter-emails' => 'Pressione Enter para adicionar e-mails', + 'cc' => 'Cópia', + 'bcc' => 'Cópia oculta', + 'subject' => 'Assunto', + 'send-btn' => 'Enviar', + 'message' => 'Mensagem', + 'draft' => 'Rascunho', + ], + 'datagrid' => [ + 'id' => 'ID', + 'from' => 'De', + 'to' => 'Para', + 'subject' => 'Assunto', + 'tags' => 'Tags', + 'content' => 'Content', + 'attachments' => 'Attachments', + 'date' => 'Date', + 'move-to-inbox' => 'Movido para Caixa de Entrada', + 'move-to-trash' => 'Movido para a lixeira', + 'edit' => 'Editar', + 'view' => 'Visualizar', + 'delete' => 'Excluir', + ], + ], + 'create-success' => 'E-mail enviado com sucesso.', + 'update-success' => 'E-mail atualizado com sucesso.', + 'mass-update-success' => 'E-mails atualizados com sucesso.', + 'delete-success' => 'E-mail excluído com sucesso.', + 'delete-failed' => 'E-mail não pode ser excluído.', + 'view' => [ + 'title' => 'E-mails', + 'subject' => ':subject', + 'link-mail' => 'Link do E-mail', + 'to' => 'Para', + 'cc' => 'Cópia', + 'bcc' => 'Cópia oculta', + 'reply' => 'Responder', + 'reply-all' => 'Responder a Todos', + 'forward' => 'Encaminhar', + 'delete' => 'Excluir', + 'enter-mails' => 'Digite o id do e-mail', + 'rotten-days' => 'O negócio está sem movimentação há :days dias', + 'search-an-existing-lead' => 'Pesquisar um negócio existente', + 'search-an-existing-contact' => 'Pesquisar um contato existente', + 'message' => 'Mensagem', + 'add-attachments' => 'Adicionar Anexos', + 'discard' => 'Descartar', + 'send' => 'Enviar', + 'no-result-found' => 'Nenhum resultado encontrado', + 'add-new-contact' => 'Adicionar Novo Contato', + 'description' => 'Descrição', + 'search' => 'Pesquisar...', + 'add-new-lead' => 'Adicionar Nova Oportunidade', + 'create-new-contact' => 'Adicionar Novo Contato', + 'save-contact' => 'Salvar Contato', + 'create-lead' => 'Adicionar Oportunidade', + 'linked-contact' => 'Contato Vinculado', + 'link-to-contact' => 'Vincular ao Contato', + 'link-to-lead' => 'Vincular a uma Oportunidade', + 'linked-lead' => 'Oportunidade Vinculado', + 'lead-details' => 'Detalhes da Oportunidade', + 'contact-person' => 'Pessoa de Contato', + 'product' => 'Produto', + 'tags' => [ + 'create-success' => 'Tag adicionada com sucesso.', + 'destroy-success' => 'Tag excluída com sucesso.', + ], + ], + ], + 'common' => [ + 'custom-attributes' => [ + 'add-more' => 'Adicionar Mais', + 'address' => 'Endereço', + 'city' => 'Cidade', + 'contact' => 'Números de Contato', + 'country' => 'País', + 'email' => 'E-mail', + 'home' => 'Casa', + 'postcode' => 'CEP', + 'save' => 'Salvar', + 'select' => 'Selecionar', + 'select-country' => 'Selecionar País', + 'select-state' => 'Selecionar Estado', + 'state' => 'Estado', + 'update-contact-title' => 'Atualizar Números de Contato', + 'update-emails-title' => 'Atualizar E-mails de Contato', + 'work' => 'Trabalho', + ], + ], + 'leads' => [ + 'create-success' => 'Negócio adicionado com sucesso.', + 'update-success' => 'Negócio atualizado com sucesso.', + 'update-failed' => 'Leads can not be deleted.', + 'destroy-success' => 'Negócio excluído com sucesso.', + 'destroy-failed' => 'Este negócio não pode ser excluído.', + 'file' => [ + 'data-not-found' => 'Dados não encontrados.', + 'empty-content' => 'O conteúdo do PDF está vazio ou não pôde ser extraído.', + 'failed-extract' => 'Falha ao extrair texto do arquivo.', + 'insufficient-info' => 'Devido a dados insuficientes, não podemos processar sua solicitação no momento.', + 'invalid-base64' => 'Formato base64 inválido.', + 'invalid-format' => 'Formato JSON inválido.', + 'invalid-response' => 'Formato de resposta de IA inválido.', + 'missing-api-key' => 'Chave API ou configuração do modelo ausente.', + 'not-found' => 'Arquivo não encontrado.', + 'recursive-call' => 'Chamada recursiva detectada.', + 'text-generation-failed' => 'Falha na extração de texto. O arquivo pode estar vazio ou ilegível.', + ], + 'index' => [ + 'title' => 'Oportunidades', + 'create-btn' => 'Adicionar Negócio', + 'datagrid' => [ + 'id' => 'ID', + 'sales-person' => 'Vendedor', + 'subject' => 'Assunto', + 'source' => 'Origem', + 'lead-value' => 'Valor do Negócio', + 'lead-type' => 'Tipo de Negócio', + 'tag-name' => 'Nome da Tag', + 'contact-person' => 'Pessoa de Contato', + 'stage' => 'Etapa', + 'rotten-lead' => 'Negócio estagnado', + 'date-to' => 'Data fechamento', + 'created-at' => 'Criado em', + 'no' => 'Não', + 'yes' => 'Sim', + 'delete' => 'Excluir', + 'mass-delete' => 'Excluir em Massa', + 'mass-update' => 'Atualizar em Massa', + ], + 'kanban' => [ + 'rotten-days' => 'Negócio estagnado por :days dias', + 'empty-list' => 'Sua lista de Negócios está vazia', + 'empty-list-description' => 'Adicione um negócio para organizar seus objetivos.', + 'create-lead-btn' => 'Adicionar Negócio', + 'stages' => [ + 'need-more-info' => 'Mais informações', + 'won-value' => 'Valor Ganho', + 'lost-reason' => 'Motivo da Perda', + 'closed-at' => 'Fechado em', + 'save-btn' => 'Salvar', + ], + 'columns' => [ + 'contact-person' => 'Pessoa de Contato', + 'id' => 'ID', + 'lead-type' => 'Tipo de Negócio', + 'lead-value' => 'Valor do negócio', + 'sales-person' => 'Vendedor', + 'source' => 'Origem', + 'title' => 'Título', + 'tags' => 'Tags', + 'expected-close-date' => 'Data Esperada de Fechamento', + 'created-at' => 'Criado em', + ], + 'toolbar' => [ + 'search' => [ + 'title' => 'Buscar por título', + ], + 'filters' => [ + 'apply-filters' => 'Aplicar Filtros', + 'clear-all' => 'Limpar Tudo', + 'filter' => 'Filtrar', + 'filters' => 'Filtros', + 'from' => 'De', + 'select' => 'Selecionar', + 'to' => 'Para', + ], + ], + ], + 'view-switcher' => [ + 'all-pipelines' => 'Todos os Funis', + 'create-new-pipeline' => 'Adicionar Novo Funil', + ], + 'upload' => [ + 'create-lead' => 'Adicionar Negócio Usando AI', + 'file' => 'Upload de arquivo', + 'file-info' => 'Apenas arquivos nos formatos pdf, bmp, jpg, jpeg, png são aceitos.', + 'file-required' => 'Por favor, selecione pelo menos um arquivo válido para prosseguir.', + 'save-btn' => 'Salvar', + 'upload-file' => 'Enviar arquivo', + ], + ], + 'create' => [ + 'title' => 'Adicionar Negócio', + 'save-btn' => 'Salvar', + 'details' => 'Detalhes', + 'details-info' => 'Coloque as informações básicas do Negócio', + 'contact-person' => 'Pessoa de Contato', + 'contact-info' => 'Informações sobre a Pessoa de Contato', + 'products' => 'Produtos', + 'products-info' => 'Informações sobre os Produtos', + ], + 'edit' => [ + 'title' => 'Editar Negócio', + 'save-btn' => 'Salvar', + 'details' => 'Detalhes', + 'details-info' => 'Coloque as informações básicas do Negócio', + 'contact-person' => 'Pessoa de Contato', + 'contact-info' => 'Informações sobre a Pessoa de Contato', + 'products' => 'Produtos', + 'products-info' => 'Informações sobre os Produtos', + ], + 'common' => [ + 'contact' => [ + 'name' => 'Nome', + 'email' => 'E-mail', + 'contact-number' => 'Número de Contato', + 'organization' => 'Empresa', + ], + 'products' => [ + 'product-name' => 'Nome do Produto', + 'quantity' => 'Quantidade', + 'price' => 'Preço', + 'amount' => 'Valor', + 'action' => 'Ação', + 'add-more' => 'Adicionar Mais', + 'total' => 'Total', + ], + ], + 'view' => [ + 'title' => 'Negócio: :title', + 'rotten-days' => ':days Dias', + 'tabs' => [ + 'description' => 'Descrição', + 'products' => 'Produtos', + 'quotes' => 'Cotações', + ], + 'attributes' => [ + 'title' => 'Sobre o Negócio', + ], + 'quotes' => [ + 'subject' => 'Assunto', + 'expired-at' => 'Expirado em', + 'sub-total' => 'Subtotal', + 'discount' => 'Desconto', + 'tax' => 'Imposto', + 'adjustment' => 'Ajuste', + 'grand-total' => 'Total Geral', + 'delete' => 'Excluir', + 'edit' => 'Editar', + 'download' => 'Baixar', + 'destroy-success' => 'Cotação excluída com sucesso.', + 'empty-title' => 'Nenhuma Cotação Encontrada', + 'empty-info' => 'Nenhuma Cotação Encontrada para este Negócio', + 'add-btn' => 'Adicionar Cotação', + ], + 'products' => [ + 'product-name' => 'Nome do Produto', + 'quantity' => 'Quantidade', + 'price' => 'Preço', + 'amount' => 'Valor', + 'action' => 'Ação', + 'add-more' => 'Adicionar Mais', + 'total' => 'Total', + 'empty-title' => 'Nenhum Produto Encontrado', + 'empty-info' => 'Nenhum Produto Encontrado para este Negócio', + 'add-product' => 'Adicionar Produto', + ], + 'persons' => [ + 'title' => 'Sobre as Pessoas', + 'job-title' => ':job_title em :organization', + ], + 'stages' => [ + 'won-lost' => 'Ganho/Perdido', + 'won' => 'Ganho', + 'lost' => 'Perdido', + 'need-more-info' => 'Precisa de Mais Informações', + 'closed-at' => 'Fechado em', + 'won-value' => 'Valor Ganhado', + 'lost-reason' => 'Motivo da Perda', + 'save-btn' => 'Salvar', + ], + 'tags' => [ + 'create-success' => 'Tag adicionada com sucesso.', + 'destroy-success' => 'Tag excluída com sucesso.', + ], + ], + ], + 'configuration' => [ + 'index' => [ + 'back' => 'Voltar', + 'delete' => 'Excluir', + 'save-btn' => 'Salvar Configuração', + 'save-success' => 'Configuração Salva com Sucesso.', + 'search' => 'Pesquisar', + 'select-country' => 'Selecionar País', + 'select-state' => 'Selecionar Estado', + 'title' => 'Configuração', + 'general' => [ + 'title' => 'Geral', + 'info' => 'Configuração Geral', + 'general' => [ + 'title' => 'Geral', + 'info' => 'Atualize suas configurações gerais aqui.', + 'locale-settings' => [ + 'title' => 'Configurações de Idioma', + 'title-info' => 'Define o idioma usado na interface do usuário.', + ], + 'admin-logo' => [ + 'logo-image' => 'Imagem do Logo', + 'title' => 'Logo do Admin', + 'title-info' => 'Configure a imagem do logo para o seu painel de administração.', + ], + ], + 'settings' => [ + 'title' => 'Settings', + 'info' => 'Update your settings here.', + 'footer' => [ + 'info' => 'We can configure the powered by section here.', + 'powered-by' => 'Powered by text editor', + 'title' => 'Powered by Section Configurations', + ], + 'menu' => [ + 'activities' => 'Activities', + 'configuration' => 'Configuration', + 'contacts' => 'Contacts', + 'dashboard' => 'Dashboard', + 'draft' => 'Draft', + 'inbox' => 'Inbox', + 'info' => 'We can configure the menu items name here.', + 'leads' => 'Leads', + 'mail' => 'Mail', + 'organizations' => 'Organizations', + 'outbox' => 'Outbox', + 'persons' => 'Persons', + 'products' => 'Products', + 'quotes' => 'Quotes', + 'sent' => 'Sent', + 'settings' => 'Settings', + 'title' => 'Menu Item Configurations', + 'trash' => 'Trash', + ], + 'menu-color' => [ + 'brand-color' => 'Brand Color', + 'info' => 'We can change the menu items colors here.', + 'title' => 'Menu Item Color Configurations', + ], + ], + ], + 'email' => [ + 'title' => 'Configurações de E-mail', + 'info' => 'Configuração de e-mail para a aplicação.', + 'imap' => [ + 'title' => 'Configurações IMAP', + 'info' => 'Configuração de e-mail IMAP para receber emails.', + 'account' => [ + 'title' => 'Conta IMAP', + 'title-info' => 'Configure as configurações da sua conta IMAP aqui.', + 'host' => 'Host', + 'port' => 'Porta', + 'encryption' => 'Tipo de Criptografia', + 'validate-cert' => 'Validar Certificado SSL', + 'username' => 'Nome de Usuário IMAP', + 'password' => 'Senha IMAP', + ], + ], + ], + 'magic-ai' => [ + 'title' => 'Magic AI', + 'info' => 'Configuração do Magic AI para a aplicação.', + 'settings' => [ + 'api-key' => 'Chave API', + 'api-key-info' => 'Lembre-se de usar uma chave API do OpenRouter para cada modelo. É um passo simples para melhorar a segurança e o desempenho.', + 'enable' => 'Habilitar', + 'info' => 'Melhore sua experiência com o Magic AI com sua chave API do OpenRouter. Integre-a agora para uma aventura de IA personalizada e perfeita, feita sob medida para você! Personalize as configurações com facilidade e assuma o controle da sua jornada de IA.', + 'other' => 'Outro Modelo', + 'other-model' => 'Para outros modelos, use o ID do Modelo do OpenRouter.', + 'doc-generation' => 'Geração de DOC', + 'doc-generation-info' => 'Ative o recurso de geração de DOC para extrair automaticamente dados de arquivos DOC e convertê-los em formato de texto. Aumente sua produtividade e eficiência ativando este recurso para simplificar seu fluxo de trabalho.', + 'title' => 'Configurações Gerais', + 'models' => [ + 'deepseek-r1' => 'Deepseek R1 Distill-llama-8b', + 'gemini-2-0-flash-001' => 'Gemini 2.0 flash-001', + 'gpt-4o' => 'GPT-4.0', + 'gpt-4o-mini' => 'GPT-4.0 mini', + 'grok-2-1212' => 'Grok 2.12', + 'llama-3-2-3b-instruct' => 'Llama 3.2 3b Instruct', + 'title' => 'Modelos', + ], + ], + ], + ], + ], + 'dashboard' => [ + 'index' => [ + 'title' => 'Início', + 'revenue' => [ + 'lost-revenue' => 'Negócios Perdidos', + 'won-revenue' => 'Negócios Ganhos', + ], + 'over-all' => [ + 'average-lead-value' => 'Ticket médio', + 'total-leads' => 'Total de negócios', + 'average-leads-per-day' => 'Média de negócios por dia', + 'total-quotations' => 'Total de cotações', + 'total-persons' => 'Total de pessoas', + 'total-organizations' => 'Total de empresas', + ], + 'total-leads' => [ + 'title' => 'Negócios', + 'total' => 'Total de negócios', + 'won' => 'Negócios ganhos', + 'lost' => 'Negócios perdidos', + ], + 'revenue-by-sources' => [ + 'title' => 'Faturamento por origens', + 'empty-title' => 'Ainda não há dados', + 'empty-info' => 'Nenhum dado disponível para o intervalo selecionado', + ], + 'revenue-by-types' => [ + 'title' => 'Faturamento por tipos', + 'empty-title' => 'Ainda não há dados', + 'empty-info' => 'Nenhum dado disponível para o intervalo selecionado', + ], + 'top-selling-products' => [ + 'title' => 'Produtos mais vendidos', + 'empty-title' => 'Ainda não há dados', + 'empty-info' => 'Nenhum produto disponível para o intervalo selecionado', + ], + 'top-persons' => [ + 'title' => 'Principais pessoas', + 'empty-title' => 'Ainda não há dados', + 'empty-info' => 'Nenhuma pessoa disponível para o intervalo selecionado', + ], + 'open-leads-by-states' => [ + 'title' => 'Negócios por estágios', + 'empty-title' => 'Ainda não há dados', + 'empty-info' => 'Nenhum dado disponível para o intervalo selecionado', + ], + 'start-date' => 'Data de Início', + 'end-date' => 'Data de Término', + ], + ], + 'layouts' => [ + 'app-version' => 'Versão: :version', + 'dashboard' => 'Início', + 'leads' => 'Oportunidades', + 'quotes' => 'Cotações', + 'quote' => 'Cotação', + 'mail' => [ + 'title' => 'E-mail', + 'compose' => 'Escrever', + 'inbox' => 'Caixa de Entrada', + 'draft' => 'Rascunho', + 'outbox' => 'Caixa de Saída', + 'sent' => 'Enviado', + 'trash' => 'Lixeira', + 'setting' => 'Configurações', + ], + 'activities' => 'Atividades', + 'contacts' => 'Contatos', + 'persons' => 'Pessoas', + 'person' => 'Pessoa', + 'organizations' => 'Empresas', + 'organization' => 'Empresa', + 'products' => 'Produtos', + 'product' => 'Produto', + 'settings' => 'Configurações', + 'user' => 'Usuário', + 'user-info' => 'Gerencie todos os seus usuários e suas permissões no CRM, o que eles estão autorizados a fazer.', + 'groups' => 'Grupos', + 'groups-info' => 'Adicionar, editar ou excluir grupos do CRM', + 'roles' => 'Funções', + 'role' => 'Função', + 'roles-info' => 'Adicionar, editar ou excluir funções do CRM', + 'users' => 'Usuários', + 'users-info' => 'Adicionar, editar ou excluir usuários do CRM', + 'lead' => 'Negócio', + 'lead-info' => 'Gerencie todas as configurações relacionadas aos Negócios no CRM', + 'pipelines' => 'Funis', + 'pipelines-info' => 'Adicionar, editar ou excluir funis do CRM', + 'sources' => 'Origens', + 'sources-info' => 'Adicionar, editar ou excluir origems do CRM', + 'types' => 'Tipos', + 'types-info' => 'Adicionar, editar ou excluir tipos do CRM', + 'automation' => 'Automação', + 'automation-info' => 'Gerencie todas as configurações de automação no CRM', + 'attributes' => 'Atributos', + 'attribute' => 'Atributo', + 'attributes-info' => 'Adicionar, editar ou excluir atributos do CRM', + 'email-templates' => 'Modelos de E-mail', + 'email' => 'E-mail', + 'email-templates-info' => 'Adicionar, editar ou excluir modelos de e-mail do CRM', + 'events' => 'Events', + 'events-info' => 'Add, edit or delete events from CRM', + 'campaigns' => 'Campaigns', + 'campaigns-info' => 'Add, edit or delete campaigns from CRM', + 'workflows' => 'Fluxos de Trabalho', + 'workflows-info' => 'Adicionar, editar ou excluir fluxos de trabalho do CRM', + 'webhooks' => 'Webhooks', + 'webhooks-info' => 'Add, edit or delete webhooks from CRM', + 'other-settings' => 'Outros Ajustes', + 'other-settings-info' => 'Gerencie todas as configurações extras no CRM', + 'tags' => 'Tags', + 'tags-info' => 'Adicionar, editar ou excluir tags do CRM', + 'my-account' => 'Minha conta', + 'sign-out' => 'Sair', + 'back' => 'Voltar', + 'name' => 'Nome', + 'configuration' => 'Ajustes', + 'howdy' => 'Olá!', + 'warehouses' => 'Depósitos', + 'warehouse' => 'Depósito', + 'warehouses-info' => 'Adicionar, editar ou excluir depósitos do CRM', + 'data_transfer' => 'Data Transfer', + 'data_transfer_info' => 'Manage persons, products and leads data transfer related settings in the CRM', + ], + 'user' => [ + 'account' => [ + 'name' => 'Nome', + 'email' => 'E-mail', + 'password' => 'Senha', + 'my_account' => 'Minha conta', + 'update_details' => 'Atualizar Detalhes', + 'current_password' => 'Senha atual', + 'confirm_password' => 'Confirmar senha', + 'password-match' => 'A senha atual não corresponde.', + 'account-save' => 'Alterações na conta salvas com sucesso.', + 'permission-denied' => 'Permissão Negada', + 'remove-image' => 'Remover Imagem', + 'upload_image_pix' => 'Carregar uma Imagem de Perfil (100px x 100px)', + 'upload_image_format' => 'em formato PNG ou JPG', + 'image_upload_message' => 'Somente imagens (.jpeg, .jpg, .png, ..) são permitidas.', + ], + ], + 'emails' => [ + 'common' => [ + 'dear' => 'Prezado(a) :name', + 'cheers' => 'Atenciosamente,
Equipe :app_name', + 'user' => [ + 'dear' => 'Prezado(a) :username', + 'create-subject' => 'Você foi adicionado como membro.', + 'create-body' => 'Parabéns! Agora você é um membro da nossa equipe.', + 'forget-password' => [ + 'subject' => 'Redefinir Senha do Cliente', + 'dear' => 'Prezado(a) :username', + 'reset-password' => 'Redefinir Senha', + 'info' => 'Você está recebendo este e-mail porque recebemos uma solicitação de redefinição de senha para sua conta.', + 'final-summary' => 'Se você não solicitou a redefinição de senha, nenhuma outra ação é necessária.', + 'thanks' => 'Obrigado!', + ], + ], + ], + ], + 'validations' => [ + 'message' => [ + 'decimal' => 'The :attribute must be a decimal.', + ], + ], + 'errors' => [ + 'dashboard' => 'Dashboard', + 'go-back' => 'Go Back', + 'support' => 'If the problem persists, reach out to us at :email for assistance.', + '404' => [ + 'description' => 'Oops! The page you\'re looking for is on vacation. It seems we couldn\'t find what you were searching for.', + 'title' => '404 Page Not Found', + ], + '401' => [ + 'description' => 'Ops! Parece que você não tem permissão para acessar esta página. Parece que estão faltando as credenciais necessárias.', + 'title' => '401 Não autorizado.', + ], + '403' => [ + 'description' => 'Oops! This page is off-limits. It appears you don\'t have the required permissions to view this content.', + 'title' => '403 Forbidden', + ], + '500' => [ + 'description' => 'Oops! Something went wrong. It seems we\'re having trouble loading the page you\'re looking for.', + 'title' => '500 Internal Server Error', + ], + '503' => [ + 'description' => 'Oops! Looks like we\'re temporarily down for maintenance. Please check back in a bit.', + 'title' => '503 Service Unavailable', + ], + ], + 'export' => [ + 'csv' => 'CSV', + 'download' => 'Download', + 'export' => 'Exportar', + 'no-records' => 'Nenhum registro encontrado.', + 'xls' => 'XLS', + 'xlsx' => 'XLSX', + ], +]; diff --git a/packages/Webkul/Admin/src/Resources/lang/tr/app.php b/packages/Webkul/Admin/src/Resources/lang/tr/app.php new file mode 100644 index 0000000..b61d3eb --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/lang/tr/app.php @@ -0,0 +1,2225 @@ + [ + 'leads' => 'Potansiyeller', + 'lead' => 'Potansiyel', + 'quotes' => 'Teklifler', + 'mail' => 'Posta', + 'inbox' => 'Gelen Kutusu', + 'draft' => 'Taslak', + 'outbox' => 'Gönderilenler', + 'sent' => 'Gönderildi', + 'trash' => 'Çöp Kutusu', + 'activities' => 'Etkinlikler', + 'webhook' => 'Web Kancası', + 'contacts' => 'Kişiler', + 'persons' => 'Kişiler', + 'organizations' => 'Organizasyonlar', + 'products' => 'Ürünler', + 'settings' => 'Ayarlar', + 'groups' => 'Gruplar', + 'roles' => 'Roller', + 'users' => 'Kullanıcılar', + 'user' => 'Kullanıcı', + 'automation' => 'Otomasyon', + 'attributes' => 'Öznitelikler', + 'pipelines' => 'Pipelines', + 'sources' => 'Kaynaklar', + 'types' => 'Türler', + 'email-templates' => 'E-posta Şablonları', + 'workflows' => 'İş Akışları', + 'other-settings' => 'Diğer Ayarlar', + 'tags' => 'Etiketler', + 'configuration' => 'Yapılandırma', + 'create' => 'Oluştur', + 'edit' => 'Düzenle', + 'view' => 'Görüntüle', + 'print' => 'Yazdır', + 'delete' => 'Sil', + 'export' => 'Dışa Aktar', + 'mass-delete' => 'Toplu Sil', + 'data-transfer' => 'Veri Transferi', + 'imports' => 'İthalatlar', + 'import' => 'İthalat', + 'event' => 'Etkinlik', + 'campaigns' => 'Kampanyalar', + ], + 'users' => [ + 'activate-warning' => 'Hesabınız henüz etkinleştirilmedi. Lütfen yönetici ile iletişime geçin.', + 'login-error' => 'Kimlik bilgileri kayıtlarımızla eşleşmiyor.', + 'not-permission' => 'Yönetici paneline erişim izniniz yok.', + 'login' => [ + 'email' => 'E-posta Adresi', + 'forget-password-link' => 'Şifremi Unuttum?', + 'password' => 'Şifre', + 'submit-btn' => 'Giriş Yap', + 'title' => 'Giriş Yap', + ], + 'forget-password' => [ + 'create' => [ + 'email' => 'Kayıtlı E-posta', + 'email-not-exist' => 'E-posta Mevcut Değil', + 'page-title' => 'Şifremi Unuttum', + 'reset-link-sent' => 'Şifre sıfırlama bağlantısı gönderildi', + 'sign-in-link' => 'Giriş Yapmaya Dön?', + 'submit-btn' => 'Sıfırla', + 'title' => 'Şifre Kurtarma', + ], + ], + 'reset-password' => [ + 'back-link-title' => 'Giriş Yapmaya Dön?', + 'confirm-password' => 'Şifreyi Onayla', + 'email' => 'Kayıtlı E-posta', + 'password' => 'Şifre', + 'submit-btn' => 'Şifreyi Sıfırla', + 'title' => 'Şifre Sıfırlama', + ], + ], + 'account' => [ + 'edit' => [ + 'back-btn' => 'Geri', + 'change-password' => 'Şifreyi Değiştir', + 'confirm-password' => 'Şifreyi Onayla', + 'current-password' => 'Mevcut Şifre', + 'email' => 'E-posta', + 'general' => 'Genel', + 'invalid-password' => 'Girdiğiniz mevcut şifre yanlış.', + 'name' => 'Ad', + 'password' => 'Şifre', + 'profile-image' => 'Profil Resmi', + 'save-btn' => 'Hesabı Kaydet', + 'title' => 'Hesabım', + 'update-success' => 'Hesap başarıyla güncellendi', + 'upload-image-info' => 'Profil Resmi Yükleyin (110px X 110px) PNG veya JPG Formatında', + ], + ], + 'components' => [ + 'activities' => [ + 'actions' => [ + 'mail' => [ + 'btn' => 'Mail', + 'title' => 'Compose Mail', + 'to' => 'To', + 'enter-emails' => 'Press enter to add emails', + 'cc' => 'CC', + 'bcc' => 'BCC', + 'subject' => 'Subject', + 'send-btn' => 'Send', + 'message' => 'Message', + ], + 'file' => [ + 'btn' => 'File', + 'title' => 'Add File', + 'title-control' => 'Title', + 'name' => 'Name', + 'description' => 'Description', + 'file' => 'File', + 'save-btn' => 'Save File', + ], + 'note' => [ + 'btn' => 'Note', + 'title' => 'Add Note', + 'comment' => 'Comment', + 'save-btn' => 'Save Note', + ], + 'activity' => [ + 'btn' => 'Activity', + 'title' => 'Add Activity', + 'title-control' => 'Title', + 'description' => 'Description', + 'schedule-from' => 'Schedule From', + 'schedule-to' => 'Schedule To', + 'location' => 'Location', + 'call' => 'Call', + 'meeting' => 'Meeting', + 'lunch' => 'Lunch', + 'save-btn' => 'Save Activity', + 'participants' => [ + 'title' => 'Participants', + 'placeholder' => 'Type to search participants', + 'users' => 'Users', + 'persons' => 'Persons', + 'no-results' => 'No result found...', + ], + ], + ], + 'index' => [ + 'all' => 'All', + 'bcc' => 'Bcc', + 'by-user' => 'By :user', + 'calls' => 'Calls', + 'cc' => 'Cc', + 'change-log' => 'Changelogs', + 'delete' => 'Delete', + 'edit' => 'Edit', + 'emails' => 'Emails', + 'empty' => 'Empty', + 'files' => 'Files', + 'from' => 'From', + 'location' => 'Location', + 'lunches' => 'Lunches', + 'mark-as-done' => 'Mark as Done', + 'meetings' => 'Meetings', + 'notes' => 'Notes', + 'participants' => 'Participants', + 'planned' => 'Planned', + 'quotes' => 'Quotes', + 'scheduled-on' => 'Scheduled on', + 'system' => 'System', + 'to' => 'To', + 'unlink' => 'Unlink', + 'view' => 'View', + 'empty-placeholders' => [ + 'all' => [ + 'title' => 'No Activities Found', + 'description' => 'No activities found for this. You can add activities by clicking on the Activity button on the left panel.', + ], + 'planned' => [ + 'title' => 'No Planned Activities Found', + 'description' => 'No planned activities found for this. You can add planned activities by clicking on the Activity button on the left panel.', + ], + 'notes' => [ + 'title' => 'No Notes Found', + 'description' => 'No notes found for this. You can add notes by clicking on the Note button on the left panel.', + ], + 'calls' => [ + 'title' => 'No Calls Found', + 'description' => 'No calls found for this. You can add calls by clicking on the Activity button on the left panel and selecting the Call type.', + ], + 'meetings' => [ + 'title' => 'No Meetings Found', + 'description' => 'No meetings found for this. You can add meetings by clicking on the Activity button on the left panel and selecting the Meeting type.', + ], + 'lunches' => [ + 'title' => 'No Lunches Found', + 'description' => 'No lunches found for this. You can add lunches by clicking on the Activity button on the left panel and selecting the Lunch type.', + ], + 'files' => [ + 'title' => 'No Files Found', + 'description' => 'No files found for this. You can add files by clicking on the File button on the left panel.', + ], + 'emails' => [ + 'title' => 'No Emails Found', + 'description' => 'No emails found for this. You can add emails by clicking on the Mail button on the left panel.', + ], + 'system' => [ + 'title' => 'No Changelogs Found', + 'description' => 'No changelogs found for this.', + ], + ], + ], + ], + 'media' => [ + 'images' => [ + 'add-image-btn' => 'Resim Ekle', + 'ai-add-image-btn' => 'Sihirli AI', + 'allowed-types' => 'png, jpeg, jpg', + 'not-allowed-error' => 'Sadece resim dosyalarına (.jpeg, .jpg, .png, vb.) izin verilmektedir.', + 'placeholders' => [ + 'front' => 'Ön', + 'next' => 'Sonraki', + 'size' => 'Boyut', + 'use-cases' => 'Kullanım Alanları', + 'zoom' => 'Yakınlaştır', + ], + ], + 'videos' => [ + 'add-video-btn' => 'Video Ekle', + 'allowed-types' => 'mp4, webm, mkv', + 'not-allowed-error' => 'Sadece video dosyalarına (.mp4, .mov, .ogg vb.) izin verilmektedir.', + ], + ], + 'datagrid' => [ + 'index' => [ + 'no-records-selected' => 'Hiçbir kayıt seçilmedi.', + 'must-select-a-mass-action-option' => 'Bir toplu işlem seçeneği seçmelisiniz.', + 'must-select-a-mass-action' => 'Bir toplu işlem seçmelisiniz.', + ], + 'toolbar' => [ + 'length-of' => ':length kadar', + 'of' => 'üzerinden', + 'per-page' => 'Sayfa Başına', + 'results' => ':total Sonuç', + 'delete' => 'Sil', + 'selected' => ':total Seçilen Öğeler', + 'mass-actions' => [ + 'submit' => 'Gönder', + 'select-option' => 'Seçim Yap', + 'select-action' => 'Eylem Seç', + ], + 'filter' => [ + 'apply-filters-btn' => 'Filtreleri Uygula', + 'back-btn' => 'Geri', + 'create-new-filter' => 'Yeni Filtre Oluştur', + 'custom-filters' => 'Özel Filtreler', + 'delete-error' => 'Filtre silinirken bir hata oluştu, lütfen tekrar deneyin.', + 'delete-success' => 'Filtre başarıyla silindi.', + 'empty-description' => 'Kaydedilecek seçili filtre bulunmamaktadır. Lütfen kaydetmek için filtreler seçin.', + 'empty-title' => 'Kaydetmek İçin Filtreler Ekleyin', + 'name' => 'Ad', + 'quick-filters' => 'Hızlı Filtreler', + 'save-btn' => 'Kaydet', + 'save-filter' => 'Filtreyi Kaydet', + 'saved-success' => 'Filtre başarıyla kaydedildi.', + 'selected-filters' => 'Seçilen Filtreler', + 'title' => 'Filtre', + 'update' => 'Güncelle', + 'update-filter' => 'Filtreyi Güncelle', + 'updated-success' => 'Filtre başarıyla güncellendi.', + ], + 'search' => [ + 'title' => 'Ara', + ], + ], + 'filters' => [ + 'select' => 'Seç', + 'title' => 'Filtreler', + 'dropdown' => [ + 'searchable' => [ + 'at-least-two-chars' => 'En az 2 karakter yazın...', + 'no-results' => 'Sonuç bulunamadı...', + ], + ], + 'custom-filters' => [ + 'clear-all' => 'Hepsini Temizle', + 'title' => 'Özel Filtreler', + ], + 'boolean-options' => [ + 'false' => 'Yanlış', + 'true' => 'Doğru', + ], + 'date-options' => [ + 'last-month' => 'Geçen Ay', + 'last-six-months' => 'Son 6 Ay', + 'last-three-months' => 'Son 3 Ay', + 'this-month' => 'Bu Ay', + 'this-week' => 'Bu Hafta', + 'this-year' => 'Bu Yıl', + 'today' => 'Bugün', + 'yesterday' => 'Dün', + ], + ], + 'table' => [ + 'actions' => 'Eylemler', + 'no-records-available' => 'Kayıt Bulunmuyor.', + ], + ], + 'modal' => [ + 'confirm' => [ + 'agree-btn' => 'Kabul Et', + 'disagree-btn' => 'Reddet', + 'message' => 'Bu işlemi gerçekleştirmek istediğinizden emin misiniz?', + 'title' => 'Emin Misiniz?', + ], + ], + 'tags' => [ + 'index' => [ + 'title' => 'Etiketler', + 'added-tags' => 'Eklenen Etiketler', + 'save-btn' => 'Etiketi Kaydet', + 'placeholder' => 'Etiketleri aramak için yazın', + 'add-tag' => '\\" :term \\" Ekle...', + 'aquarelle-red' => 'Aquarelle Kırmızı', + 'crushed-cashew' => 'Ezilmiş Antep Fıstığı', + 'beeswax' => 'Abeş Mum', + 'lemon-chiffon' => 'Limon Şifon', + 'snow-flurry' => 'Kar Fırtınası', + 'honeydew' => 'Honeydew', + ], + ], + 'layouts' => [ + 'powered-by' => [ + 'description' => ':webkul tarafından geliştirilen açık kaynaklı bir proje olan :krayin tarafından desteklenmektedir.', + ], + 'header' => [ + 'mega-search' => [ + 'title' => 'Mega Arama', + 'tabs' => [ + 'leads' => 'Müşteriler', + 'quotes' => 'Teklifler', + 'persons' => 'Kişiler', + 'products' => 'Ürünler', + ], + 'explore-all-products' => 'Tüm Ürünleri Keşfet', + 'explore-all-leads' => 'Tüm Müşterileri Keşfet', + 'explore-all-contacts' => 'Tüm İletişimleri Keşfet', + 'explore-all-quotes' => 'Tüm Teklifleri Keşfet', + 'explore-all-matching-products' => '":query" (:count) ile eşleşen tüm ürünleri keşfet', + 'explore-all-matching-leads' => '":query" (:count) ile eşleşen tüm müşterileri keşfet', + 'explore-all-matching-contacts' => '":query" (:count) ile eşleşen tüm iletişimleri keşfet', + 'explore-all-matching-quotes' => '":query" (:count) ile eşleşen tüm teklifleri keşfet', + ], + ], + ], + 'attributes' => [ + 'edit' => [ + 'delete' => 'Sil', + ], + 'lookup' => [ + 'click-to-add' => 'Eklemek için tıklayın', + 'search' => 'Arama...', + 'no-result-found' => 'Sonuç bulunamadı', + ], + ], + 'lookup' => [ + 'click-to-add' => 'Eklemek için Tıklayın', + 'no-results' => 'Sonuç Bulunamadı', + 'add-as-new' => 'Yeni Olarak Ekle', + 'search' => 'Arama...', + ], + 'flash-group' => [ + 'success' => 'Başarı', + 'error' => 'Hata', + 'warning' => 'Uyarı', + 'info' => 'Bilgi', + ], + 'tiny-mce' => [ + 'http-error' => 'HTTP Hatası', + 'invalid-json' => 'Sunucudan geçersiz JSON yanıtı.', + 'upload-failed' => 'Dosya yüklemesi başarısız oldu. Lütfen tekrar deneyin.', + ], + ], + 'quotes' => [ + 'index' => [ + 'title' => 'Teklifler', + 'create-btn' => 'Teklif Oluştur', + 'create-success' => 'Teklif başarıyla oluşturuldu.', + 'update-success' => 'Teklif başarıyla güncellendi.', + 'delete-success' => 'Teklif başarıyla silindi.', + 'delete-failed' => 'Teklif silinemedi.', + 'datagrid' => [ + 'subject' => 'Konu', + 'sales-person' => 'Satış Temsilcisi', + 'expired-at' => 'Son Kullanma Tarihi', + 'created-at' => 'Oluşturulma Tarihi', + 'person' => 'Kişi', + 'subtotal' => 'Ara Toplam', + 'discount' => 'İndirim', + 'tax' => 'Vergi', + 'adjustment' => 'Düzenleme', + 'grand-total' => 'Genel Toplam', + 'edit' => 'Düzenle', + 'delete' => 'Sil', + 'print' => 'Yazdır', + ], + 'pdf' => [ + 'adjustment' => 'Düzenleme', + 'amount' => 'Tutar', + 'billing-address' => 'Fatura Adresi', + 'date' => 'Tarih', + 'discount' => 'İndirim', + 'expired-at' => 'Son Kullanma Tarihi', + 'grand-total' => 'Genel Toplam', + 'person' => 'Kişi', + 'price' => 'Fiyat', + 'product-name' => 'Ürün Adı', + 'quantity' => 'Miktar', + 'quote-id' => 'Teklif ID', + 'sales-person' => 'Satış Temsilcisi', + 'shipping-address' => 'Teslimat Adresi', + 'sku' => 'SKU', + 'sub-total' => 'Ara Toplam', + 'subject' => 'Konu', + 'tax' => 'Vergi', + 'title' => 'Teklif', + ], + ], + 'create' => [ + 'title' => 'Teklif Oluştur', + 'save-btn' => 'Teklifi Kaydet', + 'quote-info' => 'Teklif Bilgileri', + 'quote-info-info' => 'Teklifin temel bilgilerini girin.', + 'address-info' => 'Adres Bilgileri', + 'address-info-info' => 'Teklif ile ilgili adres bilgileri.', + 'quote-items' => 'Teklif Kalemleri', + 'search-products' => 'Ürünleri Ara', + 'link-to-lead' => 'Potansiyele Bağla', + 'quote-item-info' => 'Bu teklif için ürün talebi ekleyin.', + 'quote-name' => 'Teklif Adı', + 'quantity' => 'Miktar', + 'price' => 'Fiyat', + 'discount' => 'İndirim', + 'tax' => 'Vergi', + 'total' => 'Toplam', + 'amount' => 'Tutar', + 'add-item' => '+ Kalem Ekle', + 'sub-total' => 'Ara Toplam (:symbol)', + 'total-discount' => 'İndirim (:symbol)', + 'total-tax' => 'Vergi (:symbol)', + 'total-adjustment' => 'Düzenleme (:symbol)', + 'grand-total' => 'Genel Toplam (:symbol)', + 'discount-amount' => 'İndirim Tutarı', + 'tax-amount' => 'Vergi Tutarı', + 'adjustment-amount' => 'Düzenleme Tutarı', + 'product-name' => 'Ürün Adı', + 'action' => 'Eylem', + ], + 'edit' => [ + 'title' => 'Teklifi Düzenle', + 'save-btn' => 'Teklifi Kaydet', + 'quote-info' => 'Teklif Bilgileri', + 'quote-info-info' => 'Teklifin temel bilgilerini girin.', + 'address-info' => 'Adres Bilgileri', + 'address-info-info' => 'Teklif ile ilgili adres bilgileri.', + 'quote-items' => 'Teklif Kalemleri', + 'link-to-lead' => 'Potansiyele Bağla', + 'quote-item-info' => 'Bu teklif için ürün talebi ekleyin.', + 'quote-name' => 'Teklif Adı', + 'quantity' => 'Miktar', + 'price' => 'Fiyat', + 'search-products' => 'Ürünleri Ara', + 'discount' => 'İndirim', + 'tax' => 'Vergi', + 'total' => 'Toplam', + 'amount' => 'Tutar', + 'add-item' => '+ Kalem Ekle', + 'sub-total' => 'Ara Toplam (:symbol)', + 'total-discount' => 'İndirim (:symbol)', + 'total-tax' => 'Vergi (:symbol)', + 'total-adjustment' => 'Düzenleme (:symbol)', + 'grand-total' => 'Genel Toplam (:symbol)', + 'discount-amount' => 'İndirim Tutarı', + 'tax-amount' => 'Vergi Tutarı', + 'adjustment-amount' => 'Düzenleme Tutarı', + 'product-name' => 'Ürün Adı', + 'action' => 'Eylem', + ], + ], + 'contacts' => [ + 'persons' => [ + 'index' => [ + 'title' => 'Kişiler', + 'create-btn' => 'Kişi Oluştur', + 'create-success' => 'Kişi başarıyla oluşturuldu.', + 'update-success' => 'Kişi başarıyla güncellendi.', + 'all-delete-success' => 'Seçilen tüm kişiler başarıyla silindi.', + 'partial-delete-warning' => 'Bazı kişiler başarıyla silindi. Diğerleri potansiyel müşterilerle bağlantılı olduğu için silinemedi.', + 'none-delete-warning' => 'Seçilen kişilerin hiçbiri potansiyel müşterilerle bağlantılı olduğu için silinemedi.', + 'no-selection' => 'Silinecek kişi seçilmedi.', + 'delete-failed' => 'Seçilen kişiler silinemedi.', + 'datagrid' => [ + 'contact-numbers' => 'İletişim Numaraları', + 'delete' => 'Sil', + 'edit' => 'Düzenle', + 'emails' => 'E-postalar', + 'id' => 'ID', + 'view' => 'Görüntüle', + 'name' => 'Ad', + 'organization-name' => 'Kuruluş Adı', + ], + ], + 'view' => [ + 'title' => ':name', + 'about-person' => 'Kişi Hakkında', + 'about-organization' => 'Kuruluş Hakkında', + 'activities' => [ + 'index' => [ + 'all' => 'Hepsi', + 'calls' => 'Aramalar', + 'meetings' => 'Toplantılar', + 'lunches' => 'Öğle Yemekleri', + 'files' => 'Dosyalar', + 'quotes' => 'Teklifler', + 'notes' => 'Notlar', + 'emails' => 'E-postalar', + 'by-user' => ':user tarafından', + 'scheduled-on' => 'Planlandığı Tarih', + 'location' => 'Konum', + 'participants' => 'Katılımcılar', + 'mark-as-done' => 'Tamamlandı olarak işaretle', + 'delete' => 'Sil', + 'edit' => 'Düzenle', + ], + 'actions' => [ + 'mail' => [ + 'btn' => 'E-posta', + 'title' => 'E-posta Oluştur', + 'to' => 'Kime', + 'cc' => 'CC', + 'bcc' => 'BCC', + 'subject' => 'Konu', + 'send-btn' => 'Gönder', + 'message' => 'Mesaj', + ], + 'file' => [ + 'btn' => 'Dosya', + 'title' => 'Dosya Ekle', + 'title-control' => 'Başlık', + 'name' => 'Dosya Adı', + 'description' => 'Açıklama', + 'file' => 'Dosya', + 'save-btn' => 'Dosyayı Kaydet', + ], + 'note' => [ + 'btn' => 'Not', + 'title' => 'Not Ekle', + 'comment' => 'Yorum', + 'save-btn' => 'Notu Kaydet', + ], + 'activity' => [ + 'btn' => 'Etkinlik', + 'title' => 'Etkinlik Ekle', + 'title-control' => 'Başlık', + 'description' => 'Açıklama', + 'schedule-from' => 'Başlangıç Tarihi', + 'schedule-to' => 'Bitiş Tarihi', + 'location' => 'Konum', + 'call' => 'Çağrı', + 'meeting' => 'Toplantı', + 'lunch' => 'Öğle Yemeği', + 'save-btn' => 'Etkinliği Kaydet', + ], + ], + ], + 'tags' => [ + 'create-success' => 'Etiket başarıyla oluşturuldu.', + 'destroy-success' => 'Etiket başarıyla silindi.', + ], + ], + 'create' => [ + 'title' => 'Kişi Oluştur', + 'save-btn' => 'Kişiyi Kaydet', + ], + 'edit' => [ + 'title' => 'Kişiyi Düzenle', + 'save-btn' => 'Kişiyi Kaydet', + ], + ], + 'organizations' => [ + 'index' => [ + 'title' => 'Kuruluşlar', + 'create-btn' => 'Kuruluş Oluştur', + 'create-success' => 'Kuruluş başarıyla oluşturuldu.', + 'update-success' => 'Kuruluş başarıyla güncellendi.', + 'delete-success' => 'Kuruluş başarıyla silindi.', + 'delete-failed' => 'Kuruluş silinemedi.', + 'datagrid' => [ + 'delete' => 'Sil', + 'edit' => 'Düzenle', + 'id' => 'ID', + 'name' => 'Ad', + 'persons-count' => 'Kişi Sayısı', + ], + ], + 'create' => [ + 'title' => 'Kuruluş Oluştur', + 'save-btn' => 'Kuruluşu Kaydet', + ], + 'edit' => [ + 'title' => 'Kuruluşu Düzenle', + 'save-btn' => 'Kuruluşu Kaydet', + ], + ], + ], + 'products' => [ + 'index' => [ + 'title' => 'Ürünler', + 'create-btn' => 'Ürün Oluştur', + 'create-success' => 'Ürün başarıyla oluşturuldu.', + 'update-success' => 'Ürün başarıyla güncellendi.', + 'delete-success' => 'Ürün başarıyla silindi.', + 'delete-failed' => 'Ürün silinemedi.', + 'datagrid' => [ + 'allocated' => 'Tahsis Edilen', + 'delete' => 'Sil', + 'edit' => 'Düzenle', + 'id' => 'ID', + 'in-stock' => 'Stokta', + 'name' => 'Ad', + 'on-hand' => 'Elinde', + 'tag-name' => 'Etiket Adı', + 'price' => 'Fiyat', + 'sku' => 'SKU', + 'view' => 'Görüntüle', + ], + ], + 'create' => [ + 'save-btn' => 'Ürünleri Kaydet', + 'title' => 'Ürün Oluştur', + 'general' => 'Genel', + 'price' => 'Fiyat', + ], + 'edit' => [ + 'title' => 'Ürünleri Düzenle', + 'save-btn' => 'Ürünleri Kaydet', + 'general' => 'Genel', + 'price' => 'Fiyat', + ], + 'view' => [ + 'sku' => 'SKU', + 'all' => 'Hepsi', + 'notes' => 'Notlar', + 'files' => 'Dosyalar', + 'inventories' => 'Envanter', + 'change-logs' => 'Değişiklik Günlükleri', + 'attributes' => [ + 'about-product' => 'Ürün Hakkında', + ], + 'inventory' => [ + 'source' => 'Kaynak', + 'in-stock' => 'Stokta', + 'allocated' => 'Tahsis Edilen', + 'on-hand' => 'Elinde', + 'actions' => 'İşlemler', + 'assign' => 'Ata', + 'add-source' => 'Kaynak Ekle', + 'location' => 'Konum', + 'add-more' => 'Daha Fazla Ekle', + 'save' => 'Kaydet', + ], + ], + ], + 'settings' => [ + 'title' => 'Ayarlar', + 'groups' => [ + 'index' => [ + 'create-btn' => 'Grup Oluştur', + 'title' => 'Gruplar', + 'create-success' => 'Grup başarıyla oluşturuldu.', + 'update-success' => 'Grup başarıyla güncellendi.', + 'destroy-success' => 'Grup başarıyla silindi.', + 'delete-failed' => 'Grup silinemedi.', + 'delete-failed-associated-users' => 'Grup silinemiyor, çünkü kullanıcılar tarafından kullanılıyor.', + 'datagrid' => [ + 'delete' => 'Sil', + 'description' => 'Açıklama', + 'edit' => 'Düzenle', + 'id' => 'ID', + 'name' => 'Ad', + ], + 'edit' => [ + 'title' => 'Grubu Düzenle', + ], + 'create' => [ + 'name' => 'Ad', + 'title' => 'Grup Oluştur', + 'description' => 'Açıklama', + 'save-btn' => 'Grubu Kaydet', + ], + ], + ], + 'roles' => [ + 'index' => [ + 'being-used' => 'Rol silinemedi, çünkü bu admin kullanıcısında kullanılıyor.', + 'create-btn' => 'Rol Oluştur', + 'create-success' => 'Rol başarıyla oluşturuldu.', + 'current-role-delete-error' => 'Mevcut kullanıcıya atanmış rol silinemedi.', + 'delete-failed' => 'Rol silinemedi.', + 'delete-success' => 'Rol başarıyla silindi.', + 'last-delete-error' => 'En az bir rol gereklidir.', + 'settings' => 'Ayarlar', + 'title' => 'Roller', + 'update-success' => 'Rol başarıyla güncellendi.', + 'user-define-error' => 'Sistem rolü silinemedi.', + 'datagrid' => [ + 'all' => 'Hepsi', + 'custom' => 'Özel', + 'delete' => 'Sil', + 'description' => 'Açıklama', + 'edit' => 'Düzenle', + 'id' => 'ID', + 'name' => 'Ad', + 'permission-type' => 'İzin Türü', + ], + ], + 'create' => [ + 'access-control' => 'Erişim Kontrolü', + 'all' => 'Hepsi', + 'back-btn' => 'Geri', + 'custom' => 'Özel', + 'description' => 'Açıklama', + 'general' => 'Genel', + 'name' => 'Ad', + 'permissions' => 'İzinler', + 'save-btn' => 'Rolü Kaydet', + 'title' => 'Rol Oluştur', + ], + 'edit' => [ + 'access-control' => 'Erişim Kontrolü', + 'all' => 'Hepsi', + 'back-btn' => 'Geri', + 'custom' => 'Özel', + 'description' => 'Açıklama', + 'general' => 'Genel', + 'name' => 'Ad', + 'permissions' => 'İzinler', + 'save-btn' => 'Rolü Kaydet', + 'title' => 'Rol Düzenle', + ], + ], + 'types' => [ + 'index' => [ + 'create-btn' => 'Tür Oluştur', + 'create-success' => 'Tür başarıyla oluşturuldu.', + 'delete-failed' => 'Tür silinemedi.', + 'delete-success' => 'Tür başarıyla silindi.', + 'title' => 'Türler', + 'update-success' => 'Tür başarıyla güncellendi.', + 'datagrid' => [ + 'delete' => 'Sil', + 'description' => 'Açıklama', + 'edit' => 'Düzenle', + 'id' => 'ID', + 'name' => 'Ad', + ], + 'create' => [ + 'name' => 'Ad', + 'save-btn' => 'Türü Kaydet', + 'title' => 'Tür Oluştur', + ], + 'edit' => [ + 'title' => 'Tür Düzenle', + ], + ], + ], + 'sources' => [ + 'index' => [ + 'title' => 'Kaynaklar', + 'create-btn' => 'Kaynak Oluştur', + 'create-success' => 'Kaynak başarıyla oluşturuldu.', + 'delete-failed' => 'Kaynak silinemedi.', + 'delete-success' => 'Kaynak başarıyla silindi.', + 'update-success' => 'Kaynak başarıyla güncellendi.', + 'delete-failed-associated-leads' => 'Kaynak silinemiyor çünkü mevcut adaylarla ilişkili. Lütfen bu adayları silmeden önce bağlantılarını kaldırın veya güncelleyin.', + 'datagrid' => [ + 'delete' => 'Sil', + 'edit' => 'Düzenle', + 'id' => 'ID', + 'name' => 'Ad', + ], + 'create' => [ + 'name' => 'Ad', + 'save-btn' => 'Kaynağı Kaydet', + 'title' => 'Kaynak Oluştur', + ], + 'edit' => [ + 'title' => 'Kaynağı Düzenle', + ], + ], + ], + 'workflows' => [ + 'index' => [ + 'title' => 'İş Akışları', + 'create-btn' => 'İş Akışı Oluştur', + 'create-success' => 'İş akışı başarıyla oluşturuldu.', + 'update-success' => 'İş akışı başarıyla güncellendi.', + 'delete-success' => 'İş akışı başarıyla silindi.', + 'delete-failed' => 'İş akışı silinemedi.', + 'datagrid' => [ + 'delete' => 'Sil', + 'description' => 'Açıklama', + 'edit' => 'Düzenle', + 'id' => 'ID', + 'name' => 'Ad', + ], + ], + 'helpers' => [ + 'update-related-leads' => 'İlgili fırsatları güncelle', + 'send-email-to-sales-owner' => 'Satış sahibiyle e-posta gönder', + 'send-email-to-participants' => 'Katılımcılara e-posta gönder', + 'add-webhook' => 'Webhook Ekle', + 'update-lead' => 'Fırsatı Güncelle', + 'update-person' => 'Kişiyi Güncelle', + 'send-email-to-person' => 'Kişiye e-posta gönder', + 'add-tag' => 'Etiket Ekle', + 'add-note-as-activity' => 'Notu Aktivite Olarak Ekle', + 'update-quote' => 'Teklifi Güncelle', + ], + 'create' => [ + 'title' => 'İş Akışı Oluştur', + 'event' => 'Olay', + 'back-btn' => 'Geri', + 'save-btn' => 'İş Akışını Kaydet', + 'name' => 'Ad', + 'basic-details' => 'Temel Bilgiler', + 'description' => 'Açıklama', + 'actions' => 'Eylemler', + 'basic-details-info' => 'İş akışının temel bilgilerini girin.', + 'event-info' => 'Bir olay tetikler, kontrolleri yapar, koşulları değerlendirir ve önceden tanımlanmış eylemleri gerçekleştirir.', + 'conditions' => 'Koşullar', + 'conditions-info' => 'Koşullar, belirli durumlarda tetiklenen kurallardır.', + 'actions-info' => 'Bir eylem sadece iş yükünü azaltmakla kalmaz, aynı zamanda CRM otomasyonu için oldukça kolaylaştırır.', + 'value' => 'Değer', + 'condition-type' => 'Koşul Türü', + 'all-condition-are-true' => 'Tüm koşullar doğru', + 'any-condition-are-true' => 'Herhangi bir koşul doğru', + 'add-condition' => 'Koşul Ekle', + 'add-action' => 'Eylem Ekle', + 'yes' => 'Evet', + 'no' => 'Hayır', + 'email' => 'E-posta', + 'is-equal-to' => 'Eşittir', + 'is-not-equal-to' => 'Eşit değildir', + 'equals-or-greater-than' => 'Eşittir veya büyük', + 'equals-or-less-than' => 'Eşittir veya küçük', + 'greater-than' => 'Büyük', + 'less-than' => 'Küçük', + 'type' => 'Tür', + 'contain' => 'İçerir', + 'contains' => 'İçerir', + 'does-not-contain' => 'İçermez', + ], + 'edit' => [ + 'title' => 'İş Akışını Düzenle', + 'event' => 'Olay', + 'back-btn' => 'Geri', + 'save-btn' => 'İş Akışını Kaydet', + 'name' => 'Ad', + 'basic-details' => 'Temel Bilgiler', + 'description' => 'Açıklama', + 'actions' => 'Eylemler', + 'type' => 'Tür', + 'basic-details-info' => 'İş akışının temel bilgilerini girin.', + 'event-info' => 'Bir olay tetikler, kontrolleri yapar, koşulları değerlendirir ve önceden tanımlanmış eylemleri gerçekleştirir.', + 'conditions' => 'Koşullar', + 'conditions-info' => 'Koşullar, belirli durumlarda tetiklenen kurallardır.', + 'actions-info' => 'Bir eylem sadece iş yükünü azaltmakla kalmaz, aynı zamanda CRM otomasyonu için oldukça kolaylaştırır.', + 'value' => 'Değer', + 'condition-type' => 'Koşul Türü', + 'all-condition-are-true' => 'Tüm koşullar doğru', + 'any-condition-are-true' => 'Herhangi bir koşul doğru', + 'add-condition' => 'Koşul Ekle', + 'add-action' => 'Eylem Ekle', + 'yes' => 'Evet', + 'no' => 'Hayır', + 'email' => 'E-posta', + 'is-equal-to' => 'Eşittir', + 'is-not-equal-to' => 'Eşit değildir', + 'equals-or-greater-than' => 'Eşittir veya büyük', + 'equals-or-less-than' => 'Eşittir veya küçük', + 'greater-than' => 'Büyük', + 'less-than' => 'Küçük', + 'contain' => 'İçerir', + 'contains' => 'İçerir', + 'does-not-contain' => 'İçermez', + ], + ], + 'webforms' => [ + 'index' => [ + 'title' => 'Web Formları', + 'create-btn' => 'Web Formu Oluştur', + 'create-success' => 'Web formu başarıyla oluşturuldu.', + 'update-success' => 'Web formu başarıyla güncellendi.', + 'delete-success' => 'Web formu başarıyla silindi.', + 'delete-failed' => 'Web formu silinemedi.', + 'datagrid' => [ + 'id' => 'ID', + 'title' => 'Başlık', + 'edit' => 'Düzenle', + 'delete' => 'Sil', + ], + ], + 'create' => [ + 'title' => 'Web Formu Oluştur', + 'add-attribute-btn' => 'Öznitelik Düğmesi Ekle', + 'attribute-label-color' => 'Öznitelik Etiketi Rengi', + 'attributes' => 'Öznitelikler', + 'attributes-info' => 'Forma özel öznitelikler ekleyin.', + 'background-color' => 'Arka Plan Rengi', + 'create-lead' => 'Fırsat Oluştur', + 'customize-webform' => 'Web Formunu Özelleştir', + 'customize-webform-info' => 'Web formunuzu seçtiğiniz eleman renkleri ile özelleştirin.', + 'description' => 'Açıklama', + 'display-custom-message' => 'Özel mesaj göster', + 'form-background-color' => 'Form Arka Plan Rengi', + 'form-submit-btn-color' => 'Form Gönderim Düğmesi Rengi', + 'form-submit-button-color' => 'Form Gönderim Düğmesi Rengi', + 'form-title-color' => 'Form Başlık Rengi', + 'general' => 'Genel', + 'leads' => 'Fırsatlar', + 'person' => 'Kişi', + 'save-btn' => 'Web Formunu Kaydet', + 'submit-button-label' => 'Gönderim Düğmesi Etiketi', + 'submit-success-action' => 'Gönderim Başarı Eylemi', + 'redirect-to-url' => 'URL\'ye Yönlendir', + 'choose-value' => 'Değer Seç', + 'select-file' => 'Dosya Seç', + 'select-image' => 'Görüntü Seç', + 'enter-value' => 'Değer Gir', + ], + 'edit' => [ + 'add-attribute-btn' => 'Öznitelik Düğmesi Ekle', + 'attribute-label-color' => 'Öznitelik Etiketi Rengi', + 'attributes' => 'Öznitelikler', + 'attributes-info' => 'Forma özel öznitelikler ekleyin.', + 'background-color' => 'Arka Plan Rengi', + 'choose-value' => 'Değer Seç', + 'code-snippet' => 'Kod Parçası', + 'copied' => 'Kopyalandı', + 'copy' => 'Kopyala', + 'create-lead' => 'Fırsat Oluştur', + 'customize-webform' => 'Web Formunu Özelleştir', + 'customize-webform-info' => 'Web formunuzu seçtiğiniz eleman renkleri ile özelleştirin.', + 'description' => 'Açıklama', + 'display-custom-message' => 'Özel mesaj göster', + 'embed' => 'Göm', + 'enter-value' => 'Değer Gir', + 'form-background-color' => 'Form Arka Plan Rengi', + 'form-submit-btn-color' => 'Form Gönderim Düğmesi Rengi', + 'form-submit-button-color' => 'Form Gönderim Düğmesi Rengi', + 'form-title-color' => 'Form Başlık Rengi', + 'general' => 'Genel', + 'leads' => 'Fırsatlar', + 'person' => 'Kişi', + 'preview' => 'Önizleme', + 'public-url' => 'Genel URL', + 'redirect-to-url' => 'URL\'ye Yönlendir', + 'save-btn' => 'Web Formunu Kaydet', + 'select-file' => 'Dosya Seç', + 'select-image' => 'Görüntü Seç', + 'submit-button-label' => 'Gönderim Düğmesi Etiketi', + 'submit-success-action' => 'Gönderim Başarı Eylemi', + 'title' => 'Web Formunu Düzenle', + ], + ], + 'email-template' => [ + 'index' => [ + 'create-btn' => 'E-posta Şablonu Oluştur', + 'title' => 'E-posta Şablonları', + 'create-success' => 'E-posta şablonu başarıyla oluşturuldu.', + 'update-success' => 'E-posta şablonu başarıyla güncellendi.', + 'delete-success' => 'E-posta şablonu başarıyla silindi.', + 'delete-failed' => 'E-posta şablonu silinemedi.', + 'datagrid' => [ + 'delete' => 'Sil', + 'edit' => 'Düzenle', + 'id' => 'ID', + 'name' => 'Ad', + 'subject' => 'Konu', + ], + ], + 'create' => [ + 'title' => 'E-posta Şablonu Oluştur', + 'save-btn' => 'E-posta Şablonunu Kaydet', + 'email-template' => 'E-posta Şablonu', + 'subject' => 'Konu', + 'content' => 'İçerik', + 'subject-placeholders' => 'Konu Yer Tutucuları', + 'general' => 'Genel', + 'name' => 'Ad', + ], + 'edit' => [ + 'title' => 'E-posta Şablonunu Düzenle', + 'save-btn' => 'E-posta Şablonunu Kaydet', + 'email-template' => 'E-posta Şablonu', + 'subject' => 'Konu', + 'content' => 'İçerik', + 'subject-placeholders' => 'Konu Yer Tutucuları', + 'general' => 'Genel', + 'name' => 'Ad', + ], + ], + 'marketing' => [ + 'events' => [ + 'index' => [ + 'create-btn' => 'Etkinlik Oluştur', + 'title' => 'Etkinlikler', + 'create-success' => 'Etkinlik başarıyla oluşturuldu.', + 'update-success' => 'Etkinlik başarıyla güncellendi.', + 'delete-success' => 'Etkinlik başarıyla silindi.', + 'delete-failed' => 'Etkinlik silinemedi.', + 'mass-delete-success' => 'Etkinlikler başarıyla silindi', + 'datagrid' => [ + 'delete' => 'Sil', + 'edit' => 'Düzenle', + 'id' => 'ID', + 'name' => 'Ad', + 'description' => 'Açıklama', + 'date' => 'Tarih', + ], + 'create' => [ + 'title' => 'Etkinlik Oluştur', + 'name' => 'Ad', + 'date' => 'Tarih', + 'description' => 'Açıklama', + 'save-btn' => 'Etkinliği Kaydet', + ], + 'edit' => [ + 'title' => 'Etkinliği Düzenle', + ], + ], + ], + 'campaigns' => [ + 'index' => [ + 'create-btn' => 'Kampanya Oluştur', + 'title' => 'Kampanyalar', + 'create-success' => 'Kampanya başarıyla oluşturuldu.', + 'update-success' => 'Kampanya başarıyla güncellendi.', + 'delete-success' => 'Kampanya başarıyla silindi.', + 'delete-failed' => 'Kampanya silinemedi.', + 'mass-delete-success' => 'Kampanyalar başarıyla silindi', + 'datagrid' => [ + 'id' => 'ID', + 'name' => 'Ad', + 'subject' => 'Konu', + 'status' => 'Durum', + 'active' => 'Aktif', + 'inactive' => 'Pasif', + 'edit' => 'Düzenle', + 'delete' => 'Sil', + ], + 'create' => [ + 'title' => 'Kampanya Oluştur', + 'name' => 'Ad', + 'type' => 'Tür', + 'subject' => 'Konu', + 'event' => 'Etkinlik', + 'email-template' => 'E-posta Şablonu', + 'status' => 'Durum', + ], + 'edit' => [ + 'title' => 'Kampanyayı Düzenle', + ], + ], + ], + ], + 'tags' => [ + 'index' => [ + 'create-btn' => 'Etiket Oluştur', + 'title' => 'Etiketler', + 'create-success' => 'Etiket başarıyla oluşturuldu.', + 'update-success' => 'Etiket başarıyla güncellendi.', + 'delete-success' => 'Etiket başarıyla silindi.', + 'delete-failed' => 'Etiket silinemedi.', + 'datagrid' => [ + 'delete' => 'Sil', + 'edit' => 'Düzenle', + 'id' => 'ID', + 'name' => 'Ad', + 'users' => 'Kullanıcılar', + 'created-at' => 'Oluşturulma Tarihi', + ], + 'create' => [ + 'name' => 'Ad', + 'save-btn' => 'Etiketi Kaydet', + 'title' => 'Etiket Oluştur', + 'color' => 'Renk', + ], + 'edit' => [ + 'title' => 'Etiketi Düzenle', + ], + ], + ], + 'users' => [ + 'index' => [ + 'create-btn' => 'Kullanıcı Oluştur', + 'create-success' => 'Kullanıcı başarıyla oluşturuldu.', + 'delete-failed' => 'Kullanıcı silinemedi.', + 'delete-success' => 'Kullanıcı başarıyla silindi.', + 'last-delete-error' => 'En az bir kullanıcı gereklidir.', + 'mass-delete-failed' => 'Kullanıcılar silinemedi.', + 'mass-delete-success' => 'Kullanıcılar başarıyla silindi.', + 'mass-update-failed' => 'Kullanıcılar güncellenemedi.', + 'mass-update-success' => 'Kullanıcılar başarıyla güncellendi.', + 'title' => 'Kullanıcılar', + 'update-success' => 'Kullanıcı başarıyla güncellendi.', + 'user-define-error' => 'Sistem kullanıcısı silinemedi.', + 'active' => 'Aktif', + 'inactive' => 'Pasif', + 'datagrid' => [ + 'active' => 'Aktif', + 'created-at' => 'Oluşturulma Tarihi', + 'delete' => 'Sil', + 'edit' => 'Düzenle', + 'email' => 'E-posta', + 'id' => 'ID', + 'inactive' => 'Pasif', + 'name' => 'Ad', + 'status' => 'Durum', + 'update-status' => 'Durumu Güncelle', + 'users' => 'Kullanıcılar', + ], + 'create' => [ + 'confirm-password' => 'Şifreyi Onayla', + 'email' => 'E-posta', + 'general' => 'Genel', + 'global' => 'Küresel', + 'group' => 'Grup', + 'individual' => 'Bireysel', + 'name' => 'Ad', + 'password' => 'Şifre', + 'permission' => 'İzin', + 'role' => 'Rol', + 'save-btn' => 'Kullanıcıyı Kaydet', + 'status' => 'Durum', + 'title' => 'Kullanıcı Oluştur', + 'view-permission' => 'Görüntüleme İzni', + 'select-at-lest-one-group' => 'Select at least one group', + ], + 'edit' => [ + 'title' => 'Kullanıcıyı Düzenle', + ], + ], + ], + 'pipelines' => [ + 'index' => [ + 'title' => 'Pipelines', + 'create-btn' => 'Pipeline Oluştur', + 'create-success' => 'Pipeline başarıyla oluşturuldu.', + 'update-success' => 'Pipeline başarıyla güncellendi.', + 'default-required' => 'En az bir varsayılan boru hattı gereklidir.', + 'delete-success' => 'Pipeline başarıyla silindi.', + 'delete-failed' => 'Pipeline silinemedi.', + 'default-delete-error' => 'Varsayılan pipeline silinemez.', + 'datagrid' => [ + 'delete' => 'Sil', + 'edit' => 'Düzenle', + 'id' => 'ID', + 'is-default' => 'Varsayılan mı', + 'name' => 'Ad', + 'no' => 'Hayır', + 'rotten-days' => 'Çürük Günler', + 'yes' => 'Evet', + ], + ], + 'create' => [ + 'title' => 'Pipeline Oluştur', + 'save-btn' => 'Pipeline Kaydet', + 'name' => 'Ad', + 'rotten-days' => 'Çürük Günler', + 'mark-as-default' => 'Varsayılan Olarak İşaretle', + 'general' => 'Genel', + 'probability' => 'Olasılık (%)', + 'new-stage' => 'Yeni', + 'won-stage' => 'Kazandı', + 'lost-stage' => 'Kaybetti', + 'stage-btn' => 'Aşama Ekle', + 'stages' => 'Aşamalar', + 'duplicate-name' => '"Ad" alanı tekrar edemez', + 'delete-stage' => 'Aşama Sil', + 'add-new-stages' => 'Yeni Aşamalar Ekle', + 'add-stage-info' => 'Pipeline için yeni aşama ekleyin', + 'newly-added' => 'Yeni Eklenen', + 'stage-delete-success' => 'Aşama Başarıyla Silindi', + ], + 'edit' => [ + 'title' => 'Pipeline\'ı Düzenle', + 'save-btn' => 'Pipeline Kaydet', + 'name' => 'Ad', + 'rotten-days' => 'Çürük Günler', + 'mark-as-default' => 'Varsayılan Olarak İşaretle', + 'general' => 'Genel', + 'probability' => 'Olasılık (%)', + 'new-stage' => 'Yeni', + 'won-stage' => 'Kazandı', + 'lost-stage' => 'Kaybetti', + 'stage-btn' => 'Aşama Ekle', + 'stages' => 'Aşamalar', + 'duplicate-name' => '"Ad" alanı tekrar edemez', + 'delete-stage' => 'Aşama Sil', + 'add-new-stages' => 'Yeni Aşamalar Ekle', + 'add-stage-info' => 'Pipeline için yeni aşama ekleyin', + 'stage-delete-success' => 'Aşama Başarıyla Silindi', + ], + ], + 'webhooks' => [ + 'index' => [ + 'title' => 'Webhooks', + 'create-btn' => 'Webhook Oluştur', + 'create-success' => 'Webhook başarıyla oluşturuldu.', + 'update-success' => 'Webhook başarıyla güncellendi.', + 'delete-success' => 'Webhook başarıyla silindi.', + 'delete-failed' => 'Webhook silinemedi.', + 'datagrid' => [ + 'id' => 'ID', + 'delete' => 'Sil', + 'edit' => 'Düzenle', + 'name' => 'Ad', + 'entity-type' => 'Varlık Türü', + 'end-point' => 'Son Nokta', + ], + ], + 'create' => [ + 'title' => 'Webhook Oluştur', + 'save-btn' => 'Webhook Kaydet', + 'info' => 'Webhook detaylarını girin', + 'url-and-parameters' => 'URL ve Parametreler', + 'method' => 'Yöntem', + 'post' => 'Post', + 'put' => 'Put', + 'url-endpoint' => 'URL Son Noktası', + 'parameters' => 'Parametreler', + 'add-new-parameter' => 'Yeni Parametre Ekle', + 'url-preview' => 'URL Önizleme:', + 'headers' => 'Başlıklar', + 'add-new-header' => 'Yeni Başlık Ekle', + 'body' => 'Gövde', + 'default' => 'Varsayılan', + 'x-www-form-urlencoded' => 'x-www-form-urlencoded', + 'key-and-value' => 'Anahtar ve Değer', + 'add-new-payload' => 'Yeni yük ekle', + 'raw' => 'Ham', + 'general' => 'Genel', + 'name' => 'Ad', + 'entity-type' => 'Varlık Türü', + 'insert-placeholder' => 'Yer Tutucu Ekle', + 'description' => 'Açıklama', + 'json' => 'Json', + 'text' => 'Metin', + ], + 'edit' => [ + 'title' => 'Webhook\'u Düzenle', + 'edit-btn' => 'Webhook Kaydet', + 'save-btn' => 'Webhook Kaydet', + 'info' => 'Webhook detaylarını girin', + 'url-and-parameters' => 'URL ve Parametreler', + 'method' => 'Yöntem', + 'post' => 'Post', + 'put' => 'Put', + 'url-endpoint' => 'URL Son Noktası', + 'parameters' => 'Parametreler', + 'add-new-parameter' => 'Yeni Parametre Ekle', + 'url-preview' => 'URL Önizleme:', + 'headers' => 'Başlıklar', + 'add-new-header' => 'Yeni Başlık Ekle', + 'body' => 'Gövde', + 'default' => 'Varsayılan', + 'x-www-form-urlencoded' => 'x-www-form-urlencoded', + 'key-and-value' => 'Anahtar ve Değer', + 'add-new-payload' => 'Yeni yük ekle', + 'raw' => 'Ham', + 'general' => 'Genel', + 'name' => 'Ad', + 'entity-type' => 'Varlık Türü', + 'insert-placeholder' => 'Yer Tutucu Ekle', + 'description' => 'Açıklama', + 'json' => 'Json', + 'text' => 'Metin', + ], + ], + 'warehouses' => [ + 'index' => [ + 'title' => 'Depolar', + 'create-btn' => 'Depo Oluştur', + 'create-success' => 'Depo başarıyla oluşturuldu.', + 'name-exists' => 'Depo adı zaten mevcut.', + 'update-success' => 'Depo başarıyla güncellendi.', + 'delete-success' => 'Depo başarıyla silindi.', + 'delete-failed' => 'Depo silinemedi.', + 'datagrid' => [ + 'id' => 'ID', + 'name' => 'Ad', + 'contact-name' => 'İletişim Adı', + 'delete' => 'Sil', + 'edit' => 'Düzenle', + 'view' => 'Görüntüle', + 'created-at' => 'Oluşturulma Tarihi', + 'products' => 'Ürünler', + 'contact-emails' => 'İletişim E-postaları', + 'contact-numbers' => 'İletişim Numaraları', + ], + ], + 'create' => [ + 'title' => 'Depo Oluştur', + 'save-btn' => 'Depoyu Kaydet', + 'contact-info' => 'İletişim Bilgileri', + ], + 'edit' => [ + 'title' => 'Depoyu Düzenle', + 'save-btn' => 'Depoyu Kaydet', + 'contact-info' => 'İletişim Bilgileri', + ], + 'view' => [ + 'all' => 'Tümü', + 'notes' => 'Notlar', + 'files' => 'Dosyalar', + 'location' => 'Konum', + 'change-logs' => 'Değişiklik Kayıtları', + 'locations' => [ + 'action' => 'Eylem', + 'add-location' => 'Konum Ekle', + 'create-success' => 'Konum başarıyla oluşturuldu.', + 'delete' => 'Sil', + 'delete-failed' => 'Konum silinemedi.', + 'delete-success' => 'Konum başarıyla silindi.', + 'name' => 'Ad', + 'save-btn' => 'Kaydet', + ], + 'general-information' => [ + 'title' => 'Genel Bilgiler', + ], + 'contact-information' => [ + 'title' => 'İletişim Bilgileri', + ], + ], + ], + 'attributes' => [ + 'index' => [ + 'title' => 'Öznitelikler', + 'create-btn' => 'Öznitelik Oluştur', + 'create-success' => 'Öznitelik başarıyla oluşturuldu.', + 'update-success' => 'Öznitelik başarıyla güncellendi.', + 'delete-success' => 'Öznitelik başarıyla silindi.', + 'delete-failed' => 'Öznitelik silinemedi.', + 'user-define-error' => 'Sistem özniteliği silinemez.', + 'mass-delete-failed' => 'Sistem öznitelikleri silinemez.', + 'datagrid' => [ + 'yes' => 'Evet', + 'no' => 'Hayır', + 'id' => 'ID', + 'code' => 'Kod', + 'name' => 'Ad', + 'entity-type' => 'Varlık Türü', + 'type' => 'Tür', + 'is-default' => 'Varsayılan mı', + 'edit' => 'Düzenle', + 'delete' => 'Sil', + 'entity-types' => [ + 'leads' => 'Potansiyeller', + 'organizations' => 'Organizasyonlar', + 'persons' => 'Kişiler', + 'products' => 'Ürünler', + 'quotes' => 'Teklifler', + 'warehouses' => 'Depolar', + ], + 'types' => [ + 'text' => 'Metin', + 'textarea' => 'Metin alanı', + 'price' => 'Fiyat', + 'boolean' => 'Mantıksal', + 'select' => 'Seçim', + 'multiselect' => 'Çoklu seçim', + 'checkbox' => 'Onay kutusu', + 'email' => 'E-posta', + 'address' => 'Adres', + 'phone' => 'Telefon', + 'lookup' => 'Arama', + 'datetime' => 'Tarih ve saat', + 'date' => 'Tarih', + 'image' => 'Görsel', + 'file' => 'Dosya', + ], + ], + ], + 'create' => [ + 'title' => 'Öznitelik Oluştur', + 'save-btn' => 'Özniteliği Kaydet', + 'code' => 'Kod', + 'name' => 'Ad', + 'entity-type' => 'Varlık Türü', + 'type' => 'Tür', + 'validations' => 'Doğrulamalar', + 'is-required' => 'Gerekli mi', + 'input-validation' => 'Girdi Doğrulaması', + 'is-unique' => 'Benzersiz mi', + 'labels' => 'Etiketler', + 'general' => 'Genel', + 'numeric' => 'Sayısal', + 'decimal' => 'Ondalık', + 'url' => 'URL', + 'options' => 'Seçenekler', + 'option-type' => 'Seçenek Türü', + 'lookup-type' => 'Arama Türü', + 'add-option' => 'Seçenek Ekle', + 'save-option' => 'Seçeneği Kaydet', + 'option-name' => 'Seçenek Adı', + 'add-attribute-options' => 'Öznitelik Seçenekleri Ekle', + 'text' => 'Metin', + 'textarea' => 'Metin Alanı', + 'price' => 'Fiyat', + 'boolean' => 'Boolean', + 'select' => 'Seç', + 'multiselect' => 'Çoklu Seçim', + 'email' => 'E-posta', + 'address' => 'Adres', + 'phone' => 'Telefon', + 'datetime' => 'Tarih Saat', + 'date' => 'Tarih', + 'image' => 'Resim', + 'file' => 'Dosya', + 'lookup' => 'Arama', + 'entity_type' => 'Varlık türü', + 'checkbox' => 'Onay Kutusu', + 'is_required' => 'Gerekli mi', + 'is_unique' => 'Benzersiz mi', + 'actions' => 'İşlemler', + ], + 'edit' => [ + 'actions' => 'İşlemler', + 'add-attribute-options' => 'Öznitelik Seçenekleri Ekle', + 'add-option' => 'Seçenek Ekle', + 'address' => 'Adres', + 'boolean' => 'Boolean', + 'checkbox' => 'Onay Kutusu', + 'code' => 'Kod', + 'date' => 'Tarih', + 'datetime' => 'Tarih Saat', + 'decimal' => 'Ondalık', + 'email' => 'E-posta', + 'entity-type' => 'Varlık Türü', + 'entity_type' => 'Varlık türü', + 'file' => 'Dosya', + 'general' => 'Genel', + 'image' => 'Resim', + 'input-validation' => 'Girdi Doğrulaması', + 'is-required' => 'Gerekli mi', + 'is-unique' => 'Benzersiz mi', + 'is_required' => 'Gerekli mi', + 'is_unique' => 'Benzersiz mi', + 'labels' => 'Etiketler', + 'lookup' => 'Arama', + 'lookup-type' => 'Arama Türü', + 'multiselect' => 'Çoklu Seçim', + 'name' => 'Ad', + 'numeric' => 'Sayısal', + 'option-deleted' => 'Attribute Option is deleted successfully', + 'option-name' => 'Seçenek Adı', + 'option-type' => 'Seçenek Türü', + 'options' => 'Seçenekler', + 'phone' => 'Telefon', + 'price' => 'Fiyat', + 'save-btn' => 'Özniteliği Kaydet', + 'save-option' => 'Seçeneği Kaydet', + 'select' => 'Seç', + 'text' => 'Metin', + 'textarea' => 'Metin Alanı', + 'title' => 'Özniteliği Düzenle', + 'type' => 'Tür', + 'url' => 'URL', + 'validations' => 'Doğrulamalar', + ], + ], + 'data-transfer' => [ + 'imports' => [ + 'create' => [ + 'action' => 'Eylem', + 'allowed-errors' => 'İzin Verilen Hatalar', + 'back-btn' => 'Geri', + 'create-update' => 'Oluştur/Güncelle', + 'delete' => 'Sil', + 'download-sample' => 'Örneği İndir', + 'field-separator' => 'Alan Ayırıcı', + 'file' => 'Dosya', + 'general' => 'Genel', + 'images-directory' => 'Resim Dizini Yolu', + 'process-in-queue' => 'Kuyrukta İşle', + 'results' => 'Sonuçlar', + 'save-btn' => 'İthalatı Kaydet', + 'settings' => 'Ayarlar', + 'skip-errors' => 'Hataları Atla', + 'stop-on-errors' => 'Hatalarda Durdur', + 'title' => 'İthalat Oluştur', + 'type' => 'Tür', + 'validation-strategy' => 'Doğrulama Stratejisi', + ], + 'edit' => [ + 'action' => 'Eylem', + 'allowed-errors' => 'İzin Verilen Hatalar', + 'back-btn' => 'Geri', + 'create-update' => 'Oluştur/Güncelle', + 'delete' => 'Sil', + 'download-sample' => 'Örneği İndir', + 'field-separator' => 'Alan Ayırıcı', + 'file' => 'Dosya', + 'general' => 'Genel', + 'images-directory' => 'Resim Dizini Yolu', + 'process-in-queue' => 'Kuyrukta İşle', + 'results' => 'Sonuçlar', + 'save-btn' => 'İthalatı Kaydet', + 'settings' => 'Ayarlar', + 'skip-errors' => 'Hataları Atla', + 'stop-on-errors' => 'Hatalarda Durdur', + 'title' => 'İthalatı Düzenle', + 'type' => 'Tür', + 'validation-strategy' => 'Doğrulama Stratejisi', + ], + 'index' => [ + 'button-title' => 'İthalat Oluştur', + 'title' => 'İthalatlar', + 'datagrid' => [ + 'actions' => 'Eylemler', + 'completed-at' => 'Tamamlandığı Zaman', + 'created' => 'Oluşturuldu', + 'delete' => 'Sil', + 'deleted' => 'Silindi', + 'edit' => 'Düzenle', + 'error-file' => 'Hata Dosyası', + 'id' => 'Kimlik', + 'started-at' => 'Başlama Zamanı', + 'state' => 'Durum', + 'summary' => 'Özet', + 'type' => 'Tür', + 'updated' => 'Güncellendi', + 'uploaded-file' => 'Yüklenen Dosya', + ], + ], + 'import' => [ + 'back-btn' => 'Geri', + 'completed-batches' => 'Tamamlanan Toplam Gruplar:', + 'download-error-report' => 'Tam Raporu İndir', + 'edit-btn' => 'Düzenle', + 'imported-info' => 'Tebrikler! İthalatınız başarılı oldu.', + 'importing-info' => 'İthalat İşlemde', + 'indexing-info' => 'Kaynaklar İndeksleniyor (Fiyat, Stok ve Elastic Search) İlerliyor', + 'linking-info' => 'Kaynaklar Bağlanıyor', + 'progress' => 'İlerleme:', + 'title' => 'İthalat', + 'total-batches' => 'Toplam Gruplar:', + 'total-created' => 'Oluşturulan Toplam Kayıtlar:', + 'total-deleted' => 'Silinen Toplam Kayıtlar:', + 'total-errors' => 'Toplam Hatalar:', + 'total-invalid-rows' => 'Geçersiz Satırların Toplamı:', + 'total-rows-processed' => 'İşlenen Toplam Satırlar:', + 'total-updated' => 'Güncellenen Toplam Kayıtlar:', + 'validate' => 'Doğrula', + 'validate-info' => 'İthalatınızı kontrol etmek için Verileri Doğrula\'ya tıklayın.', + 'validating-info' => 'Veriler okunmaya ve doğrulanmaya başlandı', + 'validation-failed-info' => 'İthalatınız geçersiz. Lütfen aşağıdaki hataları düzeltin ve tekrar deneyin.', + 'validation-success-info' => 'İthalatınız geçerli. İthalat işlemini başlatmak için İthalat\'a tıklayın.', + ], + 'create-success' => 'İthalat başarıyla oluşturuldu.', + 'delete-failed' => 'İthalatı silme beklenmedik bir şekilde başarısız oldu.', + 'delete-success' => 'İthalat başarıyla silindi.', + 'not-valid' => 'İthalat geçersiz', + 'nothing-to-import' => 'İthal edilecek kaynak yok.', + 'setup-queue-error' => 'İthalat işlemini başlatmak için kuyruk sürücünüzü "veritabanı" veya "redis" olarak değiştirin.', + 'update-success' => 'İthalat başarıyla güncellendi.', + ], + ], + ], + 'activities' => [ + 'index' => [ + 'title' => 'Etkinlikler', + 'datagrid' => [ + 'comment' => 'Yorum', + 'created_at' => 'Oluşturulma Tarihi', + 'created_by' => 'Oluşturan', + 'edit' => 'Düzenle', + 'id' => 'ID', + 'done' => 'Tamamlandı mı', + 'not-done' => 'Tamamlanmadı', + 'lead' => 'Müşteri', + 'mass-delete' => 'Toplu Sil', + 'mass-update' => 'Toplu Güncelle', + 'schedule-from' => 'Başlangıç Tarihi', + 'schedule-to' => 'Bitiş Tarihi', + 'schedule_from' => 'Başlangıç Tarihi', + 'schedule_to' => 'Bitiş Tarihi', + 'title' => 'Başlık', + 'is_done' => 'Tamamlandı mı', + 'type' => 'Tür', + 'update' => 'Güncelle', + 'call' => 'Arama', + 'meeting' => 'Toplantı', + 'lunch' => 'Öğle Yemeği', + ], + ], + 'edit' => [ + 'title' => 'Etkinliği Düzenle', + 'back-btn' => 'Geri', + 'save-btn' => 'Etkinliği Kaydet', + 'type' => 'Etkinlik Türü', + 'call' => 'Arama', + 'meeting' => 'Toplantı', + 'lunch' => 'Öğle Yemeği', + 'schedule_to' => 'Bitiş Tarihi', + 'schedule_from' => 'Başlangıç Tarihi', + 'location' => 'Konum', + 'comment' => 'Yorum', + 'lead' => 'Müşteri', + 'participants' => 'Katılımcılar', + 'general' => 'Genel', + 'persons' => 'Kişiler', + 'no-result-found' => 'Kayıt bulunamadı.', + 'users' => 'Kullanıcılar', + ], + 'updated' => 'Güncellendi :attribute', + 'created' => 'Oluşturuldu', + 'duration-overlapping' => 'Katılımcıların bu saatte başka bir toplantısı var. Devam etmek istiyor musunuz?', + 'create-success' => 'Etkinlik başarıyla oluşturuldu.', + 'update-success' => 'Etkinlik başarıyla güncellendi.', + 'overlapping-error' => 'Katılımcıların bu saatte başka bir toplantısı var.', + 'destroy-success' => 'Etkinlik başarıyla silindi.', + 'delete-failed' => 'Etkinlik silinemiyor.', + 'mass-update-success' => 'Etkinlikler başarıyla güncellendi.', + 'mass-destroy-success' => 'Etkinlikler başarıyla silindi.', + 'mass-delete-failed' => 'Etkinlikler silinemiyor.', + ], + 'mail' => [ + 'index' => [ + 'compose' => 'Oluştur', + 'draft' => 'Taslak', + 'inbox' => 'Gelen Kutusu', + 'outbox' => 'Giden Kutusu', + 'sent' => 'Gönderildi', + 'trash' => 'Çöp', + 'compose-mail-btn' => 'Mail Oluştur', + 'btn' => 'Mail', + 'mail' => [ + 'title' => 'Mail Oluştur', + 'to' => 'Kime', + 'enter-emails' => 'E-posta eklemek için enter tuşuna basın', + 'cc' => 'CC', + 'bcc' => 'BCC', + 'subject' => 'Konu', + 'send-btn' => 'Gönder', + 'message' => 'Mesaj', + 'draft' => 'Taslak', + ], + 'datagrid' => [ + 'id' => 'ID', + 'from' => 'Gönderen', + 'to' => 'Alıcı', + 'subject' => 'Konu', + 'tags' => 'Etiketler', + 'content' => 'Eklentiler', + 'attachments' => 'Attachments', + 'date' => 'Tarih', + 'move-to-inbox' => 'Gelen Kutusuna Taşı', + 'move-to-trash' => 'Çöp kutusuna taşındı', + 'edit' => 'Düzenle', + 'view' => 'Görüntüle', + 'delete' => 'Sil', + ], + ], + 'create-success' => 'E-posta başarıyla gönderildi.', + 'update-success' => 'E-posta başarıyla güncellendi.', + 'mass-update-success' => 'E-postalar başarıyla güncellendi.', + 'delete-success' => 'E-posta başarıyla silindi.', + 'delete-failed' => 'E-posta silinemedi.', + 'view' => [ + 'title' => 'Mails', + 'subject' => ':subject', + 'link-mail' => 'Maili Bağla', + 'to' => 'Kime', + 'cc' => 'CC', + 'bcc' => 'BCC', + 'reply' => 'Yanıtla', + 'reply-all' => 'Hepsine Yanıtla', + 'forward' => 'Yönlendir', + 'delete' => 'Sil', + 'enter-mails' => 'E-posta ID girin', + 'rotten-days' => ':days gün boyunca geçersiz', + 'search-an-existing-lead' => 'Mevcut bir müşteri arayın', + 'search-an-existing-contact' => 'Mevcut bir kişi arayın', + 'message' => 'Mesaj', + 'add-attachments' => 'Ek Ekle', + 'discard' => 'İptal Et', + 'send' => 'Gönder', + 'no-result-found' => 'Sonuç bulunamadı', + 'add-new-contact' => 'Yeni İletişim Ekle', + 'description' => 'Açıklama', + 'search' => 'Ara...', + 'add-new-lead' => 'Yeni Müşteri Ekle', + 'create-new-contact' => 'Yeni İletişim Oluştur', + 'save-contact' => 'İletişimi Kaydet', + 'create-lead' => 'Müşteri Oluştur', + 'linked-contact' => 'Bağlı Kişi', + 'link-to-contact' => 'Kişiye Bağla', + 'link-to-lead' => 'Müşteriye Bağla', + 'linked-lead' => 'Bağlı Müşteri', + 'lead-details' => 'Müşteri Detayları', + 'contact-person' => 'İletişim Kişisi', + 'product' => 'Ürün', + 'tags' => [ + 'create-success' => 'Etiket başarıyla oluşturuldu.', + 'destroy-success' => 'Etiket başarıyla silindi.', + ], + ], + ], + 'common' => [ + 'custom-attributes' => [ + 'add-more' => 'Daha Fazla Ekle', + 'address' => 'Adres', + 'city' => 'Şehir', + 'contact' => 'İletişim Numaraları', + 'country' => 'Ülke', + 'email' => 'E-posta', + 'home' => 'Ev', + 'postcode' => 'Posta Kodu', + 'save' => 'Kaydet', + 'select' => 'Seç', + 'select-country' => 'Ülke Seç', + 'select-state' => 'Eyalet Seç', + 'state' => 'Eyalet', + 'update-contact-title' => 'İletişim Numaralarını Güncelle', + 'update-emails-title' => 'İletişim E-postalarını Güncelle', + 'work' => 'İş', + ], + ], + 'leads' => [ + 'create-success' => 'Lead başarıyla oluşturuldu.', + 'update-success' => 'Lead başarıyla güncellendi.', + 'update-failed' => 'Potansiyel müşteriler silinemez.', + 'destroy-success' => 'Lead başarıyla silindi.', + 'destroy-failed' => 'Lead silinemedi.', + 'file' => [ + 'data-not-found' => 'Veri bulunamadı.', + 'empty-content' => 'PDF içeriği boş veya çıkarılamadı.', + 'failed-extract' => 'Dosyadan metin çıkarılamadı.', + 'insufficient-info' => 'Yetersiz veri nedeniyle, şu anda isteğinizi işleyemiyoruz.', + 'invalid-base64' => 'Geçersiz base64 formatı.', + 'invalid-format' => 'Geçersiz JSON formatı.', + 'invalid-response' => 'Geçersiz AI yanıt formatı.', + 'missing-api-key' => 'API anahtarı veya model yapılandırması eksik.', + 'not-found' => 'Dosya bulunamadı.', + 'recursive-call' => 'Özyinelemeli çağrı tespit edildi.', + 'text-generation-failed' => 'Metin çıkarma başarısız oldu. Dosya boş veya okunamaz olabilir.', + ], + 'index' => [ + 'title' => 'Leads', + 'create-btn' => 'Lead Oluştur', + 'datagrid' => [ + 'id' => 'ID', + 'sales-person' => 'Satış Temsilcisi', + 'subject' => 'Konu', + 'source' => 'Kaynak', + 'lead-value' => 'Lead Değeri', + 'lead-type' => 'Potansiyel Müşteri Türü', + 'tag-name' => 'Etiket Adı', + 'contact-person' => 'İletişim Kişisi', + 'stage' => 'Aşama', + 'rotten-lead' => 'Çürümüş Lead', + 'date-to' => 'Bitiş Tarihi', + 'created-at' => 'Oluşturulma Tarihi', + 'no' => 'Hayır', + 'yes' => 'Evet', + 'delete' => 'Sil', + 'mass-delete' => 'Toplu Sil', + 'mass-update' => 'Toplu Güncelle', + ], + 'kanban' => [ + 'rotten-days' => 'Bu müşteri adayı :days gündür çürük', + 'empty-list' => 'Müşteri Adayı Listeniz Boş', + 'empty-list-description' => 'Hedeflerinizi düzenlemek için bir müşteri adayı oluşturun.', + 'create-lead-btn' => 'Müşteri Adayı Oluştur', + 'columns' => [ + 'contact-person' => 'İletişim Kişisi', + 'id' => 'ID', + 'lead-type' => 'Lead Türü', + 'lead-value' => 'Lead Değeri', + 'sales-person' => 'Satış Temsilcisi', + 'source' => 'Kaynak', + 'title' => 'Başlık', + 'tags' => 'Etiketler', + 'expected-close-date' => 'Beklenen Kapanış Tarihi', + 'created-at' => 'Oluşturulma Tarihi', + ], + 'toolbar' => [ + 'search' => [ + 'title' => 'Başlığa göre ara', + ], + 'filters' => [ + 'apply-filters' => 'Filtreleri Uygula', + 'clear-all' => 'Tümünü Temizle', + 'filter' => 'Filtre', + 'filters' => 'Filtreler', + 'from' => 'Kimden', + 'select' => 'Seç', + 'to' => 'Kime', + ], + ], + ], + 'view-switcher' => [ + 'all-pipelines' => 'Tüm Boru Hatları', + 'create-new-pipeline' => 'Yeni Boru Hattı Oluştur', + ], + 'upload' => [ + 'create-lead' => 'AI Kullanarak Lead Oluştur', + 'file' => 'Dosya yükleme', + 'file-info' => 'Yalnızca pdf, bmp, jpg, jpeg, png formatındaki dosyalar kabul edilir.', + 'file-required' => 'Devam etmek için lütfen en az bir geçerli dosya seçin.', + 'save-btn' => 'Kaydet', + 'upload-file' => 'Dosya yükle', + ], + ], + 'create' => [ + 'title' => 'Lead Oluştur', + 'save-btn' => 'Kaydet', + 'details' => 'Detaylar', + 'details-info' => 'Lead\'in Temel Bilgilerini Girin', + 'contact-person' => 'İletişim Kişisi', + 'contact-info' => 'İletişim Kişisi Hakkında Bilgiler', + 'products' => 'Ürünler', + 'products-info' => 'Ürünler Hakkında Bilgiler', + ], + 'edit' => [ + 'title' => 'Lead\'i Düzenle', + 'save-btn' => 'Kaydet', + 'details' => 'Detaylar', + 'details-info' => 'Lead\'in Temel Bilgilerini Girin', + 'contact-person' => 'İletişim Kişisi', + 'contact-info' => 'İletişim Kişisi Hakkında Bilgiler', + 'products' => 'Ürünler', + 'products-info' => 'Ürünler Hakkında Bilgiler', + ], + 'common' => [ + 'contact' => [ + 'name' => 'Ad', + 'email' => 'E-posta', + 'contact-number' => 'İletişim Numarası', + 'organization' => 'Kuruluş', + ], + 'products' => [ + 'product-name' => 'Ürün Adı', + 'quantity' => 'Miktar', + 'price' => 'Fiyat', + 'amount' => 'Tutar', + 'action' => 'Eylem', + 'add-more' => 'Daha Fazla Ekle', + 'total' => 'Toplam', + ], + ], + 'view' => [ + 'title' => 'Lead: :title', + 'rotten-days' => ':days Gün', + 'tabs' => [ + 'description' => 'Açıklama', + 'products' => 'Ürünler', + 'quotes' => 'Teklifler', + ], + 'attributes' => [ + 'title' => 'Lead Hakkında', + ], + 'quotes' => [ + 'subject' => 'Konu', + 'expired-at' => 'Son Tarih', + 'sub-total' => 'Ara Toplam', + 'discount' => 'İndirim', + 'tax' => 'Vergi', + 'adjustment' => 'Düzeltme', + 'grand-total' => 'Genel Toplam', + 'delete' => 'Sil', + 'edit' => 'Düzenle', + 'download' => 'İndir', + 'destroy-success' => 'Teklif başarıyla silindi.', + 'empty-title' => 'Teklif Bulunamadı', + 'empty-info' => 'Bu Lead için Teklif Bulunamadı', + 'add-btn' => 'Teklif Ekle', + ], + 'products' => [ + 'product-name' => 'Ürün Adı', + 'quantity' => 'Miktar', + 'price' => 'Fiyat', + 'amount' => 'Tutar', + 'action' => 'Eylem', + 'add-more' => 'Daha Fazla Ekle', + 'total' => 'Toplam', + 'empty-title' => 'Ürün Bulunamadı', + 'empty-info' => 'Bu Lead için Ürün Bulunamadı', + 'add-product' => 'Ürün Ekle', + ], + 'persons' => [ + 'title' => 'Kişiler Hakkında', + 'job-title' => ':job_title @ :organization', + ], + 'stages' => [ + 'won-lost' => 'Kazandı/Kayıp', + 'won' => 'Kazandı', + 'lost' => 'Kayıp', + 'need-more-info' => 'Daha Fazla Bilgi Gerekiyor', + 'closed-at' => 'Kapanış Tarihi', + 'won-value' => 'Kazanan Değer', + 'lost-reason' => 'Kayıp Nedeni', + 'save-btn' => 'Kaydet', + ], + 'tags' => [ + 'create-success' => 'Etiket başarıyla oluşturuldu.', + 'destroy-success' => 'Etiket başarıyla silindi.', + ], + ], + ], + 'configuration' => [ + 'index' => [ + 'back' => 'Geri', + 'delete' => 'Sil', + 'save-btn' => 'Yapılandırmayı Kaydet', + 'save-success' => 'Yapılandırma Başarıyla Kaydedildi.', + 'search' => 'Ara', + 'select-country' => 'Ülke Seç', + 'select-state' => 'Eyalet Seç', + 'title' => 'Yapılandırma', + 'general' => [ + 'title' => 'Genel', + 'info' => 'Genel Yapılandırma', + 'general' => [ + 'title' => 'Genel', + 'info' => 'Genel ayarlarınızı burada güncelleyin.', + 'locale-settings' => [ + 'title' => 'Yerel Ayarlar', + 'title-info' => 'Kullanıcı arayüzünde kullanılan dili tanımlar, örneğin Arapça (ar), İngilizce (en), İspanyolca (es), Farsça (fa) ve Türkçe (tr).', + ], + 'admin-logo' => [ + 'logo-image' => 'Logo Resmi', + 'title' => 'Yönetici Logosu', + 'title-info' => 'Yönetici paneliniz için logo resmini yapılandırın.', + ], + ], + 'settings' => [ + 'title' => 'Ayarlar', + 'info' => 'Ayarlarınızı burada güncelleyin.', + 'footer' => [ + 'info' => 'Powered by bölümünü burada yapılandırabiliriz.', + 'powered-by' => 'Powered by metin düzenleyici', + 'title' => 'Powered by Bölüm Yapılandırmaları', + ], + 'menu' => [ + 'activities' => 'Aktiviteler', + 'configuration' => 'Yapılandırma', + 'contacts' => 'İletişim', + 'dashboard' => 'Gösterge Paneli', + 'draft' => 'Taslak', + 'inbox' => 'Gelen Kutusu', + 'info' => 'Menü öğelerinin adlarını burada yapılandırabiliriz.', + 'leads' => 'Leadler', + 'mail' => 'Mail', + 'organizations' => 'Organizasyonlar', + 'outbox' => 'Gönderilenler', + 'persons' => 'Kişiler', + 'products' => 'Ürünler', + 'quotes' => 'Teklifler', + 'sent' => 'Gönderildi', + 'settings' => 'Ayarlar', + 'title' => 'Menü Öğesi Yapılandırmaları', + 'trash' => 'Çöp Kutusu', + ], + 'menu-color' => [ + 'brand-color' => 'Brand Color', + 'info' => 'Menü öğelerinin renklerini burada değiştirebiliriz.', + 'title' => 'Menü Öğesi Renk Yapılandırmaları', + ], + ], + ], + 'email' => [ + 'title' => 'Email Settings', + 'info' => 'Email configuration for the application.', + 'imap' => [ + 'title' => 'IMAP Settings', + 'info' => 'IMAP email configuration for receiving emails.', + 'account' => [ + 'title' => 'IMAP Account', + 'title-info' => 'Configure your IMAP account settings here.', + 'host' => 'Host', + 'port' => 'Port', + 'encryption' => 'Encryption Type', + 'validate-cert' => 'Validate SSL Certificate', + 'username' => 'IMAP Username', + 'password' => 'IMAP Password', + ], + ], + ], + 'magic-ai' => [ + 'title' => 'Sihirli AI', + 'info' => 'Uygulama için Sihirli AI yapılandırması.', + 'settings' => [ + 'api-key' => 'API Anahtarı', + 'api-key-info' => 'Her model için bir OpenRouter API anahtarı kullanmayı unutmayın. Bu, güvenliği ve performansı artırmak için basit bir adımdır.', + 'enable' => 'Etkinleştir', + 'info' => 'OpenRouter API Anahtarınız ile Magic AI deneyiminizi geliştirin. Şimdi entegre edin ve size özel, sorunsuz bir AI macerası yaşayın! Ayarları kolayca özelleştirin ve AI yolculuğunuzun kontrolünü elinize alın.', + 'other' => 'Diğer Model', + 'other-model' => 'Diğer modeller için OpenRouter\'dan Model ID kullanın.', + 'doc-generation' => 'DOC Oluşturma', + 'doc-generation-info' => 'DOC dosyalarından verileri otomatik olarak çıkartıp metin formatına dönüştürmek için DOC Oluşturma özelliğini etkinleştirin. Bu özelliği etkinleştirerek iş akışınızı kolaylaştırın ve verimliliğinizi artırın.', + 'title' => 'Genel Ayarlar', + 'models' => [ + 'deepseek-r1' => 'Deepseek R1 Distill-llama-8b', + 'gemini-2-0-flash-001' => 'Gemini 2.0 flash-001', + 'gpt-4o' => 'GPT-4.0', + 'gpt-4o-mini' => 'GPT-4.0 mini', + 'grok-2-1212' => 'Grok 2.12', + 'llama-3-2-3b-instruct' => 'Llama 3.2 3b Instruct', + 'title' => 'Modeller', + ], + ], + ], + ], + ], + 'dashboard' => [ + 'index' => [ + 'title' => 'Gösterge Paneli', + 'revenue' => [ + 'lost-revenue' => 'Kayıp Gelir', + 'won-revenue' => 'Kazançlı Gelir', + ], + 'over-all' => [ + 'average-lead-value' => 'Ortalama Lead Değeri', + 'total-leads' => 'Toplam Lead', + 'average-leads-per-day' => 'Günlük Ortalama Lead', + 'total-quotations' => 'Toplam Teklif', + 'total-persons' => 'Toplam Kişi', + 'total-organizations' => 'Toplam Organizasyon', + ], + 'total-leads' => [ + 'title' => 'Leadler', + 'total' => 'Toplam Lead', + 'won' => 'Kazanan Leadler', + 'lost' => 'Kayıp Leadler', + ], + 'revenue-by-sources' => [ + 'title' => 'Kaynaklara Göre Gelir', + 'empty-title' => 'Veri Bulunamadı', + 'empty-info' => 'Seçilen aralık için veri bulunamadı', + ], + 'revenue-by-types' => [ + 'title' => 'Türlere Göre Gelir', + 'empty-title' => 'Veri Bulunamadı', + 'empty-info' => 'Seçilen aralık için veri bulunamadı', + ], + 'top-selling-products' => [ + 'title' => 'En Çok Satılan Ürünler', + 'empty-title' => 'Ürün Bulunamadı', + 'empty-info' => 'Seçilen aralık için ürün bulunamadı', + ], + 'top-persons' => [ + 'title' => 'En İyi Kişiler', + 'empty-title' => 'Kişi Bulunamadı', + 'empty-info' => 'Seçilen aralık için kişi bulunamadı', + ], + 'open-leads-by-states' => [ + 'title' => 'Aşamalara Göre Açık Leadler', + 'empty-title' => 'Veri Bulunamadı', + 'empty-info' => 'Seçilen aralık için veri bulunamadı', + ], + ], + ], + 'layouts' => [ + 'app-version' => 'Sürüm: :version', + 'dashboard' => 'Gösterge Paneli', + 'leads' => 'Leadler', + 'quotes' => 'Teklifler', + 'quote' => 'Teklif', + 'mail' => [ + 'title' => 'Mail', + 'compose' => 'Yeni Mesaj', + 'inbox' => 'Gelen Kutusu', + 'draft' => 'Taslak', + 'outbox' => 'Gönderilenler', + 'sent' => 'Gönderildi', + 'trash' => 'Çöp Kutusu', + 'setting' => 'Ayar', + ], + 'activities' => 'Aktiviteler', + 'contacts' => 'İletişim', + 'persons' => 'Kişiler', + 'person' => 'Kişi', + 'organizations' => 'Organizasyonlar', + 'organization' => 'Organizasyon', + 'products' => 'Ürünler', + 'product' => 'Ürün', + 'settings' => 'Ayarlar', + 'user' => 'Kullanıcı', + 'user-info' => 'CRM’de tüm kullanıcılarınızı ve yetkilerini yönetin, ne yapmalarına izin verildiğini belirleyin.', + 'groups' => 'Gruplar', + 'groups-info' => 'CRM’den grupları ekleyin, düzenleyin veya silin', + 'roles' => 'Roller', + 'role' => 'Rol', + 'roles-info' => 'CRM’den rolleri ekleyin, düzenleyin veya silin', + 'users' => 'Kullanıcılar', + 'users-info' => 'CRM’den kullanıcıları ekleyin, düzenleyin veya silin', + 'lead' => 'Lead', + 'lead-info' => 'CRM’de tüm lead ayarlarınızı yönetin', + 'pipelines' => 'Pipeline’lar', + 'pipelines-info' => 'CRM’den pipeline’ları ekleyin, düzenleyin veya silin', + 'sources' => 'Kaynaklar', + 'sources-info' => 'CRM’den kaynakları ekleyin, düzenleyin veya silin', + 'types' => 'Türler', + 'types-info' => 'CRM’den türleri ekleyin, düzenleyin veya silin', + 'automation' => 'Otomasyon', + 'automation-info' => 'CRM’de tüm otomasyon ayarlarınızı yönetin', + 'attributes' => 'Nitelikler', + 'attribute' => 'Nitelik', + 'attributes-info' => 'CRM’den nitelikleri ekleyin, düzenleyin veya silin', + 'email-templates' => 'E-posta Şablonları', + 'email' => 'E-posta', + 'email-templates-info' => 'CRM’den e-posta şablonları ekleyin, düzenleyin veya silin', + 'events' => 'Etkinlikler', + 'events-info' => 'CRM üzerinden etkinlikleri ekleyin, düzenleyin veya silin', + 'campaigns' => 'Kampanyalar', + 'campaigns-info' => 'CRM üzerinden kampanyaları ekleyin, düzenleyin veya silin', + 'workflows' => 'İş Akışları', + 'workflows-info' => 'CRM’den iş akışlarını ekleyin, düzenleyin veya silin', + 'webhooks' => 'Webhooklar', + 'webhooks-info' => 'CRM’den webhookları ekleyin, düzenleyin veya silin', + 'other-settings' => 'Diğer Ayarlar', + 'other-settings-info' => 'CRM’de tüm ekstra ayarlarınızı yönetin', + 'tags' => 'Etiketler', + 'tags-info' => 'CRM’den etiketleri ekleyin, düzenleyin veya silin', + 'my-account' => 'Hesabım', + 'sign-out' => 'Çıkış Yap', + 'back' => 'Geri', + 'name' => 'Ad', + 'configuration' => 'Yapılandırma', + 'howdy' => 'Merhaba!', + 'warehouses' => 'Depolar', + 'warehouse' => 'Depo', + 'warehouses-info' => 'CRM’den depoları ekleyin, düzenleyin veya silin', + 'data_transfer' => 'Veri Transferi', + 'data_transfer_info' => 'CRM’de kişiler, ürünler ve potansiyel müşterilere ilişkin veri transferi ayarlarını yönetin', + ], + 'user' => [ + 'account' => [ + 'name' => 'İsim', + 'email' => 'E-posta', + 'password' => 'Şifre', + 'my_account' => 'Hesabım', + 'update_details' => 'Bilgileri Güncelle', + 'current_password' => 'Mevcut şifre', + 'confirm_password' => 'Şifreyi onayla', + 'password-match' => 'Mevcut şifre eşleşmiyor.', + 'account-save' => 'Hesap değişiklikleri başarıyla kaydedildi.', + 'permission-denied' => 'İzin Reddedildi', + 'remove-image' => 'Görseli Kaldır', + 'upload_image_pix' => 'Profil Görseli Yükle (100px x 100px)', + 'upload_image_format' => 'PNG veya JPG Formatında', + 'image_upload_message' => 'Sadece görseller (.jpeg, .jpg, .png, ..) izinlidir.', + ], + ], + 'emails' => [ + 'common' => [ + 'dear' => 'Sevgili :name', + 'cheers' => 'Saygılar,
:app_name Ekibi', + 'user' => [ + 'dear' => 'Sevgili :username', + 'create-subject' => 'Bir üye olarak eklendiniz.', + 'create-body' => 'Tebrikler! Artık ekibimizin bir üyesisiniz.', + 'forget-password' => [ + 'subject' => 'Müşteri Şifre Sıfırlama', + 'dear' => 'Sevgili :username', + 'reset-password' => 'Şifreyi Sıfırla', + 'info' => 'Bu e-postayı almanız, hesabınız için bir şifre sıfırlama talebi aldığımız anlamına gelir', + 'final-summary' => 'Eğer şifre sıfırlama talebinde bulunmadıysanız, herhangi bir ek işlem yapmanıza gerek yoktur', + 'thanks' => 'Teşekkürler!', + ], + ], + ], + ], + 'validations' => [ + 'message' => [ + 'decimal' => ':attribute ondalıklı bir sayı olmalıdır.', + ], + ], + 'errors' => [ + 'dashboard' => 'Kontrol Paneli', + 'go-back' => 'Geri Dön', + 'support' => 'Sorun devam ederse, yardım için bize :email adresinden ulaşın.', + '404' => [ + 'description' => 'Oops! Aradığınız sayfa tatilde. Aradığınız şeyi bulamadık gibi görünüyor.', + 'title' => '404 Sayfa Bulunamadı', + ], + '401' => [ + 'description' => 'Oops! Bu sayfaya erişim izniniz yok gibi görünüyor. Gerekli yetkilere sahip değilsiniz.', + 'title' => '401 Yetkisiz', + ], + '403' => [ + 'description' => 'Oops! Bu sayfa erişime kapalı. Bu içeriği görüntülemek için gerekli izinlere sahip değilsiniz gibi görünüyor.', + 'title' => '403 Yasak', + ], + '500' => [ + 'description' => 'Oops! Bir şeyler ters gitti. Aradığınız sayfa yüklenirken sorun yaşıyoruz gibi görünüyor.', + 'title' => '500 Sunucu Hatası', + ], + '503' => [ + 'description' => 'Oops! Görünüşe göre geçici bir bakım nedeniyle kapalıyız. Lütfen kısa süre sonra tekrar kontrol edin.', + 'title' => '503 Hizmet Kullanılamıyor', + ], + ], + 'export' => [ + 'csv' => 'CSV', + 'download' => 'İndir', + 'export' => 'Dışa Aktar', + 'no-records' => 'Dışa aktarılacak kayıt bulunamadı.', + 'xls' => 'XLS', + 'xlsx' => 'XLSX', + ], +]; diff --git a/packages/Webkul/Admin/src/Resources/lang/vi/app.php b/packages/Webkul/Admin/src/Resources/lang/vi/app.php new file mode 100644 index 0000000..b853e79 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/lang/vi/app.php @@ -0,0 +1,2225 @@ + [ + 'leads' => 'Những Khách hàng tiềm năng', + 'lead' => 'Khách hàng tiềm năng', + 'quotes' => 'Báo giá', + 'mail' => 'Thư', + 'inbox' => 'Hộp thư đến', + 'draft' => 'Thư nháp', + 'outbox' => 'Hộp thư đi', + 'sent' => 'Đã gửi', + 'trash' => 'Thùng rác', + 'activities' => 'Hoạt động', + 'webhook' => 'Webhook', + 'contacts' => 'Danh bạ', + 'persons' => 'Cá nhân', + 'organizations' => 'Tổ chức', + 'products' => 'Sản phẩm', + 'settings' => 'Cài đặt', + 'groups' => 'Nhóm', + 'roles' => 'Vai trò', + 'users' => 'Người dùng', + 'user' => 'Người dùng', + 'automation' => 'Tự động hóa', + 'attributes' => 'Thuộc tính', + 'pipelines' => 'Quy trình', + 'sources' => 'Nguồn', + 'types' => 'Loại', + 'email-templates' => 'Mẫu email', + 'workflows' => 'Quy trình làm việc', + 'other-settings' => 'Cài đặt khác', + 'tags' => 'Thẻ', + 'configuration' => 'Cấu hình', + 'create' => 'Tạo mới', + 'edit' => 'Chỉnh sửa', + 'view' => 'Xem', + 'print' => 'In', + 'delete' => 'Xóa', + 'export' => 'Xuất khẩu', + 'mass-delete' => 'Xóa hàng loạt', + 'data-transfer' => 'Data Transfer', + 'imports' => 'Imports', + 'import' => 'Import', + 'event' => 'Sự kiện', + 'campaigns' => 'Chiến dịch', + ], + 'users' => [ + 'activate-warning' => 'Tài khoản của bạn chưa được kích hoạt. Vui lòng liên hệ quản trị viên.', + 'login-error' => 'Thông tin đăng nhập không khớp với hồ sơ của chúng tôi.', + 'not-permission' => 'Bạn không có quyền truy cập vào bảng quản trị.', + 'login' => [ + 'email' => 'Địa chỉ Email', + 'forget-password-link' => 'Quên Mật khẩu?', + 'password' => 'Mật khẩu', + 'submit-btn' => 'Đăng Nhập', + 'title' => 'Đăng Nhập', + ], + 'forget-password' => [ + 'create' => [ + 'email' => 'Email Đã Đăng Ký', + 'email-not-exist' => 'Email Không Tồn Tại', + 'page-title' => 'Quên Mật khẩu', + 'reset-link-sent' => 'Liên kết đặt lại mật khẩu đã được gửi', + 'sign-in-link' => 'Quay lại Đăng Nhập?', + 'submit-btn' => 'Đặt Lại', + 'title' => 'Khôi Phục Mật khẩu', + ], + ], + 'reset-password' => [ + 'back-link-title' => 'Quay lại Đăng Nhập?', + 'confirm-password' => 'Xác Nhận Mật Khẩu', + 'email' => 'Email Đã Đăng Ký', + 'password' => 'Mật Khẩu', + 'submit-btn' => 'Đặt Lại Mật Khẩu', + 'title' => 'Đặt Lại Mật Khẩu', + ], + ], + 'account' => [ + 'edit' => [ + 'back-btn' => 'Quay Lại', + 'change-password' => 'Đổi Mật Khẩu', + 'confirm-password' => 'Xác Nhận Mật Khẩu', + 'current-password' => 'Mật Khẩu Hiện Tại', + 'email' => 'Email', + 'general' => 'Chung', + 'invalid-password' => 'Mật khẩu hiện tại bạn nhập không đúng.', + 'name' => 'Tên', + 'password' => 'Mật Khẩu', + 'profile-image' => 'Ảnh Hồ Sơ', + 'save-btn' => 'Lưu Tài Khoản', + 'title' => 'Tài Khoản Của Tôi', + 'update-success' => 'Tài khoản đã được cập nhật thành công', + 'upload-image-info' => 'Tải lên Ảnh Hồ Sơ (110px X 110px) ở định dạng PNG hoặc JPG', + ], + ], + 'components' => [ + 'activities' => [ + 'actions' => [ + 'mail' => [ + 'btn' => 'Thư', + 'title' => 'Soạn thư', + 'to' => 'Tới', + 'enter-emails' => 'Nhấn enter để thêm email', + 'cc' => 'CC', + 'bcc' => 'BCC', + 'subject' => 'Chủ đề', + 'send-btn' => 'Gửi', + 'message' => 'Tin nhắn', + ], + 'file' => [ + 'btn' => 'Tệp', + 'title' => 'Thêm tệp', + 'title-control' => 'Tiêu đề', + 'name' => 'Tên', + 'description' => 'Mô tả', + 'file' => 'Tệp', + 'save-btn' => 'Lưu tệp', + ], + 'note' => [ + 'btn' => 'Ghi chú', + 'title' => 'Thêm ghi chú', + 'comment' => 'Bình luận', + 'save-btn' => 'Lưu ghi chú', + ], + 'activity' => [ + 'btn' => 'Hoạt động', + 'title' => 'Thêm hoạt động', + 'title-control' => 'Tiêu đề', + 'description' => 'Mô tả', + 'schedule-from' => 'Lịch từ', + 'schedule-to' => 'Lịch đến', + 'location' => 'Địa điểm', + 'call' => 'Cuộc gọi', + 'meeting' => 'Cuộc họp', + 'lunch' => 'Bữa trưa', + 'save-btn' => 'Lưu hoạt động', + 'participants' => [ + 'title' => 'Người tham gia', + 'placeholder' => 'Nhập để tìm kiếm người tham gia', + 'users' => 'Người dùng', + 'persons' => 'Người', + 'no-results' => 'Không có kết quả...', + ], + ], + ], + 'index' => [ + 'all' => 'Tất cả', + 'bcc' => 'Bcc', + 'by-user' => 'Bởi :user', + 'calls' => 'Cuộc gọi', + 'cc' => 'Cc', + 'change-log' => 'Nhật ký thay đổi', + 'delete' => 'Xóa', + 'edit' => 'Chỉnh sửa', + 'emails' => 'Email', + 'empty' => 'Trống', + 'files' => 'Tệp tin', + 'from' => 'Từ', + 'location' => 'Địa điểm', + 'lunches' => 'Bữa trưa', + 'mark-as-done' => 'Đánh dấu hoàn thành', + 'meetings' => 'Cuộc họp', + 'notes' => 'Ghi chú', + 'participants' => 'Người tham gia', + 'planned' => 'Đã lên kế hoạch', + 'quotes' => 'Báo giá', + 'scheduled-on' => 'Lên lịch vào', + 'system' => 'Hệ thống', + 'to' => 'Đến', + 'unlink' => 'Gỡ liên kết', + 'view' => 'Xem', + 'empty-placeholders' => [ + 'all' => [ + 'title' => 'Không tìm thấy hoạt động nào', + 'description' => 'Không có hoạt động nào được tìm thấy. Bạn có thể thêm hoạt động bằng cách nhấn nút Hoạt động ở bảng bên trái.', + ], + 'planned' => [ + 'title' => 'Không tìm thấy hoạt động đã lên kế hoạch', + 'description' => 'Không có hoạt động đã lên kế hoạch nào được tìm thấy. Thêm hoạt động bằng cách nhấn nút Hoạt động ở bảng bên trái.', + ], + 'notes' => [ + 'title' => 'Không tìm thấy ghi chú', + 'description' => 'Không có ghi chú nào được tìm thấy. Thêm ghi chú bằng cách nhấn nút Ghi chú ở bảng bên trái.', + ], + 'calls' => [ + 'title' => 'Không tìm thấy cuộc gọi', + 'description' => 'Không có cuộc gọi nào được tìm thấy. Thêm cuộc gọi bằng cách nhấn nút Hoạt động và chọn loại Cuộc gọi.', + ], + 'meetings' => [ + 'title' => 'Không tìm thấy cuộc họp', + 'description' => 'Không có cuộc họp nào được tìm thấy. Thêm cuộc họp bằng cách nhấn nút Hoạt động và chọn loại Cuộc họp.', + ], + 'lunches' => [ + 'title' => 'Không tìm thấy buổi ăn trưa', + 'description' => 'Không có buổi ăn trưa nào được tìm thấy. Thêm ăn trưa bằng cách nhấn nút Hoạt động và chọn loại Ăn trưa.', + ], + 'files' => [ + 'title' => 'Không tìm thấy tệp', + 'description' => 'Không có tệp nào được tìm thấy. Thêm tệp bằng cách nhấn nút Tệp ở bảng bên trái.', + ], + 'emails' => [ + 'title' => 'Không tìm thấy email', + 'description' => 'Không có email nào được tìm thấy. Thêm email bằng cách nhấn nút Thư ở bảng bên trái.', + ], + 'system' => [ + 'title' => 'Không tìm thấy nhật ký thay đổi', + 'description' => 'Không có nhật ký thay đổi nào được tìm thấy.', + ], + ], + ], + ], + 'media' => [ + 'images' => [ + 'add-image-btn' => 'Thêm hình ảnh', + 'ai-add-image-btn' => 'Magic AI', + 'allowed-types' => 'png, jpeg, jpg', + 'not-allowed-error' => 'Chỉ chấp nhận tệp hình ảnh (.jpeg, .jpg, .png, ..).', + 'placeholders' => [ + 'front' => 'Mặt trước', + 'next' => 'Kế tiếp', + 'size' => 'Kích thước', + 'use-cases' => 'Trường hợp sử dụng', + 'zoom' => 'Thu phóng', + ], + ], + 'videos' => [ + 'add-video-btn' => 'Thêm video', + 'allowed-types' => 'mp4, webm, mkv', + 'not-allowed-error' => 'Chỉ chấp nhận tệp video (.mp4, .mov, .ogg ..).', + ], + ], + 'datagrid' => [ + 'index' => [ + 'no-records-selected' => 'Chưa có bản ghi nào được chọn.', + 'must-select-a-mass-action-option' => 'Bạn phải chọn một tùy chọn hành động hàng loạt.', + 'must-select-a-mass-action' => 'Bạn phải chọn một hành động hàng loạt.', + ], + 'toolbar' => [ + 'length-of' => ':length của', + 'of' => 'của', + 'per-page' => 'Mỗi Trang', + 'results' => ':total Kết quả', + 'delete' => 'Xóa', + 'selected' => ':total Mục đã chọn', + 'mass-actions' => [ + 'submit' => 'Gửi', + 'select-option' => 'Chọn Tùy chọn', + 'select-action' => 'Chọn Hành động', + ], + 'filter' => [ + 'apply-filters-btn' => 'Áp dụng Bộ lọc', + 'back-btn' => 'Quay lại', + 'create-new-filter' => 'Tạo Bộ lọc Mới', + 'custom-filters' => 'Bộ lọc Tùy chỉnh', + 'delete-error' => 'Đã xảy ra lỗi khi xóa bộ lọc, vui lòng thử lại.', + 'delete-success' => 'Bộ lọc đã được xóa thành công.', + 'empty-description' => 'Không có bộ lọc nào được chọn để lưu. Vui lòng chọn bộ lọc để lưu.', + 'empty-title' => 'Thêm Bộ lọc để Lưu', + 'name' => 'Tên', + 'quick-filters' => 'Bộ lọc Nhanh', + 'save-btn' => 'Lưu', + 'save-filter' => 'Lưu Bộ lọc', + 'saved-success' => 'Bộ lọc đã được lưu thành công.', + 'selected-filters' => 'Bộ lọc đã chọn', + 'title' => 'Bộ lọc', + 'update' => 'Cập nhật', + 'update-filter' => 'Cập nhật Bộ lọc', + 'updated-success' => 'Bộ lọc đã được cập nhật thành công.', + ], + 'search' => [ + 'title' => 'Tìm kiếm', + ], + ], + 'filters' => [ + 'select' => 'Chọn', + 'title' => 'Bộ lọc', + 'dropdown' => [ + 'searchable' => [ + 'at-least-two-chars' => 'Nhập ít nhất 2 ký tự...', + 'no-results' => 'Không tìm thấy kết quả...', + ], + ], + 'custom-filters' => [ + 'clear-all' => 'Xóa tất cả', + 'title' => 'Bộ lọc Tùy chỉnh', + ], + 'boolean-options' => [ + 'false' => 'Sai', + 'true' => 'Đúng', + ], + 'date-options' => [ + 'last-month' => 'Tháng trước', + 'last-six-months' => '6 Tháng trước', + 'last-three-months' => '3 Tháng trước', + 'this-month' => 'Tháng này', + 'this-week' => 'Tuần này', + 'this-year' => 'Năm nay', + 'today' => 'Hôm nay', + 'yesterday' => 'Hôm qua', + ], + ], + 'table' => [ + 'actions' => 'Hành động', + 'no-records-available' => 'Không có Bản ghi nào.', + ], + ], + 'modal' => [ + 'confirm' => [ + 'agree-btn' => 'Đồng ý', + 'disagree-btn' => 'Không đồng ý', + 'message' => 'Bạn có chắc chắn muốn thực hiện hành động này không?', + 'title' => 'Bạn có chắc chắn?', + ], + ], + 'tags' => [ + 'index' => [ + 'title' => 'Thẻ', + 'added-tags' => 'Thẻ đã thêm', + 'save-btn' => 'Lưu Thẻ', + 'placeholder' => 'Nhập để tìm thẻ', + 'add-tag' => 'Thêm ":term"...', + 'aquarelle-red' => 'Đỏ Aquarelle', + 'crushed-cashew' => 'Hạt điều nghiền', + 'beeswax' => 'Sáp ong', + 'lemon-chiffon' => 'Vàng Chanh', + 'snow-flurry' => 'Tuyết Bay', + 'honeydew' => 'Mật Ong', + ], + ], + 'layouts' => [ + 'powered-by' => [ + 'description' => 'Được hỗ trợ bởi :krayin, một dự án mã nguồn mở được phát triển bởi :webkul.', + ], + 'header' => [ + 'mega-search' => [ + 'title' => 'Tìm kiếm Mega', + 'tabs' => [ + 'leads' => 'Khách hàng tiềm năng', + 'quotes' => 'Báo giá', + 'persons' => 'Người', + 'products' => 'Sản phẩm', + ], + 'explore-all-products' => 'Khám phá tất cả Sản phẩm', + 'explore-all-leads' => 'Khám phá tất cả Khách hàng tiềm năng', + 'explore-all-contacts' => 'Khám phá tất cả Liên hệ', + 'explore-all-quotes' => 'Khám phá tất cả Báo giá', + 'explore-all-matching-products' => 'Khám phá tất cả sản phẩm khớp với ":query" (:count)', + 'explore-all-matching-leads' => 'Khám phá tất cả khách hàng tiềm năng khớp với ":query" (:count)', + 'explore-all-matching-contacts' => 'Khám phá tất cả liên hệ khớp với ":query" (:count)', + 'explore-all-matching-quotes' => 'Khám phá tất cả báo giá khớp với ":query" (:count)', + ], + ], + ], + 'attributes' => [ + 'edit' => [ + 'delete' => 'Xóa', + ], + 'lookup' => [ + 'click-to-add' => 'Nhấn để thêm', + 'search' => 'Tìm kiếm...', + 'no-result-found' => 'Không tìm thấy kết quả', + ], + ], + 'lookup' => [ + 'click-to-add' => 'Nhấn để Thêm', + 'no-results' => 'Không tìm thấy kết quả', + 'add-as-new' => 'Thêm như mới', + 'search' => 'Tìm kiếm...', + ], + 'flash-group' => [ + 'success' => 'Thành công', + 'error' => 'Lỗi', + 'warning' => 'Cảnh báo', + 'info' => 'Thông tin', + ], + 'tiny-mce' => [ + 'http-error' => 'Lỗi HTTP', + 'invalid-json' => 'Phản hồi JSON không hợp lệ từ máy chủ.', + 'upload-failed' => 'Tải tệp lên không thành công. Vui lòng thử lại.', + ], + ], + 'quotes' => [ + 'index' => [ + 'title' => 'Báo giá', + 'create-btn' => 'Tạo Báo giá', + 'create-success' => 'Báo giá đã được tạo thành công.', + 'update-success' => 'Báo giá đã được cập nhật thành công.', + 'delete-success' => 'Báo giá đã được xóa thành công.', + 'delete-failed' => 'Không thể xóa báo giá.', + 'datagrid' => [ + 'subject' => 'Chủ đề', + 'sales-person' => 'Nhân viên bán hàng', + 'expired-at' => 'Hết hạn vào', + 'created-at' => 'Tạo vào', + 'person' => 'Người', + 'subtotal' => 'Tổng phụ', + 'discount' => 'Giảm giá', + 'tax' => 'Thuế', + 'adjustment' => 'Điều chỉnh', + 'grand-total' => 'Tổng cộng', + 'edit' => 'Chỉnh sửa', + 'delete' => 'Xóa', + 'print' => 'In', + ], + 'pdf' => [ + 'adjustment' => 'Điều chỉnh', + 'amount' => 'Số tiền', + 'billing-address' => 'Địa chỉ thanh toán', + 'date' => 'Ngày', + 'discount' => 'Giảm giá', + 'expired-at' => 'Hết hạn vào', + 'grand-total' => 'Tổng cộng', + 'person' => 'Người', + 'price' => 'Giá', + 'product-name' => 'Tên sản phẩm', + 'quantity' => 'Số lượng', + 'quote-id' => 'ID Báo giá', + 'sales-person' => 'Nhân viên bán hàng', + 'shipping-address' => 'Địa chỉ giao hàng', + 'sku' => 'Mã sản phẩm (SKU)', + 'sub-total' => 'Tổng phụ', + 'subject' => 'Chủ đề', + 'tax' => 'Thuế', + 'title' => 'Báo giá', + ], + ], + 'create' => [ + 'title' => 'Tạo Báo giá', + 'save-btn' => 'Lưu Báo giá', + 'quote-info' => 'Thông tin Báo giá', + 'quote-info-info' => 'Nhập thông tin cơ bản của báo giá.', + 'address-info' => 'Thông tin Địa chỉ', + 'address-info-info' => 'Thông tin về địa chỉ liên quan đến báo giá.', + 'quote-items' => 'Mục Báo giá', + 'search-products' => 'Tìm kiếm Sản phẩm', + 'link-to-lead' => 'Liên kết tới lead', + 'quote-item-info' => 'Thêm Yêu cầu Sản phẩm cho báo giá này.', + 'quote-name' => 'Tên Báo giá', + 'quantity' => 'Số lượng', + 'price' => 'Giá', + 'discount' => 'Giảm giá', + 'tax' => 'Thuế', + 'total' => 'Tổng cộng', + 'amount' => 'Số tiền', + 'add-item' => '+ Thêm Mục', + 'sub-total' => 'Tổng phụ (:symbol)', + 'total-discount' => 'Giảm giá (:symbol)', + 'total-tax' => 'Thuế (:symbol)', + 'total-adjustment' => 'Điều chỉnh (:symbol)', + 'grand-total' => 'Tổng cộng (:symbol)', + 'discount-amount' => 'Số tiền giảm giá', + 'tax-amount' => 'Số tiền thuế', + 'adjustment-amount' => 'Số tiền điều chỉnh', + 'product-name' => 'Tên Sản phẩm', + 'action' => 'Hành động', + ], + 'edit' => [ + 'title' => 'Chỉnh sửa Báo giá', + 'save-btn' => 'Lưu Báo giá', + 'quote-info' => 'Thông tin Báo giá', + 'quote-info-info' => 'Nhập thông tin cơ bản của báo giá.', + 'address-info' => 'Thông tin Địa chỉ', + 'address-info-info' => 'Thông tin về địa chỉ liên quan đến báo giá.', + 'quote-items' => 'Mục Báo giá', + 'link-to-lead' => 'Liên kết tới lead', + 'quote-item-info' => 'Thêm Yêu cầu Sản phẩm cho báo giá này.', + 'quote-name' => 'Tên Báo giá', + 'quantity' => 'Số lượng', + 'price' => 'Giá', + 'search-products' => 'Tìm kiếm Sản phẩm', + 'discount' => 'Giảm giá', + 'tax' => 'Thuế', + 'total' => 'Tổng cộng', + 'amount' => 'Số tiền', + 'add-item' => '+ Thêm Mục', + 'sub-total' => 'Tổng phụ (:symbol)', + 'total-discount' => 'Giảm giá (:symbol)', + 'total-tax' => 'Thuế (:symbol)', + 'total-adjustment' => 'Điều chỉnh (:symbol)', + 'grand-total' => 'Tổng cộng (:symbol)', + 'discount-amount' => 'Số tiền giảm giá', + 'tax-amount' => 'Số tiền thuế', + 'adjustment-amount' => 'Số tiền điều chỉnh', + 'product-name' => 'Tên Sản phẩm', + 'action' => 'Hành động', + ], + ], + 'contacts' => [ + 'persons' => [ + 'index' => [ + 'title' => 'Người', + 'create-btn' => 'Tạo Người', + 'create-success' => 'Người đã được tạo thành công.', + 'update-success' => 'Người đã được cập nhật thành công.', + 'all-delete-success' => 'Tất cả người được chọn đã được xóa thành công.', + 'partial-delete-warning' => 'Một số người đã được xóa thành công. Những người khác không thể xóa vì có liên kết với khách hàng tiềm năng.', + 'none-delete-warning' => 'Không thể xóa bất kỳ người nào được chọn vì họ có liên kết với khách hàng tiềm năng.', + 'no-selection' => 'Chưa chọn người nào để xóa.', + 'delete-failed' => 'Xóa người được chọn không thành công.', + 'datagrid' => [ + 'contact-numbers' => 'Số Liên hệ', + 'delete' => 'Xóa', + 'edit' => 'Chỉnh sửa', + 'emails' => 'Email', + 'id' => 'ID', + 'view' => 'Xem', + 'name' => 'Tên', + 'organization-name' => 'Tên Tổ chức', + ], + ], + 'view' => [ + 'title' => ':name', + 'about-person' => 'Thông tin về Người', + 'about-organization' => 'Thông tin về Tổ chức', + 'activities' => [ + 'index' => [ + 'all' => 'Tất cả', + 'calls' => 'Cuộc gọi', + 'meetings' => 'Cuộc họp', + 'lunches' => 'Bữa trưa', + 'files' => 'Tệp', + 'quotes' => 'Báo giá', + 'notes' => 'Ghi chú', + 'emails' => 'Email', + 'by-user' => 'Bởi :user', + 'scheduled-on' => 'Đã lên lịch vào', + 'location' => 'Vị trí', + 'participants' => 'Người tham gia', + 'mark-as-done' => 'Đánh dấu là Đã hoàn thành', + 'delete' => 'Xóa', + 'edit' => 'Chỉnh sửa', + ], + 'actions' => [ + 'mail' => [ + 'btn' => 'Mail', + 'title' => 'Soạn Mail', + 'to' => 'Đến', + 'cc' => 'CC', + 'bcc' => 'BCC', + 'subject' => 'Chủ đề', + 'send-btn' => 'Gửi', + 'message' => 'Tin nhắn', + ], + 'file' => [ + 'btn' => 'Tệp', + 'title' => 'Thêm Tệp', + 'title-control' => 'Tiêu đề', + 'name' => 'Tên Tệp', + 'description' => 'Mô tả', + 'file' => 'Tệp', + 'save-btn' => 'Lưu Tệp', + ], + 'note' => [ + 'btn' => 'Ghi chú', + 'title' => 'Thêm Ghi chú', + 'comment' => 'Bình luận', + 'save-btn' => 'Lưu Ghi chú', + ], + 'activity' => [ + 'btn' => 'Hoạt động', + 'title' => 'Thêm Hoạt động', + 'title-control' => 'Tiêu đề', + 'description' => 'Mô tả', + 'schedule-from' => 'Lên lịch từ', + 'schedule-to' => 'Lên lịch đến', + 'location' => 'Vị trí', + 'call' => 'Cuộc gọi', + 'meeting' => 'Cuộc họp', + 'lunch' => 'Bữa trưa', + 'save-btn' => 'Lưu Hoạt động', + ], + ], + ], + 'tags' => [ + 'create-success' => 'Thẻ được tạo thành công.', + 'destroy-success' => 'Thẻ đã được xóa thành công.', + ], + ], + 'create' => [ + 'title' => 'Tạo Người', + 'save-btn' => 'Lưu Người', + ], + 'edit' => [ + 'title' => 'Chỉnh sửa Người', + 'save-btn' => 'Lưu Người', + ], + ], + 'organizations' => [ + 'index' => [ + 'title' => 'Tổ chức', + 'create-btn' => 'Tạo Tổ chức', + 'create-success' => 'Tổ chức đã được tạo thành công.', + 'update-success' => 'Tổ chức đã được cập nhật thành công.', + 'delete-success' => 'Tổ chức đã được xóa thành công.', + 'delete-failed' => 'Không thể xóa tổ chức.', + 'datagrid' => [ + 'delete' => 'Xóa', + 'edit' => 'Chỉnh sửa', + 'id' => 'ID', + 'name' => 'Tên', + 'persons-count' => 'Số người', + ], + ], + 'create' => [ + 'title' => 'Tạo Tổ chức', + 'save-btn' => 'Lưu Tổ chức', + ], + 'edit' => [ + 'title' => 'Chỉnh sửa Tổ chức', + 'save-btn' => 'Lưu Tổ chức', + ], + ], + ], + 'products' => [ + 'index' => [ + 'title' => 'Sản phẩm', + 'create-btn' => 'Tạo Sản phẩm', + 'create-success' => 'Sản phẩm đã được tạo thành công.', + 'update-success' => 'Sản phẩm đã được cập nhật thành công.', + 'delete-success' => 'Sản phẩm đã được xóa thành công.', + 'delete-failed' => 'Không thể xóa sản phẩm.', + 'datagrid' => [ + 'allocated' => 'Đã phân bổ', + 'delete' => 'Xóa', + 'edit' => 'Chỉnh sửa', + 'id' => 'ID', + 'in-stock' => 'Có sẵn', + 'name' => 'Tên', + 'on-hand' => 'Sẵn có', + 'tag-name' => 'Tên thẻ', + 'price' => 'Giá', + 'sku' => 'SKU', + 'view' => 'Xem', + ], + ], + 'create' => [ + 'save-btn' => 'Lưu Sản phẩm', + 'title' => 'Tạo Sản phẩm', + 'general' => 'Thông tin chung', + 'price' => 'Giá', + ], + 'edit' => [ + 'title' => 'Chỉnh sửa Sản phẩm', + 'save-btn' => 'Lưu Sản phẩm', + 'general' => 'Thông tin chung', + 'price' => 'Giá', + ], + 'view' => [ + 'sku' => 'SKU', + 'all' => 'Tất cả', + 'notes' => 'Ghi chú', + 'files' => 'Tệp', + 'inventories' => 'Tồn kho', + 'change-logs' => 'Nhật ký thay đổi', + 'attributes' => [ + 'about-product' => 'Thông tin về sản phẩm', + ], + 'inventory' => [ + 'source' => 'Nguồn', + 'in-stock' => 'Có sẵn', + 'allocated' => 'Đã phân bổ', + 'on-hand' => 'Sẵn có', + 'actions' => 'Hành động', + 'assign' => 'Phân bổ', + 'add-source' => 'Thêm nguồn', + 'location' => 'Vị trí', + 'add-more' => 'Thêm nữa', + 'save' => 'Lưu', + ], + ], + ], + 'settings' => [ + 'title' => 'Cài đặt', + 'groups' => [ + 'index' => [ + 'create-btn' => 'Tạo Nhóm', + 'title' => 'Nhóm', + 'create-success' => 'Tạo nhóm thành công.', + 'update-success' => 'Cập nhật nhóm thành công.', + 'destroy-success' => 'Xóa nhóm thành công.', + 'delete-failed' => 'Không thể xóa nhóm.', + 'delete-failed-associated-users' => 'Không thể xóa nhóm vì đang được sử dụng bởi người dùng.', + 'datagrid' => [ + 'delete' => 'Xóa', + 'description' => 'Mô tả', + 'edit' => 'Chỉnh sửa', + 'id' => 'ID', + 'name' => 'Tên', + ], + 'edit' => [ + 'title' => 'Chỉnh sửa Nhóm', + ], + 'create' => [ + 'name' => 'Tên', + 'title' => 'Tạo Nhóm', + 'description' => 'Mô tả', + 'save-btn' => 'Lưu Nhóm', + ], + ], + ], + 'roles' => [ + 'index' => [ + 'being-used' => 'Vai trò không thể xóa, vì đang được sử dụng trong người dùng quản trị.', + 'create-btn' => 'Tạo Vai trò', + 'create-success' => 'Vai trò đã được tạo thành công.', + 'current-role-delete-error' => 'Không thể xóa vai trò đã gán cho người dùng hiện tại.', + 'delete-failed' => 'Không thể xóa vai trò.', + 'delete-success' => 'Vai trò đã được xóa thành công.', + 'last-delete-error' => 'Cần ít nhất một vai trò.', + 'settings' => 'Cài đặt', + 'title' => 'Vai trò', + 'update-success' => 'Vai trò đã được cập nhật thành công.', + 'user-define-error' => 'Không thể xóa vai trò hệ thống.', + 'datagrid' => [ + 'all' => 'Tất cả', + 'custom' => 'Tùy chỉnh', + 'delete' => 'Xóa', + 'description' => 'Mô tả', + 'edit' => 'Chỉnh sửa', + 'id' => 'ID', + 'name' => 'Tên', + 'permission-type' => 'Loại quyền', + ], + ], + 'create' => [ + 'access-control' => 'Kiểm soát truy cập', + 'all' => 'Tất cả', + 'back-btn' => 'Quay lại', + 'custom' => 'Tùy chỉnh', + 'description' => 'Mô tả', + 'general' => 'Thông tin chung', + 'name' => 'Tên', + 'permissions' => 'Quyền', + 'save-btn' => 'Lưu Vai trò', + 'title' => 'Tạo Vai trò', + ], + 'edit' => [ + 'access-control' => 'Kiểm soát truy cập', + 'all' => 'Tất cả', + 'back-btn' => 'Quay lại', + 'custom' => 'Tùy chỉnh', + 'description' => 'Mô tả', + 'general' => 'Thông tin chung', + 'name' => 'Tên', + 'permissions' => 'Quyền', + 'save-btn' => 'Lưu Vai trò', + 'title' => 'Chỉnh sửa Vai trò', + ], + ], + 'types' => [ + 'index' => [ + 'create-btn' => 'Tạo Loại', + 'create-success' => 'Loại đã được tạo thành công.', + 'delete-failed' => 'Không thể xóa loại.', + 'delete-success' => 'Loại đã được xóa thành công.', + 'title' => 'Các Loại', + 'update-success' => 'Loại đã được cập nhật thành công.', + 'datagrid' => [ + 'delete' => 'Xóa', + 'description' => 'Mô tả', + 'edit' => 'Chỉnh sửa', + 'id' => 'ID', + 'name' => 'Tên', + ], + 'create' => [ + 'name' => 'Tên', + 'save-btn' => 'Lưu Loại', + 'title' => 'Tạo Loại', + ], + 'edit' => [ + 'title' => 'Chỉnh sửa Loại', + ], + ], + ], + 'sources' => [ + 'index' => [ + 'title' => 'Nguồn', + 'create-btn' => 'Tạo Nguồn', + 'create-success' => 'Tạo nguồn thành công.', + 'delete-failed' => 'Không thể xóa nguồn.', + 'delete-success' => 'Xóa nguồn thành công.', + 'update-success' => 'Cập nhật nguồn thành công.', + 'delete-failed-associated-leads' => 'Không thể xóa nguồn vì nó đang được liên kết với các khách hàng tiềm năng. Vui lòng hủy liên kết hoặc cập nhật các khách hàng đó trước khi xóa.', + 'datagrid' => [ + 'delete' => 'Xóa', + 'edit' => 'Chỉnh sửa', + 'id' => 'ID', + 'name' => 'Tên', + ], + 'create' => [ + 'name' => 'Tên', + 'save-btn' => 'Lưu Nguồn', + 'title' => 'Tạo Nguồn', + ], + 'edit' => [ + 'title' => 'Chỉnh sửa Nguồn', + ], + ], + ], + 'workflows' => [ + 'index' => [ + 'title' => 'Quy trình', + 'create-btn' => 'Tạo Quy trình', + 'create-success' => 'Quy trình đã được tạo thành công.', + 'update-success' => 'Quy trình đã được cập nhật thành công.', + 'delete-success' => 'Quy trình đã được xóa thành công.', + 'delete-failed' => 'Không thể xóa quy trình.', + 'datagrid' => [ + 'delete' => 'Xóa', + 'description' => 'Mô tả', + 'edit' => 'Chỉnh sửa', + 'id' => 'ID', + 'name' => 'Tên', + ], + ], + 'helpers' => [ + 'update-related-leads' => 'Cập nhật các đầu mối liên quan', + 'send-email-to-sales-owner' => 'Gửi email đến người sở hữu bán hàng', + 'send-email-to-participants' => 'Gửi email đến các tham gia', + 'add-webhook' => 'Thêm Webhook', + 'update-lead' => 'Cập nhật đầu mối', + 'update-person' => 'Cập nhật người', + 'send-email-to-person' => 'Gửi email đến người', + 'add-tag' => 'Thêm Thẻ', + 'add-note-as-activity' => 'Thêm Ghi chú như Hoạt động', + 'update-quote' => 'Cập nhật báo giá', + ], + 'create' => [ + 'title' => 'Tạo Quy trình', + 'event' => 'Sự kiện', + 'back-btn' => 'Quay lại', + 'save-btn' => 'Lưu Quy trình', + 'name' => 'Tên', + 'basic-details' => 'Thông tin cơ bản', + 'description' => 'Mô tả', + 'actions' => 'Hành động', + 'basic-details-info' => 'Nhập thông tin cơ bản của quy trình.', + 'event-info' => 'Một sự kiện kích hoạt, kiểm tra, điều kiện và thực hiện các hành động đã được định nghĩa.', + 'conditions' => 'Điều kiện', + 'conditions-info' => 'Điều kiện là các quy tắc kiểm tra kịch bản, được kích hoạt trong các dịp cụ thể.', + 'actions-info' => 'Một hành động không chỉ giảm khối lượng công việc mà còn làm cho tự động hóa CRM dễ dàng hơn.', + 'value' => 'Giá trị', + 'condition-type' => 'Loại điều kiện', + 'all-condition-are-true' => 'Tất cả điều kiện đều đúng', + 'any-condition-are-true' => 'Bất kỳ điều kiện nào cũng đúng', + 'add-condition' => 'Thêm Điều kiện', + 'add-action' => 'Thêm Hành động', + 'yes' => 'Có', + 'no' => 'Không', + 'email' => 'Email', + 'is-equal-to' => 'Bằng với', + 'is-not-equal-to' => 'Không bằng với', + 'equals-or-greater-than' => 'Bằng hoặc lớn hơn', + 'equals-or-less-than' => 'Bằng hoặc nhỏ hơn', + 'greater-than' => 'Lớn hơn', + 'less-than' => 'Nhỏ hơn', + 'type' => 'Loại', + 'contain' => 'Chứa', + 'contains' => 'Chứa', + 'does-not-contain' => 'Không chứa', + ], + 'edit' => [ + 'title' => 'Chỉnh sửa Quy trình', + 'event' => 'Sự kiện', + 'back-btn' => 'Quay lại', + 'save-btn' => 'Lưu Quy trình', + 'name' => 'Tên', + 'basic-details' => 'Thông tin cơ bản', + 'description' => 'Mô tả', + 'actions' => 'Hành động', + 'type' => 'Loại', + 'basic-details-info' => 'Nhập thông tin cơ bản của quy trình.', + 'event-info' => 'Một sự kiện kích hoạt, kiểm tra, điều kiện và thực hiện các hành động đã được định nghĩa.', + 'conditions' => 'Điều kiện', + 'conditions-info' => 'Điều kiện là các quy tắc kiểm tra kịch bản, được kích hoạt trong các dịp cụ thể.', + 'actions-info' => 'Một hành động không chỉ giảm khối lượng công việc mà còn làm cho tự động hóa CRM dễ dàng hơn.', + 'value' => 'Giá trị', + 'condition-type' => 'Loại điều kiện', + 'all-condition-are-true' => 'Tất cả điều kiện đều đúng', + 'any-condition-are-true' => 'Bất kỳ điều kiện nào cũng đúng', + 'add-condition' => 'Thêm Điều kiện', + 'add-action' => 'Thêm Hành động', + 'yes' => 'Có', + 'no' => 'Không', + 'email' => 'Email', + 'is-equal-to' => 'Bằng với', + 'is-not-equal-to' => 'Không bằng với', + 'equals-or-greater-than' => 'Bằng hoặc lớn hơn', + 'equals-or-less-than' => 'Bằng hoặc nhỏ hơn', + 'greater-than' => 'Lớn hơn', + 'less-than' => 'Nhỏ hơn', + 'contain' => 'Chứa', + 'contains' => 'Chứa', + 'does-not-contain' => 'Không chứa', + ], + ], + 'webforms' => [ + 'index' => [ + 'title' => 'Biểu mẫu Web', + 'create-btn' => 'Tạo Biểu mẫu Web', + 'create-success' => 'Biểu mẫu Web đã được tạo thành công.', + 'update-success' => 'Biểu mẫu Web đã được cập nhật thành công.', + 'delete-success' => 'Biểu mẫu Web đã được xóa thành công.', + 'delete-failed' => 'Biểu mẫu Web không thể bị xóa.', + 'datagrid' => [ + 'id' => 'ID', + 'title' => 'Tiêu đề', + 'edit' => 'Chỉnh sửa', + 'delete' => 'Xóa', + ], + ], + 'create' => [ + 'title' => 'Tạo Biểu mẫu Web', + 'add-attribute-btn' => 'Thêm Nút Thuộc Tính', + 'attribute-label-color' => 'Màu Nhãn Thuộc Tính', + 'attributes' => 'Thuộc Tính', + 'attributes-info' => 'Thêm các thuộc tính tùy chỉnh vào biểu mẫu.', + 'background-color' => 'Màu Nền', + 'create-lead' => 'Tạo Dẫn Dắt', + 'customize-webform' => 'Tùy Chỉnh Biểu Mẫu Web', + 'customize-webform-info' => 'Tùy chỉnh biểu mẫu web của bạn với màu sắc của các phần tử theo lựa chọn của bạn.', + 'description' => 'Mô tả', + 'display-custom-message' => 'Hiển thị thông điệp tùy chỉnh', + 'form-background-color' => 'Màu Nền Biểu Mẫu', + 'form-submit-btn-color' => 'Màu Nút Gửi Biểu Mẫu', + 'form-submit-button-color' => 'Màu Nút Gửi Biểu Mẫu', + 'form-title-color' => 'Màu Tiêu Đề Biểu Mẫu', + 'general' => 'Chung', + 'leads' => 'Dẫn Dắt', + 'person' => 'Người', + 'save-btn' => 'Lưu Biểu Mẫu Web', + 'submit-button-label' => 'Nhãn Nút Gửi', + 'submit-success-action' => 'Hành Động Thành Công Khi Gửi', + 'redirect-to-url' => 'Chuyển Hướng Đến URL', + 'choose-value' => 'Chọn Giá Trị', + 'select-file' => 'Chọn Tập Tin', + 'select-image' => 'Chọn Hình Ảnh', + 'enter-value' => 'Nhập Giá Trị', + ], + 'edit' => [ + 'add-attribute-btn' => 'Thêm Nút Thuộc Tính', + 'attribute-label-color' => 'Màu Nhãn Thuộc Tính', + 'attributes' => 'Thuộc Tính', + 'attributes-info' => 'Thêm các thuộc tính tùy chỉnh vào biểu mẫu.', + 'background-color' => 'Màu Nền', + 'choose-value' => 'Chọn Giá Trị', + 'code-snippet' => 'Mã Snippet', + 'copied' => 'Đã Sao Chép', + 'copy' => 'Sao Chép', + 'create-lead' => 'Tạo Dẫn Dắt', + 'customize-webform' => 'Tùy Chỉnh Biểu Mẫu Web', + 'customize-webform-info' => 'Tùy chỉnh biểu mẫu web của bạn với màu sắc của các phần tử theo lựa chọn của bạn.', + 'description' => 'Mô tả', + 'display-custom-message' => 'Hiển thị thông điệp tùy chỉnh', + 'embed' => 'Nhúng', + 'enter-value' => 'Nhập Giá Trị', + 'form-background-color' => 'Màu Nền Biểu Mẫu', + 'form-submit-btn-color' => 'Màu Nút Gửi Biểu Mẫu', + 'form-submit-button-color' => 'Màu Nút Gửi Biểu Mẫu', + 'form-title-color' => 'Màu Tiêu Đề Biểu Mẫu', + 'general' => 'Chung', + 'leads' => 'Dẫn Dắt', + 'person' => 'Người', + 'preview' => 'Xem Trước', + 'public-url' => 'URL Công Khai', + 'redirect-to-url' => 'Chuyển Hướng Đến URL', + 'save-btn' => 'Lưu Biểu Mẫu Web', + 'select-file' => 'Chọn Tập Tin', + 'select-image' => 'Chọn Hình Ảnh', + 'submit-button-label' => 'Nhãn Nút Gửi', + 'submit-success-action' => 'Hành Động Thành Công Khi Gửi', + 'title' => 'Chỉnh Sửa Biểu Mẫu Web', + ], + ], + 'email-template' => [ + 'index' => [ + 'create-btn' => 'Tạo Mẫu Email', + 'title' => 'Mẫu Email', + 'create-success' => 'Mẫu Email đã được tạo thành công.', + 'update-success' => 'Mẫu Email đã được cập nhật thành công.', + 'delete-success' => 'Mẫu Email đã được xóa thành công.', + 'delete-failed' => 'Mẫu Email không thể bị xóa.', + 'datagrid' => [ + 'delete' => 'Xóa', + 'edit' => 'Chỉnh sửa', + 'id' => 'ID', + 'name' => 'Tên', + 'subject' => 'Chủ đề', + ], + ], + 'create' => [ + 'title' => 'Tạo Mẫu Email', + 'save-btn' => 'Lưu Mẫu Email', + 'email-template' => 'Mẫu Email', + 'subject' => 'Chủ đề', + 'content' => 'Nội dung', + 'subject-placeholders' => 'Biến thể Chủ đề', + 'general' => 'Chung', + 'name' => 'Tên', + ], + 'edit' => [ + 'title' => 'Chỉnh Sửa Mẫu Email', + 'save-btn' => 'Lưu Mẫu Email', + 'email-template' => 'Mẫu Email', + 'subject' => 'Chủ đề', + 'content' => 'Nội dung', + 'subject-placeholders' => 'Biến thể Chủ đề', + 'general' => 'Chung', + 'name' => 'Tên', + ], + ], + 'marketing' => [ + 'events' => [ + 'index' => [ + 'create-btn' => 'Tạo Sự kiện', + 'title' => 'Sự kiện', + 'create-success' => 'Sự kiện đã được tạo thành công.', + 'update-success' => 'Sự kiện đã được cập nhật thành công.', + 'delete-success' => 'Sự kiện đã được xóa thành công.', + 'delete-failed' => 'Không thể xóa sự kiện.', + 'mass-delete-success' => 'Các sự kiện đã được xóa thành công', + 'datagrid' => [ + 'delete' => 'Xóa', + 'edit' => 'Chỉnh sửa', + 'id' => 'ID', + 'name' => 'Tên', + 'description' => 'Mô tả', + 'date' => 'Ngày', + ], + 'create' => [ + 'title' => 'Tạo Sự kiện', + 'name' => 'Tên', + 'date' => 'Ngày', + 'description' => 'Mô tả', + 'save-btn' => 'Lưu Sự kiện', + ], + 'edit' => [ + 'title' => 'Chỉnh sửa Sự kiện', + ], + ], + ], + 'campaigns' => [ + 'index' => [ + 'create-btn' => 'Tạo Chiến dịch', + 'title' => 'Chiến dịch', + 'create-success' => 'Chiến dịch đã được tạo thành công.', + 'update-success' => 'Chiến dịch đã được cập nhật thành công.', + 'delete-success' => 'Chiến dịch đã được xóa thành công.', + 'delete-failed' => 'Không thể xóa chiến dịch.', + 'mass-delete-success' => 'Các chiến dịch đã được xóa thành công', + 'datagrid' => [ + 'id' => 'ID', + 'name' => 'Tên', + 'subject' => 'Chủ đề', + 'status' => 'Trạng thái', + 'active' => 'Kích hoạt', + 'inactive' => 'Không kích hoạt', + 'edit' => 'Chỉnh sửa', + 'delete' => 'Xóa', + ], + 'create' => [ + 'title' => 'Tạo Chiến dịch', + 'name' => 'Tên', + 'type' => 'Loại', + 'subject' => 'Chủ đề', + 'event' => 'Sự kiện', + 'email-template' => 'Mẫu Email', + 'status' => 'Trạng thái', + ], + 'edit' => [ + 'title' => 'Chỉnh sửa Chiến dịch', + ], + ], + ], + ], + 'tags' => [ + 'index' => [ + 'create-btn' => 'Tạo Thẻ', + 'title' => 'Thẻ', + 'create-success' => 'Thẻ đã được tạo thành công.', + 'update-success' => 'Thẻ đã được cập nhật thành công.', + 'delete-success' => 'Thẻ đã được xóa thành công.', + 'delete-failed' => 'Thẻ không thể bị xóa.', + 'datagrid' => [ + 'delete' => 'Xóa', + 'edit' => 'Chỉnh sửa', + 'id' => 'ID', + 'name' => 'Tên', + 'users' => 'Người dùng', + 'created-at' => 'Ngày tạo', + ], + 'create' => [ + 'name' => 'Tên', + 'save-btn' => 'Lưu Thẻ', + 'title' => 'Tạo Thẻ', + 'color' => 'Màu sắc', + ], + 'edit' => [ + 'title' => 'Chỉnh Sửa Thẻ', + ], + ], + ], + 'users' => [ + 'index' => [ + 'create-btn' => 'Tạo Người Dùng', + 'create-success' => 'Người dùng đã được tạo thành công.', + 'delete-failed' => 'Người dùng không thể bị xóa.', + 'delete-success' => 'Người dùng đã được xóa thành công.', + 'last-delete-error' => 'Cần ít nhất một người dùng.', + 'mass-delete-failed' => 'Người dùng không thể bị xóa.', + 'mass-delete-success' => 'Người dùng đã được xóa thành công.', + 'mass-update-failed' => 'Người dùng không thể được cập nhật.', + 'mass-update-success' => 'Người dùng đã được cập nhật thành công.', + 'title' => 'Người Dùng', + 'update-success' => 'Người dùng đã được cập nhật thành công.', + 'user-define-error' => 'Không thể xóa người dùng hệ thống.', + 'active' => 'Kích hoạt', + 'inactive' => 'Không kích hoạt', + 'datagrid' => [ + 'active' => 'Kích hoạt', + 'created-at' => 'Ngày tạo', + 'delete' => 'Xóa', + 'edit' => 'Chỉnh sửa', + 'email' => 'Email', + 'id' => 'ID', + 'inactive' => 'Không kích hoạt', + 'name' => 'Tên', + 'status' => 'Trạng thái', + 'update-status' => 'Cập nhật Trạng thái', + 'users' => 'Người dùng', + ], + 'create' => [ + 'confirm-password' => 'Xác nhận Mật khẩu', + 'email' => 'Email', + 'general' => 'Chung', + 'global' => 'Toàn cầu', + 'group' => 'Nhóm', + 'individual' => 'Cá nhân', + 'name' => 'Tên', + 'password' => 'Mật khẩu', + 'permission' => 'Quyền hạn', + 'role' => 'Vai trò', + 'save-btn' => 'Lưu Người Dùng', + 'status' => 'Trạng thái', + 'title' => 'Tạo Người Dùng', + 'view-permission' => 'Xem Quyền Hạn', + 'select-at-lest-one-group' => 'Select at least one group', + ], + 'edit' => [ + 'title' => 'Chỉnh Sửa Người Dùng', + ], + ], + ], + 'pipelines' => [ + 'index' => [ + 'title' => 'Quy Trình', + 'create-btn' => 'Tạo Quy Trình', + 'create-success' => 'Quy trình đã được tạo thành công.', + 'update-success' => 'Quy trình đã được cập nhật thành công.', + 'default-required' => 'Cần ít nhất một pipeline mặc định.', + 'delete-success' => 'Quy trình đã được xóa thành công.', + 'delete-failed' => 'Quy trình không thể bị xóa.', + 'default-delete-error' => 'Quy trình mặc định không thể bị xóa.', + 'datagrid' => [ + 'delete' => 'Xóa', + 'edit' => 'Chỉnh sửa', + 'id' => 'ID', + 'is-default' => 'Có phải là mặc định', + 'name' => 'Tên', + 'no' => 'Không', + 'rotten-days' => 'Ngày Hỏng', + 'yes' => 'Có', + ], + ], + 'create' => [ + 'title' => 'Tạo Quy Trình', + 'save-btn' => 'Lưu Quy Trình', + 'name' => 'Tên', + 'rotten-days' => 'Ngày Hỏng', + 'mark-as-default' => 'Đánh dấu là Mặc định', + 'general' => 'Chung', + 'probability' => 'Xác Suất (%)', + 'new-stage' => 'Mới', + 'won-stage' => 'Thắng', + 'lost-stage' => 'Thua', + 'stage-btn' => 'Thêm Giai Đoạn', + 'stages' => 'Các Giai Đoạn', + 'duplicate-name' => 'Trường "Tên" không được trùng lặp', + 'delete-stage' => 'Xóa Giai Đoạn', + 'add-new-stages' => 'Thêm Giai Đoạn Mới', + 'add-stage-info' => 'Thêm giai đoạn mới cho Quy trình của bạn', + 'newly-added' => 'Mới Thêm', + 'stage-delete-success' => 'Giai Đoạn đã được xóa thành công', + ], + 'edit' => [ + 'title' => 'Chỉnh Sửa Quy Trình', + 'save-btn' => 'Lưu Quy Trình', + 'name' => 'Tên', + 'rotten-days' => 'Ngày Hỏng', + 'mark-as-default' => 'Đánh dấu là Mặc định', + 'general' => 'Chung', + 'probability' => 'Xác Suất (%)', + 'new-stage' => 'Mới', + 'won-stage' => 'Thắng', + 'lost-stage' => 'Thua', + 'stage-btn' => 'Thêm Giai Đoạn', + 'stages' => 'Các Giai Đoạn', + 'duplicate-name' => 'Trường "Tên" không được trùng lặp', + 'delete-stage' => 'Xóa Giai Đoạn', + 'add-new-stages' => 'Thêm Giai Đoạn Mới', + 'add-stage-info' => 'Thêm giai đoạn mới cho Quy trình của bạn', + 'stage-delete-success' => 'Giai Đoạn đã được xóa thành công', + ], + ], + 'webhooks' => [ + 'index' => [ + 'title' => 'Webhooks', + 'create-btn' => 'Tạo Webhook', + 'create-success' => 'Webhook đã được tạo thành công.', + 'update-success' => 'Webhook đã được cập nhật thành công.', + 'delete-success' => 'Webhook đã được xóa thành công.', + 'delete-failed' => 'Webhook không thể bị xóa.', + 'datagrid' => [ + 'id' => 'ID', + 'delete' => 'Xóa', + 'edit' => 'Chỉnh sửa', + 'name' => 'Tên', + 'entity-type' => 'Loại Đối Tượng', + 'end-point' => 'Điểm Kết Thúc', + ], + ], + 'create' => [ + 'title' => 'Tạo Webhook', + 'save-btn' => 'Lưu Webhook', + 'info' => 'Nhập thông tin chi tiết của webhooks', + 'url-and-parameters' => 'URL Và Tham Số', + 'method' => 'Phương Thức', + 'post' => 'Post', + 'put' => 'Put', + 'url-endpoint' => 'Điểm Kết Thúc URL', + 'parameters' => 'Tham Số', + 'add-new-parameter' => 'Thêm Tham Số Mới', + 'url-preview' => 'Xem Trước URL:', + 'headers' => 'Tiêu Đề', + 'add-new-header' => 'Thêm Tiêu Đề Mới', + 'body' => 'Nội Dung', + 'default' => 'Mặc định', + 'x-www-form-urlencoded' => 'x-www-form-urlencoded', + 'key-and-value' => 'Khóa và Giá trị', + 'add-new-payload' => 'Thêm payload mới', + 'raw' => 'Thô', + 'general' => 'Chung', + 'name' => 'Tên', + 'entity-type' => 'Loại Đối Tượng', + 'insert-placeholder' => 'Chèn Placeholder', + 'description' => 'Mô Tả', + 'json' => 'Json', + 'text' => 'Văn bản', + ], + 'edit' => [ + 'title' => 'Chỉnh Sửa Webhook', + 'edit-btn' => 'Lưu Webhook', + 'save-btn' => 'Lưu Webhook', + 'info' => 'Nhập thông tin chi tiết của webhooks', + 'url-and-parameters' => 'URL Và Tham Số', + 'method' => 'Phương Thức', + 'post' => 'Post', + 'put' => 'Put', + 'url-endpoint' => 'Điểm Kết Thúc URL', + 'parameters' => 'Tham Số', + 'add-new-parameter' => 'Thêm Tham Số Mới', + 'url-preview' => 'Xem Trước URL:', + 'headers' => 'Tiêu Đề', + 'add-new-header' => 'Thêm Tiêu Đề Mới', + 'body' => 'Nội Dung', + 'default' => 'Mặc định', + 'x-www-form-urlencoded' => 'x-www-form-urlencoded', + 'key-and-value' => 'Khóa và Giá trị', + 'add-new-payload' => 'Thêm payload mới', + 'raw' => 'Thô', + 'general' => 'Chung', + 'name' => 'Tên', + 'entity-type' => 'Loại Đối Tượng', + 'insert-placeholder' => 'Chèn Placeholder', + 'description' => 'Mô Tả', + 'json' => 'Json', + 'text' => 'Văn bản', + ], + ], + 'warehouses' => [ + 'index' => [ + 'title' => 'Kho Hàng', + 'create-btn' => 'Tạo Kho Hàng', + 'create-success' => 'Kho hàng đã được tạo thành công.', + 'name-exists' => 'Tên kho hàng đã tồn tại.', + 'update-success' => 'Kho hàng đã được cập nhật thành công.', + 'delete-success' => 'Kho hàng đã được xóa thành công.', + 'delete-failed' => 'Kho hàng không thể bị xóa.', + 'datagrid' => [ + 'id' => 'ID', + 'name' => 'Tên', + 'contact-name' => 'Tên Liên Hệ', + 'delete' => 'Xóa', + 'edit' => 'Chỉnh sửa', + 'view' => 'Xem', + 'created-at' => 'Ngày Tạo', + 'products' => 'Sản Phẩm', + 'contact-emails' => 'Email Liên Hệ', + 'contact-numbers' => 'Số Điện Thoại Liên Hệ', + ], + ], + 'create' => [ + 'title' => 'Tạo Kho Hàng', + 'save-btn' => 'Lưu Kho Hàng', + 'contact-info' => 'Thông Tin Liên Hệ', + ], + 'edit' => [ + 'title' => 'Chỉnh Sửa Kho Hàng', + 'save-btn' => 'Lưu Kho Hàng', + 'contact-info' => 'Thông Tin Liên Hệ', + ], + 'view' => [ + 'all' => 'Tất Cả', + 'notes' => 'Ghi Chú', + 'files' => 'Tệp', + 'location' => 'Vị Trí', + 'change-logs' => 'Nhật Ký Thay Đổi', + 'locations' => [ + 'action' => 'Hành Động', + 'add-location' => 'Thêm Vị Trí', + 'create-success' => 'Vị trí đã được tạo thành công.', + 'delete' => 'Xóa', + 'delete-failed' => 'Vị trí không thể bị xóa.', + 'delete-success' => 'Vị trí đã được xóa thành công.', + 'name' => 'Tên', + 'save-btn' => 'Lưu', + ], + 'general-information' => [ + 'title' => 'Thông Tin Chung', + ], + 'contact-information' => [ + 'title' => 'Thông Tin Liên Hệ', + ], + ], + ], + 'attributes' => [ + 'index' => [ + 'title' => 'Thuộc Tính', + 'create-btn' => 'Tạo Thuộc Tính', + 'create-success' => 'Thuộc tính đã được tạo thành công.', + 'update-success' => 'Thuộc tính đã được cập nhật thành công.', + 'delete-success' => 'Thuộc tính đã được xóa thành công.', + 'delete-failed' => 'Không thể xóa thuộc tính.', + 'user-define-error' => 'Không thể xóa thuộc tính hệ thống.', + 'mass-delete-failed' => 'Các thuộc tính hệ thống không thể bị xóa.', + 'datagrid' => [ + 'yes' => 'Có', + 'no' => 'Không', + 'id' => 'ID', + 'code' => 'Mã', + 'name' => 'Tên', + 'entity-type' => 'Loại Thực Thể', + 'type' => 'Loại', + 'is-default' => 'Mặc Định', + 'edit' => 'Chỉnh sửa', + 'delete' => 'Xóa', + 'entity-types' => [ + 'leads' => 'Khách hàng tiềm năng', + 'organizations' => 'Tổ chức', + 'persons' => 'Người', + 'products' => 'Sản phẩm', + 'quotes' => 'Báo giá', + 'warehouses' => 'Kho hàng', + ], + 'types' => [ + 'text' => 'Văn bản', + 'textarea' => 'Vùng văn bản', + 'price' => 'Giá', + 'boolean' => 'Boolean', + 'select' => 'Chọn', + 'multiselect' => 'Chọn nhiều', + 'checkbox' => 'Hộp kiểm', + 'email' => 'Email', + 'address' => 'Địa chỉ', + 'phone' => 'Điện thoại', + 'lookup' => 'Tìm kiếm', + 'datetime' => 'Ngày giờ', + 'date' => 'Ngày', + 'image' => 'Hình ảnh', + 'file' => 'Tệp tin', + ], + ], + ], + 'create' => [ + 'title' => 'Tạo Thuộc Tính', + 'save-btn' => 'Lưu Thuộc Tính', + 'code' => 'Mã', + 'name' => 'Tên', + 'entity-type' => 'Loại Thực Thể', + 'type' => 'Loại', + 'validations' => 'Xác Thực', + 'is-required' => 'Bắt Buộc', + 'input-validation' => 'Xác Thực Đầu Vào', + 'is-unique' => 'Là Độc Nhất', + 'labels' => 'Nhãn', + 'general' => 'Chung', + 'numeric' => 'Số', + 'decimal' => 'Thập Phân', + 'url' => 'Url', + 'options' => 'Tùy Chọn', + 'option-type' => 'Loại Tùy Chọn', + 'lookup-type' => 'Loại Tra Cứu', + 'add-option' => 'Thêm Tùy Chọn', + 'save-option' => 'Lưu Tùy Chọn', + 'option-name' => 'Tên Tùy Chọn', + 'add-attribute-options' => 'Thêm Tùy Chọn Thuộc Tính', + 'text' => 'Văn Bản', + 'textarea' => 'Khung Văn Bản', + 'price' => 'Giá', + 'boolean' => 'Boolean', + 'select' => 'Chọn', + 'multiselect' => 'Chọn Nhiều', + 'email' => 'Email', + 'address' => 'Địa Chỉ', + 'phone' => 'Điện Thoại', + 'datetime' => 'Ngày Giờ', + 'date' => 'Ngày', + 'image' => 'Hình Ảnh', + 'file' => 'Tệp', + 'lookup' => 'Tra Cứu', + 'entity_type' => 'Loại thực thể', + 'checkbox' => 'Hộp Kiểm', + 'is_required' => 'Bắt Buộc', + 'is_unique' => 'Là Độc Nhất', + 'actions' => 'Hành Động', + ], + 'edit' => [ + 'actions' => 'Hành Động', + 'add-attribute-options' => 'Thêm Tùy Chọn Thuộc Tính', + 'add-option' => 'Thêm Tùy Chọn', + 'address' => 'Địa Chỉ', + 'boolean' => 'Boolean', + 'checkbox' => 'Hộp Kiểm', + 'code' => 'Mã', + 'date' => 'Ngày', + 'datetime' => 'Ngày Giờ', + 'decimal' => 'Thập Phân', + 'email' => 'Email', + 'entity-type' => 'Loại Thực Thể', + 'entity_type' => 'Loại thực thể', + 'file' => 'Tệp', + 'general' => 'Chung', + 'image' => 'Hình Ảnh', + 'input-validation' => 'Xác Thực Đầu Vào', + 'is-required' => 'Bắt Buộc', + 'is-unique' => 'Là Độc Nhất', + 'is_required' => 'Bắt Buộc', + 'is_unique' => 'Là Độc Nhất', + 'labels' => 'Nhãn', + 'lookup' => 'Tra Cứu', + 'lookup-type' => 'Loại Tra Cứu', + 'multiselect' => 'Chọn Nhiều', + 'name' => 'Tên', + 'numeric' => 'Số', + 'option-deleted' => 'Attribute Option is deleted successfully', + 'option-name' => 'Tên Tùy Chọn', + 'option-type' => 'Loại Tùy Chọn', + 'options' => 'Tùy Chọn', + 'phone' => 'Điện Thoại', + 'price' => 'Giá', + 'save-btn' => 'Lưu Thuộc Tính', + 'save-option' => 'Lưu Tùy Chọn', + 'select' => 'Chọn', + 'text' => 'Văn Bản', + 'textarea' => 'Khung Văn Bản', + 'title' => 'Chỉnh Sửa Thuộc Tính', + 'type' => 'Loại', + 'url' => 'Url', + 'validations' => 'Xác Thực', + ], + ], + 'data-transfer' => [ + 'imports' => [ + 'create' => [ + 'action' => 'Action', + 'allowed-errors' => 'Allowed Errors', + 'back-btn' => 'Back', + 'create-update' => 'Create/Update', + 'delete' => 'Delete', + 'download-sample' => 'Download Sample', + 'field-separator' => 'Field Separator', + 'file' => 'File', + 'general' => 'General', + 'images-directory' => 'Images Directory Path', + 'process-in-queue' => 'Process In Queue', + 'results' => 'Results', + 'save-btn' => 'Save Import', + 'settings' => 'Settings', + 'skip-errors' => 'Skip Errors', + 'stop-on-errors' => 'Stop on Errors', + 'title' => 'Create Import', + 'type' => 'Type', + 'validation-strategy' => 'Validation Strategy', + ], + 'edit' => [ + 'action' => 'Action', + 'allowed-errors' => 'Allowed Errors', + 'back-btn' => 'Back', + 'create-update' => 'Create/Update', + 'delete' => 'Delete', + 'download-sample' => 'Download Sample', + 'field-separator' => 'Field Separator', + 'file' => 'File', + 'general' => 'General', + 'images-directory' => 'Images Directory Path', + 'process-in-queue' => 'Process In Queue', + 'results' => 'Results', + 'save-btn' => 'Save Import', + 'settings' => 'Settings', + 'skip-errors' => 'Skip Errors', + 'stop-on-errors' => 'Stop on Errors', + 'title' => 'Edit Import', + 'type' => 'Type', + 'validation-strategy' => 'Validation Strategy', + ], + 'index' => [ + 'button-title' => 'Create Import', + 'title' => 'Imports', + 'datagrid' => [ + 'actions' => 'Actions', + 'completed-at' => 'Completed At', + 'created' => 'Created', + 'delete' => 'Delete', + 'deleted' => 'Deleted', + 'edit' => 'Edit', + 'error-file' => 'Error File', + 'id' => 'ID', + 'started-at' => 'Started At', + 'state' => 'State', + 'summary' => 'Summary', + 'type' => 'Type', + 'updated' => 'Updated', + 'uploaded-file' => 'Uploaded File', + ], + ], + 'import' => [ + 'back-btn' => 'Back', + 'completed-batches' => 'Total Batches Completed:', + 'download-error-report' => 'Download Full Report', + 'edit-btn' => 'Edit', + 'imported-info' => 'Congratulations! Your import was successful.', + 'importing-info' => 'Import In Process', + 'indexing-info' => 'Resources Indexing (Price, Inventory and Elastic Search) In Progress', + 'linking-info' => 'Resources Linking In Progress', + 'progress' => 'Progress:', + 'title' => 'Import', + 'total-batches' => 'Total Batches:', + 'total-created' => 'Total Records Created:', + 'total-deleted' => 'Total Records Deleted:', + 'total-errors' => 'Total Errors:', + 'total-invalid-rows' => 'Total Invalid Rows:', + 'total-rows-processed' => 'Total Rows Processed:', + 'total-updated' => 'Total Records Updated:', + 'validate' => 'Validate', + 'validate-info' => 'Click on Validate Data to check your import.', + 'validating-info' => 'The data started reading and Validating', + 'validation-failed-info' => 'Your import is invalid. Please fix the following errors and try again.', + 'validation-success-info' => 'Your import is valid. Click on Import to start the import process.', + ], + 'create-success' => 'Import created successfully.', + 'delete-failed' => 'Import deletion failed unexpectedly.', + 'delete-success' => 'Import deleted successfully.', + 'not-valid' => 'Import is invalid', + 'nothing-to-import' => 'There are no resources to import.', + 'setup-queue-error' => 'Please change your queue driver to "database" or "redis" to start the import process.', + 'update-success' => 'Import updated successfully.', + ], + ], + ], + 'activities' => [ + 'index' => [ + 'title' => 'Hoạt Động', + 'datagrid' => [ + 'comment' => 'Ghi Chú', + 'created_at' => 'Thời Gian Tạo', + 'created_by' => 'Người Tạo', + 'edit' => 'Chỉnh Sửa', + 'id' => 'ID', + 'done' => 'Đã Hoàn Thành', + 'not-done' => 'Chưa Hoàn Thành', + 'lead' => 'Người Dẫn Dắt', + 'mass-delete' => 'Xóa Hàng Loạt', + 'mass-update' => 'Cập Nhật Hàng Loạt', + 'schedule-from' => 'Lịch Từ', + 'schedule-to' => 'Lịch Đến', + 'schedule_from' => 'Lịch Từ', + 'schedule_to' => 'Lịch Đến', + 'title' => 'Tiêu Đề', + 'is_done' => 'Đã Hoàn Thành', + 'type' => 'Loại', + 'update' => 'Cập Nhật', + 'call' => 'Cuộc Gọi', + 'meeting' => 'Cuộc Họp', + 'lunch' => 'Bữa Trưa', + ], + ], + 'edit' => [ + 'title' => 'Chỉnh Sửa Hoạt Động', + 'back-btn' => 'Quay Lại', + 'save-btn' => 'Lưu Hoạt Động', + 'type' => 'Loại Hoạt Động', + 'call' => 'Cuộc Gọi', + 'meeting' => 'Cuộc Họp', + 'lunch' => 'Bữa Trưa', + 'schedule_to' => 'Lịch Đến', + 'schedule_from' => 'Lịch Từ', + 'location' => 'Địa Điểm', + 'comment' => 'Ghi Chú', + 'lead' => 'Người Dẫn Dắt', + 'participants' => 'Người Tham Gia', + 'general' => 'Chung', + 'persons' => 'Người', + 'no-result-found' => 'Không tìm thấy bản ghi.', + 'users' => 'Người Dùng', + ], + 'updated' => 'Đã cập nhật :attribute', + 'created' => 'Đã tạo', + 'duration-overlapping' => 'Người tham gia có một cuộc họp khác vào thời điểm này. Bạn có muốn tiếp tục không?', + 'create-success' => 'Hoạt động được tạo thành công.', + 'update-success' => 'Hoạt động được cập nhật thành công.', + 'overlapping-error' => 'Người tham gia có một cuộc họp khác vào thời điểm này.', + 'destroy-success' => 'Hoạt động đã được xóa thành công.', + 'delete-failed' => 'Không thể xóa hoạt động.', + 'mass-update-success' => 'Hoạt động được cập nhật thành công.', + 'mass-destroy-success' => 'Hoạt động đã được xóa thành công.', + 'mass-delete-failed' => 'Không thể xóa hoạt động.', + ], + 'mail' => [ + 'index' => [ + 'compose' => 'Soạn Thư', + 'draft' => 'Thư Nháp', + 'inbox' => 'Hộp Thư Đến', + 'outbox' => 'Hộp Thư Đi', + 'sent' => 'Đã Gửi', + 'trash' => 'Thùng Rác', + 'compose-mail-btn' => 'Soạn Thư', + 'btn' => 'Thư', + 'mail' => [ + 'title' => 'Soạn Thư', + 'to' => 'Đến', + 'enter-emails' => 'Nhấn enter để thêm email', + 'cc' => 'CC', + 'bcc' => 'BCC', + 'subject' => 'Chủ Đề', + 'send-btn' => 'Gửi', + 'message' => 'Tin Nhắn', + 'draft' => 'Thư Nháp', + ], + 'datagrid' => [ + 'id' => 'ID', + 'from' => 'Từ', + 'to' => 'Đến', + 'subject' => 'Chủ đề', + 'tags' => 'Thẻ', + 'content' => 'Nội dung', + 'attachments' => 'Tệp đính kèm', + 'date' => 'Ngày', + 'move-to-inbox' => 'Di chuyển vào hộp thư đến', + 'move-to-trash' => 'Đã chuyển vào thùng rác', + 'edit' => 'Chỉnh sửa', + 'view' => 'Xem', + 'delete' => 'Xóa', + ], + ], + 'create-success' => 'Email đã được gửi thành công.', + 'update-success' => 'Email đã được cập nhật thành công.', + 'mass-update-success' => 'Các email đã được cập nhật thành công.', + 'delete-success' => 'Email đã được xóa thành công.', + 'delete-failed' => 'Email không thể bị xóa.', + 'view' => [ + 'title' => 'Thư', + 'subject' => ':subject', + 'link-mail' => 'Liên Kết Thư', + 'to' => 'Đến', + 'cc' => 'CC', + 'bcc' => 'BCC', + 'reply' => 'Trả Lời', + 'reply-all' => 'Trả Lời Tất Cả', + 'forward' => 'Chuyển Tiếp', + 'delete' => 'Xóa', + 'enter-mails' => 'Nhập ID email', + 'rotten-days' => 'Người dẫn dắt đã hỏng trong :days ngày', + 'search-an-existing-lead' => 'Tìm kiếm người dẫn dắt hiện có', + 'search-an-existing-contact' => 'Tìm kiếm liên hệ hiện có', + 'message' => 'Tin Nhắn', + 'add-attachments' => 'Thêm Tệp Đính Kèm', + 'discard' => 'Bỏ Qua', + 'send' => 'Gửi', + 'no-result-found' => 'Không tìm thấy kết quả', + 'add-new-contact' => 'Thêm Liên Hệ Mới', + 'description' => 'Mô Tả', + 'search' => 'Tìm kiếm...', + 'add-new-lead' => 'Thêm Người Dẫn Dắt Mới', + 'create-new-contact' => 'Tạo Liên Hệ Mới', + 'save-contact' => 'Lưu Liên Hệ', + 'create-lead' => 'Tạo Người Dẫn Dắt', + 'linked-contact' => 'Liên Hệ Đã Liên Kết', + 'link-to-contact' => 'Liên Kết Với Liên Hệ', + 'link-to-lead' => 'Liên Kết Với Người Dẫn Dắt', + 'linked-lead' => 'Người Dẫn Dắt Đã Liên Kết', + 'lead-details' => 'Chi Tiết Người Dẫn Dắt', + 'contact-person' => 'Người Liên Hệ', + 'product' => 'Sản Phẩm', + 'tags' => [ + 'create-success' => 'Thẻ đã được tạo thành công.', + 'destroy-success' => 'Thẻ đã được xóa thành công.', + ], + ], + ], + 'common' => [ + 'custom-attributes' => [ + 'add-more' => 'Thêm Nữa', + 'address' => 'Địa Chỉ', + 'city' => 'Thành Phố', + 'contact' => 'Số Liên Lạc', + 'country' => 'Quốc Gia', + 'email' => 'Email', + 'home' => 'Nhà', + 'postcode' => 'Mã Bưu Chính', + 'save' => 'Lưu', + 'select' => 'Chọn', + 'select-country' => 'Chọn Quốc Gia', + 'select-state' => 'Chọn Bang', + 'state' => 'Bang', + 'update-contact-title' => 'Cập Nhật Số Liên Lạc', + 'update-emails-title' => 'Cập Nhật Email Liên Hệ', + 'work' => 'Công Việc', + ], + ], + 'leads' => [ + 'create-success' => 'Tạo khách hàng tiềm năng thành công.', + 'update-success' => 'Cập nhật khách hàng tiềm năng thành công.', + 'update-failed' => 'Leads can not be deleted.', + 'destroy-success' => 'Xóa khách hàng tiềm năng thành công.', + 'destroy-failed' => 'Không thể xóa khách hàng tiềm năng.', + 'file' => [ + 'data-not-found' => 'Không tìm thấy dữ liệu.', + 'empty-content' => 'Nội dung PDF trống hoặc không thể trích xuất.', + 'failed-extract' => 'Không thể trích xuất văn bản từ tệp.', + 'insufficient-info' => 'Do dữ liệu không đủ, chúng tôi không thể xử lý yêu cầu của bạn vào lúc này.', + 'invalid-base64' => 'Định dạng base64 không hợp lệ.', + 'invalid-format' => 'Định dạng JSON không hợp lệ.', + 'invalid-response' => 'Định dạng phản hồi AI không hợp lệ.', + 'missing-api-key' => 'Thiếu khóa API hoặc cấu hình mô hình.', + 'not-found' => 'Không tìm thấy tệp.', + 'recursive-call' => 'Phát hiện cuộc gọi đệ quy.', + 'text-generation-failed' => 'Trích xuất văn bản thất bại. Tệp có thể trống hoặc không đọc được.', + ], + 'index' => [ + 'title' => 'Khách Hàng Tiềm Năng', + 'create-btn' => 'Tạo Khách Hàng Tiềm Năng', + 'datagrid' => [ + 'id' => 'ID', + 'sales-person' => 'Nhân Viên Kinh Doanh', + 'subject' => 'Chủ Đề', + 'source' => 'Nguồn', + 'lead-value' => 'Giá Trị Khách Hàng', + 'lead-type' => 'Loại Khách Hàng', + 'tag-name' => 'Tên Thẻ', + 'contact-person' => 'Người Liên Hệ', + 'stage' => 'Giai Đoạn', + 'rotten-lead' => 'Khách Hàng Tiềm Năng Hết Hạn', + 'date-to' => 'Ngày Đến', + 'created-at' => 'Tạo Vào Lúc', + 'no' => 'Không', + 'yes' => 'Có', + 'delete' => 'Xóa', + 'mass-delete' => 'Xóa Hàng Loạt', + 'mass-update' => 'Cập Nhật Hàng Loạt', + ], + 'kanban' => [ + 'rotten-days' => 'Khách hàng tiềm năng đã hết hạn trong :days ngày', + 'empty-list' => 'Danh sách khách hàng tiềm năng của bạn trống', + 'empty-list-description' => 'Tạo một khách hàng tiềm năng để tổ chức các mục tiêu của bạn.', + 'create-lead-btn' => 'Tạo Khách Hàng Tiềm Năng', + 'columns' => [ + 'contact-person' => 'Người Liên Hệ', + 'id' => 'ID', + 'lead-type' => 'Loại Khách Hàng', + 'lead-value' => 'Giá Trị Khách Hàng', + 'sales-person' => 'Nhân Viên Kinh Doanh', + 'source' => 'Nguồn', + 'title' => 'Tiêu Đề', + 'tags' => 'Thẻ', + 'expected-close-date' => 'Ngày Dự Kiến Đóng', + 'created-at' => 'Tạo Vào Lúc', + ], + 'toolbar' => [ + 'search' => [ + 'title' => 'Tìm kiếm theo tiêu đề', + ], + 'filters' => [ + 'apply-filters' => 'Áp Dụng Bộ Lọc', + 'clear-all' => 'Xóa Tất Cả', + 'filter' => 'Bộ Lọc', + 'filters' => 'Bộ Lọc', + 'from' => 'Từ', + 'select' => 'Chọn', + 'to' => 'Đến', + ], + ], + ], + 'view-switcher' => [ + 'all-pipelines' => 'Tất Cả Các Quy Trình', + 'create-new-pipeline' => 'Tạo Quy Trình Mới', + ], + 'upload' => [ + 'create-lead' => 'Tạo Khách Hàng Tiềm Năng Bằng AI', + 'file' => 'Tải tệp lên', + 'file-info' => 'Chỉ chấp nhận các tệp định dạng pdf, bmp, jpg, jpeg, png.', + 'file-required' => 'Vui lòng chọn ít nhất một tệp hợp lệ để tiếp tục.', + 'save-btn' => 'Lưu', + 'upload-file' => 'Tải lên tệp', + ], + ], + 'create' => [ + 'title' => 'Tạo Khách Hàng Tiềm Năng', + 'save-btn' => 'Lưu', + 'details' => 'Chi Tiết', + 'details-info' => 'Nhập Thông Tin Cơ Bản Của Khách Hàng Tiềm Năng', + 'contact-person' => 'Người Liên Hệ', + 'contact-info' => 'Thông Tin Về Người Liên Hệ', + 'products' => 'Sản Phẩm', + 'products-info' => 'Thông Tin Về Sản Phẩm', + ], + 'edit' => [ + 'title' => 'Chỉnh Sửa Khách Hàng Tiềm Năng', + 'save-btn' => 'Lưu', + 'details' => 'Chi Tiết', + 'details-info' => 'Nhập Thông Tin Cơ Bản Của Khách Hàng Tiềm Năng', + 'contact-person' => 'Người Liên Hệ', + 'contact-info' => 'Thông Tin Về Người Liên Hệ', + 'products' => 'Sản Phẩm', + 'products-info' => 'Thông Tin Về Sản Phẩm', + ], + 'common' => [ + 'contact' => [ + 'name' => 'Tên', + 'email' => 'Email', + 'contact-number' => 'Số Liên Lạc', + 'organization' => 'Tổ Chức', + ], + 'products' => [ + 'product-name' => 'Tên Sản Phẩm', + 'quantity' => 'Số Lượng', + 'price' => 'Giá', + 'amount' => 'Tổng Tiền', + 'action' => 'Hành Động', + 'add-more' => 'Thêm Nữa', + 'total' => 'Tổng Cộng', + ], + ], + 'view' => [ + 'title' => 'Khách Hàng Tiềm Năng: :title', + 'rotten-days' => ':days Ngày', + 'tabs' => [ + 'description' => 'Mô Tả', + 'products' => 'Sản Phẩm', + 'quotes' => 'Báo Giá', + ], + 'attributes' => [ + 'title' => 'Về Khách Hàng Tiềm Năng', + ], + 'quotes' => [ + 'subject' => 'Chủ Đề', + 'expired-at' => 'Hết Hạn Vào', + 'sub-total' => 'Tạm Tính', + 'discount' => 'Giảm Giá', + 'tax' => 'Thuế', + 'adjustment' => 'Điều Chỉnh', + 'grand-total' => 'Tổng Cộng', + 'delete' => 'Xóa', + 'edit' => 'Chỉnh Sửa', + 'download' => 'Tải Xuống', + 'destroy-success' => 'Xóa báo giá thành công.', + 'empty-title' => 'Không Có Báo Giá', + 'empty-info' => 'Không Có Báo Giá Cho Khách Hàng Tiềm Năng Này', + 'add-btn' => 'Thêm Báo Giá', + ], + 'products' => [ + 'product-name' => 'Tên Sản Phẩm', + 'quantity' => 'Số Lượng', + 'price' => 'Giá', + 'amount' => 'Tổng Tiền', + 'action' => 'Hành Động', + 'add-more' => 'Thêm Nữa', + 'total' => 'Tổng Cộng', + 'empty-title' => 'Không Có Sản Phẩm', + 'empty-info' => 'Không Có Sản Phẩm Cho Khách Hàng Tiềm Năng Này', + 'add-product' => 'Thêm Sản Phẩm', + ], + 'persons' => [ + 'title' => 'Về Người Liên Hệ', + 'job-title' => ':job_title tại :organization', + ], + 'stages' => [ + 'won-lost' => 'Thắng/Thua', + 'won' => 'Thắng', + 'lost' => 'Thua', + 'need-more-info' => 'Cần Thêm Thông Tin', + 'closed-at' => 'Đóng Vào', + 'won-value' => 'Giá Trị Thắng', + 'lost-reason' => 'Lý Do Thua', + 'save-btn' => 'Lưu', + ], + 'tags' => [ + 'create-success' => 'Tạo thẻ thành công.', + 'destroy-success' => 'Xóa thẻ thành công.', + ], + ], + ], + 'configuration' => [ + 'index' => [ + 'back' => 'Quay lại', + 'delete' => 'Xóa', + 'save-btn' => 'Lưu Cấu hình', + 'save-success' => 'Cấu hình đã được lưu thành công.', + 'search' => 'Tìm kiếm', + 'select-country' => 'Chọn Quốc gia', + 'select-state' => 'Chọn Bang', + 'title' => 'Cấu hình', + 'general' => [ + 'title' => 'Chung', + 'info' => 'Cấu hình chung', + 'general' => [ + 'title' => 'Chung', + 'info' => 'Cập nhật cài đặt chung của bạn tại đây.', + 'locale-settings' => [ + 'title' => 'Cài đặt ngôn ngữ', + 'title-info' => 'Định nghĩa ngôn ngữ được sử dụng trong giao diện người dùng, như tiếng Ả Rập (ar), tiếng Anh (en), tiếng Tây Ban Nha (es), tiếng Ba Tư (fa) và tiếng Thổ Nhĩ Kỳ (tr).', + ], + 'admin-logo' => [ + 'logo-image' => 'Hình ảnh Logo', + 'title' => 'Logo Quản trị', + 'title-info' => 'Cấu hình hình ảnh logo cho bảng điều khiển quản trị của bạn.', + ], + ], + 'settings' => [ + 'title' => 'Settings', + 'info' => 'Update your settings here.', + 'footer' => [ + 'info' => 'We can configure the powered by section here.', + 'powered-by' => 'Powered by text editor', + 'title' => 'Powered by Section Configurations', + ], + 'menu' => [ + 'activities' => 'Activities', + 'configuration' => 'Configuration', + 'contacts' => 'Contacts', + 'dashboard' => 'Dashboard', + 'draft' => 'Draft', + 'inbox' => 'Inbox', + 'info' => 'We can configure the menu items name here.', + 'leads' => 'Leads', + 'mail' => 'Mail', + 'organizations' => 'Organizations', + 'outbox' => 'Outbox', + 'persons' => 'Persons', + 'products' => 'Products', + 'quotes' => 'Quotes', + 'sent' => 'Sent', + 'settings' => 'Settings', + 'title' => 'Menu Item Configurations', + 'trash' => 'Trash', + ], + 'menu-color' => [ + 'brand-color' => 'Brand Color', + 'info' => 'We can change the menu items colors here.', + 'title' => 'Menu Item Color Configurations', + ], + ], + ], + 'email' => [ + 'title' => 'Cài đặt Email', + 'info' => 'Cấu hình email cho ứng dụng.', + 'imap' => [ + 'title' => 'Cài đặt IMAP', + 'info' => 'Cấu hình email IMAP để nhận email.', + 'account' => [ + 'title' => 'Tài khoản IMAP', + 'title-info' => 'Cấu hình cài đặt tài khoản IMAP của bạn tại đây.', + 'host' => 'Máy chủ', + 'port' => 'Cổng', + 'encryption' => 'Loại mã hóa', + 'validate-cert' => 'Xác thực chứng chỉ SSL', + 'username' => 'Tên người dùng IMAP', + 'password' => 'Mật khẩu IMAP', + ], + ], + ], + 'magic-ai' => [ + 'title' => 'Magic AI', + 'info' => 'Cấu hình Magic AI cho ứng dụng.', + 'settings' => [ + 'api-key' => 'Khóa API', + 'api-key-info' => 'Nhớ sử dụng khóa API OpenRouter cho mỗi mô hình. Đây là một bước đơn giản để tăng cường bảo mật và hiệu suất.', + 'enable' => 'Kích hoạt', + 'info' => 'Nâng cao trải nghiệm Magic AI của bạn với Khóa API OpenRouter. Tích hợp ngay bây giờ để có một cuộc phiêu lưu AI liền mạch và cá nhân hóa chỉ dành cho bạn! Dễ dàng tùy chỉnh cài đặt và kiểm soát hành trình AI của bạn.', + 'other' => 'Mô hình khác', + 'other-model' => 'Đối với các mô hình khác, sử dụng ID Mô hình từ OpenRouter.', + 'doc-generation' => 'Tạo DOC', + 'doc-generation-info' => 'Bật tính năng Tạo DOC để tự động trích xuất dữ liệu từ các tệp DOC và chuyển đổi chúng sang định dạng văn bản. Nâng cao năng suất và hiệu quả công việc bằng cách bật tính năng này để đơn giản hóa quy trình làm việc của bạn.', + 'title' => 'General Settings', + 'models' => [ + 'deepseek-r1' => 'Deepseek R1 Distill-llama-8b', + 'gemini-2-0-flash-001' => 'Gemini 2.0 flash-001', + 'gpt-4o' => 'GPT-4.0', + 'gpt-4o-mini' => 'GPT-4.0 mini', + 'grok-2-1212' => 'Grok 2.12', + 'llama-3-2-3b-instruct' => 'Llama 3.2 3b Instruct', + 'title' => 'Mô hình', + ], + ], + ], + ], + ], + 'dashboard' => [ + 'index' => [ + 'title' => 'Bảng Điều Khiển', + 'revenue' => [ + 'lost-revenue' => 'Doanh Thu Bị Mất', + 'won-revenue' => 'Doanh Thu Đã Đạt', + ], + 'over-all' => [ + 'average-lead-value' => 'Giá Trị Lead Trung Bình', + 'total-leads' => 'Tổng Số Lead', + 'average-leads-per-day' => 'Số Lead Trung Bình Mỗi Ngày', + 'total-quotations' => 'Tổng Số Báo Giá', + 'total-persons' => 'Tổng Số Người Liên Hệ', + 'total-organizations' => 'Tổng Số Tổ Chức', + ], + 'total-leads' => [ + 'title' => 'Leads', + 'total' => 'Tổng Số Lead', + 'won' => 'Lead Đã Đạt', + 'lost' => 'Lead Bị Mất', + ], + 'revenue-by-sources' => [ + 'title' => 'Doanh Thu Theo Nguồn', + 'empty-title' => 'Không Có Dữ Liệu', + 'empty-info' => 'Không có dữ liệu cho khoảng thời gian được chọn', + ], + 'revenue-by-types' => [ + 'title' => 'Doanh Thu Theo Loại', + 'empty-title' => 'Không Có Dữ Liệu', + 'empty-info' => 'Không có dữ liệu cho khoảng thời gian được chọn', + ], + 'top-selling-products' => [ + 'title' => 'Sản Phẩm Bán Chạy Nhất', + 'empty-title' => 'Không Tìm Thấy Sản Phẩm', + 'empty-info' => 'Không có sản phẩm nào cho khoảng thời gian được chọn', + ], + 'top-persons' => [ + 'title' => 'Người Liên Hệ Hàng Đầu', + 'empty-title' => 'Không Tìm Thấy Người Liên Hệ', + 'empty-info' => 'Không có người liên hệ nào cho khoảng thời gian được chọn', + ], + 'open-leads-by-states' => [ + 'title' => 'Khách hàng tiềm năng mở theo giai đoạn', + 'empty-title' => 'Không Có Dữ Liệu', + 'empty-info' => 'Không có dữ liệu cho khoảng thời gian được chọn', + ], + ], + ], + 'layouts' => [ + 'app-version' => 'Phiên Bản : :version', + 'dashboard' => 'Bảng Điều Khiển', + 'leads' => 'Leads', + 'quotes' => 'Báo Giá', + 'quote' => 'Báo Giá', + 'mail' => [ + 'title' => 'Thư', + 'compose' => 'Soạn Thư', + 'inbox' => 'Hộp Thư Đến', + 'draft' => 'Thư Nháp', + 'outbox' => 'Hộp Thư Đi', + 'sent' => 'Đã Gửi', + 'trash' => 'Thùng Rác', + 'setting' => 'Cài Đặt', + ], + 'activities' => 'Hoạt Động', + 'contacts' => 'Liên Hệ', + 'persons' => 'Người Liên Hệ', + 'person' => 'Người Liên Hệ', + 'organizations' => 'Tổ Chức', + 'organization' => 'Tổ Chức', + 'products' => 'Sản Phẩm', + 'product' => 'Sản Phẩm', + 'settings' => 'Cài Đặt', + 'user' => 'Người Dùng', + 'user-info' => 'Quản lý tất cả người dùng và quyền hạn của họ trong CRM, những gì họ được phép làm.', + 'groups' => 'Nhóm', + 'groups-info' => 'Thêm, chỉnh sửa hoặc xóa nhóm khỏi CRM', + 'roles' => 'Vai Trò', + 'role' => 'Vai Trò', + 'roles-info' => 'Thêm, chỉnh sửa hoặc xóa vai trò khỏi CRM', + 'users' => 'Người Dùng', + 'users-info' => 'Thêm, chỉnh sửa hoặc xóa người dùng khỏi CRM', + 'lead' => 'Lead', + 'lead-info' => 'Quản lý tất cả các cài đặt liên quan đến leads trong CRM', + 'pipelines' => 'Pipelines', + 'pipelines-info' => 'Thêm, chỉnh sửa hoặc xóa pipelines khỏi CRM', + 'sources' => 'Nguồn', + 'sources-info' => 'Thêm, chỉnh sửa hoặc xóa nguồn khỏi CRM', + 'types' => 'Loại', + 'types-info' => 'Thêm, chỉnh sửa hoặc xóa loại khỏi CRM', + 'automation' => 'Tự Động Hóa', + 'automation-info' => 'Quản lý tất cả các cài đặt liên quan đến tự động hóa trong CRM', + 'attributes' => 'Thuộc Tính', + 'attribute' => 'Thuộc Tính', + 'attributes-info' => 'Thêm, chỉnh sửa hoặc xóa thuộc tính khỏi CRM', + 'email-templates' => 'Mẫu Email', + 'email' => 'Email', + 'email-templates-info' => 'Thêm, chỉnh sửa hoặc xóa mẫu email khỏi CRM', + 'events' => 'Sự kiện', + 'events-info' => 'Thêm, chỉnh sửa hoặc xóa sự kiện từ CRM', + 'campaigns' => 'Chiến dịch', + 'campaigns-info' => 'Thêm, chỉnh sửa hoặc xóa chiến dịch từ CRM', + 'workflows' => 'Quy Trình', + 'workflows-info' => 'Thêm, chỉnh sửa hoặc xóa quy trình khỏi CRM', + 'webhooks' => 'Webhook', + 'webhooks-info' => 'Thêm, chỉnh sửa hoặc xóa webhook từ CRM', + 'other-settings' => 'Cài Đặt Khác', + 'other-settings-info' => 'Quản lý tất cả các cài đặt khác trong CRM', + 'tags' => 'Thẻ', + 'tags-info' => 'Thêm, chỉnh sửa hoặc xóa thẻ khỏi CRM', + 'my-account' => 'Tài Khoản Của Tôi', + 'sign-out' => 'Đăng Xuất', + 'back' => 'Quay lại', + 'name' => 'Tên', + 'configuration' => 'Cấu hình', + 'howdy' => 'Xin chào!', + 'warehouses' => 'Kho hàng', + 'warehouse' => 'Kho hàng', + 'warehouses-info' => 'Thêm, chỉnh sửa hoặc xóa kho hàng từ CRM', + 'data_transfer' => 'Data Transfer', + 'data_transfer_info' => 'Manage persons, products and leads data transfer related settings in the CRM', + ], + 'user' => [ + 'account' => [ + 'name' => 'Tên', + 'email' => 'Email', + 'password' => 'Mật Khẩu', + 'my_account' => 'Tài Khoản Của Tôi', + 'update_details' => 'Cập Nhật Thông Tin', + 'current_password' => 'Mật Khẩu Hiện Tại', + 'confirm_password' => 'Xác Nhận Mật Khẩu', + 'password-match' => 'Mật khẩu hiện tại không khớp.', + 'account-save' => 'Thay đổi tài khoản đã được lưu thành công.', + 'permission-denied' => 'Từ Chối Quyền Truy Cập', + 'remove-image' => 'Xóa Hình Ảnh', + 'upload_image_pix' => 'Tải Lên Ảnh Hồ Sơ (100px x 100px)', + 'upload_image_format' => 'Định Dạng PNG hoặc JPG', + 'image_upload_message' => 'Chỉ chấp nhận hình ảnh (.jpeg, .jpg, .png, ..).', + ], + ], + 'emails' => [ + 'common' => [ + 'dear' => 'Kính gửi :name', + 'cheers' => 'Trân trọng,
Đội ngũ :app_name', + 'user' => [ + 'dear' => 'Kính gửi :username', + 'create-subject' => 'Bạn đã được thêm làm thành viên.', + 'create-body' => 'Chúc mừng! Bạn đã trở thành thành viên của đội ngũ chúng tôi.', + 'forget-password' => [ + 'subject' => 'Khách hàng yêu cầu đặt lại mật khẩu', + 'dear' => 'Kính gửi :username', + 'reset-password' => 'Đặt Lại Mật Khẩu', + 'info' => 'Bạn nhận được email này vì chúng tôi đã nhận được yêu cầu đặt lại mật khẩu cho tài khoản của bạn.', + 'final-summary' => 'Nếu bạn không yêu cầu đặt lại mật khẩu, không cần thực hiện thêm hành động nào.', + 'thanks' => 'Cảm ơn!', + ], + ], + ], + ], + 'validations' => [ + 'message' => [ + 'decimal' => 'The :attribute must be a decimal.', + ], + ], + 'errors' => [ + 'dashboard' => 'Bảng điều khiển', + 'go-back' => 'Quay lại', + 'support' => 'Nếu sự cố vẫn tiếp diễn, vui lòng liên hệ với chúng tôi tại :email để được hỗ trợ.', + '404' => [ + 'description' => 'Rất tiếc! Trang bạn đang tìm kiếm hiện không có ở đây. Có vẻ như chúng tôi không thể tìm thấy những gì bạn đang tìm kiếm.', + 'title' => '404 Không Tìm Thấy Trang', + ], + '401' => [ + 'description' => 'Rất tiếc! Có vẻ như bạn không được phép truy cập vào trang này. Có vẻ bạn đang thiếu thông tin xác thực cần thiết.', + 'title' => '401 Không Được Phép', + ], + '403' => [ + 'description' => 'Rất tiếc! Trang này bị hạn chế. Có vẻ bạn không có quyền truy cập vào nội dung này.', + 'title' => '403 Cấm Truy Cập', + ], + '500' => [ + 'description' => 'Rất tiếc! Đã xảy ra sự cố. Có vẻ như chúng tôi đang gặp khó khăn trong việc tải trang mà bạn đang tìm kiếm.', + 'title' => '500 Lỗi Máy Chủ Nội Bộ', + ], + '503' => [ + 'description' => 'Rất tiếc! Có vẻ chúng tôi đang tạm ngừng để bảo trì. Vui lòng quay lại sau.', + 'title' => '503 Dịch Vụ Không Khả Dụng', + ], + ], + 'export' => [ + 'csv' => 'CSV', + 'download' => 'Tải Xuống', + 'export' => 'Xuất', + 'no-records' => 'Không có bản ghi nào được tìm thấy.', + 'xls' => 'XLS', + 'xlsx' => 'XLSX', + ], +]; diff --git a/packages/Webkul/Admin/src/Resources/views/activities/datagrid/is-done.blade.php b/packages/Webkul/Admin/src/Resources/views/activities/datagrid/is-done.blade.php new file mode 100644 index 0000000..3a3ea88 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/activities/datagrid/is-done.blade.php @@ -0,0 +1,13 @@ + \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/activities/edit.blade.php b/packages/Webkul/Admin/src/Resources/views/activities/edit.blade.php new file mode 100644 index 0000000..be46037 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/activities/edit.blade.php @@ -0,0 +1,463 @@ + + + + @lang('admin::app.activities.edit.title') + + + {!! view_render_event('admin.activities.edit.form.before') !!} + + +
+
+
+ + + + +
+ @lang('admin::app.activities.edit.title') +
+
+ +
+ +
+ {!! view_render_event('admin.activities.edit.save_button.before') !!} + + + + + {!! view_render_event('admin.activities.edit.save_button.after') !!} +
+
+
+ + +
+ +
+ {!! view_render_event('admin.activities.edit.form_controls.before') !!} + + + +
+
+ + @lang('admin::app.activities.edit.schedule_from') + + + + + +
+ +
+ + @lang('admin::app.activities.edit.schedule_to') + + + + + +
+
+
+ + + + + @lang('admin::app.activities.edit.comment') + + + + + + + + + + + @lang('admin::app.activities.edit.participants') + + + + +
+
    +
  • + +
  • +
+ + +
+
+
+ + + + + @lang('admin::app.activities.edit.lead') + + + + + + + + + + + {!! view_render_event('admin.activities.edit.form_controls.after') !!} +
+ + +
+ {!! view_render_event('admin.activities.edit.accordion.general.before') !!} + + + +
+

+ @lang('admin::app.activities.edit.general') +

+
+ + + + + + + @lang('admin::app.activities.edit.title') + + + + + + + + + + + @lang('admin::app.activities.edit.type') + + + + + + + + + + + + + + + + + @lang('admin::app.activities.edit.location') + + + + + + + +
+ + {!! view_render_event('admin.activities.edit.accordion.general.after') !!} +
+
+
+
+ + {!! view_render_event('admin.activities.edit.form.after') !!} + + @pushOnce('scripts') + + + + @endPushOnce +
diff --git a/packages/Webkul/Admin/src/Resources/views/activities/index.blade.php b/packages/Webkul/Admin/src/Resources/views/activities/index.blade.php new file mode 100644 index 0000000..fc08e77 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/activities/index.blade.php @@ -0,0 +1,733 @@ + + + @lang('admin::app.activities.index.title') + + + {!! view_render_event('admin.activities.index.activities.before') !!} + + + +
+
+
+ + +
+ @lang('admin::app.activities.index.title') +
+
+ +
+ + + +
+
+ + + @if ( + request()->get('view-type') == 'table' + || ! request()->has('view-type') + ) + + @endif +
+
+ + {!! view_render_event('admin.activities.index.activities.after') !!} + + @pushOnce('scripts') + + + + + + + + + + @endPushOnce + + @pushOnce('styles') + + @endPushOnce +
diff --git a/packages/Webkul/Admin/src/Resources/views/components/accordion/index.blade.php b/packages/Webkul/Admin/src/Resources/views/components/accordion/index.blade.php new file mode 100644 index 0000000..2358e71 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/accordion/index.blade.php @@ -0,0 +1,84 @@ +@props([ + 'isActive' => true, +]) + +
merge(['class' => 'box-shadow rounded-lg border border-gray-200 dark:border-gray-800 bg-white dark:bg-gray-900']) }}> + + + + @isset($header) + + @endisset + + @isset($content) + + @endisset + +
+ +@pushOnce('scripts') + + + +@endPushOnce diff --git a/packages/Webkul/Admin/src/Resources/views/components/activities/actions/activity.blade.php b/packages/Webkul/Admin/src/Resources/views/components/activities/actions/activity.blade.php new file mode 100644 index 0000000..8364ea4 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/activities/actions/activity.blade.php @@ -0,0 +1,285 @@ +@props([ + 'entity' => null, + 'entityControlName' => null, +]) + + +
+ {!! view_render_event('admin.components.activities.actions.activity.create_btn.before') !!} + + + + {!! view_render_event('admin.components.activities.actions.activity.create_btn.after') !!} + + {!! view_render_event('admin.components.activities.actions.activity.before') !!} + + + + + {!! view_render_event('admin.components.activities.actions.activity.after') !!} +
+ + +@pushOnce('scripts') + + + +@endPushOnce \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/components/activities/actions/activity/participants.blade.php b/packages/Webkul/Admin/src/Resources/views/components/activities/actions/activity/participants.blade.php new file mode 100644 index 0000000..e76b782 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/activities/actions/activity/participants.blade.php @@ -0,0 +1,245 @@ +{!! view_render_event('admin.components.activities.actions.activity.participants.before') !!} + + + + +{!! view_render_event('admin.components.activities.actions.activity.participants.after') !!} + +@pushOnce('scripts') + + + +@endPushOnce \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/components/activities/actions/file.blade.php b/packages/Webkul/Admin/src/Resources/views/components/activities/actions/file.blade.php new file mode 100644 index 0000000..413a275 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/activities/actions/file.blade.php @@ -0,0 +1,216 @@ +@props([ + 'entity' => null, + 'entityControlName' => null, +]) + + +
+ {!! view_render_event('admin.components.activities.actions.file.create_btn.before') !!} + + + + {!! view_render_event('admin.components.activities.actions.file.create_btn.after') !!} + + {!! view_render_event('admin.components.activities.actions.file.before') !!} + + + + + {!! view_render_event('admin.components.activities.actions.file.after') !!} +
+ +@pushOnce('scripts') + + + +@endPushOnce \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/components/activities/actions/mail.blade.php b/packages/Webkul/Admin/src/Resources/views/components/activities/actions/mail.blade.php new file mode 100644 index 0000000..34451d6 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/activities/actions/mail.blade.php @@ -0,0 +1,293 @@ +@props([ + 'entity' => null, + 'entityControlName' => null, +]) + + +
+ {!! view_render_event('admin.components.activities.actions.mail.create_btn.before') !!} + + + + {!! view_render_event('admin.components.activities.actions.mail.create_btn.after') !!} + + {!! view_render_event('admin.components.activities.actions.mail.before') !!} + + + + + {!! view_render_event('admin.components.activities.actions.mail.after') !!} +
+ +@pushOnce('scripts') + + + +@endPushOnce \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/components/activities/actions/note.blade.php b/packages/Webkul/Admin/src/Resources/views/components/activities/actions/note.blade.php new file mode 100644 index 0000000..ff39d11 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/activities/actions/note.blade.php @@ -0,0 +1,175 @@ +@props([ + 'entity' => null, + 'entityControlName' => null, +]) + + +
+ {!! view_render_event('admin.components.activities.actions.note.create_btn.before') !!} + + + + {!! view_render_event('admin.components.activities.actions.note.create_btn.after') !!} + + {!! view_render_event('admin.components.activities.actions.note.before') !!} + + + + + {!! view_render_event('admin.components.activities.actions.note.after') !!} +
+ +@pushOnce('scripts') + + + +@endPushOnce \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/components/activities/index.blade.php b/packages/Webkul/Admin/src/Resources/views/components/activities/index.blade.php new file mode 100644 index 0000000..7413c42 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/activities/index.blade.php @@ -0,0 +1,640 @@ +@props([ + 'endpoint', + 'emailDetachEndpoint' => null, + 'activeType' => 'all', + 'types' => null, + 'extraTypes' => null, +]) + +{!! view_render_event('admin.components.activities.before') !!} + + + + + + + @foreach ($extraTypes ?? [] as $type) + + @endforeach + + +{!! view_render_event('admin.components.activities.after') !!} + +@pushOnce('scripts') + + + +@endPushOnce diff --git a/packages/Webkul/Admin/src/Resources/views/components/attachments/index.blade.php b/packages/Webkul/Admin/src/Resources/views/components/attachments/index.blade.php new file mode 100644 index 0000000..cd9c2b6 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/attachments/index.blade.php @@ -0,0 +1,184 @@ +@props([ + 'name' => 'attachments', + 'validations' => null, + 'uploadedAttachments' => [], + 'allowMultiple' => false, + 'hideButton' => false, +]) + + + + +@pushOnce('scripts') + + + + + +@endPushOnce \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/components/attributes/edit/address.blade.php b/packages/Webkul/Admin/src/Resources/views/components/attributes/edit/address.blade.php new file mode 100644 index 0000000..ac1d4e4 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/attributes/edit/address.blade.php @@ -0,0 +1,165 @@ +@if (isset($attribute)) + + + + +@endif + +@pushOnce('scripts') + + + +@endPushOnce \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/components/attributes/edit/boolean.blade.php b/packages/Webkul/Admin/src/Resources/views/components/attributes/edit/boolean.blade.php new file mode 100755 index 0000000..d8e354d --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/attributes/edit/boolean.blade.php @@ -0,0 +1,20 @@ +code) ?: $value ?> + + + + diff --git a/packages/Webkul/Admin/src/Resources/views/components/attributes/edit/checkbox.blade.php b/packages/Webkul/Admin/src/Resources/views/components/attributes/edit/checkbox.blade.php new file mode 100644 index 0000000..c83a2a8 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/attributes/edit/checkbox.blade.php @@ -0,0 +1,32 @@ +@php + $options = $attribute->lookup_type + ? app('Webkul\Attribute\Repositories\AttributeRepository')->getLookUpOptions($attribute->lookup_type) + : $attribute->options()->orderBy('sort_order')->get(); + + $selectedOption = old($attribute->code, $value); + + $selectedOption = is_array($selectedOption) ? $selectedOption : explode(',', $selectedOption); +@endphp + + + +@foreach ($options as $option) + + + + + +@endforeach diff --git a/packages/Webkul/Admin/src/Resources/views/components/attributes/edit/date.blade.php b/packages/Webkul/Admin/src/Resources/views/components/attributes/edit/date.blade.php new file mode 100755 index 0000000..d66d053 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/attributes/edit/date.blade.php @@ -0,0 +1,18 @@ +@php + if (! empty($value)) { + if ($value instanceof \Carbon\Carbon) { + $value = $value->format('Y-m-d'); + } elseif (is_string($value)) { + $value = \Carbon\Carbon::parse($value)->format('Y-m-d'); + } + } +@endphp + + diff --git a/packages/Webkul/Admin/src/Resources/views/components/attributes/edit/datetime.blade.php b/packages/Webkul/Admin/src/Resources/views/components/attributes/edit/datetime.blade.php new file mode 100755 index 0000000..e04e80b --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/attributes/edit/datetime.blade.php @@ -0,0 +1,8 @@ + diff --git a/packages/Webkul/Admin/src/Resources/views/components/attributes/edit/email.blade.php b/packages/Webkul/Admin/src/Resources/views/components/attributes/edit/email.blade.php new file mode 100644 index 0000000..fbf2b31 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/attributes/edit/email.blade.php @@ -0,0 +1,179 @@ +@if (isset($attribute)) + +
+ + +
+ +
+
+ + + + + @lang("admin::app.common.custom-attributes.add-more") + +
+@endif + +@pushOnce('scripts') + + + +@endPushOnce diff --git a/packages/Webkul/Admin/src/Resources/views/components/attributes/edit/file.blade.php b/packages/Webkul/Admin/src/Resources/views/components/attributes/edit/file.blade.php new file mode 100644 index 0000000..116ab0c --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/attributes/edit/file.blade.php @@ -0,0 +1,39 @@ +
+ @if ($value) + +
+ +
+
+ @endif + + +
+ +@if ($value) +
+ + + +
+@endif \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/components/attributes/edit/image.blade.php b/packages/Webkul/Admin/src/Resources/views/components/attributes/edit/image.blade.php new file mode 100644 index 0000000..dbfeba6 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/attributes/edit/image.blade.php @@ -0,0 +1,42 @@ +
+ @if ($value) + + {{ $attribute->code }} + + @endif + + +
+ +@if ($value) +
+ + + +
+@endif \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/components/attributes/edit/index.blade.php b/packages/Webkul/Admin/src/Resources/views/components/attributes/edit/index.blade.php new file mode 100644 index 0000000..bd9eb0b --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/attributes/edit/index.blade.php @@ -0,0 +1,143 @@ +@props([ + 'attribute' => '', + 'value' => '', + 'validations' => '', +]) + +@switch($attribute->type) + @case('text') + + + @break + + @case('email') + + + @break + + @case('phone') + + + @break + + @case('lookup') + + + @break + + @case('select') + + + @break + + @case('multiselect') + + + @break + + @case('price') + + + @break + + @case('image') + + + @break + + @case('file') + + + @break + + @case('textarea') + + + @break + + @case('address') + + + @break + + @case('date') + + + @break + + @case('datetime') + + + @break + + @case('boolean') + + + @break + + @case('checkbox') + + + @break +@endswitch \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/components/attributes/edit/lookup.blade.php b/packages/Webkul/Admin/src/Resources/views/components/attributes/edit/lookup.blade.php new file mode 100644 index 0000000..f24aa27 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/attributes/edit/lookup.blade.php @@ -0,0 +1,290 @@ +@if (isset($attribute)) + @php + $lookUpEntityData = app('Webkul\Attribute\Repositories\AttributeRepository')->getLookUpEntity($attribute->lookup_type, old($attribute->code) ?: $value); + @endphp + + +
+ +
+ @lang('admin::app.components.attributes.lookup.click-to-add') + + +
+ + +
+
+
+
+@endif + +@pushOnce('scripts') + + + +@endPushOnce diff --git a/packages/Webkul/Admin/src/Resources/views/components/attributes/edit/multiselect.blade.php b/packages/Webkul/Admin/src/Resources/views/components/attributes/edit/multiselect.blade.php new file mode 100755 index 0000000..506a1c4 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/attributes/edit/multiselect.blade.php @@ -0,0 +1,32 @@ +@php + $options = $attribute->lookup_type + ? app('Webkul\Attribute\Repositories\AttributeRepository')->getLookUpOptions($attribute->lookup_type) + : $attribute->options()->orderBy('sort_order')->get(); + + $selectedOption = old($attribute->code) ?: $value; +@endphp + + + + \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/components/attributes/edit/phone.blade.php b/packages/Webkul/Admin/src/Resources/views/components/attributes/edit/phone.blade.php new file mode 100644 index 0000000..c0f40cb --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/attributes/edit/phone.blade.php @@ -0,0 +1,186 @@ +@if (isset($attribute)) + +
+ + +
+ +
+
+ + + + + @lang("admin::app.common.custom-attributes.add-more") + +
+@endif + +@pushOnce('scripts') + + + +@endPushOnce diff --git a/packages/Webkul/Admin/src/Resources/views/components/attributes/edit/price.blade.php b/packages/Webkul/Admin/src/Resources/views/components/attributes/edit/price.blade.php new file mode 100755 index 0000000..c0b2bb9 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/attributes/edit/price.blade.php @@ -0,0 +1,32 @@ +@if (isset($attribute)) + + +@endif + +@pushOnce('scripts') + + + +@endPushOnce \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/components/attributes/edit/select.blade.php b/packages/Webkul/Admin/src/Resources/views/components/attributes/edit/select.blade.php new file mode 100755 index 0000000..e7771e5 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/attributes/edit/select.blade.php @@ -0,0 +1,21 @@ +@php + $options = $attribute->lookup_type + ? app('Webkul\Attribute\Repositories\AttributeRepository')->getLookUpOptions($attribute->lookup_type) + : $attribute->options()->orderBy('sort_order')->get(); +@endphp + + + @foreach ($options as $option) + + @endforeach + \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/components/attributes/edit/text.blade.php b/packages/Webkul/Admin/src/Resources/views/components/attributes/edit/text.blade.php new file mode 100755 index 0000000..59eafb9 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/attributes/edit/text.blade.php @@ -0,0 +1,8 @@ + \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/components/attributes/edit/textarea.blade.php b/packages/Webkul/Admin/src/Resources/views/components/attributes/edit/textarea.blade.php new file mode 100755 index 0000000..3bf326b --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/attributes/edit/textarea.blade.php @@ -0,0 +1,8 @@ + \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/components/attributes/index.blade.php b/packages/Webkul/Admin/src/Resources/views/components/attributes/index.blade.php new file mode 100644 index 0000000..9641e12 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/attributes/index.blade.php @@ -0,0 +1,40 @@ +@foreach ($customAttributes as $attribute) + @php + $validations = []; + + if ($attribute->is_required) { + $validations[] = 'required'; + } + + if ($attribute->type == 'price') { + $validations[] = 'decimal'; + } + + $validations[] = $attribute->validation; + + $validations = implode('|', array_filter($validations)); + @endphp + + + + {{ $attribute->name }} + + @if ($attribute->type == 'price') + ({{ core()->currencySymbol(config('app.currency')) }}) + @endif + + + @if (isset($attribute)) + + @endif + + + +@endforeach \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/components/attributes/view.blade.php b/packages/Webkul/Admin/src/Resources/views/components/attributes/view.blade.php new file mode 100644 index 0000000..93e51fa --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/attributes/view.blade.php @@ -0,0 +1,25 @@ +@props([ + 'customAttributes' => [], + 'entity' => null, + 'allowEdit' => false, + 'url' => null, +]) + +
+ @foreach ($customAttributes as $attribute) + @if (view()->exists($typeView = 'admin::components.attributes.view.' . $attribute->type)) +
+
{{ $attribute->name }}
+ +
+ @include ($typeView, [ + 'attribute' => $attribute, + 'value' => isset($entity) ? $entity[$attribute->code] : null, + 'allowEdit' => $allowEdit, + 'url' => $url, + ]) +
+
+ @endif + @endforeach +
\ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/components/attributes/view/address.blade.php b/packages/Webkul/Admin/src/Resources/views/components/attributes/view/address.blade.php new file mode 100644 index 0000000..610e260 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/attributes/view/address.blade.php @@ -0,0 +1,11 @@ + diff --git a/packages/Webkul/Admin/src/Resources/views/components/attributes/view/boolean.blade.php b/packages/Webkul/Admin/src/Resources/views/components/attributes/view/boolean.blade.php new file mode 100755 index 0000000..8a8ec54 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/attributes/view/boolean.blade.php @@ -0,0 +1,11 @@ + diff --git a/packages/Webkul/Admin/src/Resources/views/components/attributes/view/checkbox.blade.php b/packages/Webkul/Admin/src/Resources/views/components/attributes/view/checkbox.blade.php new file mode 100644 index 0000000..079494e --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/attributes/view/checkbox.blade.php @@ -0,0 +1,20 @@ +@php + $options = $attribute->lookup_type + ? app('Webkul\Attribute\Repositories\AttributeRepository')->getLookUpOptions($attribute->lookup_type) + : $attribute->options()->orderBy('sort_order')->get(); + + $selectedOption = old($attribute->code) ?: $value; +@endphp + + diff --git a/packages/Webkul/Admin/src/Resources/views/components/attributes/view/date.blade.php b/packages/Webkul/Admin/src/Resources/views/components/attributes/view/date.blade.php new file mode 100755 index 0000000..c2d0851 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/attributes/view/date.blade.php @@ -0,0 +1,21 @@ +@php + if (! empty($value)) { + if ($value instanceof \Carbon\Carbon) { + $value = $value->format('Y-m-d'); + } elseif (is_string($value)) { + $value = \Carbon\Carbon::parse($value)->format('Y-m-d'); + } + } +@endphp + + \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/components/attributes/view/datetime.blade.php b/packages/Webkul/Admin/src/Resources/views/components/attributes/view/datetime.blade.php new file mode 100755 index 0000000..e1c030a --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/attributes/view/datetime.blade.php @@ -0,0 +1,11 @@ + diff --git a/packages/Webkul/Admin/src/Resources/views/components/attributes/view/email.blade.php b/packages/Webkul/Admin/src/Resources/views/components/attributes/view/email.blade.php new file mode 100644 index 0000000..b745f43 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/attributes/view/email.blade.php @@ -0,0 +1,11 @@ + diff --git a/packages/Webkul/Admin/src/Resources/views/components/attributes/view/file.blade.php b/packages/Webkul/Admin/src/Resources/views/components/attributes/view/file.blade.php new file mode 100644 index 0000000..fcda0c3 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/attributes/view/file.blade.php @@ -0,0 +1,11 @@ + diff --git a/packages/Webkul/Admin/src/Resources/views/components/attributes/view/image.blade.php b/packages/Webkul/Admin/src/Resources/views/components/attributes/view/image.blade.php new file mode 100644 index 0000000..47e3c3e --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/attributes/view/image.blade.php @@ -0,0 +1,11 @@ + diff --git a/packages/Webkul/Admin/src/Resources/views/components/attributes/view/lookup.blade.php b/packages/Webkul/Admin/src/Resources/views/components/attributes/view/lookup.blade.php new file mode 100644 index 0000000..9fa70cb --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/attributes/view/lookup.blade.php @@ -0,0 +1,16 @@ +@php + $lookUpEntity = app('Webkul\Attribute\Repositories\AttributeRepository')->getLookUpEntity($attribute->lookup_type, $value); +@endphp + + diff --git a/packages/Webkul/Admin/src/Resources/views/components/attributes/view/multiselect.blade.php b/packages/Webkul/Admin/src/Resources/views/components/attributes/view/multiselect.blade.php new file mode 100755 index 0000000..079494e --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/attributes/view/multiselect.blade.php @@ -0,0 +1,20 @@ +@php + $options = $attribute->lookup_type + ? app('Webkul\Attribute\Repositories\AttributeRepository')->getLookUpOptions($attribute->lookup_type) + : $attribute->options()->orderBy('sort_order')->get(); + + $selectedOption = old($attribute->code) ?: $value; +@endphp + + diff --git a/packages/Webkul/Admin/src/Resources/views/components/attributes/view/phone.blade.php b/packages/Webkul/Admin/src/Resources/views/components/attributes/view/phone.blade.php new file mode 100644 index 0000000..fd6d544 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/attributes/view/phone.blade.php @@ -0,0 +1,11 @@ + diff --git a/packages/Webkul/Admin/src/Resources/views/components/attributes/view/price.blade.php b/packages/Webkul/Admin/src/Resources/views/components/attributes/view/price.blade.php new file mode 100755 index 0000000..9c43152 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/attributes/view/price.blade.php @@ -0,0 +1,12 @@ + diff --git a/packages/Webkul/Admin/src/Resources/views/components/attributes/view/select.blade.php b/packages/Webkul/Admin/src/Resources/views/components/attributes/view/select.blade.php new file mode 100755 index 0000000..5fc0e38 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/attributes/view/select.blade.php @@ -0,0 +1,18 @@ +@php + $options = $attribute->lookup_type + ? app('Webkul\Attribute\Repositories\AttributeRepository')->getLookUpOptions($attribute->lookup_type) + : $attribute->options()->orderBy('sort_order')->get(); +@endphp + + diff --git a/packages/Webkul/Admin/src/Resources/views/components/attributes/view/text.blade.php b/packages/Webkul/Admin/src/Resources/views/components/attributes/view/text.blade.php new file mode 100755 index 0000000..1be1e8b --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/attributes/view/text.blade.php @@ -0,0 +1,13 @@ + diff --git a/packages/Webkul/Admin/src/Resources/views/components/attributes/view/textarea.blade.php b/packages/Webkul/Admin/src/Resources/views/components/attributes/view/textarea.blade.php new file mode 100755 index 0000000..b66f5b8 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/attributes/view/textarea.blade.php @@ -0,0 +1,12 @@ + diff --git a/packages/Webkul/Admin/src/Resources/views/components/avatar/index.blade.php b/packages/Webkul/Admin/src/Resources/views/components/avatar/index.blade.php new file mode 100644 index 0000000..fbe7182 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/avatar/index.blade.php @@ -0,0 +1,69 @@ + +
+
+ +@pushOnce('scripts') + + + +@endPushOnce \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/components/breadcrumbs/index.blade.php b/packages/Webkul/Admin/src/Resources/views/components/breadcrumbs/index.blade.php new file mode 100644 index 0000000..2e942ee --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/breadcrumbs/index.blade.php @@ -0,0 +1,15 @@ +@props([ + 'name' => '', + 'entity' => null, + 'route' => null, +]) + +
+
+ @if($route) + {{ Breadcrumbs::view('admin::partials.breadcrumbs', $name, $route, $entity) }} + @else + {{ Breadcrumbs::view('admin::partials.breadcrumbs', $name, $entity) }} + @endif +
+
diff --git a/packages/Webkul/Admin/src/Resources/views/components/button/index.blade.php b/packages/Webkul/Admin/src/Resources/views/components/button/index.blade.php new file mode 100644 index 0000000..e4bc772 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/button/index.blade.php @@ -0,0 +1,40 @@ + + +@pushOnce('scripts') + + + +@endPushOnce \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/components/charts/bar.blade.php b/packages/Webkul/Admin/src/Resources/views/components/charts/bar.blade.php new file mode 100644 index 0000000..3dc549f --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/charts/bar.blade.php @@ -0,0 +1,100 @@ + + +@pushOnce('scripts') + + + + +@endPushOnce \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/components/charts/doughnut.blade.php b/packages/Webkul/Admin/src/Resources/views/components/charts/doughnut.blade.php new file mode 100644 index 0000000..33e4bab --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/charts/doughnut.blade.php @@ -0,0 +1,68 @@ + + +@pushOnce('scripts') + + + + +@endPushOnce \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/components/charts/line.blade.php b/packages/Webkul/Admin/src/Resources/views/components/charts/line.blade.php new file mode 100644 index 0000000..928a815 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/charts/line.blade.php @@ -0,0 +1,97 @@ + + +@pushOnce('scripts') + + + + +@endPushOnce \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/components/datagrid/export/index.blade.php b/packages/Webkul/Admin/src/Resources/views/components/datagrid/export/index.blade.php new file mode 100644 index 0000000..58bdcaa --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/datagrid/export/index.blade.php @@ -0,0 +1,170 @@ + +
+ + + @lang('admin::app.export.export') +
+
+ +@pushOnce('scripts') + + + +@endPushOnce diff --git a/packages/Webkul/Admin/src/Resources/views/components/datagrid/export/temp.blade.php b/packages/Webkul/Admin/src/Resources/views/components/datagrid/export/temp.blade.php new file mode 100755 index 0000000..257cf65 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/datagrid/export/temp.blade.php @@ -0,0 +1,23 @@ + + + + @foreach ($columns as $column) + + @endforeach + + + + + @foreach ($records as $record) + + @foreach($columns as $column) + @if ($closure = $column->getClosure()) + + @else + + @endif + @endforeach + + @endforeach + +
{{ $column->getLabel() }}
{!! $closure($record) !!}{{ $record->{$column->getIndex()} }}
diff --git a/packages/Webkul/Admin/src/Resources/views/components/datagrid/index.blade.php b/packages/Webkul/Admin/src/Resources/views/components/datagrid/index.blade.php new file mode 100644 index 0000000..ae93865 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/datagrid/index.blade.php @@ -0,0 +1,572 @@ +@props([ + 'isMultiRow' => false, + 'toolbarLeftBefore' => null, + 'toolbarLeftAfter' => null, + 'toolbarRightBefore' => null, + 'toolbarRightAfter' => null, +]) + + + {{ $slot }} + + +@pushOnce('scripts') + + + +@endPushOnce diff --git a/packages/Webkul/Admin/src/Resources/views/components/datagrid/table.blade.php b/packages/Webkul/Admin/src/Resources/views/components/datagrid/table.blade.php new file mode 100644 index 0000000..ba4a491 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/datagrid/table.blade.php @@ -0,0 +1,377 @@ +@props(['isMultiRow' => false]) + + + {{ $slot }} + + +@pushOnce('scripts') + + + +@endpushOnce diff --git a/packages/Webkul/Admin/src/Resources/views/components/datagrid/toolbar.blade.php b/packages/Webkul/Admin/src/Resources/views/components/datagrid/toolbar.blade.php new file mode 100644 index 0000000..5d6563a --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/datagrid/toolbar.blade.php @@ -0,0 +1,94 @@ + + + diff --git a/packages/Webkul/Admin/src/Resources/views/components/datagrid/toolbar/filter.blade.php b/packages/Webkul/Admin/src/Resources/views/components/datagrid/toolbar/filter.blade.php new file mode 100644 index 0000000..5f79f71 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/datagrid/toolbar/filter.blade.php @@ -0,0 +1,1530 @@ + + {{ $slot }} + + +@pushOnce('scripts') + + + + + + + +@endpushOnce diff --git a/packages/Webkul/Admin/src/Resources/views/components/datagrid/toolbar/mass-action.blade.php b/packages/Webkul/Admin/src/Resources/views/components/datagrid/toolbar/mass-action.blade.php new file mode 100644 index 0000000..c47c44f --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/datagrid/toolbar/mass-action.blade.php @@ -0,0 +1,220 @@ + + {{ $slot }} + + +@pushOnce('scripts') + + + +@endPushOnce diff --git a/packages/Webkul/Admin/src/Resources/views/components/datagrid/toolbar/pagination.blade.php b/packages/Webkul/Admin/src/Resources/views/components/datagrid/toolbar/pagination.blade.php new file mode 100644 index 0000000..3bb4e6d --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/datagrid/toolbar/pagination.blade.php @@ -0,0 +1,157 @@ + + {{ $slot }} + + +@pushOnce('scripts') + + + +@endPushOnce diff --git a/packages/Webkul/Admin/src/Resources/views/components/datagrid/toolbar/search.blade.php b/packages/Webkul/Admin/src/Resources/views/components/datagrid/toolbar/search.blade.php new file mode 100644 index 0000000..1fdad78 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/datagrid/toolbar/search.blade.php @@ -0,0 +1,157 @@ + + {{ $slot }} + + +@pushOnce('scripts') + + + +@endPushOnce diff --git a/packages/Webkul/Admin/src/Resources/views/components/drawer/index.blade.php b/packages/Webkul/Admin/src/Resources/views/components/drawer/index.blade.php new file mode 100644 index 0000000..16e27b3 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/drawer/index.blade.php @@ -0,0 +1,201 @@ +@props([ + 'isActive' => false, + 'position' => 'right', + 'width' => '500px', +]) + + + @isset($toggle) + + @endisset + + @isset($header) + + @endisset + + @isset($content) + + @endisset + + @isset($footer) + + @endisset + + +@pushOnce('scripts') + + + +@endPushOnce \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/components/dropdown/index.blade.php b/packages/Webkul/Admin/src/Resources/views/components/dropdown/index.blade.php new file mode 100644 index 0000000..4faf14c --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/dropdown/index.blade.php @@ -0,0 +1,170 @@ +@props(['position' => 'bottom-left']) + +merge(['class' => 'relative']) }}> + @isset($toggle) + {{ $toggle }} + + + @endisset + + @isset($content) + + @endisset + + @isset($menu) + + @endisset + + +@pushOnce('scripts') + + + +@endPushOnce diff --git a/packages/Webkul/Admin/src/Resources/views/components/dropdown/menu/item.blade.php b/packages/Webkul/Admin/src/Resources/views/components/dropdown/menu/item.blade.php new file mode 100644 index 0000000..513b575 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/dropdown/menu/item.blade.php @@ -0,0 +1,3 @@ +
  • merge(['class' => 'cursor-pointer px-5 py-2 text-sm text-gray-800 hover:bg-gray-100 dark:text-gray-300 dark:hover:bg-gray-950 ']) }}> + {{ $slot }} +
  • diff --git a/packages/Webkul/Admin/src/Resources/views/components/example.blade.php b/packages/Webkul/Admin/src/Resources/views/components/example.blade.php new file mode 100644 index 0000000..374ccde --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/example.blade.php @@ -0,0 +1,12 @@ + +@php + $bgColors = ['bg-orange-100', 'bg-red-100', 'bg-green-100', 'bg-blue-100', 'bg-purple-100']; + $textColors = ['text-orange-800', 'text-red-800', 'text-green-800', 'text-blue-800', 'text-purple-800']; +@endphp +@foreach ($bgColors as $bgColor) +
    +@endforeach + +@foreach ($textColors as $textColor) +
    +@endforeach \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/components/flash-group/index.blade.php b/packages/Webkul/Admin/src/Resources/views/components/flash-group/index.blade.php new file mode 100644 index 0000000..f62a1d8 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/flash-group/index.blade.php @@ -0,0 +1,64 @@ + + +@pushOnce('scripts') + + + +@endpushOnce \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/components/flash-group/item.blade.php b/packages/Webkul/Admin/src/Resources/views/components/flash-group/item.blade.php new file mode 100644 index 0000000..81ccaa0 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/flash-group/item.blade.php @@ -0,0 +1,205 @@ + + + +@pushOnce('scripts') + + + +@endpushOnce diff --git a/packages/Webkul/Admin/src/Resources/views/components/flat-picker/date.blade.php b/packages/Webkul/Admin/src/Resources/views/components/flat-picker/date.blade.php new file mode 100644 index 0000000..f5b3954 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/flat-picker/date.blade.php @@ -0,0 +1,81 @@ + + {{ $slot }} + + +@pushOnce('scripts') + + + +@endPushOnce diff --git a/packages/Webkul/Admin/src/Resources/views/components/flat-picker/datetime.blade.php b/packages/Webkul/Admin/src/Resources/views/components/flat-picker/datetime.blade.php new file mode 100644 index 0000000..7c60790 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/flat-picker/datetime.blade.php @@ -0,0 +1,83 @@ + + {{ $slot }} + + +@pushOnce('scripts') + + + +@endPushOnce diff --git a/packages/Webkul/Admin/src/Resources/views/components/form/control-group/control.blade.php b/packages/Webkul/Admin/src/Resources/views/components/form/control-group/control.blade.php new file mode 100644 index 0000000..616ec0f --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/form/control-group/control.blade.php @@ -0,0 +1,353 @@ +@props([ + 'type' => 'text', + 'name' => '', +]) + +@switch($type) + @case('hidden') + @case('text') + @case('email') + @case('password') + @case('number') + only(['name', ':name', 'value', ':value', 'v-model', 'rules', ':rules', 'label', ':label']) }} + name="{{ $name }}" + > + except(['value', ':value', 'v-model', 'rules', ':rules', 'label', ':label'])->merge(['class' => 'w-full rounded border border-gray-200 px-2.5 py-2 text-sm font-normal text-gray-800 transition-all hover:border-gray-400 focus:border-gray-400 dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300 dark:hover:border-gray-400 dark:focus:border-gray-400']) }} + /> + + + @break + + @case('price') + only(['name', ':name', 'value', ':value', 'v-model', 'rules', ':rules', 'label', ':label']) }} + name="{{ $name }}" + > +
    + @if (isset($currency)) + attributes->merge(['class' => 'py-2.5 text-gray-500 ltr:pl-4 rtl:pr-4']) }}> + {{ $currency }} + + @else + + {{ config('app.currency') }} + + @endif + + except(['value', ':value', 'v-model', 'rules', ':rules', 'label', ':label'])->merge(['class' => 'w-full p-2.5 text-sm text-gray-600 dark:bg-gray-900 dark:text-gray-300']) }} + /> +
    +
    + + @break + + @case('file') + only(['name', ':name', 'value', ':value', 'v-model', 'rules', ':rules', 'label', ':label']) }} + name="{{ $name }}" + > + except(['value', ':value', 'v-model', 'rules', ':rules', 'label', ':label'])->merge(['class' => 'w-full dark:file:bg-gray-800 dark:file:dark:text-white rounded border border-gray-200 px-2.5 py-2 text-sm font-normal text-gray-800 transition-all hover:border-gray-400 focus:border-gray-400 dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300 dark:hover:border-gray-400 dark:focus:border-gray-400']) }} + @change="handleChange" + @blur="handleBlur" + /> + + + @break + + @case('color') + except('class') }} + > + except(['value'])->merge(['class' => 'w-full appearance-none rounded-md border text-sm text-gray-600 transition-all hover:border-gray-400 dark:text-gray-300 dark:hover:border-gray-400']) }} + > + + @break + + @case('textarea') + only(['name', ':name', 'value', ':value', 'v-model', 'rules', ':rules', 'label', ':label']) }} + name="{{ $name }}" + > + @php + $defaultAttributes = [ + 'class' => 'w-full rounded border border-gray-200 px-2.5 py-2 text-sm font-normal text-gray-800 transition-all hover:border-gray-400 focus:border-gray-400 dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300 dark:hover:border-gray-400 dark:focus:border-gray-400' + ]; + + if ($attributes->get('tinymce', false) || $attributes->get(':tinymce', false)) { + $defaultAttributes['id'] = $attributes->get(':id', 'id'); + } + @endphp + + + + @if ($attributes->get('tinymce', false) || $attributes->get(':tinymce', false)) + + @endif + + + @break + + @case('date') + only(['name', ':name', 'value', ':value', 'v-model', 'rules', ':rules', 'label', ':label'])->merge(['rules' => 'regex:^\d{4}-\d{2}-\d{2}$']) }} + name="{{ $name }}" + > + + except(['value', ':value', 'v-model', 'rules', ':rules', 'label', ':label'])->merge(['class' => 'w-full rounded border border-gray-200 px-2.5 py-2 text-sm font-normal text-gray-800 transition-all hover:border-gray-400 focus:border-gray-400 dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300 dark:hover:border-gray-400 dark:focus:border-gray-400']) }} + autocomplete="off" + /> + + + + @break + + @case('datetime') + only(['name', ':name', 'value', ':value', 'v-model', 'rules', ':rules', 'label', ':label'])->merge(['rules' => 'regex:^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}$']) }} + name="{{ $name }}" + > + + except(['value', ':value', 'v-model', 'rules', ':rules', 'label', ':label'])->merge(['class' => 'w-full rounded border border-gray-200 px-2.5 py-2 text-sm font-normal text-gray-800 transition-all hover:border-gray-400 focus:border-gray-400 dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300 dark:hover:border-gray-400 dark:focus:border-gray-400']) }} + autocomplete="off" + > + + + @break + + @case('select') + only(['name', ':name', 'value', ':value', 'v-model', 'rules', ':rules', 'label', ':label']) }} + name="{{ $name }}" + > + + + + @break + + @case('multiselect') + except([])->merge(['class' => 'flex w-full flex-col rounded-md border bg-white px-3 py-2.5 text-sm font-normal text-gray-600 transition-all hover:border-gray-400 dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300 dark:hover:border-gray-400']) }} + name="{{ $name }}" + multiple + > + {{ $slot }} + + + @break + + @case('checkbox') + + + + + @break + + @case('radio') + + + + + @break + + @case('switch') + + + @break + + @case('image') + + + @break + + @case('inline') + + + @break + + @case('custom') + + {{ $slot }} + + + @break + + @case('tags') + + @break +@endswitch + +@pushOnce('scripts') + + + +@endpushOnce diff --git a/packages/Webkul/Admin/src/Resources/views/components/form/control-group/controls/inline/address.blade.php b/packages/Webkul/Admin/src/Resources/views/components/form/control-group/controls/inline/address.blade.php new file mode 100644 index 0000000..ba4e2e4 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/form/control-group/controls/inline/address.blade.php @@ -0,0 +1,370 @@ +@props([ + 'allowEdit' => true, +]) + +except('value') }} + :value='@json($attributes->get('value'))' + :allow-edit="{{ $allowEdit ? 'true' : 'false' }}" +> +
    +
    +
    +
    +
    +
    + +@pushOnce('scripts') + + + +@endPushOnce \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/components/form/control-group/controls/inline/boolean.blade.php b/packages/Webkul/Admin/src/Resources/views/components/form/control-group/controls/inline/boolean.blade.php new file mode 100644 index 0000000..6f5a8b2 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/form/control-group/controls/inline/boolean.blade.php @@ -0,0 +1,250 @@ +@props([ + 'allowEdit' => true, +]) + +except('options') }} + :allow-edit="{{ $allowEdit ? 'true' : 'false' }}" +> +
    +
    +
    +
    +
    +
    + +@pushOnce('scripts') + + + +@endPushOnce \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/components/form/control-group/controls/inline/date.blade.php b/packages/Webkul/Admin/src/Resources/views/components/form/control-group/controls/inline/date.blade.php new file mode 100644 index 0000000..f5f3bd9 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/form/control-group/controls/inline/date.blade.php @@ -0,0 +1,245 @@ +@props([ + 'allowEdit' => true, +]) + + +
    +
    +
    +
    +
    +
    + +@pushOnce('scripts') + + + +@endPushOnce \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/components/form/control-group/controls/inline/datetime.blade.php b/packages/Webkul/Admin/src/Resources/views/components/form/control-group/controls/inline/datetime.blade.php new file mode 100644 index 0000000..8488c72 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/form/control-group/controls/inline/datetime.blade.php @@ -0,0 +1,245 @@ +@props([ + 'allowEdit' => true, +]) + + +
    +
    +
    +
    +
    +
    + +@pushOnce('scripts') + + + +@endPushOnce \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/components/form/control-group/controls/inline/email.blade.php b/packages/Webkul/Admin/src/Resources/views/components/form/control-group/controls/inline/email.blade.php new file mode 100644 index 0000000..507c375 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/form/control-group/controls/inline/email.blade.php @@ -0,0 +1,320 @@ +@props([ + 'allowEdit' => true, +]) + +except('value') }} + :value={{ json_encode($attributes->get('value')) }} + :allow-edit="{{ $allowEdit ? 'true' : 'false' }}" +> +
    +
    +
    +
    +
    +
    + +@pushOnce('scripts') + + + +@endPushOnce \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/components/form/control-group/controls/inline/file.blade.php b/packages/Webkul/Admin/src/Resources/views/components/form/control-group/controls/inline/file.blade.php new file mode 100644 index 0000000..0856a1a --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/form/control-group/controls/inline/file.blade.php @@ -0,0 +1,245 @@ +@props([ + 'allowEdit' => true, +]) + + +
    +
    +
    +
    +
    +
    + +@pushOnce('scripts') + + + +@endPushOnce \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/components/form/control-group/controls/inline/image.blade.php b/packages/Webkul/Admin/src/Resources/views/components/form/control-group/controls/inline/image.blade.php new file mode 100644 index 0000000..7386e18 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/form/control-group/controls/inline/image.blade.php @@ -0,0 +1,242 @@ +@props([ + 'allowEdit' => true, +]) + + +
    +
    +
    +
    +
    +
    + +@pushOnce('scripts') + + + +@endPushOnce \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/components/form/control-group/controls/inline/lookup.blade.php b/packages/Webkul/Admin/src/Resources/views/components/form/control-group/controls/inline/lookup.blade.php new file mode 100644 index 0000000..06e5018 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/form/control-group/controls/inline/lookup.blade.php @@ -0,0 +1,448 @@ +@props([ + 'allowEdit' => true, + 'attribute' => [], +]) + + +
    +
    +
    +
    +
    +
    + +@pushOnce('scripts') + + + +@endPushOnce diff --git a/packages/Webkul/Admin/src/Resources/views/components/form/control-group/controls/inline/multiselect.blade.php b/packages/Webkul/Admin/src/Resources/views/components/form/control-group/controls/inline/multiselect.blade.php new file mode 100644 index 0000000..68d4ce1 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/form/control-group/controls/inline/multiselect.blade.php @@ -0,0 +1,367 @@ +@props([ + 'allowEdit' => true, + 'data' => [], +]) + +except('data') }} + :data="{{ json_encode($data) }}" + :allow-edit="{{ $allowEdit ? 'true' : 'false' }}" +> +
    +
    +
    +
    +
    +
    + +@pushOnce('scripts') + + + +@endPushOnce \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/components/form/control-group/controls/inline/phone.blade.php b/packages/Webkul/Admin/src/Resources/views/components/form/control-group/controls/inline/phone.blade.php new file mode 100644 index 0000000..58af08c --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/form/control-group/controls/inline/phone.blade.php @@ -0,0 +1,321 @@ +@props([ + 'allowEdit' => true, +]) + +except('value') }} + :value={{ json_encode($attributes->get('value')) }} + :allow-edit="{{ $allowEdit ? 'true' : 'false' }}" +> +
    +
    +
    +
    +
    +
    + +@pushOnce('scripts') + + + +@endPushOnce \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/components/form/control-group/controls/inline/select.blade.php b/packages/Webkul/Admin/src/Resources/views/components/form/control-group/controls/inline/select.blade.php new file mode 100644 index 0000000..5d79071 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/form/control-group/controls/inline/select.blade.php @@ -0,0 +1,270 @@ +@props([ + 'allowEdit' => true, + 'options' => [], +]) + +except('options') }} + :options="{{ json_encode($options) }}" + :allow-edit="{{ $allowEdit ? 'true' : 'false' }}" +> +
    +
    +
    +
    +
    +
    + +@pushOnce('scripts') + + + +@endPushOnce \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/components/form/control-group/controls/inline/text.blade.php b/packages/Webkul/Admin/src/Resources/views/components/form/control-group/controls/inline/text.blade.php new file mode 100644 index 0000000..8eb9dd2 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/form/control-group/controls/inline/text.blade.php @@ -0,0 +1,277 @@ +@props([ + 'allowEdit' => true, +]) + + +
    +
    +
    +
    +
    +
    + +@pushOnce('scripts') + + + +@endPushOnce diff --git a/packages/Webkul/Admin/src/Resources/views/components/form/control-group/controls/tags.blade.php b/packages/Webkul/Admin/src/Resources/views/components/form/control-group/controls/tags.blade.php new file mode 100644 index 0000000..bdcad84 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/form/control-group/controls/tags.blade.php @@ -0,0 +1,183 @@ + + +@pushOnce('scripts') + + + +@endpushOnce diff --git a/packages/Webkul/Admin/src/Resources/views/components/form/control-group/error.blade.php b/packages/Webkul/Admin/src/Resources/views/components/form/control-group/error.blade.php new file mode 100644 index 0000000..88d5292 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/form/control-group/error.blade.php @@ -0,0 +1,16 @@ +@props([ + 'name' => null, + 'controlName' => '', +]) + + +

    merge(['class' => 'mt-1 text-xs italic text-red-600']) }} + v-text="message" + > +

    +
    diff --git a/packages/Webkul/Admin/src/Resources/views/components/form/control-group/index.blade.php b/packages/Webkul/Admin/src/Resources/views/components/form/control-group/index.blade.php new file mode 100644 index 0000000..e391d10 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/form/control-group/index.blade.php @@ -0,0 +1,3 @@ +
    merge(['class' => 'mb-4']) }}> + {{ $slot }} +
    diff --git a/packages/Webkul/Admin/src/Resources/views/components/form/control-group/label.blade.php b/packages/Webkul/Admin/src/Resources/views/components/form/control-group/label.blade.php new file mode 100644 index 0000000..8f7b393 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/form/control-group/label.blade.php @@ -0,0 +1,3 @@ + diff --git a/packages/Webkul/Admin/src/Resources/views/components/form/index.blade.php b/packages/Webkul/Admin/src/Resources/views/components/form/index.blade.php new file mode 100644 index 0000000..0faa931 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/form/index.blade.php @@ -0,0 +1,40 @@ + +@if ($attributes->has('as')) + + {{ $slot }} + + + +@else + @props([ + 'method' => 'POST', + ]) + + @php + $method = strtoupper($method); + @endphp + + + @unless(in_array($method, ['HEAD', 'GET', 'OPTIONS'])) + @csrf + @endunless + + @if (! in_array($method, ['GET', 'POST'])) + @method($method) + @endif + + {{ $slot }} + +@endif \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/components/layouts/anonymous.blade.php b/packages/Webkul/Admin/src/Resources/views/components/layouts/anonymous.blade.php new file mode 100644 index 0000000..c1e7e2c --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/layouts/anonymous.blade.php @@ -0,0 +1,124 @@ + + + + + + {{ $title ?? '' }} + + + + + + + + + + + @stack('meta') + + {{ + vite()->set(['src/Resources/assets/css/app.css', 'src/Resources/assets/js/app.js']) + }} + + + + + + @if ($favicon = core()->getConfigData('general.design.admin_logo.favicon')) + + @else + + @endif + + @php + $brandColor = core()->getConfigData('general.settings.menu_color.brand_color') ?? '#0E90D9'; + @endphp + + @stack('styles') + + + + {!! view_render_event('admin.layout.head') !!} + + + + {!! view_render_event('admin.layout.body.before') !!} + +
    + + + + {!! view_render_event('admin.layout.content.before') !!} + + + {{ $slot }} + + {!! view_render_event('admin.layout.content.after') !!} +
    + + {!! view_render_event('admin.layout.body.after') !!} + + @stack('scripts') + + {!! view_render_event('admin.layout.vue-app-mount.before') !!} + + + + {!! view_render_event('admin.layout.vue-app-mount.after') !!} + + + + + diff --git a/packages/Webkul/Admin/src/Resources/views/components/layouts/header/desktop/mega-search.blade.php b/packages/Webkul/Admin/src/Resources/views/components/layouts/header/desktop/mega-search.blade.php new file mode 100644 index 0000000..893dd1c --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/layouts/header/desktop/mega-search.blade.php @@ -0,0 +1,567 @@ + +
    + + + +
    +
    + +@pushOnce('scripts') + + + +@endPushOnce diff --git a/packages/Webkul/Admin/src/Resources/views/components/layouts/header/index.blade.php b/packages/Webkul/Admin/src/Resources/views/components/layouts/header/index.blade.php new file mode 100644 index 0000000..e9dcfc5 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/layouts/header/index.blade.php @@ -0,0 +1,191 @@ +
    + + + +
    + + @include('admin::components.layouts.header.desktop.mega-search') + + + @include('admin::components.layouts.header.quick-creation') +
    + +
    +
    + + @include('admin::components.layouts.header.mobile.mega-search') +
    + + + +
    + +
    +
    + +
    + + @include('admin::components.layouts.header.quick-creation') +
    + + + + + @php($user = auth()->guard('user')->user()) + + @if ($user->image) + + @else + + @endif + + + + +
    + + + +

    + @lang('admin::app.layouts.app-version', ['version' => core()->version()]) +

    +
    + + + +
    +
    +
    + +@pushOnce('scripts') + + + +@endPushOnce diff --git a/packages/Webkul/Admin/src/Resources/views/components/layouts/header/mobile/mega-search.blade.php b/packages/Webkul/Admin/src/Resources/views/components/layouts/header/mobile/mega-search.blade.php new file mode 100644 index 0000000..9986eb1 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/layouts/header/mobile/mega-search.blade.php @@ -0,0 +1,593 @@ + + + + +@pushOnce('scripts') + + + +@endPushOnce diff --git a/packages/Webkul/Admin/src/Resources/views/components/layouts/header/quick-creation.blade.php b/packages/Webkul/Admin/src/Resources/views/components/layouts/header/quick-creation.blade.php new file mode 100644 index 0000000..ef71747 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/layouts/header/quick-creation.blade.php @@ -0,0 +1,145 @@ +
    + @if (bouncer()->hasPermission('leads.create') + || bouncer()->hasPermission('quotes.create') + || bouncer()->hasPermission('mail.create') + || bouncer()->hasPermission('contacts.persons.create') + || bouncer()->hasPermission('contacts.organizations.create') + || bouncer()->hasPermission('products.create') + || bouncer()->hasPermission('settings.automation.attributes.create') + || bouncer()->hasPermission('settings.user.roles.create') + || bouncer()->hasPermission('settings.user.users.create') + ) + + + + + + + + +
    +
    + + @if (bouncer()->hasPermission('leads.create')) + + @endif + + + @if (bouncer()->hasPermission('quotes.create')) + + @endif + + + @if (bouncer()->hasPermission('mail.create')) + + @endif + + + @if (bouncer()->hasPermission('contacts.persons.create')) + + @endif + + + @if (bouncer()->hasPermission('contacts.organizations.create')) + + @endif + + + @if (bouncer()->hasPermission('products.create')) + + @endif + + + @if (bouncer()->hasPermission('settings.automation.attributes.create')) + + @endif + + + @if (bouncer()->hasPermission('settings.user.roles.create')) + + @endif + + + @if (bouncer()->hasPermission('settings.user.users.create')) + + @endif +
    +
    + +
    + @endif +
    diff --git a/packages/Webkul/Admin/src/Resources/views/components/layouts/index.blade.php b/packages/Webkul/Admin/src/Resources/views/components/layouts/index.blade.php new file mode 100644 index 0000000..5221ac3 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/layouts/index.blade.php @@ -0,0 +1,158 @@ + + + + + + + {!! view_render_event('admin.layout.head.before') !!} + + {{ $title ?? '' }} + + + + + + + + + + + @stack('meta') + + {{ + vite()->set(['src/Resources/assets/css/app.css', 'src/Resources/assets/js/app.js']) + }} + + + + + + @if ($favicon = core()->getConfigData('general.design.admin_logo.favicon')) + + @else + + @endif + + @php + $brandColor = core()->getConfigData('general.settings.menu_color.brand_color') ?? '#0E90D9'; + @endphp + + @stack('styles') + + + + {!! view_render_event('admin.layout.head.after') !!} + + + + {!! view_render_event('admin.layout.body.before') !!} + +
    + + + + + + + {!! view_render_event('admin.layout.content.before') !!} + + + + + + + {!! view_render_event('admin.layout.content.after') !!} +
    + + {!! view_render_event('admin.layout.body.after') !!} + + @stack('scripts') + + {!! view_render_event('admin.layout.vue-app-mount.before') !!} + + + + {!! view_render_event('admin.layout.vue-app-mount.after') !!} + + + diff --git a/packages/Webkul/Admin/src/Resources/views/components/layouts/sidebar/desktop/index.blade.php b/packages/Webkul/Admin/src/Resources/views/components/layouts/sidebar/desktop/index.blade.php new file mode 100644 index 0000000..ac20515 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/layouts/sidebar/desktop/index.blade.php @@ -0,0 +1,63 @@ +
    +
    + +
    +
    \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/components/layouts/sidebar/mobile/index.blade.php b/packages/Webkul/Admin/src/Resources/views/components/layouts/sidebar/mobile/index.blade.php new file mode 100644 index 0000000..c2c2b7f --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/layouts/sidebar/mobile/index.blade.php @@ -0,0 +1,120 @@ + + + + +@pushOnce('scripts') + + + +@endPushOnce diff --git a/packages/Webkul/Admin/src/Resources/views/components/layouts/tabs.blade.php b/packages/Webkul/Admin/src/Resources/views/components/layouts/tabs.blade.php new file mode 100755 index 0000000..9a0b47f --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/layouts/tabs.blade.php @@ -0,0 +1,20 @@ +@php + $tabs = menu()->getCurrentActiveMenu('admin')?->getChildren(); +@endphp + +@if ( + $tabs + && $tabs->isNotEmpty() +) +
    +
    + @foreach ($tabs as $tab) + +
    + {{ $tab->getName() }} +
    +
    + @endforeach +
    +
    +@endif diff --git a/packages/Webkul/Admin/src/Resources/views/components/lookup/index.blade.php b/packages/Webkul/Admin/src/Resources/views/components/lookup/index.blade.php new file mode 100644 index 0000000..ccae8b4 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/lookup/index.blade.php @@ -0,0 +1,328 @@ + + +@pushOnce('scripts') + + + +@endPushOnce diff --git a/packages/Webkul/Admin/src/Resources/views/components/media/images.blade.php b/packages/Webkul/Admin/src/Resources/views/components/media/images.blade.php new file mode 100644 index 0000000..5698450 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/media/images.blade.php @@ -0,0 +1,334 @@ +@props([ + 'name' => 'images', + 'allowMultiple' => false, + 'showPlaceholders' => false, + 'uploadedImages' => [], + 'width' => '120px', + 'height' => '120px' +]) + + + + + +@pushOnce('scripts') + + + + + +@endPushOnce \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/components/media/videos.blade.php b/packages/Webkul/Admin/src/Resources/views/components/media/videos.blade.php new file mode 100644 index 0000000..1bab30e --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/media/videos.blade.php @@ -0,0 +1,307 @@ +@props([ + 'name' => 'images', + 'allowMultiple' => false, + 'uploadedVideos' => [], + 'width' => '210px', + 'height' => '120px' +]) + +get('class') }} +> + + +@pushOnce('scripts') + + + + + +@endPushOnce \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/components/modal/confirm.blade.php b/packages/Webkul/Admin/src/Resources/views/components/modal/confirm.blade.php new file mode 100644 index 0000000..ed302b6 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/modal/confirm.blade.php @@ -0,0 +1,140 @@ + + +@pushOnce('scripts') + + + +@endPushOnce \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/components/modal/index.blade.php b/packages/Webkul/Admin/src/Resources/views/components/modal/index.blade.php new file mode 100644 index 0000000..4de1ce1 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/modal/index.blade.php @@ -0,0 +1,225 @@ +@props([ + 'isActive' => false, + 'position' => 'center', + 'size' => 'normal', +]) + + + @isset($toggle) + + @endisset + + @isset($header) + + @endisset + + @isset($content) + + @endisset + + @isset($footer) + + @endisset + + +@pushOnce('scripts') + + + +@endPushOnce \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/components/shimmer/accordion/index.blade.php b/packages/Webkul/Admin/src/Resources/views/components/shimmer/accordion/index.blade.php new file mode 100644 index 0000000..7c97ce1 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/shimmer/accordion/index.blade.php @@ -0,0 +1,17 @@ +
    +
    +

    +

    +
    + +
    +
    +

    +

    +

    +

    +

    +

    +
    +
    +
    \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/components/shimmer/activities/index.blade.php b/packages/Webkul/Admin/src/Resources/views/components/shimmer/activities/index.blade.php new file mode 100644 index 0000000..7a37245 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/shimmer/activities/index.blade.php @@ -0,0 +1,41 @@ +
    + +
    + @for ($i = 0; $i < 5; $i++) +
    +
    +
    + @endfor +
    + + +
    + +
    + @for ($i = 0; $i < 5; $i++) + +
    + +
    + + +
    +
    +
    + +
    +
    +
    +
    + +
    +
    + + +
    +
    +
    + @endfor +
    +
    +
    \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/components/shimmer/charts/bar.blade.php b/packages/Webkul/Admin/src/Resources/views/components/shimmer/charts/bar.blade.php new file mode 100644 index 0000000..4762e4b --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/shimmer/charts/bar.blade.php @@ -0,0 +1,28 @@ +@props(['count' => 30]) + +
    +
    + @foreach (range(1, 10) as $i) +
    + @endforeach +
    + +
    +
    +
    + @foreach (range(1, $count) as $i) +
    + @endforeach +
    +
    + +
    + @foreach (range(1, $count) as $i) +
    + @endforeach +
    +
    +
    \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/components/shimmer/common/address.blade.php b/packages/Webkul/Admin/src/Resources/views/components/shimmer/common/address.blade.php new file mode 100644 index 0000000..0eca400 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/shimmer/common/address.blade.php @@ -0,0 +1,15 @@ +
    +
    +
    +
    + +
    +
    + +
    + +
    + +
    +
    +
    \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/components/shimmer/dashboard/index/open-leads-by-states.blade.php b/packages/Webkul/Admin/src/Resources/views/components/shimmer/dashboard/index/open-leads-by-states.blade.php new file mode 100644 index 0000000..7f3ff55 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/shimmer/dashboard/index/open-leads-by-states.blade.php @@ -0,0 +1,16 @@ +
    +
    +
    +
    + +
    +
    + @for ($i = 0; $i < 4; $i++) +
    +
    +
    +
    + @endfor +
    +
    +
    \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/components/shimmer/dashboard/index/over-all.blade.php b/packages/Webkul/Admin/src/Resources/views/components/shimmer/dashboard/index/over-all.blade.php new file mode 100644 index 0000000..2248363 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/shimmer/dashboard/index/over-all.blade.php @@ -0,0 +1,13 @@ +
    + @for ($i = 1; $i <= 6; $i++) +
    +
    + +
    +
    + +
    +
    +
    + @endfor +
    \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/components/shimmer/dashboard/index/revenue-by-sources.blade.php b/packages/Webkul/Admin/src/Resources/views/components/shimmer/dashboard/index/revenue-by-sources.blade.php new file mode 100644 index 0000000..447d46c --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/shimmer/dashboard/index/revenue-by-sources.blade.php @@ -0,0 +1,21 @@ +
    +
    +
    +
    + +
    +
    + +
    +
    +
    +
    +
    + +
    +
    +
    +
    +
    +
    +
    \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/components/shimmer/dashboard/index/revenue-by-types.blade.php b/packages/Webkul/Admin/src/Resources/views/components/shimmer/dashboard/index/revenue-by-types.blade.php new file mode 100644 index 0000000..447d46c --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/shimmer/dashboard/index/revenue-by-types.blade.php @@ -0,0 +1,21 @@ +
    +
    +
    +
    + +
    +
    + +
    +
    +
    +
    +
    + +
    +
    +
    +
    +
    +
    +
    \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/components/shimmer/dashboard/index/revenue.blade.php b/packages/Webkul/Admin/src/Resources/views/components/shimmer/dashboard/index/revenue.blade.php new file mode 100644 index 0000000..1dcefe6 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/shimmer/dashboard/index/revenue.blade.php @@ -0,0 +1,46 @@ +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + +
    +
    +
    +
    + + +
    +
    +
    +
    +
    + +
    +
    +
    +
    +
    + +
    +
    +
    +
    +
    +
    +
    +
    \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/components/shimmer/dashboard/index/top-persons.blade.php b/packages/Webkul/Admin/src/Resources/views/components/shimmer/dashboard/index/top-persons.blade.php new file mode 100644 index 0000000..fc5add2 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/shimmer/dashboard/index/top-persons.blade.php @@ -0,0 +1,25 @@ +
    +
    +
    +
    + +
    + @for ($i = 1; $i <= 5; $i++) +
    + +
    + +
    + +
    + +
    + + +
    +
    +
    +
    + @endfor +
    +
    \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/components/shimmer/dashboard/index/top-selling-products.blade.php b/packages/Webkul/Admin/src/Resources/views/components/shimmer/dashboard/index/top-selling-products.blade.php new file mode 100644 index 0000000..26e6436 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/shimmer/dashboard/index/top-selling-products.blade.php @@ -0,0 +1,25 @@ +
    +
    +
    +
    + +
    + @for ($i = 1; $i <= 5; $i++) +
    + +
    + +
    + +
    + +
    + + +
    +
    +
    +
    + @endfor +
    +
    \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/components/shimmer/dashboard/index/total-leads.blade.php b/packages/Webkul/Admin/src/Resources/views/components/shimmer/dashboard/index/total-leads.blade.php new file mode 100644 index 0000000..d07d3c3 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/shimmer/dashboard/index/total-leads.blade.php @@ -0,0 +1,18 @@ +
    +
    + + + + +
    +
    +
    +
    +
    + +
    +
    +
    +
    +
    +
    \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/components/shimmer/datagrid/index.blade.php b/packages/Webkul/Admin/src/Resources/views/components/shimmer/datagrid/index.blade.php new file mode 100644 index 0000000..4222616 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/shimmer/datagrid/index.blade.php @@ -0,0 +1,15 @@ +@props(['isMultiRow' => false]) + +
    + + +
    +
    +
    + + + +
    +
    +
    +
    diff --git a/packages/Webkul/Admin/src/Resources/views/components/shimmer/datagrid/table/body.blade.php b/packages/Webkul/Admin/src/Resources/views/components/shimmer/datagrid/table/body.blade.php new file mode 100644 index 0000000..a1689b1 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/shimmer/datagrid/table/body.blade.php @@ -0,0 +1,53 @@ +@props(['isMultiRow' => false]) + +@for ($i = 0; $i < 10; $i++) + @if (! $isMultiRow) +
    +
    + +
    + +
    + +
    + +
    + +
    +
    + +
    +
    +
    + @else +
    +
    +
    + +
    +
    + +
    + +
    +
    +
    + +
    +
    + +
    + +
    +
    + +
    +
    + +
    + +
    +
    +
    + @endif +@endfor diff --git a/packages/Webkul/Admin/src/Resources/views/components/shimmer/datagrid/table/head.blade.php b/packages/Webkul/Admin/src/Resources/views/components/shimmer/datagrid/table/head.blade.php new file mode 100644 index 0000000..60cf1d8 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/shimmer/datagrid/table/head.blade.php @@ -0,0 +1,29 @@ +@props(['isMultiRow' => false]) + +@if (! $isMultiRow) +
    +
    + +
    + +
    + +
    + +
    + +
    +
    +@else +
    +
    +
    + +
    +
    + +
    + +
    +
    +@endif diff --git a/packages/Webkul/Admin/src/Resources/views/components/shimmer/datagrid/toolbar.blade.php b/packages/Webkul/Admin/src/Resources/views/components/shimmer/datagrid/toolbar.blade.php new file mode 100644 index 0000000..cdae5e1 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/shimmer/datagrid/toolbar.blade.php @@ -0,0 +1,27 @@ +
    + +
    +
    + +
    +
    + + +
    +
    +

    +
    + +
    +
    + +

    + +
    +
    + +
    +
    +
    +
    +
    \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/components/shimmer/datagrid/toolbar/filter.blade.php b/packages/Webkul/Admin/src/Resources/views/components/shimmer/datagrid/toolbar/filter.blade.php new file mode 100644 index 0000000..cc31c5b --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/shimmer/datagrid/toolbar/filter.blade.php @@ -0,0 +1,3 @@ +{{--
    +
    +
    --}} diff --git a/packages/Webkul/Admin/src/Resources/views/components/shimmer/datagrid/toolbar/pagination.blade.php b/packages/Webkul/Admin/src/Resources/views/components/shimmer/datagrid/toolbar/pagination.blade.php new file mode 100644 index 0000000..23f8f3c --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/shimmer/datagrid/toolbar/pagination.blade.php @@ -0,0 +1,17 @@ +
    +
    +

    +
    + +
    +
    + +

    + +
    +
    + +
    +
    +
    +
    \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/components/shimmer/datagrid/toolbar/search.blade.php b/packages/Webkul/Admin/src/Resources/views/components/shimmer/datagrid/toolbar/search.blade.php new file mode 100644 index 0000000..7e58b44 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/shimmer/datagrid/toolbar/search.blade.php @@ -0,0 +1,5 @@ +
    +
    + +
    +
    diff --git a/packages/Webkul/Admin/src/Resources/views/components/shimmer/header/mega-search/configurations.blade.php b/packages/Webkul/Admin/src/Resources/views/components/shimmer/header/mega-search/configurations.blade.php new file mode 100644 index 0000000..5566bcc --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/shimmer/header/mega-search/configurations.blade.php @@ -0,0 +1,12 @@ +@for ($i = 0; $i < 3; $i++) +
    + +
    + +
    +

    +

    +
    +
    +
    +@endfor diff --git a/packages/Webkul/Admin/src/Resources/views/components/shimmer/header/mega-search/leads.blade.php b/packages/Webkul/Admin/src/Resources/views/components/shimmer/header/mega-search/leads.blade.php new file mode 100644 index 0000000..36387e6 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/shimmer/header/mega-search/leads.blade.php @@ -0,0 +1,17 @@ +@for ($i = 0; $i < 3; $i++) +
    + +
    + +
    +

    +

    +
    +
    + + +
    +

    +
    +
    +@endfor diff --git a/packages/Webkul/Admin/src/Resources/views/components/shimmer/header/mega-search/persons.blade.php b/packages/Webkul/Admin/src/Resources/views/components/shimmer/header/mega-search/persons.blade.php new file mode 100644 index 0000000..f339b28 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/shimmer/header/mega-search/persons.blade.php @@ -0,0 +1,17 @@ +@for ($i = 0; $i < 3; $i++) +
    + +
    + +
    +

    +

    +
    +
    + + +
    +

    +
    +
    +@endfor \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/components/shimmer/header/mega-search/products.blade.php b/packages/Webkul/Admin/src/Resources/views/components/shimmer/header/mega-search/products.blade.php new file mode 100644 index 0000000..98cbed4 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/shimmer/header/mega-search/products.blade.php @@ -0,0 +1,17 @@ +@for ($i = 0; $i < 3; $i++) +
    + +
    + +
    +

    +

    +
    +
    + + +
    +

    +
    +
    +@endfor \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/components/shimmer/header/mega-search/quotes.blade.php b/packages/Webkul/Admin/src/Resources/views/components/shimmer/header/mega-search/quotes.blade.php new file mode 100644 index 0000000..fffad36 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/shimmer/header/mega-search/quotes.blade.php @@ -0,0 +1,12 @@ +@for ($i = 0; $i < 3; $i++) +
    + +
    + +
    +

    +

    +
    +
    +
    +@endfor \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/components/shimmer/header/mega-search/settings.blade.php b/packages/Webkul/Admin/src/Resources/views/components/shimmer/header/mega-search/settings.blade.php new file mode 100644 index 0000000..5566bcc --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/shimmer/header/mega-search/settings.blade.php @@ -0,0 +1,12 @@ +@for ($i = 0; $i < 3; $i++) +
    + +
    + +
    +

    +

    +
    +
    +
    +@endfor diff --git a/packages/Webkul/Admin/src/Resources/views/components/shimmer/image/index.blade.php b/packages/Webkul/Admin/src/Resources/views/components/shimmer/image/index.blade.php new file mode 100644 index 0000000..f4ff081 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/shimmer/image/index.blade.php @@ -0,0 +1,44 @@ + +
    merge(['class' => 'shimmer bg-neutral-100']) }}>
    +
    + +@pushOnce('scripts') + + + +@endPushOnce diff --git a/packages/Webkul/Admin/src/Resources/views/components/shimmer/leads/datagrid.blade.php b/packages/Webkul/Admin/src/Resources/views/components/shimmer/leads/datagrid.blade.php new file mode 100644 index 0000000..ba83758 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/shimmer/leads/datagrid.blade.php @@ -0,0 +1,144 @@ +
    + +
    +
    +
    +
    +
    + + +
    + +
    +
    +
    + +
    +
    + +
    + +
    +
    + +
    +
    + + +
    +
    + +
    +
    + +
    + +
    +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    +
    + + +
    +
    +
    + +
    +
    + +
    +
    + +
    +
    +
    +
    +
    +
    + + +
    +
    +
    + +
    +
    + +
    + +
    +
    + +
    +
    + + +
    +
    + +
    + +
    +
    + + +
    +
    + +
    + +
    +
    + + +
    +
    + +
    +
    +
    +
    + + +
    +
    +
    + +
    +
    + +
    + +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + + +
    +
    +
    +
    +
    \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/components/shimmer/leads/index/kanban.blade.php b/packages/Webkul/Admin/src/Resources/views/components/shimmer/leads/index/kanban.blade.php new file mode 100644 index 0000000..8d8efab --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/shimmer/leads/index/kanban.blade.php @@ -0,0 +1,60 @@ + + +
    + + @for ($i = 1; $i <= 6; $i++) +
    + +
    +
    +
    +
    +
    + +
    +
    +
    +
    +
    + + +
    + @for ($j = 1; $j <= 3; $j++) + +
    + +
    +
    + +
    + + +
    +
    +
    +
    +
    + + +
    +
    + + +
    +
    +
    +
    + + +
    +
    +
    +
    +
    +
    +
    + @endfor +
    +
    + @endfor +
    \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/components/shimmer/leads/index/kanban/toolbar.blade.php b/packages/Webkul/Admin/src/Resources/views/components/shimmer/leads/index/kanban/toolbar.blade.php new file mode 100644 index 0000000..3b34210 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/shimmer/leads/index/kanban/toolbar.blade.php @@ -0,0 +1,17 @@ +
    +
    +
    +
    +
    + +
    + +
    + + +
    +
    +
    +
    +
    +
    \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/components/shimmer/leads/view/mail/index.blade.php b/packages/Webkul/Admin/src/Resources/views/components/shimmer/leads/view/mail/index.blade.php new file mode 100644 index 0000000..2547d55 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/shimmer/leads/view/mail/index.blade.php @@ -0,0 +1,111 @@ +@props([ + 'count' => 1, +]) + +
    +
    + @for ($i = 0; $i < $count; $i++) +
    +
    +
    +
    +
    + +
    +
    +
    +
    +
    + +
    +
    +
    +
    +
    +
    +
    + +
    + +
    +
    +
    +
    +
    +
    +
    +
    +
    + @endfor +
    + +
    +
    +
    +
    +
    +
    + +
    +
    + +
    +
    +
    +
    +
    +
    +
    +
    + +
    +
    +
    +
    +
    +
    +
    + +
    +
    + + +
    +
    + +
    + + +
    +
    +
    +
    +
    + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    +
    +
    +
    + + +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/components/shimmer/leads/view/stages.blade.php b/packages/Webkul/Admin/src/Resources/views/components/shimmer/leads/view/stages.blade.php new file mode 100644 index 0000000..8373cc9 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/shimmer/leads/view/stages.blade.php @@ -0,0 +1,9 @@ +@props(['count' => 5]) + +
    + @for ($i = 0; $i < $count; $i++) +
    +
    +
    + @endfor +
    \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/components/shimmer/mail/datagrid/index.blade.php b/packages/Webkul/Admin/src/Resources/views/components/shimmer/mail/datagrid/index.blade.php new file mode 100644 index 0000000..b9c7a98 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/shimmer/mail/datagrid/index.blade.php @@ -0,0 +1,13 @@ +
    + + +
    +
    +
    + + + +
    +
    +
    +
    diff --git a/packages/Webkul/Admin/src/Resources/views/components/shimmer/mail/datagrid/table/body.blade.php b/packages/Webkul/Admin/src/Resources/views/components/shimmer/mail/datagrid/table/body.blade.php new file mode 100644 index 0000000..11f80cd --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/shimmer/mail/datagrid/table/body.blade.php @@ -0,0 +1,31 @@ +@for ($i = 0; $i < 10; $i++) +
    +
    +
    +
    +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    +
    + +
    +
    +
    +
    + +
    +
    +
    +
    +
    +
    +@endfor \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/components/shimmer/mail/datagrid/table/head.blade.php b/packages/Webkul/Admin/src/Resources/views/components/shimmer/mail/datagrid/table/head.blade.php new file mode 100644 index 0000000..caf7f84 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/shimmer/mail/datagrid/table/head.blade.php @@ -0,0 +1,13 @@ +
    +
    +
    + +
    +
    + +
    +
    + +
    +
    +
    \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/components/shimmer/person/view/activities/index.blade.php b/packages/Webkul/Admin/src/Resources/views/components/shimmer/person/view/activities/index.blade.php new file mode 100644 index 0000000..f2cfa43 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/shimmer/person/view/activities/index.blade.php @@ -0,0 +1,41 @@ +
    + +
    + @for ($i = 0; $i < 5; $i++) +
    +
    +
    + @endfor +
    + + +
    + +
    + @for ($i = 0; $i < 5; $i++) + +
    + +
    + + +
    +
    +
    + +
    +
    +
    +
    + +
    +
    + + +
    +
    +
    + @endfor +
    +
    +
    \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/components/shimmer/person/view/stages.blade.php b/packages/Webkul/Admin/src/Resources/views/components/shimmer/person/view/stages.blade.php new file mode 100644 index 0000000..3a4d6a0 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/shimmer/person/view/stages.blade.php @@ -0,0 +1,9 @@ +@props(['count' => 5]) + +
    + @for ($i = 0; $i < $count; $i++) +
    +
    +
    + @endfor +
    \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/components/shimmer/person/view/tags.blade.php b/packages/Webkul/Admin/src/Resources/views/components/shimmer/person/view/tags.blade.php new file mode 100644 index 0000000..e03ac2d --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/shimmer/person/view/tags.blade.php @@ -0,0 +1,9 @@ +@props(['count' => 5]) + +
    + @for ($i = 0; $i < $count; $i++) +
    + @endfor + +
    +
    \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/components/shimmer/pipelines/kanban.blade.php b/packages/Webkul/Admin/src/Resources/views/components/shimmer/pipelines/kanban.blade.php new file mode 100644 index 0000000..5b9a167 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/shimmer/pipelines/kanban.blade.php @@ -0,0 +1,33 @@ +
    + @for ($i = 1; $i <= 6; $i++) +
    + +
    + +
    +
    +
    +
    + + +
    +
    +
    +
    +
    + +
    +
    +
    +
    +
    +
    + +
    +
    + +
    +
    +
    + @endfor +
    \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/components/shimmer/quotes/index.blade.php b/packages/Webkul/Admin/src/Resources/views/components/shimmer/quotes/index.blade.php new file mode 100644 index 0000000..c9e2003 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/shimmer/quotes/index.blade.php @@ -0,0 +1,116 @@ +
    + +
    +
    +
    +
    +
    + +
    + +
    +
    +
    +
    +
    + +
    + +
    +
    + +
    +
    + + +
    +
    + +
    +
    + + +
    +
    +
    + +
    +
    + +
    +
    + +
    +
    +
    + + +
    +
    +
    + +
    +
    + +
    +
    + +
    +
    +
    +
    +
    + + +
    +
    +
    +
    +
    +
    + +
    + +
    +
    + +
    +
    + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    + +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + + +
    +
    +
    +
    +
    +
    +
    +
    \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/components/shimmer/settings/attributes.blade.php b/packages/Webkul/Admin/src/Resources/views/components/shimmer/settings/attributes.blade.php new file mode 100644 index 0000000..1cc494c --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/shimmer/settings/attributes.blade.php @@ -0,0 +1,62 @@ + +
    + +
    +
    +
    + + @for ($i = 1; $i < 5; $i++) +
    +
    + +
    +
    + @endfor +
    +
    + + +
    + +
    +
    +

    + +

    +
    + +
    + @for ($i = 1; $i < 4; $i++) +
    +
    + +
    +
    + @endfor +
    +
    + + +
    +
    +

    + +

    +
    + +
    +
    +
    + +
    +
    + +
    +
    + +
    +
    +
    +
    +
    +
    \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/components/shimmer/settings/web-forms/body.blade.php b/packages/Webkul/Admin/src/Resources/views/components/shimmer/settings/web-forms/body.blade.php new file mode 100644 index 0000000..fce4f85 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/shimmer/settings/web-forms/body.blade.php @@ -0,0 +1,13 @@ +
    +
    + +
    + +
    +
    + +
    + +
    +
    +
    \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/components/shimmer/settings/web-forms/head.blade.php b/packages/Webkul/Admin/src/Resources/views/components/shimmer/settings/web-forms/head.blade.php new file mode 100644 index 0000000..004d22f --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/shimmer/settings/web-forms/head.blade.php @@ -0,0 +1,7 @@ +
    +
    + +
    + +
    +
    \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/components/shimmer/settings/web-forms/index.blade.php b/packages/Webkul/Admin/src/Resources/views/components/shimmer/settings/web-forms/index.blade.php new file mode 100644 index 0000000..f69d2cd --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/shimmer/settings/web-forms/index.blade.php @@ -0,0 +1,13 @@ +
    + + +
    +
    +
    + + + +
    +
    +
    +
    \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/components/shimmer/tabs/index.blade.php b/packages/Webkul/Admin/src/Resources/views/components/shimmer/tabs/index.blade.php new file mode 100644 index 0000000..614e942 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/shimmer/tabs/index.blade.php @@ -0,0 +1,9 @@ +
    + + + + + + + +
    \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/components/shimmer/tags/index.blade.php b/packages/Webkul/Admin/src/Resources/views/components/shimmer/tags/index.blade.php new file mode 100644 index 0000000..e03ac2d --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/shimmer/tags/index.blade.php @@ -0,0 +1,9 @@ +@props(['count' => 5]) + +
    + @for ($i = 0; $i < $count; $i++) +
    + @endfor + +
    +
    \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/components/shimmer/tinymce/index.blade.php b/packages/Webkul/Admin/src/Resources/views/components/shimmer/tinymce/index.blade.php new file mode 100644 index 0000000..311bb35 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/shimmer/tinymce/index.blade.php @@ -0,0 +1,3 @@ +
    merge(['class' => 'shimmer block bg-neutral-100']) }}> + +
    \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/components/shimmer/tree/index.blade.php b/packages/Webkul/Admin/src/Resources/views/components/shimmer/tree/index.blade.php new file mode 100644 index 0000000..fc8e172 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/shimmer/tree/index.blade.php @@ -0,0 +1,31 @@ +@for ($j = 0; $j < 3; $j++) +
    + +
    + +
    + + +
    +
    + +
    + +
    +
    +
    + + +
    + @for ($k = 0; $k < 5; $k++) +
    +
    + +
    + +
    +
    + @endfor +
    +
    +@endfor \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/components/spinner/index.blade.php b/packages/Webkul/Admin/src/Resources/views/components/spinner/index.blade.php new file mode 100644 index 0000000..ed724bd --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/spinner/index.blade.php @@ -0,0 +1,27 @@ + +@props(['color' => 'currentColor']) + + \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/components/table/index.blade.php b/packages/Webkul/Admin/src/Resources/views/components/table/index.blade.php new file mode 100644 index 0000000..a886898 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/table/index.blade.php @@ -0,0 +1,3 @@ +merge(['class' => 'table-fixed w-full min-w-[800px] text-left text-sm border border-gray-200 dark:border-gray-800']) }}> + {{ $slot }} +
    \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/components/table/tbody/index.blade.php b/packages/Webkul/Admin/src/Resources/views/components/table/tbody/index.blade.php new file mode 100644 index 0000000..fd45937 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/table/tbody/index.blade.php @@ -0,0 +1,3 @@ +merge(['class' => 'bg-white dark:bg-gray-900 dark:text-gray-300 dark:border-gray-800']) }}> + {{ $slot }} + \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/components/table/tbody/tr.blade.php b/packages/Webkul/Admin/src/Resources/views/components/table/tbody/tr.blade.php new file mode 100644 index 0000000..3fb610a --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/table/tbody/tr.blade.php @@ -0,0 +1,3 @@ +merge(['scope' => 'row', 'class' => 'border-b border-gray-200 last:border-b-0 dark:border-gray-800']) }}> + {{ $slot }} + \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/components/table/td.blade.php b/packages/Webkul/Admin/src/Resources/views/components/table/td.blade.php new file mode 100644 index 0000000..06148f9 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/table/td.blade.php @@ -0,0 +1,4 @@ +merge(['scope' => 'row', 'class' => 'whitespace-nowrap px-6 py-4']) }}> + {{ $slot }} + + \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/components/table/th.blade.php b/packages/Webkul/Admin/src/Resources/views/components/table/th.blade.php new file mode 100644 index 0000000..57bc1d5 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/table/th.blade.php @@ -0,0 +1,3 @@ +merge(['scope' => 'col', 'class' => 'whitespace-nowrap px-6 py-4 font-semibold']) }}> + {{ $slot }} + diff --git a/packages/Webkul/Admin/src/Resources/views/components/table/thead/index.blade.php b/packages/Webkul/Admin/src/Resources/views/components/table/thead/index.blade.php new file mode 100644 index 0000000..ace6cd8 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/table/thead/index.blade.php @@ -0,0 +1,3 @@ +merge(['class' => 'bg-gray-50 dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300']) }}> + {{ $slot }} + \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/components/table/thead/tr.blade.php b/packages/Webkul/Admin/src/Resources/views/components/table/thead/tr.blade.php new file mode 100644 index 0000000..87e980d --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/table/thead/tr.blade.php @@ -0,0 +1,3 @@ +merge(['scope' => 'row', 'class' => 'border-b border-gray-200 dark:border-gray-800']) }}> + {{ $slot }} + \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/components/tabs/index.blade.php b/packages/Webkul/Admin/src/Resources/views/components/tabs/index.blade.php new file mode 100644 index 0000000..e1ac715 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/tabs/index.blade.php @@ -0,0 +1,65 @@ +@props(['position' => 'left']) + + + + + +@pushOnce('scripts') + + + +@endPushOnce diff --git a/packages/Webkul/Admin/src/Resources/views/components/tabs/item.blade.php b/packages/Webkul/Admin/src/Resources/views/components/tabs/item.blade.php new file mode 100644 index 0000000..dc1cd0b --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/tabs/item.blade.php @@ -0,0 +1,51 @@ +@props([ + 'title' => '', + 'isSelected' => false, +]) + +merge(['class' => 'p-4']) }} +> + + + +@pushOnce('scripts') + + + +@endPushOnce diff --git a/packages/Webkul/Admin/src/Resources/views/components/tags/index.blade.php b/packages/Webkul/Admin/src/Resources/views/components/tags/index.blade.php new file mode 100644 index 0000000..5683d48 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/tags/index.blade.php @@ -0,0 +1,398 @@ +@props([ + 'attachEndpoint', + 'detachEndpoint', + 'addedTags' => [], +]) + + + + + +@pushOnce('scripts') + + + +@endPushOnce \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/components/tinymce/index.blade.php b/packages/Webkul/Admin/src/Resources/views/components/tinymce/index.blade.php new file mode 100644 index 0000000..733e65d --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/tinymce/index.blade.php @@ -0,0 +1,217 @@ +@php($placeholders = app('\Webkul\Automation\Helpers\Entity')->getEmailTemplatePlaceholders()) + + + +@pushOnce('scripts') + + + + + + +@endPushOnce diff --git a/packages/Webkul/Admin/src/Resources/views/components/tree/checkbox.blade.php b/packages/Webkul/Admin/src/Resources/views/components/tree/checkbox.blade.php new file mode 100644 index 0000000..8af3905 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/tree/checkbox.blade.php @@ -0,0 +1,55 @@ +@pushOnce('scripts') + + + +@endPushOnce diff --git a/packages/Webkul/Admin/src/Resources/views/components/tree/radio.blade.php b/packages/Webkul/Admin/src/Resources/views/components/tree/radio.blade.php new file mode 100644 index 0000000..769062a --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/tree/radio.blade.php @@ -0,0 +1,54 @@ +@pushOnce('scripts') + + + +@endPushOnce diff --git a/packages/Webkul/Admin/src/Resources/views/components/tree/view.blade.php b/packages/Webkul/Admin/src/Resources/views/components/tree/view.blade.php new file mode 100644 index 0000000..177d136 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/components/tree/view.blade.php @@ -0,0 +1,393 @@ +@props([ + 'inputType' => 'checkbox', + 'selectionType' => 'hierarchical', +]) + +@if ($inputType == 'checkbox') + + +@else + + +@endif + +except(['input-type', 'selection-type']) }} + input-type="{{ $inputType }}" + selection-type="{{ $selectionType }}" +> + + + +@pushOnce('scripts') + +@endPushOnce diff --git a/packages/Webkul/Admin/src/Resources/views/configuration/edit.blade.php b/packages/Webkul/Admin/src/Resources/views/configuration/edit.blade.php new file mode 100644 index 0000000..08fbe00 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/configuration/edit.blade.php @@ -0,0 +1,83 @@ +@php + $activeConfiguration = system_config()->getActiveConfigurationItem(); +@endphp + + + + {{ $name = $activeConfiguration->getName() }} + + + {!! view_render_event('admin.configuration.edit.form_controls.before') !!} + + + + +
    +

    + {{ $name }} +

    + + +
    + {!! view_render_event('admin.configuration.edit.back_button.before') !!} + + + + @lang('admin::app.configuration.index.back') + + + {!! view_render_event('admin.configuration.edit.back_button.after') !!} + + {!! view_render_event('admin.configuration.edit.save_button.before') !!} + + + + {!! view_render_event('admin.configuration.edit.save_button.after') !!} +
    +
    + +
    + @foreach ($activeConfiguration->getChildren() as $child) +
    +

    + {{ $child->getName() }} +

    + +

    + {!! $child->getInfo() !!} +

    +
    + +
    + {!! view_render_event('admin.configuration.edit.form_controls.before') !!} + + @foreach ($child->getFields() as $field) + @if ( + $field->getType() == 'blade' + && view()->exists($path = $field->getPath()) + ) + {!! view($path, compact('field', 'child'))->render() !!} + @else + @include ('admin::configuration.field-type') + @endif + @endforeach + + {!! view_render_event('admin.configuration.edit.form_controls.after') !!} +
    + @endforeach +
    +
    + + {!! view_render_event('admin.configuration.edit.form_controls.after') !!} +
    diff --git a/packages/Webkul/Admin/src/Resources/views/configuration/field-type.blade.php b/packages/Webkul/Admin/src/Resources/views/configuration/field-type.blade.php new file mode 100755 index 0000000..31f0ab6 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/configuration/field-type.blade.php @@ -0,0 +1,524 @@ +@php($value = old($field->getNameKey()) ?? system_config()->getConfigData($field->getNameKey())) + + + +
    + +
    + +
    +
    +
    + +@pushOnce('scripts') + + + + + + + +@endPushOnce \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/configuration/index.blade.php b/packages/Webkul/Admin/src/Resources/views/configuration/index.blade.php new file mode 100644 index 0000000..2ba8c0e --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/configuration/index.blade.php @@ -0,0 +1,196 @@ + + + + @lang('admin::app.configuration.index.title') + + + + + + {!! view_render_event('admin.configuration.index.header.before') !!} + + +
    +

    + @lang('admin::app.configuration.index.title') +

    + + {!! view_render_event('admin.configuration.index.header.configuration_search.before') !!} + + + +
    + + + +
    +
    + + {!! view_render_event('admin.configuration.index.header.configuration_search.after') !!} +
    + + {!! view_render_event('admin.configuration.index.header.after') !!} + + {!! view_render_event('admin.configuration.index.content.before') !!} + + +
    + @foreach (system_config()->getItems() as $item) +
    +
    + +

    + {{ $item->getName() }} +

    + + +

    + {{ $item->getInfo() }} +

    +
    + + +
    + @endforeach +
    + + {!! view_render_event('admin.configuration.index.content.after') !!} + + @pushOnce('scripts') + + + + @endpushOnce +
    diff --git a/packages/Webkul/Admin/src/Resources/views/contacts/organizations/create.blade.php b/packages/Webkul/Admin/src/Resources/views/contacts/organizations/create.blade.php new file mode 100644 index 0000000..f86e77f --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/contacts/organizations/create.blade.php @@ -0,0 +1,73 @@ + + + + + @lang('admin::app.contacts.organizations.create.title') + + + {!! view_render_event('admin.organizations.create.form.before') !!} + + + +
    +
    +
    + {!! view_render_event('admin.organizations.create.breadcrumbs.before') !!} + + + + + {!! view_render_event('admin.organizations.create.breadcrumbs.before') !!} + +
    + @lang('admin::app.contacts.organizations.create.title') +
    +
    + +
    +
    + {!! view_render_event('admin.organizations.create.save_buttons.before') !!} + + + + + {!! view_render_event('admin.organizations.create.save_buttons.before') !!} +
    +
    +
    + +
    + {!! view_render_event('admin.contacts.organizations.create.form_controls.before') !!} + + + + {!! view_render_event('admin.contacts.organizations.edit.form_controls.after') !!} +
    +
    +
    + + {!! view_render_event('admin.organizations.create.form.after') !!} +
    diff --git a/packages/Webkul/Admin/src/Resources/views/contacts/organizations/edit.blade.php b/packages/Webkul/Admin/src/Resources/views/contacts/organizations/edit.blade.php new file mode 100644 index 0000000..d8710f4 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/contacts/organizations/edit.blade.php @@ -0,0 +1,75 @@ + + + + + @lang('admin::app.contacts.organizations.edit.title') + + + {!! view_render_event('admin.organizations.edit.form.before') !!} + + +
    +
    +
    + {!! view_render_event('admin.organizations.edit.breadcrumbs.before', ['organization' => $organization]) !!} + + + + {!! view_render_event('admin.organizations.edit.breadcrumbs.before', ['organization' => $organization]) !!} + +
    + @lang('admin::app.contacts.organizations.edit.title') +
    +
    + +
    +
    + {!! view_render_event('admin.organizations.edit.save_button.before', ['organization' => $organization]) !!} + + + + + {!! view_render_event('admin.organizations.edit.save_button.after', ['organization' => $organization]) !!} +
    +
    +
    + +
    + {!! view_render_event('admin.contacts.organizations.edit.form_controls.before') !!} + + + + {!! view_render_event('admin.contacts.organizations.edit.form_controls.after') !!} +
    +
    +
    + + {!! view_render_event('admin.organizations.edit.form.after') !!} +
    diff --git a/packages/Webkul/Admin/src/Resources/views/contacts/organizations/index.blade.php b/packages/Webkul/Admin/src/Resources/views/contacts/organizations/index.blade.php new file mode 100644 index 0000000..1f4d880 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/contacts/organizations/index.blade.php @@ -0,0 +1,50 @@ + + + + @lang('admin::app.contacts.organizations.index.title') + + +
    +
    +
    + {!! view_render_event('admin.organizations.index.breadcrumbs.before') !!} + + + + + {!! view_render_event('admin.organizations.index.breadcrumbs.before') !!} + +
    + @lang('admin::app.contacts.organizations.index.title') +
    +
    + +
    +
    + {!! view_render_event('admin.organizations.index.create_button.before') !!} + + @if (bouncer()->hasPermission('contacts.organizations.create')) + + + @lang('admin::app.contacts.organizations.index.create-btn') + + @endif + + {!! view_render_event('admin.organizations.index.create_button.after') !!} +
    +
    +
    + + {!! view_render_event('admin.organizations.datagrid.index.before') !!} + + + + + + + {!! view_render_event('admin.organizations.datagrid.index.after') !!} +
    +
    diff --git a/packages/Webkul/Admin/src/Resources/views/contacts/persons/create.blade.php b/packages/Webkul/Admin/src/Resources/views/contacts/persons/create.blade.php new file mode 100644 index 0000000..1f91fba --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/contacts/persons/create.blade.php @@ -0,0 +1,117 @@ + + + + @lang('admin::app.contacts.persons.create.title') + + + {!! view_render_event('admin.persons.create.form.before') !!} + + + +
    + +
    +
    + {!! view_render_event('admin.persons.create.breadcrumbs.before') !!} + + + + + {!! view_render_event('admin.persons.create.breadcrumbs.after') !!} + +
    + @lang('admin::app.contacts.persons.create.title') +
    +
    + +
    +
    + {!! view_render_event('admin.persons.create.create_button.before') !!} + + + + + {!! view_render_event('admin.persons.create.create_button.after') !!} +
    +
    +
    + + +
    + {!! view_render_event('admin.persons.create.form_controls.before') !!} + + + + + + {!! view_render_event('admin.persons.create.form_controls.after') !!} +
    +
    +
    + + {!! view_render_event('admin.persons.create.form.after') !!} + + @pushOnce('scripts') + + + + @endPushOnce +
    diff --git a/packages/Webkul/Admin/src/Resources/views/contacts/persons/edit.blade.php b/packages/Webkul/Admin/src/Resources/views/contacts/persons/edit.blade.php new file mode 100644 index 0000000..60e85fb --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/contacts/persons/edit.blade.php @@ -0,0 +1,120 @@ + + + + + @lang('admin::app.contacts.persons.edit.title') + + + {!! view_render_event('admin.persons.edit.form.before') !!} + + +
    +
    +
    + {!! view_render_event('admin.persons.edit.breadcrumbs.before') !!} + + + + {!! view_render_event('admin.persons.edit.breadcrumbs.after') !!} + +
    + @lang('admin::app.contacts.persons.edit.title') +
    +
    + +
    + +
    + {!! view_render_event('admin.persons.edit.save_button.before') !!} + + + + {!! view_render_event('admin.persons.edit.save_button.after') !!} +
    +
    +
    + +
    + {!! view_render_event('admin.contacts.persons.edit.form_controls.before') !!} + + + + + + {!! view_render_event('admin.contacts.persons.edit.form_controls.after') !!} +
    +
    +
    + + {!! view_render_event('admin.persons.edit.form.after') !!} + + @pushOnce('scripts') + + + + @endPushOnce +
    diff --git a/packages/Webkul/Admin/src/Resources/views/contacts/persons/index.blade.php b/packages/Webkul/Admin/src/Resources/views/contacts/persons/index.blade.php new file mode 100644 index 0000000..8f0e2b9 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/contacts/persons/index.blade.php @@ -0,0 +1,339 @@ + + + @lang('admin::app.contacts.persons.index.title') + + +
    +
    +
    + + +
    + @lang('admin::app.contacts.persons.index.title') +
    +
    + +
    + + + + +
    + {!! view_render_event('admin.persons.index.create_button.before') !!} + + @if (bouncer()->hasPermission('contacts.persons.create')) + + @lang('admin::app.contacts.persons.index.create-btn') + + @endif + + {!! view_render_event('admin.persons.index.create_button.after') !!} +
    +
    +
    + + {!! view_render_event('admin.persons.index.datagrid.before') !!} + + + + + + + {!! view_render_event('admin.persons.index.datagrid.after') !!} +
    + + @pushOnce('scripts') + + + + @endPushOnce +
    diff --git a/packages/Webkul/Admin/src/Resources/views/contacts/persons/view.blade.php b/packages/Webkul/Admin/src/Resources/views/contacts/persons/view.blade.php new file mode 100644 index 0000000..4348dc7 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/contacts/persons/view.blade.php @@ -0,0 +1,100 @@ + + + @lang('admin::app.contacts.persons.view.title', ['name' => $person->name]) + + + +
    + + {!! view_render_event('admin.contact.persons.view.left.before', ['person' => $person]) !!} + +
    + +
    + +
    + +
    + + {!! view_render_event('admin.contact.persons.view.tags.before', ['person' => $person]) !!} + + + + + {!! view_render_event('admin.contact.persons.view.tags.after', ['person' => $person]) !!} + + + +
    + {!! view_render_event('admin.contact.persons.view.title.before', ['person' => $person]) !!} + +

    + {{ $person->name }} +

    + +

    + {{ $person->job_title }} +

    + + {!! view_render_event('admin.contact.persons.view.title.after', ['person' => $person]) !!} +
    + + +
    + {!! view_render_event('admin.contact.persons.view.actions.before', ['person' => $person]) !!} + + + + + + + + + + + + + + {!! view_render_event('admin.contact.persons.view.actions.after', ['person' => $person]) !!} +
    +
    + + + @include ('admin::contacts.persons.view.attributes') + + + @include ('admin::contacts.persons.view.organization') +
    + + {!! view_render_event('admin.contact.persons.view.left.after', ['person' => $person]) !!} + + +
    + {!! view_render_event('admin.contact.persons.view.right.before', ['person' => $person]) !!} + + + + + {!! view_render_event('admin.contact.persons.view.right.after', ['person' => $person]) !!} +
    +
    +
    diff --git a/packages/Webkul/Admin/src/Resources/views/contacts/persons/view/attributes.blade.php b/packages/Webkul/Admin/src/Resources/views/contacts/persons/view/attributes.blade.php new file mode 100644 index 0000000..16d605e --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/contacts/persons/view/attributes.blade.php @@ -0,0 +1,41 @@ +{!! view_render_event('admin.contacts.persons.view.attributes.before', ['person' => $person]) !!} + +
    + + +

    + @lang('admin::app.contacts.persons.view.about-person') +

    + + + + {!! view_render_event('admin.contacts.persons.view.attributes.form_controls.before', ['person' => $person]) !!} + + +
    + {!! view_render_event('admin.contacts.persons.view.attributes.form_controls.attributes_view.before', ['person' => $person]) !!} + + + + {!! view_render_event('admin.contacts.persons.view.attributes.form_controls.attributes_view.after', ['person' => $person]) !!} + +
    + + {!! view_render_event('admin.contacts.persons.view.attributes.form_controls.after', ['person' => $person]) !!} + +
    +
    + +{!! view_render_event('admin.contacts.persons.view.attributes.before', ['person' => $person]) !!} diff --git a/packages/Webkul/Admin/src/Resources/views/contacts/persons/view/organization.blade.php b/packages/Webkul/Admin/src/Resources/views/contacts/persons/view/organization.blade.php new file mode 100644 index 0000000..7f0569d --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/contacts/persons/view/organization.blade.php @@ -0,0 +1,73 @@ +{!! view_render_event('admin.contacts.persons.view.organization.before', ['person' => $person]) !!} + +@if ($person?->organization) +
    +

    + @lang('admin::app.contacts.persons.view.about-organization') + + +

    + +
    + {!! view_render_event('admin.contacts.persons.view.organization.avatar.before', ['person' => $person]) !!} + + + + + {!! view_render_event('admin.contacts.persons.view.organization.avatar.after', ['person' => $person]) !!} + + +
    + {!! view_render_event('admin.contacts.persons.view.organization.name.before', ['person' => $person]) !!} + + + {{ $person->organization->name }} + + + {!! view_render_event('admin.contacts.persons.view.organization.name.after', ['person' => $person]) !!} + + + {!! view_render_event('admin.contacts.persons.view.organization.address.before', ['person' => $person]) !!} + + @if ($person->organization->address) +
    + @isset($person->organization->address['address']) + + {{ $person->organization->address['address'] }} + + @endisset + + @if( + isset($person->organization->address['postcode']) + && isset($person->organization->address['city']) + ) + + {{ $person->organization->address['postcode'] . ' ' . $person->organization->address['city'] }} + + @endif + + @isset($person->organization->address['state']) + + {{ core()->state_name($person->organization->address['state']) }} + + @endisset + + @isset($person->organization->address['country']) + + {{ core()->country_name($person->organization->address['country']) }} + + @endisset +
    + @endif + + {!! view_render_event('admin.contacts.persons.view.organization.address.after', ['person' => $person]) !!} +
    +
    +
    +@endif + +{!! view_render_event('admin.contacts.persons.view.organization.after', ['person' => $person]) !!} diff --git a/packages/Webkul/Admin/src/Resources/views/dashboard/index.blade.php b/packages/Webkul/Admin/src/Resources/views/dashboard/index.blade.php new file mode 100644 index 0000000..467aae0 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/dashboard/index.blade.php @@ -0,0 +1,160 @@ + + + @lang('admin::app.dashboard.index.title') + + + + {!! view_render_event('admin.dashboard.index.header.before') !!} + +
    + {!! view_render_event('admin.dashboard.index.header.left.before') !!} + +
    +

    + @lang('admin::app.dashboard.index.title') +

    +
    + + {!! view_render_event('admin.dashboard.index.header.left.after') !!} + + + {!! view_render_event('admin.dashboard.index.header.right.before') !!} + + + +
    +
    +
    +
    +
    + + {!! view_render_event('admin.dashboard.index.header.right.after') !!} +
    + + {!! view_render_event('admin.dashboard.index.header.after') !!} + + + {!! view_render_event('admin.dashboard.index.content.before') !!} + +
    + + {!! view_render_event('admin.dashboard.index.content.left.before') !!} + +
    + + @include('admin::dashboard.index.revenue') + + + @include('admin::dashboard.index.over-all') + + + @include('admin::dashboard.index.total-leads') + +
    + + @include('admin::dashboard.index.top-selling-products') + + + @include('admin::dashboard.index.top-persons') +
    +
    + + {!! view_render_event('admin.dashboard.index.content.left.after') !!} + + + {!! view_render_event('admin.dashboard.index.content.right.before') !!} + +
    + + @include('admin::dashboard.index.open-leads-by-states') + + + @include('admin::dashboard.index.revenue-by-sources') + + + @include('admin::dashboard.index.revenue-by-types') +
    + + {!! view_render_event('admin.dashboard.index.content.left.after') !!} +
    + + {!! view_render_event('admin.dashboard.index.content.after') !!} + + @pushOnce('scripts') + + + + + + + + + @endPushOnce +
    diff --git a/packages/Webkul/Admin/src/Resources/views/dashboard/index/open-leads-by-states.blade.php b/packages/Webkul/Admin/src/Resources/views/dashboard/index/open-leads-by-states.blade.php new file mode 100644 index 0000000..b88b5da --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/dashboard/index/open-leads-by-states.blade.php @@ -0,0 +1,168 @@ +{!! view_render_event('admin.dashboard.index.open_leads_by_states.before') !!} + + + + + + + +{!! view_render_event('admin.dashboard.index.open_leads_by_states.after') !!} + +@pushOnce('scripts') + + + + +@endPushOnce diff --git a/packages/Webkul/Admin/src/Resources/views/dashboard/index/over-all.blade.php b/packages/Webkul/Admin/src/Resources/views/dashboard/index/over-all.blade.php new file mode 100644 index 0000000..83d2360 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/dashboard/index/over-all.blade.php @@ -0,0 +1,231 @@ +{!! view_render_event('admin.dashboard.index.over_all.before') !!} + + + + + + + +{!! view_render_event('admin.dashboard.index.over_all.after') !!} + +@pushOnce('scripts') + + + +@endPushOnce \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/dashboard/index/revenue-by-sources.blade.php b/packages/Webkul/Admin/src/Resources/views/dashboard/index/revenue-by-sources.blade.php new file mode 100644 index 0000000..7aba2fb --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/dashboard/index/revenue-by-sources.blade.php @@ -0,0 +1,154 @@ +{!! view_render_event('admin.dashboard.index.revenue_by_sources.before') !!} + + + + + + + +{!! view_render_event('admin.dashboard.index.revenue_by_sources.after') !!} + +@pushOnce('scripts') + + + +@endPushOnce diff --git a/packages/Webkul/Admin/src/Resources/views/dashboard/index/revenue-by-types.blade.php b/packages/Webkul/Admin/src/Resources/views/dashboard/index/revenue-by-types.blade.php new file mode 100644 index 0000000..60cea9e --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/dashboard/index/revenue-by-types.blade.php @@ -0,0 +1,154 @@ +{!! view_render_event('admin.dashboard.index.revenue_by_types.before') !!} + + + + + + + +{!! view_render_event('admin.dashboard.index.revenue_by_types.after') !!} + +@pushOnce('scripts') + + + +@endPushOnce diff --git a/packages/Webkul/Admin/src/Resources/views/dashboard/index/revenue.blade.php b/packages/Webkul/Admin/src/Resources/views/dashboard/index/revenue.blade.php new file mode 100644 index 0000000..e803cf6 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/dashboard/index/revenue.blade.php @@ -0,0 +1,241 @@ +{!! view_render_event('admin.dashboard.index.revenue.after') !!} + + + + + + + +{!! view_render_event('admin.dashboard.index.revenue.after') !!} + +@pushOnce('scripts') + + + +@endPushOnce diff --git a/packages/Webkul/Admin/src/Resources/views/dashboard/index/top-persons.blade.php b/packages/Webkul/Admin/src/Resources/views/dashboard/index/top-persons.blade.php new file mode 100644 index 0000000..11a6bc2 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/dashboard/index/top-persons.blade.php @@ -0,0 +1,120 @@ +{!! view_render_event('admin.dashboard.index.top_persons.before') !!} + + + + + + + +{!! view_render_event('admin.dashboard.index.top_persons.after') !!} + +@pushOnce('scripts') + + + +@endPushOnce diff --git a/packages/Webkul/Admin/src/Resources/views/dashboard/index/top-selling-products.blade.php b/packages/Webkul/Admin/src/Resources/views/dashboard/index/top-selling-products.blade.php new file mode 100644 index 0000000..0c504a9 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/dashboard/index/top-selling-products.blade.php @@ -0,0 +1,129 @@ +{!! view_render_event('admin.dashboard.index.top_selling_proudcts.before') !!} + + + + + + + +{!! view_render_event('admin.dashboard.index.top_selling_proudcts.after') !!} + +@pushOnce('scripts') + + + +@endPushOnce diff --git a/packages/Webkul/Admin/src/Resources/views/dashboard/index/total-leads.blade.php b/packages/Webkul/Admin/src/Resources/views/dashboard/index/total-leads.blade.php new file mode 100644 index 0000000..c84b9b1 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/dashboard/index/total-leads.blade.php @@ -0,0 +1,128 @@ +{!! view_render_event('admin.dashboard.index.total_leads.before') !!} + + + + + + + +{!! view_render_event('admin.dashboard.index.total_leads.after') !!} + +@pushOnce('scripts') + + + +@endPushOnce \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/emails/common/index.blade.php b/packages/Webkul/Admin/src/Resources/views/emails/common/index.blade.php new file mode 100644 index 0000000..f8a3edc --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/emails/common/index.blade.php @@ -0,0 +1,3 @@ +@component('admin::emails.layout') + {!! $body !!} +@endcomponent diff --git a/packages/Webkul/Admin/src/Resources/views/emails/layout.blade.php b/packages/Webkul/Admin/src/Resources/views/emails/layout.blade.php new file mode 100644 index 0000000..38e6f6a --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/emails/layout.blade.php @@ -0,0 +1,36 @@ + + + + + + + + + + + + +
    +
    + +
    + + {{ config('app.name') }} + +
    + + + {{ $slot }} + + +

    + @lang('admin::app.emails.common.cheers', ['app_name' => config('app.name')]) +

    +
    +
    + + diff --git a/packages/Webkul/Admin/src/Resources/views/emails/users/create.blade.php b/packages/Webkul/Admin/src/Resources/views/emails/users/create.blade.php new file mode 100644 index 0000000..1d83a1d --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/emails/users/create.blade.php @@ -0,0 +1,11 @@ +@component('admin::emails.layout') +
    +

    + @lang('admin::app.emails.common.user.dear', ['username' => $user_name]), 👋 +

    + +

    + @lang('admin::app.emails.common.user.create-body') +

    +
    +@endcomponent diff --git a/packages/Webkul/Admin/src/Resources/views/emails/users/forget-password.blade.php b/packages/Webkul/Admin/src/Resources/views/emails/users/forget-password.blade.php new file mode 100644 index 0000000..bad6350 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/emails/users/forget-password.blade.php @@ -0,0 +1,28 @@ +@component('admin::emails.layout') +
    +

    + @lang('admin::app.emails.common.user.forget-password.dear', ['username' => $user_name]), 👋 +

    + +

    + @lang('admin::app.emails.common.user.forget-password.info') +

    + +

    + + @lang('admin::app.emails.common.user.forget-password.reset-password') + +

    + +

    + @lang('admin::app.emails.common.user.forget-password.final-summary') +

    + +

    + @lang('admin::app.emails.common.user.forget-password.thanks') +

    +
    +@endcomponent diff --git a/packages/Webkul/Admin/src/Resources/views/errors/index.blade.php b/packages/Webkul/Admin/src/Resources/views/errors/index.blade.php new file mode 100644 index 0000000..0c73cc6 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/errors/index.blade.php @@ -0,0 +1,64 @@ + + + + @lang("admin::app.errors.{$errorCode}.title") + + + +
    +
    +
    + + +
    + {{ $errorCode }} +
    + +

    + @lang("admin::app.errors.{$errorCode}.description") +

    + + + +

    + @lang('admin::app.errors.support', [ + 'link' => 'mailto:support@example.com', + 'email' => 'support@example.com', + 'class' => 'font-semibold text-blue-600 transition-all hover:underline', + ]) +

    +
    + +
    + +
    +
    +
    +
    diff --git a/packages/Webkul/Admin/src/Resources/views/leads/common/contact.blade.php b/packages/Webkul/Admin/src/Resources/views/leads/common/contact.blade.php new file mode 100644 index 0000000..6f89f8d --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/leads/common/contact.blade.php @@ -0,0 +1,141 @@ +{!! view_render_event('admin.leads.create.contact_person.form_controls.before') !!} + + + +{!! view_render_event('admin.leads.create.contact_person.form_controls.after') !!} + +@pushOnce('scripts') + + + +@endPushOnce \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/leads/common/products.blade.php b/packages/Webkul/Admin/src/Resources/views/leads/common/products.blade.php new file mode 100644 index 0000000..9e08493 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/leads/common/products.blade.php @@ -0,0 +1,269 @@ +{!! view_render_event('admin.leads.create.products.form_controls.before') !!} + + + +{!! view_render_event('admin.leads.create.products.form_controls.after') !!} + +@pushOnce('scripts') + + + + + +@endPushOnce \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/leads/create.blade.php b/packages/Webkul/Admin/src/Resources/views/leads/create.blade.php new file mode 100644 index 0000000..9a6e112 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/leads/create.blade.php @@ -0,0 +1,272 @@ + + + @lang('admin::app.leads.create.title') + + + {!! view_render_event('admin.leads.create.form.before') !!} + + + +
    +
    +
    + + +
    + @lang('admin::app.leads.create.title') +
    +
    + + {!! view_render_event('admin.leads.create.save_button.before') !!} + +
    + +
    + {!! view_render_event('admin.leads.create.form_buttons.before') !!} + + + + {!! view_render_event('admin.leads.create.form_buttons.after') !!} +
    +
    + + {!! view_render_event('admin.leads.create.save_button.after') !!} +
    + + @if (request('stage_id')) + + @endif + + @if (request('pipeline_id')) + + @endif + + + + + +
    +
    + + {!! view_render_event('admin.leads.create.form.after') !!} + + @pushOnce('scripts') + + + + @endPushOnce + + @pushOnce('styles') + + @endPushOnce +
    diff --git a/packages/Webkul/Admin/src/Resources/views/leads/edit.blade.php b/packages/Webkul/Admin/src/Resources/views/leads/edit.blade.php new file mode 100644 index 0000000..43b1d56 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/leads/edit.blade.php @@ -0,0 +1,270 @@ + + + + @lang('admin::app.leads.edit.title') + + + {!! view_render_event('admin.leads.edit.form_controls.before', ['lead' => $lead]) !!} + + + +
    +
    +
    + + +
    + @lang('admin::app.leads.edit.title') +
    +
    + +
    + {!! view_render_event('admin.leads.edit.save_button.before', ['lead' => $lead]) !!} + + +
    + {!! view_render_event('admin.leads.edit.form_buttons.before') !!} + + + + {!! view_render_event('admin.leads.edit.form_buttons.after') !!} +
    + + {!! view_render_event('admin.leads.edit.save_button.after', ['lead' => $lead]) !!} +
    +
    + + + + + + + +
    +
    + + {!! view_render_event('admin.leads.edit.form_controls.after', ['lead' => $lead]) !!} + + @pushOnce('scripts') + + + + @endPushOnce + + @pushOnce('styles') + + @endPushOnce +
    \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/leads/index.blade.php b/packages/Webkul/Admin/src/Resources/views/leads/index.blade.php new file mode 100644 index 0000000..d278ff2 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/leads/index.blade.php @@ -0,0 +1,66 @@ + + + @lang('admin::app.leads.index.title') + + + + {!! view_render_event('admin.leads.index.header.before') !!} + +
    + {!! view_render_event('admin.leads.index.header.left.before') !!} + +
    + + + +
    + @lang('admin::app.leads.index.title') +
    +
    + + {!! view_render_event('admin.leads.index.header.left.after') !!} + + {!! view_render_event('admin.leads.index.header.right.before') !!} + +
    + + @if(core()->getConfigData('general.magic_ai.doc_generation.enabled')) + @include('admin::leads.index.upload') + @endif + + @if ((request()->view_type ?? "kanban") == "table") + + + @endif + + +
    + @if (bouncer()->hasPermission('leads.create')) + + @lang('admin::app.leads.index.create-btn') + + @endif +
    +
    + + {!! view_render_event('admin.leads.index.header.right.after') !!} +
    + + {!! view_render_event('admin.leads.index.header.after') !!} + + {!! view_render_event('admin.leads.index.content.before') !!} + + +
    + @if ((request()->view_type ?? "kanban") == "table") + @include('admin::leads.index.table') + @else + @include('admin::leads.index.kanban') + @endif +
    + + {!! view_render_event('admin.leads.index.content.after') !!} +
    diff --git a/packages/Webkul/Admin/src/Resources/views/leads/index/kanban.blade.php b/packages/Webkul/Admin/src/Resources/views/leads/index/kanban.blade.php new file mode 100644 index 0000000..1d4efe6 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/leads/index/kanban.blade.php @@ -0,0 +1,772 @@ +{!! view_render_event('admin.leads.index.kanban.before') !!} + + + +
    + + +
    +
    + +{!! view_render_event('admin.leads.index.kanban.after') !!} + +@pushOnce('scripts') + + + +@endPushOnce diff --git a/packages/Webkul/Admin/src/Resources/views/leads/index/kanban/filter.blade.php b/packages/Webkul/Admin/src/Resources/views/leads/index/kanban/filter.blade.php new file mode 100644 index 0000000..d540df8 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/leads/index/kanban/filter.blade.php @@ -0,0 +1,1093 @@ +{!! view_render_event('admin.leads.index.kanban.filter.before') !!} + + + + +{!! view_render_event('admin.leads.index.kanban.filter.after') !!} + +@pushOnce('scripts') + + + + + + + +@endpushOnce diff --git a/packages/Webkul/Admin/src/Resources/views/leads/index/kanban/search.blade.php b/packages/Webkul/Admin/src/Resources/views/leads/index/kanban/search.blade.php new file mode 100644 index 0000000..8dc605b --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/leads/index/kanban/search.blade.php @@ -0,0 +1,98 @@ +{!! view_render_event('admin.leads.index.kanban.search.before') !!} + + + + +{!! view_render_event('admin.leads.index.kanban.search.after') !!} + +@pushOnce('scripts') + + + +@endPushOnce diff --git a/packages/Webkul/Admin/src/Resources/views/leads/index/kanban/toolbar.blade.php b/packages/Webkul/Admin/src/Resources/views/leads/index/kanban/toolbar.blade.php new file mode 100644 index 0000000..e72aab6 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/leads/index/kanban/toolbar.blade.php @@ -0,0 +1,30 @@ +{!! view_render_event('admin.leads.index.kanban.toolbar.before') !!} + +
    +
    + {!! view_render_event('admin.leads.index.kanban.toolbar.search.before') !!} + + + @include('admin::leads.index.kanban.search') + + {!! view_render_event('admin.leads.index.kanban.toolbar.search.after') !!} + + {!! view_render_event('admin.leads.index.kanban.toolbar.filter.before') !!} + + + @include('admin::leads.index.kanban.filter') + + {!! view_render_event('admin.leads.index.kanban.toolbar.filter.after') !!} + + +
    + + {!! view_render_event('admin.leads.index.kanban.toolbar.switcher.before') !!} + + + @include('admin::leads.index.view-switcher') + + {!! view_render_event('admin.leads.index.kanban.toolbar.switcher.after') !!} +
    + +{!! view_render_event('admin.leads.index.kanban.toolbar.after') !!} diff --git a/packages/Webkul/Admin/src/Resources/views/leads/index/table.blade.php b/packages/Webkul/Admin/src/Resources/views/leads/index/table.blade.php new file mode 100644 index 0000000..9f4a75b --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/leads/index/table.blade.php @@ -0,0 +1,12 @@ +{!! view_render_event('admin.leads.index.table.before') !!} + + + + + + + @include('admin::leads.index.view-switcher') + + + +{!! view_render_event('admin.leads.index.table.after') !!} \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/leads/index/upload.blade.php b/packages/Webkul/Admin/src/Resources/views/leads/index/upload.blade.php new file mode 100644 index 0000000..e6d598d --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/leads/index/upload.blade.php @@ -0,0 +1,141 @@ + + + + +@pushOnce('scripts') + + + +@endPushOnce diff --git a/packages/Webkul/Admin/src/Resources/views/leads/index/view-switcher.blade.php b/packages/Webkul/Admin/src/Resources/views/leads/index/view-switcher.blade.php new file mode 100644 index 0000000..841f73a --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/leads/index/view-switcher.blade.php @@ -0,0 +1,95 @@ +{!! view_render_event('admin.leads.index.view_switcher.before') !!} + +
    + + + {!! view_render_event('admin.leads.index.view_switcher.pipeline.button.before') !!} + + + + {!! view_render_event('admin.leads.index.view_switcher.pipeline.button.after') !!} + + + + {!! view_render_event('admin.leads.index.view_switcher.pipeline.content.header.before') !!} + + +
    + + @lang('admin::app.leads.index.view-switcher.all-pipelines') + +
    + + {!! view_render_event('admin.leads.index.view_switcher.pipeline.content.header.after') !!} + + + @foreach (app('Webkul\Lead\Repositories\PipelineRepository')->all() as $tempPipeline) + {!! view_render_event('admin.leads.index.view_switcher.pipeline.content.before', ['tempPipeline' => $tempPipeline]) !!} + + + {{ $tempPipeline->name }} + + + {!! view_render_event('admin.leads.index.view_switcher.pipeline.content.after', ['tempPipeline' => $tempPipeline]) !!} + @endforeach + + {!! view_render_event('admin.leads.index.view_switcher.pipeline.content.footer.before') !!} + + + + + @lang('admin::app.leads.index.view-switcher.create-new-pipeline') + + + + {!! view_render_event('admin.leads.index.view_switcher.pipeline.content.footer.after') !!} + +
    + +
    + {!! view_render_event('admin.leads.index.view_switcher.pipeline.view_type.before') !!} + + @if (request('view_type')) + + + + + + @else + + + + + + @endif + + {!! view_render_event('admin.leads.index.view_switcher.pipeline.view_type.after') !!} +
    +
    + +{!! view_render_event('admin.leads.index.view_switcher.after') !!} \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/leads/view.blade.php b/packages/Webkul/Admin/src/Resources/views/leads/view.blade.php new file mode 100644 index 0000000..8b79070 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/leads/view.blade.php @@ -0,0 +1,142 @@ + + + @lang('admin::app.leads.view.title', ['title' => $lead->title]) + + + +
    + + {!! view_render_event('admin.leads.view.left.before', ['lead' => $lead]) !!} + +
    + +
    + +
    + +
    + +
    + @if (($days = $lead->rotten_days) > 0) + @php + $lead->tags->prepend([ + 'name' => '' . trans('admin::app.leads.view.rotten-days', ['days' => $days]), + 'color' => '#FEE2E2' + ]); + @endphp + @endif + + {!! view_render_event('admin.leads.view.tags.before', ['lead' => $lead]) !!} + + + + + {!! view_render_event('admin.leads.view.tags.after', ['lead' => $lead]) !!} +
    + + + {!! view_render_event('admin.leads.view.title.before', ['lead' => $lead]) !!} + + +

    + {{ $lead->title }} +

    + + {!! view_render_event('admin.leads.view.title.after', ['lead' => $lead]) !!} + + +
    + {!! view_render_event('admin.leads.view.actions.before', ['lead' => $lead]) !!} + + @if (bouncer()->hasPermission('mail.compose')) + + + @endif + + @if (bouncer()->hasPermission('activities.create')) + + + + + + + + + @endif + + {!! view_render_event('admin.leads.view.actions.after', ['lead' => $lead]) !!} +
    +
    + + + @include ('admin::leads.view.attributes') + + + @include ('admin::leads.view.person') +
    + + {!! view_render_event('admin.leads.view.left.after', ['lead' => $lead]) !!} + + {!! view_render_event('admin.leads.view.right.before', ['lead' => $lead]) !!} + + +
    + + @include ('admin::leads.view.stages') + + + {!! view_render_event('admin.leads.view.activities.before', ['lead' => $lead]) !!} + + + + + @include ('admin::leads.view.products') + + + + + @include ('admin::leads.view.quotes') + + + + +
    + {{ $lead->description }} +
    + +
    + + {!! view_render_event('admin.leads.view.activities.after', ['lead' => $lead]) !!} +
    + + {!! view_render_event('admin.leads.view.right.after', ['lead' => $lead]) !!} +
    +
    diff --git a/packages/Webkul/Admin/src/Resources/views/leads/view/attributes.blade.php b/packages/Webkul/Admin/src/Resources/views/leads/view/attributes.blade.php new file mode 100644 index 0000000..33904b7 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/leads/view/attributes.blade.php @@ -0,0 +1,49 @@ +{!! view_render_event('admin.leads.view.attributes.before', ['lead' => $lead]) !!} + +
    + + +
    +

    @lang('admin::app.leads.view.attributes.title')

    + + @if (bouncer()->hasPermission('leads.edit')) + + @endif +
    + + + + {!! view_render_event('admin.leads.view.attributes.form_controls.before', ['lead' => $lead]) !!} + + +
    + {!! view_render_event('admin.leads.view.attributes.form_controls.attributes.view.before', ['lead' => $lead]) !!} + + + + {!! view_render_event('admin.leads.view.attributes.form_controls.attributes.view.after', ['lead' => $lead]) !!} + +
    + + {!! view_render_event('admin.leads.view.attributes.form_controls.after', ['lead' => $lead]) !!} + +
    +
    + +{!! view_render_event('admin.leads.view.attributes.before', ['lead' => $lead]) !!} diff --git a/packages/Webkul/Admin/src/Resources/views/leads/view/person.blade.php b/packages/Webkul/Admin/src/Resources/views/leads/view/person.blade.php new file mode 100644 index 0000000..4c18735 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/leads/view/person.blade.php @@ -0,0 +1,103 @@ +{!! view_render_event('admin.leads.view.person.before', ['lead' => $lead]) !!} + +@if ($lead?->person) +
    + + +
    +

    @lang('admin::app.leads.view.persons.title')

    + + @if (bouncer()->hasPermission('contacts.persons.edit')) + + @endif +
    + + + +
    + {!! view_render_event('admin.leads.view.person.avatar.before', ['lead' => $lead]) !!} + + + + + {!! view_render_event('admin.leads.view.person.avatar.after', ['lead' => $lead]) !!} + + +
    + {!! view_render_event('admin.leads.view.person.name.before', ['lead' => $lead]) !!} + + + {{ $lead->person->name }} + + + {!! view_render_event('admin.leads.view.person.name.after', ['lead' => $lead]) !!} + + {!! view_render_event('admin.leads.view.person.job_title.before', ['lead' => $lead]) !!} + + @if ($lead->person->job_title) + + @if ($lead->person->organization) + @lang('admin::app.leads.view.persons.job-title', [ + 'job_title' => $lead->person->job_title, + 'organization' => $lead->person->organization->name + ]) + @else + {{ $lead->person->job_title }} + @endif + + @endif + + {!! view_render_event('admin.leads.view.person.job_title.after', ['lead' => $lead]) !!} + + {!! view_render_event('admin.leads.view.person.email.before', ['lead' => $lead]) !!} + + @foreach ($lead->person->emails as $email) +
    + + {{ $email['value'] }} + + + + ({{ $email['label'] }}) + +
    + @endforeach + + {!! view_render_event('admin.leads.view.person.email.after', ['lead' => $lead]) !!} + + {!! view_render_event('admin.leads.view.person.contact_numbers.before', ['lead' => $lead]) !!} + + @foreach ($lead->person->contact_numbers as $contactNumber) +
    + + {{ $contactNumber['value'] }} + + + + ({{ $contactNumber['label'] }}) + +
    + @endforeach + + {!! view_render_event('admin.leads.view.person.contact_numbers.after', ['lead' => $lead]) !!} +
    +
    + +
    +
    +@endif +{!! view_render_event('admin.leads.view.person.after', ['lead' => $lead]) !!} \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/leads/view/products.blade.php b/packages/Webkul/Admin/src/Resources/views/leads/view/products.blade.php new file mode 100644 index 0000000..a9d9399 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/leads/view/products.blade.php @@ -0,0 +1,379 @@ +{!! view_render_event('admin.leads.view.products.before', ['lead' => $lead]) !!} + + + +{!! view_render_event('admin.leads.view.products.after', ['lead' => $lead]) !!} + +@pushOnce('scripts') + + + + + +@endPushOnce diff --git a/packages/Webkul/Admin/src/Resources/views/leads/view/quotes.blade.php b/packages/Webkul/Admin/src/Resources/views/leads/view/quotes.blade.php new file mode 100644 index 0000000..d22b7fe --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/leads/view/quotes.blade.php @@ -0,0 +1,218 @@ +{!! view_render_event('admin.leads.view.quotes.before', ['lead' => $lead]) !!} + + + +{!! view_render_event('admin.leads.view.quotes.after', ['lead' => $lead]) !!} + +@pushOnce('scripts') + + + + +@endPushOnce diff --git a/packages/Webkul/Admin/src/Resources/views/leads/view/stages.blade.php b/packages/Webkul/Admin/src/Resources/views/leads/view/stages.blade.php new file mode 100644 index 0000000..b07d8f7 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/leads/view/stages.blade.php @@ -0,0 +1,262 @@ + +{!! view_render_event('admin.leads.view.stages.before', ['lead' => $lead]) !!} + + + + + + +{!! view_render_event('admin.leads.view.stages.after', ['lead' => $lead]) !!} + +@pushOnce('scripts') + + + +@endPushOnce diff --git a/packages/Webkul/Admin/src/Resources/views/mail/index.blade.php b/packages/Webkul/Admin/src/Resources/views/mail/index.blade.php new file mode 100644 index 0000000..fd59cb2 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/mail/index.blade.php @@ -0,0 +1,712 @@ + + + @lang('admin::app.mail.index.' . request('route')) + + +
    +
    +
    + {!! view_render_event('admin.mail.create.breadcrumbs.before') !!} + + + + + {!! view_render_event('admin.mail.create.breadcrumbs.after') !!} + +
    + + @lang('admin::app.mail.index.' . request('route')) +
    +
    + +
    +
    + {!! view_render_event('admin.mail.create.compose_mail_btn.before') !!} + + + @if (bouncer()->hasPermission('mail.compose')) + + @endif + + {!! view_render_event('admin.mail.create.compose_mail_btn.after') !!} +
    +
    +
    + + + + + + +
    + + @pushOnce('scripts') + + + + @endPushOnce +
    diff --git a/packages/Webkul/Admin/src/Resources/views/mail/view.blade.php b/packages/Webkul/Admin/src/Resources/views/mail/view.blade.php new file mode 100644 index 0000000..7acc560 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/mail/view.blade.php @@ -0,0 +1,2019 @@ +@php + if (! $email->is_read) { + $email->is_read = true; + + $email->save(); + } +@endphp + + + + @lang('admin::app.mail.view.subject', ['subject' => $email->subject]) + + +
    +
    +
    + {!! view_render_event('admin.mail.view.form.before', ['email' => $email]) !!} + + + + + {!! view_render_event('admin.mail.view.form.after', ['email' => $email]) !!} + + +
    +
    + @lang('admin::app.mail.view.title') +
    + + {{ ucfirst(request('route')) }} + + {!! view_render_event('admin.mail.view.tags.before', ['email' => $email]) !!} + + + + {!! view_render_event('admin.mail.view.tags.after', ['email' => $email]) !!} +
    +
    +
    + + {!! view_render_event('admin.mail.view.email-list.before', ['email' => $email]) !!} + + + + + + + {!! view_render_event('admin.mail.view.email-list.before', ['email' => $email]) !!} +
    + + @pushOnce('scripts') + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @endPushOnce +
    diff --git a/packages/Webkul/Admin/src/Resources/views/partials/breadcrumbs.blade.php b/packages/Webkul/Admin/src/Resources/views/partials/breadcrumbs.blade.php new file mode 100644 index 0000000..05eeb2b --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/partials/breadcrumbs.blade.php @@ -0,0 +1,27 @@ +@unless ($breadcrumbs->isEmpty()) + +@endunless diff --git a/packages/Webkul/Admin/src/Resources/views/products/create.blade.php b/packages/Webkul/Admin/src/Resources/views/products/create.blade.php new file mode 100644 index 0000000..83d7125 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/products/create.blade.php @@ -0,0 +1,107 @@ + + + + + @lang('admin::app.products.create.title') + + + {!! view_render_event('admin.products.create.form.before') !!} + + +
    +
    +
    + {!! view_render_event('admin.products.create.breadcrumbs.before') !!} + + + + + {!! view_render_event('admin.products.create.breadcrumbs.after') !!} + +
    + @lang('admin::app.products.create.title') +
    +
    + +
    +
    + {!! view_render_event('admin.products.create.save_button.before') !!} + + + @if (bouncer()->hasPermission('settings.user.groups.create')) + + @endif + + {!! view_render_event('admin.products.create.save_button.after') !!} +
    +
    +
    + +
    + +
    +
    +

    + @lang('admin::app.products.create.general') +

    + + {!! view_render_event('admin.products.create.attributes.before') !!} + + + + {!! view_render_event('admin.products.create.attributes.after') !!} +
    +
    + + +
    + {!! view_render_event('admin.products.create.accordion.before') !!} + + + + {!! view_render_event('admin.products.create.accordion.header.before') !!} + +
    +

    + @lang('admin::app.products.create.price') +

    +
    + + {!! view_render_event('admin.products.create.accordion.header.after') !!} + + + + {!! view_render_event('admin.products.create.accordion.content.attributes.before') !!} + + + + {!! view_render_event('admin.products.create.accordion.content.attributes.after') !!} + +
    + + {!! view_render_event('admin.products.create.accordion.before') !!} +
    +
    +
    +
    + + {!! view_render_event('admin.products.create.form.after') !!} +
    diff --git a/packages/Webkul/Admin/src/Resources/views/products/edit.blade.php b/packages/Webkul/Admin/src/Resources/views/products/edit.blade.php new file mode 100644 index 0000000..a1ea5de --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/products/edit.blade.php @@ -0,0 +1,107 @@ + + + + + @lang('admin::app.products.edit.title') + + + {!! view_render_event('admin.products.edit.form.before') !!} + + +
    +
    +
    + + + +
    + @lang('admin::app.products.edit.title') +
    +
    + +
    +
    + {!! view_render_event('admin.products.edit.create_button.before', ['product' => $product]) !!} + + + + + {!! view_render_event('admin.products.edit.create_button.after', ['product' => $product]) !!} +
    +
    +
    + +
    + +
    +
    +

    + @lang('admin::app.products.create.general') +

    + + {!! view_render_event('admin.products.edit.attributes.before', ['product' => $product]) !!} + + + + {!! view_render_event('admin.products.edit.attributes.after', ['product' => $product]) !!} +
    +
    + + +
    + {!! view_render_event('admin.products.edit.accordion.before', ['product' => $product]) !!} + + + + {!! view_render_event('admin.products.edit.accordion.header.before', ['product' => $product]) !!} + +
    +

    + @lang('admin::app.products.create.price') +

    +
    + + {!! view_render_event('admin.products.edit.accordion.header.after', ['product' => $product]) !!} + + + + {!! view_render_event('admin.products.edit.accordion.content.attributes.before', ['product' => $product]) !!} + + + + {!! view_render_event('admin.products.edit.accordion.content.attributes.after', ['product' => $product]) !!} + +
    + + {!! view_render_event('admin.products.edit.accordion.after', ['product' => $product]) !!} +
    +
    +
    +
    + + {!! view_render_event('admin.products.edit.form.after') !!} +
    diff --git a/packages/Webkul/Admin/src/Resources/views/products/index.blade.php b/packages/Webkul/Admin/src/Resources/views/products/index.blade.php new file mode 100644 index 0000000..1716ae3 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/products/index.blade.php @@ -0,0 +1,45 @@ + + + @lang('admin::app.products.index.title') + + +
    +
    +
    + + + +
    + @lang('admin::app.products.index.title') +
    +
    + +
    + {!! view_render_event('admin.products.index.create_button.before') !!} + + + @if (bouncer()->hasPermission('products.create')) + + @endif + + {!! view_render_event('admin.products.index.create_button.after') !!} +
    +
    + + {!! view_render_event('admin.products.index.datagrid.before') !!} + + + + + + + {!! view_render_event('admin.products.index.datagrid.after') !!} +
    +
    diff --git a/packages/Webkul/Admin/src/Resources/views/products/view.blade.php b/packages/Webkul/Admin/src/Resources/views/products/view.blade.php new file mode 100644 index 0000000..499cb13 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/products/view.blade.php @@ -0,0 +1,112 @@ + + + @lang ($product->name) + + + +
    + + {!! view_render_event('admin.products.view.left.before', ['product' => $product]) !!} + +
    + +
    + +
    + +
    + + {!! view_render_event('admin.products.view.left.tags.before', ['product' => $product]) !!} + + + + + {!! view_render_event('admin.products.view.left.tags.after', ['product' => $product]) !!} + + +
    + {!! view_render_event('admin.products.view.left.title.before', ['product' => $product]) !!} + +

    + {{ $product->name }} +

    + + {!! view_render_event('admin.products.view.left.title.after', ['product' => $product]) !!} + + {!! view_render_event('admin.products.view.left.sku.before', ['product' => $product]) !!} + +

    + @lang('admin::app.products.view.sku') : {{ $product->sku }} +

    + + {!! view_render_event('admin.products.view.left.sku.after', ['product' => $product]) !!} +
    + + {!! view_render_event('admin.products.view.left.activity_actions.before', ['product' => $product]) !!} + + +
    + {!! view_render_event('admin.products.view.left.activity_actions.note.before', ['product' => $product]) !!} + + + + + {!! view_render_event('admin.products.view.left.activity_actions.note.after', ['product' => $product]) !!} + + {!! view_render_event('admin.products.view.left.activity_actions.file.before', ['product' => $product]) !!} + + + + + {!! view_render_event('admin.products.view.left.activity_actions.file.after', ['product' => $product]) !!} +
    + + {!! view_render_event('admin.products.view.left.activity_actions.after', ['product' => $product]) !!} +
    + + + @include ('admin::products.view.attributes') +
    + + {!! view_render_event('admin.products.view.left.after', ['product' => $product]) !!} + + {!! view_render_event('admin.products.view.right.before', ['product' => $product]) !!} + + +
    + {!! view_render_event('admin.products.view.right.activities.before', ['product' => $product]) !!} + + + + + @include('admin::products.view.inventory') + + + + {!! view_render_event('admin.products.view.right.activities.after', ['product' => $product]) !!} +
    + + {!! view_render_event('admin.products.view.right.after', ['product' => $product]) !!} +
    +
    \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/products/view/attributes.blade.php b/packages/Webkul/Admin/src/Resources/views/products/view/attributes.blade.php new file mode 100644 index 0000000..360ddb9 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/products/view/attributes.blade.php @@ -0,0 +1,44 @@ +{!! view_render_event('admin.products.view.attributes.before', ['product' => $product]) !!} + +
    + + +

    + @lang('admin::app.products.view.attributes.about-product') +

    + + + + {!! view_render_event('admin.products.view.attributes.view.before', ['product' => $product]) !!} + + +
    + + + + + +
    + + {!! view_render_event('admin.products.view.attributes.view.after', ['product' => $product]) !!} + +
    +
    + +{!! view_render_event('admin.products.view.attributes.before', ['product' => $product]) !!} \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/products/view/inventory.blade.php b/packages/Webkul/Admin/src/Resources/views/products/view/inventory.blade.php new file mode 100644 index 0000000..b1d653b --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/products/view/inventory.blade.php @@ -0,0 +1,507 @@ +{!! view_render_event('admin.products.view.inventory.before', ['product' => $product]) !!} + + + + +{!! view_render_event('admin.products.view.inventory.after', ['product' => $product]) !!} + +@pushOnce('scripts') + + + + + + + +@endPushOnce diff --git a/packages/Webkul/Admin/src/Resources/views/quotes/create.blade.php b/packages/Webkul/Admin/src/Resources/views/quotes/create.blade.php new file mode 100644 index 0000000..fd99341 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/quotes/create.blade.php @@ -0,0 +1,807 @@ +@php + $quote = app('\Webkul\Quote\Repositories\QuoteRepository')->getModel(); + + if (isset($lead)) { + $quote->fill([ + 'person_id' => $lead->person_id, + 'user_id' => $lead->user_id, + 'billing_address' => $lead->person->organization ? $lead->person->organization->address : null + ]); + } +@endphp + + + + @lang('admin::app.quotes.create.title') + + + {!! view_render_event('admin.contacts.quotes.create.form_controls.before') !!} + + +
    +
    +
    + + +
    + @lang('admin::app.quotes.create.title') +
    +
    + +
    + +
    + {!! view_render_event('admin.contacts.quotes.create.save_button.before') !!} + + + + {!! view_render_event('admin.contacts.quotes.create.save_button.after') !!} +
    +
    +
    + + + + +
    +
    + + {!! view_render_event('admin.contacts.quotes.create.form_controls.after') !!} + + @pushOnce('scripts') + + + + + + + + @endPushOnce + + @pushOnce('styles') + + @endPushOnce +
    diff --git a/packages/Webkul/Admin/src/Resources/views/quotes/edit.blade.php b/packages/Webkul/Admin/src/Resources/views/quotes/edit.blade.php new file mode 100644 index 0000000..b3f1a7f --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/quotes/edit.blade.php @@ -0,0 +1,800 @@ + + + @lang('admin::app.quotes.edit.title') + + + {!! view_render_event('admin.contacts.quotes.edit.form_controls.before', ['quote' => $quote]) !!} + + +
    +
    +
    + + +
    + @lang('admin::app.quotes.edit.title') +
    +
    + +
    +
    + {!! view_render_event('admin.contacts.quotes.edit.save_button.before', ['quote' => $quote]) !!} + + + + + {!! view_render_event('admin.contacts.quotes.edit.save_button.after', ['quote' => $quote]) !!} +
    +
    +
    + + + + +
    +
    + + {!! view_render_event('admin.contacts.quotes.edit.form_controls.after', ['quote' => $quote]) !!} + + @pushOnce('scripts') + + + + + + + + @endPushOnce + + @pushOnce('styles') + + @endPushOnce +
    diff --git a/packages/Webkul/Admin/src/Resources/views/quotes/index.blade.php b/packages/Webkul/Admin/src/Resources/views/quotes/index.blade.php new file mode 100644 index 0000000..06ede13 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/quotes/index.blade.php @@ -0,0 +1,88 @@ + + + @lang('admin::app.quotes.index.title') + + + +
    +
    +
    + + + +
    + @lang('admin::app.quotes.index.title') +
    +
    + +
    + +
    + @if (bouncer()->hasPermission('quotes.create')) + + @lang('admin::app.quotes.index.create-btn') + + @endif +
    +
    +
    + + + +
    +
    + + @pushOnce('scripts') + + + + @endPushOnce +
    diff --git a/packages/Webkul/Admin/src/Resources/views/quotes/pdf.blade.php b/packages/Webkul/Admin/src/Resources/views/quotes/pdf.blade.php new file mode 100755 index 0000000..945b802 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/quotes/pdf.blade.php @@ -0,0 +1,408 @@ + + + + + + + + + @php + if ($locale == 'en') { + $fontFamily = [ + 'regular' => 'DejaVu Sans', + 'bold' => 'DejaVu Sans', + ]; + } else { + $fontFamily = [ + 'regular' => 'Arial, sans-serif', + 'bold' => 'Arial, sans-serif', + ]; + } + + if (in_array($locale, ['ar', 'fa', 'tr'])) { + $fontFamily = [ + 'regular' => 'DejaVu Sans', + 'bold' => 'DejaVu Sans', + ]; + } + @endphp + + + + + + +
    + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + @lang('admin::app.quotes.index.pdf.quote-id'): + + + + #{{ $quote->id }} + + + + @lang('admin::app.quotes.index.pdf.person'): + + + + {{ $quote->person->name }} + +
    + + @lang('admin::app.quotes.index.pdf.sales-person'): + + + + {{ $quote->user->name }} + + + + @lang('admin::app.quotes.index.pdf.subject'): + + + + {{ $quote->subject }} + +
    + + @lang('admin::app.quotes.index.pdf.date'): + + + + {{ core()->formatDate($quote->created_at, 'd-m-Y') }} + + + + @lang('admin::app.quotes.index.pdf.sales-person'): + + + + {{ $quote->user->name }} + +
    + + @lang('admin::app.quotes.index.pdf.expired-at'): + + + + {{ core()->formatDate($quote->expired_at, 'd-m-Y') }} + +
    + + + + + + @if ($quote->billing_address) + + @endif + + @if ($quote->shipping_address) + + @endif + + + + + + @if ($quote->billing_address) + + @endif + + @if ($quote->shipping_address) + + @endif + + +
    + + @lang('admin::app.quotes.index.pdf.billing-address') + + + + @lang('admin::app.quotes.index.pdf.shipping-address') + +
    +
    {{ $quote->billing_address['address'] ?? '' }}
    + +
    {{ $quote->billing_address['postcode'] ?? '' . ' ' .$quote->billing_address['city'] ?? '' }}
    + +
    {{ $quote->billing_address['state'] ?? '' }}
    + +
    {{ core()->country_name($quote->billing_address['country'] ?? '') }}
    +
    +
    {{ $quote->shipping_address['address'] ?? ''}}
    + +
    {{ $quote->shipping_address['postcode'] ?? '' . ' ' .$quote->shipping_address['city'] ?? '' }}
    + +
    {{ $quote->shipping_address['state'] ?? '' }}
    + +
    {{ core()->country_name($quote->shipping_address['country'] ?? '') }}
    +
    + + +
    + + + + + + + + + + + + + + + + + + + + + + + @foreach ($quote->items as $item) + + + + + + + + + + + + + + + + + + @endforeach + +
    + @lang('admin::app.quotes.index.pdf.sku') + + @lang('admin::app.quotes.index.pdf.product-name') + + @lang('admin::app.quotes.index.pdf.price') + + @lang('admin::app.quotes.index.pdf.quantity') + + @lang('admin::app.quotes.index.pdf.amount') + + @lang('admin::app.quotes.index.pdf.discount') + + @lang('admin::app.quotes.index.pdf.tax') + + @lang('admin::app.quotes.index.pdf.grand-total') +
    {{ $item->sku }} + {{ $item->name }} + {!! core()->formatBasePrice($item->price, true) !!}{{ $item->quantity }}{!! core()->formatBasePrice($item->total, true) !!}{!! core()->formatBasePrice($item->discount_amount, true) !!}{!! core()->formatBasePrice($item->tax_amount, true) !!}{!! core()->formatBasePrice($item->total + $item->tax_amount - $item->discount_amount, true) !!}
    +
    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    @lang('admin::app.quotes.index.pdf.sub-total')-{!! core()->formatBasePrice($quote->sub_total, true) !!}
    @lang('admin::app.quotes.index.pdf.tax')-{!! core()->formatBasePrice($quote->tax_amount, true) !!}
    @lang('admin::app.quotes.index.pdf.discount')-{!! core()->formatBasePrice($quote->discount_amount, true) !!}
    @lang('admin::app.quotes.index.pdf.adjustment')-{!! core()->formatBasePrice($quote->adjustment_amount, true) !!}
    @lang('admin::app.quotes.index.pdf.grand-total')-{!! core()->formatBasePrice($quote->grand_total, true) !!}
    +
    +
    +
    + + diff --git a/packages/Webkul/Admin/src/Resources/views/sessions/forgot-password.blade.php b/packages/Webkul/Admin/src/Resources/views/sessions/forgot-password.blade.php new file mode 100644 index 0000000..61e9124 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/sessions/forgot-password.blade.php @@ -0,0 +1,91 @@ + + + + @lang('admin::app.users.forget-password.create.page-title') + + +
    +
    + + @if ($logo = core()->getConfigData('general.design.admin_logo.logo_image')) + {{ config('app.name') }} + @else + {{ config('app.name') }} + @endif + +
    + {!! view_render_event('admin.sessions.forgor_password.form_controls.before') !!} + + + +
    +

    + @lang('admin::app.users.forget-password.create.title') +

    +
    + +
    + + + + @lang('admin::app.users.forget-password.create.email') + + + + + + +
    + +
    + + + @lang('admin::app.users.forget-password.create.sign-in-link') + + + + +
    +
    + + {!! view_render_event('admin.sessions.forgor_password.form_controls.after') !!} +
    +
    + + +
    + Desenvolvido por + + Blyzer + +
    + + diff --git a/packages/Webkul/Admin/src/Resources/views/sessions/login.blade.php b/packages/Webkul/Admin/src/Resources/views/sessions/login.blade.php new file mode 100644 index 0000000..96d26df --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/sessions/login.blade.php @@ -0,0 +1,129 @@ + + + + @lang('admin::app.users.login.title') + + +
    +
    + + @if ($logo = core()->getConfigData('general.design.admin_logo.logo_image')) + {{ config('app.name') }} + @else + {{ config('app.name') }} + @endif + +
    + {!! view_render_event('admin.sessions.login.form_controls.before') !!} + + + +

    + @lang('admin::app.users.login.title') +

    + +
    + + + + @lang('admin::app.users.login.email') + + + + + + + + + + + @lang('admin::app.users.login.password') + + + + + + + + + +
    + +
    + + + @lang('admin::app.users.login.forget-password-link') + + + + +
    +
    + + {!! view_render_event('admin.sessions.login.form_controls.after') !!} +
    +
    + + +
    + Desenvolvido por + + Blyzer + +
    + + @push('scripts') + + @endpush + diff --git a/packages/Webkul/Admin/src/Resources/views/sessions/reset-password.blade.php b/packages/Webkul/Admin/src/Resources/views/sessions/reset-password.blade.php new file mode 100644 index 0000000..ef12185 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/sessions/reset-password.blade.php @@ -0,0 +1,136 @@ + + + + @lang('admin::app.users.reset-password.title') + + +
    +
    + + @if ($logo = core()->getConfigData('general.design.admin_logo.logo_image')) + {{ config('app.name') }} + @else + {{ config('app.name') }} + @endif + +
    + {!! view_render_event('admin.sessions.reset-password.form_controls.before') !!} + + + +
    +

    + @lang('admin::app.users.reset-password.title') +

    +
    + + + +
    + + + + @lang('admin::app.users.reset-password.email') + + + + + + + + + + + @lang('admin::app.users.reset-password.password') + + + + + + + + + + + @lang('admin::app.users.reset-password.confirm-password') + + + + + + +
    + +
    + + + @lang('admin::app.users.reset-password.back-link-title') + + + + +
    +
    + + {!! view_render_event('admin.sessions.reset-password.form_controls.after') !!} +
    +
    + + +
    + Desenvolvido por + + Blyzer + +
    + + diff --git a/packages/Webkul/Admin/src/Resources/views/settings/attributes/create.blade.php b/packages/Webkul/Admin/src/Resources/views/settings/attributes/create.blade.php new file mode 100644 index 0000000..b259f5d --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/settings/attributes/create.blade.php @@ -0,0 +1,658 @@ + + + @lang('admin::app.settings.attributes.create.title') + + + {!! view_render_event('admin.settings.attributes.create.before') !!} + + + +
    + {!! view_render_event('admin.settings.attributes.create.form_controls.before') !!} + + +
    +
    + {!! view_render_event('admin.settings.attributes.create.breadcrumbs.before') !!} + + + + {!! view_render_event('admin.settings.attributes.create.breadcrumbs.after') !!} + +
    + {!! view_render_event('admin.settings.attributes.create.title.before') !!} + + @lang('admin::app.settings.attributes.create.title') + + {!! view_render_event('admin.settings.attributes.create.title.after') !!} +
    +
    + +
    + +
    + {!! view_render_event('admin.settings.attributes.create.create_button.before') !!} + + @if (bouncer()->hasPermission('settings.automation.attributes.create')) + + @endif + + {!! view_render_event('admin.settings.attributes.create.create_button.after') !!} +
    +
    +
    + + + + + + + + {!! view_render_event('admin.settings.attributes.create.form_controls.after') !!} +
    +
    + + {!! view_render_event('admin.settings.attributes.create.after') !!} + + @pushOnce('scripts') + + + + @endPushOnce +
    diff --git a/packages/Webkul/Admin/src/Resources/views/settings/attributes/edit.blade.php b/packages/Webkul/Admin/src/Resources/views/settings/attributes/edit.blade.php new file mode 100644 index 0000000..5650cbf --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/settings/attributes/edit.blade.php @@ -0,0 +1,741 @@ + + + @lang('admin::app.settings.attributes.edit.title') + + + {!! view_render_event('admin.catalog.attributes.edit.before', ['attribute' => $attribute]) !!} + + + +
    + {!! view_render_event('admin.settings.attributes.edit.form_controls.before', ['attribute' => $attribute]) !!} + + +
    +
    + {!! view_render_event('admin.settings.attributes.edit.breadcrumbs.before', ['attribute' => $attribute]) !!} + + + + {!! view_render_event('admin.settings.attributes.edit.breadcrumbs.after', ['attribute' => $attribute]) !!} + +
    + {!! view_render_event('admin.settings.attributes.edit.title.before', ['attribute' => $attribute]) !!} + + @lang('admin::app.settings.attributes.edit.title') + + {!! view_render_event('admin.settings.attributes.edit.title.after', ['attribute' => $attribute]) !!} +
    +
    + +
    + +
    + {!! view_render_event('admin.settings.attributes.edit.edit_button.before', ['attribute' => $attribute]) !!} + + @if (bouncer()->hasPermission('settings.automation.attributes.edit')) + + @endif + + {!! view_render_event('admin.settings.attributes.edit.edit_button.after', ['attribute' => $attribute]) !!} +
    +
    +
    + + + + + + + + {!! view_render_event('admin.settings.attributes.edit.form_controls.after', ['attribute' => $attribute]) !!} +
    +
    + + {!! view_render_event('admin.catalog.attributes.edit.after', ['attribute' => $attribute]) !!} + + @pushOnce('scripts') + + + + @endPushOnce +
    diff --git a/packages/Webkul/Admin/src/Resources/views/settings/attributes/index.blade.php b/packages/Webkul/Admin/src/Resources/views/settings/attributes/index.blade.php new file mode 100644 index 0000000..ed79705 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/settings/attributes/index.blade.php @@ -0,0 +1,51 @@ + + + @lang('admin::app.settings.attributes.index.title') + + +
    +
    +
    + {!! view_render_event('admin.settings.attributes.index.breadcrumbs.before') !!} + + + + + {!! view_render_event('admin.settings.attributes.index.breadcrumbs.after') !!} + +
    + + @lang('admin::app.settings.attributes.index.title') +
    +
    + +
    + +
    + {!! view_render_event('admin.settings.attributes.index.create_button.before') !!} + + @if (bouncer()->hasPermission('settings.automation.attributes.create')) + + @lang('admin::app.settings.attributes.index.create-btn') + + @endif + + {!! view_render_event('admin.settings.attributes.index.create_button.after') !!} +
    +
    +
    + + {!! view_render_event('admin.settings.attributes.index.datagrid.before') !!} + + + + + + + + {!! view_render_event('admin.settings.attributes.index.datagrid.after') !!} +
    +
    diff --git a/packages/Webkul/Admin/src/Resources/views/settings/data-transfer/imports/create.blade.php b/packages/Webkul/Admin/src/Resources/views/settings/data-transfer/imports/create.blade.php new file mode 100644 index 0000000..1a67a98 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/settings/data-transfer/imports/create.blade.php @@ -0,0 +1,232 @@ + + + + @lang('admin::app.settings.data-transfer.imports.create.title') + + + {!! view_render_event('admin.settings.data_transfer.imports.create.before') !!} + + + {!! view_render_event('admin.settings.data_transfer.imports.create.create_form_controls.before') !!} + + +
    +
    + {!! view_render_event('admin.settings.data_transfers.create.breadcrumbs.before') !!} + + + + + {!! view_render_event('admin.settings.data_transfers.create.breadcrumbs.after') !!} + +
    + @lang('admin::app.settings.data-transfer.imports.create.title') +
    +
    + +
    + +
    + {!! view_render_event('admin.settings.data_transfers.create.save_button.before') !!} + + @if (bouncer()->hasPermission('settings.data_transfer.imports.create')) + + + @endif + + {!! view_render_event('admin.settings.data_transfers.create.save_button.after') !!} +
    +
    +
    + + +
    + +
    + {!! view_render_event('admin.settings.data_transfer.imports.create.card.general.before') !!} + + +
    +

    + @lang('admin::app.settings.data-transfer.imports.create.general') +

    + + + + + @lang('admin::app.settings.data-transfer.imports.create.type') + + + + @foreach (config('importers') as $code => $importer) + + @endforeach + + + + + @lang('admin::app.settings.data-transfer.imports.create.download-sample') + + + + + + + + + @lang('admin::app.settings.data-transfer.imports.create.file') + + + + + + +
    + + {!! view_render_event('admin.settings.data_transfer.imports.create.card.general.after') !!} +
    + + +
    + {!! view_render_event('admin.settings.data_transfer.imports.create.card.accordion.settings.before') !!} + + + + +
    +

    + @lang('admin::app.settings.data-transfer.imports.create.settings') +

    +
    + + + + + + + @lang('admin::app.settings.data-transfer.imports.create.action') + + + + + + + + + + + + + + @lang('admin::app.settings.data-transfer.imports.create.validation-strategy') + + + + + + + + + + + + + + @lang('admin::app.settings.data-transfer.imports.create.allowed-errors') + + + + + + + + + + + @lang('admin::app.settings.data-transfer.imports.create.field-separator') + + + + + + + + + + + @lang('admin::app.settings.data-transfer.imports.create.process-in-queue') + + + + + + + +
    + + {!! view_render_event('admin.settings.data_transfer.imports.create.card.accordion.settings.after') !!} +
    +
    + + {!! view_render_event('admin.settings.data_transfer.imports.create.create_form_controls.after') !!} +
    +
    diff --git a/packages/Webkul/Admin/src/Resources/views/settings/data-transfer/imports/edit.blade.php b/packages/Webkul/Admin/src/Resources/views/settings/data-transfer/imports/edit.blade.php new file mode 100644 index 0000000..025ae21 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/settings/data-transfer/imports/edit.blade.php @@ -0,0 +1,251 @@ + + + + @lang('admin::app.settings.data-transfer.imports.edit.title') + + + {!! view_render_event('admin.settings.data_transfer.imports.edit.before', ['import' => $import]) !!} + + + {!! view_render_event('admin.settings.data_transfer.imports.edit.edit_form_controls.before', ['import' => $import]) !!} + + +
    +
    + {!! view_render_event('admin.settings.data_transfers.edit.breadcrumbs.before') !!} + + + + + {!! view_render_event('admin.settings.data_transfers.edit.breadcrumbs.after') !!} + +
    + @lang('admin::app.settings.data-transfer.imports.edit.title') +
    +
    + +
    + +
    + {!! view_render_event('admin.settings.data_transfers.edit.save_button.before') !!} + + @if (bouncer()->hasPermission('settings.data_transfer.imports.edit')) + + + @endif + + {!! view_render_event('admin.settings.data_transfers.edit.save_button.after') !!} +
    +
    +
    + + +
    + +
    + {!! view_render_event('admin.settings.data_transfer.imports.edit.card.general.before', ['import' => $import]) !!} + + +
    +

    + @lang('admin::app.settings.data-transfer.imports.edit.general') +

    + + + + + @lang('admin::app.settings.data-transfer.imports.edit.type') + + +
    + + @foreach (config('importers') as $code => $importer) + + @endforeach + + + + + @lang('admin::app.settings.data-transfer.imports.edit.download-sample') + +
    + + +
    + + + + + @lang('admin::app.settings.data-transfer.imports.edit.file') + + +
    + + + + + @if ($import?->file_path) + + + {{ $import?->file_name }} + + @endif +
    +
    +
    + + {!! view_render_event('admin.settings.data_transfer.imports.edit.card.general.after', ['import' => $import]) !!} +
    + + +
    + {!! view_render_event('admin.settings.data_transfer.imports.edit.card.accordion.settings.before', ['import' => $import]) !!} + + + + +
    +

    + @lang('admin::app.settings.data-transfer.imports.edit.settings') +

    +
    + + + + + + + @lang('admin::app.settings.data-transfer.imports.edit.action') + + + + + + + + + + + + + + @lang('admin::app.settings.data-transfer.imports.edit.validation-strategy') + + + + + + + + + + + + + + @lang('admin::app.settings.data-transfer.imports.edit.allowed-errors') + + + + + + + + + + + @lang('admin::app.settings.data-transfer.imports.edit.field-separator') + + + + + + + + + + + @lang('admin::app.settings.data-transfer.imports.edit.process-in-queue') + + + + + + + +
    + + {!! view_render_event('admin.settings.data_transfer.imports.edit.card.accordion.settings.after', ['import' => $import]) !!} +
    +
    + + {!! view_render_event('admin.settings.data_transfer.imports.edit.edit_form_controls.after', ['import' => $import]) !!} +
    +
    diff --git a/packages/Webkul/Admin/src/Resources/views/settings/data-transfer/imports/import.blade.php b/packages/Webkul/Admin/src/Resources/views/settings/data-transfer/imports/import.blade.php new file mode 100644 index 0000000..b77cbda --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/settings/data-transfer/imports/import.blade.php @@ -0,0 +1,539 @@ + + + @lang('admin::app.settings.data-transfer.imports.import.title') + + + +
    +
    + {!! view_render_event('admin.settings.data_transfers.import.breadcrumbs.before') !!} + + + + + {!! view_render_event('admin.settings.data_transfers.import.breadcrumbs.after') !!} + +
    + @lang('admin::app.settings.data-transfer.imports.import.title') +
    +
    + +
    + +
    + {!! view_render_event('admin.settings.data_transfers.import.edit_button.before') !!} + + + @if (bouncer()->hasPermission('settings.data_transfer.imports.edit')) + + @lang('admin::app.settings.data-transfer.imports.import.edit-btn') + + @endif + + {!! view_render_event('admin.settings.data_transfers.import.edit_button.after') !!} +
    +
    +
    + + + + + @pushOnce('scripts') + + + + @endPushOnce +
    diff --git a/packages/Webkul/Admin/src/Resources/views/settings/data-transfer/imports/index.blade.php b/packages/Webkul/Admin/src/Resources/views/settings/data-transfer/imports/index.blade.php new file mode 100644 index 0000000..5860dbf --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/settings/data-transfer/imports/index.blade.php @@ -0,0 +1,50 @@ + + + @lang('admin::app.settings.data-transfer.imports.index.title') + + +
    +
    +
    + {!! view_render_event('admin.settings.data_transfers.index.breadcrumbs.before') !!} + + + + + {!! view_render_event('admin.settings.data_transfers.index.breadcrumbs.after') !!} + +
    + @lang('admin::app.settings.data-transfer.imports.index.title') +
    +
    + +
    + +
    + {!! view_render_event('admin.settings.data_transfers.index.create_button.before') !!} + + @if (bouncer()->hasPermission('settings.data_transfer.imports.create')) + + @lang('admin::app.settings.data-transfer.imports.index.button-title') + + @endif + + {!! view_render_event('admin.settings.data_transfers.index.create_button.after') !!} +
    +
    +
    + + {!! view_render_event('admin.settings.data_transfers.index.datagrid.before') !!} + + + + + + + + {!! view_render_event('admin.settings.data_transfers.index.datagrid.after') !!} +
    +
    diff --git a/packages/Webkul/Admin/src/Resources/views/settings/email-templates/create.blade.php b/packages/Webkul/Admin/src/Resources/views/settings/email-templates/create.blade.php new file mode 100644 index 0000000..0280463 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/settings/email-templates/create.blade.php @@ -0,0 +1,234 @@ + + + + + @lang('admin::app.settings.email-template.create.title') + + + {!! view_render_event('admin.settings.email_template.create.form.before') !!} + + +
    +
    +
    + {!! view_render_event('admin.settings.email_template.create.breadcrumbs.after') !!} + + + + + {!! view_render_event('admin.settings.email_template.create.breadcrumbs.after') !!} + +
    + @lang('admin::app.settings.email-template.create.title') +
    +
    + +
    + +
    + {!! view_render_event('admin.settings.email_template.create.save_button.before') !!} + + + + {!! view_render_event('admin.settings.email_template.create.save_button.after') !!} +
    +
    +
    + + +
    +
    + + {!! view_render_event('admin.email_template.create.form.after') !!} + + @pushOnce('scripts') + + + + @endPushOnce +
    diff --git a/packages/Webkul/Admin/src/Resources/views/settings/email-templates/edit.blade.php b/packages/Webkul/Admin/src/Resources/views/settings/email-templates/edit.blade.php new file mode 100644 index 0000000..614c229 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/settings/email-templates/edit.blade.php @@ -0,0 +1,238 @@ + + + + + @lang('admin::app.settings.email-template.edit.title') + + + {!! view_render_event('admin.settings.email_template.edit.form.before') !!} + + +
    +
    +
    + {!! view_render_event('admin.settings.email_template.edit.breadcrumbs.before') !!} + + + + + {!! view_render_event('admin.settings.email_template.edit.breadcrumbs.after') !!} + +
    + @lang('admin::app.settings.email-template.edit.title') +
    +
    + +
    + +
    + {!! view_render_event('admin.settings.email_template.edit.save_button.before') !!} + + + + {!! view_render_event('admin.settings.email_template.edit.save_button.before') !!} +
    +
    +
    + + +
    +
    + + {!! view_render_event('admin.settings.email_template.edit.form.after') !!} + + @pushOnce('scripts') + + + + @endPushOnce +
    diff --git a/packages/Webkul/Admin/src/Resources/views/settings/email-templates/index.blade.php b/packages/Webkul/Admin/src/Resources/views/settings/email-templates/index.blade.php new file mode 100644 index 0000000..ab73a04 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/settings/email-templates/index.blade.php @@ -0,0 +1,51 @@ + + + + @lang('admin::app.settings.email-template.index.title') + + +
    +
    +
    + {!! view_render_event('admin.settings.email_template.index.breadcrumbs.before') !!} + + + + + {!! view_render_event('admin.settings.email_template.index.breadcrumbs.after') !!} + +
    + @lang('admin::app.settings.email-template.index.title') +
    +
    + +
    + +
    + {!! view_render_event('admin.settings.email_template.index.create_button.before') !!} + + @if (bouncer()->hasPermission('settings.automation.email_templates.create')) + + @lang('admin::app.settings.email-template.index.create-btn') + + @endif + + {!! view_render_event('admin.settings.email_template.index.create_button.after') !!} +
    +
    +
    + + {!! view_render_event('admin.settings.email_template.index.datagrid.before') !!} + + + + + + + + {!! view_render_event('admin.settings.email_template.index.datagrid.after') !!} +
    +
    diff --git a/packages/Webkul/Admin/src/Resources/views/settings/groups/index.blade.php b/packages/Webkul/Admin/src/Resources/views/settings/groups/index.blade.php new file mode 100644 index 0000000..ff0d8ce --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/settings/groups/index.blade.php @@ -0,0 +1,352 @@ + + + + @lang('admin::app.settings.groups.index.title') + + +
    + +
    +
    + {!! view_render_event('admin.settings.groups.index.breadcrumbs.before') !!} + + + + + {!! view_render_event('admin.settings.groups.index.breadcrumbs.after') !!} + +
    + @lang('admin::app.settings.groups.index.title') +
    +
    + +
    + +
    + {!! view_render_event('admin.settings.groups.index.breadcrumbs.after') !!} + + @if (bouncer()->hasPermission('settings.user.groups.create')) + + @endif + + {!! view_render_event('admin.settings.groups.index.create_button.after') !!} +
    +
    +
    + + + + + +
    + + @pushOnce('scripts') + + + + @endPushOnce +
    diff --git a/packages/Webkul/Admin/src/Resources/views/settings/index.blade.php b/packages/Webkul/Admin/src/Resources/views/settings/index.blade.php new file mode 100644 index 0000000..9dc4727 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/settings/index.blade.php @@ -0,0 +1,58 @@ + + + + @lang('admin::app.settings.title') + + + + + +
    +

    + @lang('admin::app.settings.title') +

    +
    + + +
    + @foreach (menu()->getAdminMenuByKey('settings')->getChildren() as $setting) +
    +
    + +

    + {{ $setting->getName() }} +

    + + +

    + {{ $setting->getInfo() }} +

    +
    + +
    + + @foreach ($setting->getChildren() as $key => $child) + +
    + +
    + +
    +

    + {{ $child->getName() }} +

    + +

    + {{ $child->getInfo() }} +

    +
    +
    + @endforeach +
    +
    + @endforeach +
    +
    diff --git a/packages/Webkul/Admin/src/Resources/views/settings/marketing/campaigns/index.blade.php b/packages/Webkul/Admin/src/Resources/views/settings/marketing/campaigns/index.blade.php new file mode 100644 index 0000000..0a32604 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/settings/marketing/campaigns/index.blade.php @@ -0,0 +1,525 @@ + + + + @lang('admin::app.settings.marketing.campaigns.index.title') + + +
    + +
    +
    +
    + {!! view_render_event('admin.settings.marketing.campaigns.index.breadcrumbs.before') !!} + + + + + {!! view_render_event('admin.settings.marketing.campaigns.index.breadcrumbs.after') !!} +
    + +
    + @lang('admin::app.settings.marketing.campaigns.index.title') +
    +
    + +
    + +
    + {!! view_render_event('admin.settings.marketing.campaigns.index.breadcrumbs.after') !!} + + @if (bouncer()->hasPermission('settings.automation.campaigns.create')) + + @endif + + {!! view_render_event('admin.settings.marketing.campaigns.index.create_button.after') !!} +
    +
    +
    + + + + +
    + + @pushOnce('scripts') + + + + @endPushOnce +
    diff --git a/packages/Webkul/Admin/src/Resources/views/settings/marketing/events/index.blade.php b/packages/Webkul/Admin/src/Resources/views/settings/marketing/events/index.blade.php new file mode 100644 index 0000000..b9fb1f0 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/settings/marketing/events/index.blade.php @@ -0,0 +1,410 @@ + + + + @lang('admin::app.settings.marketing.events.index.title') + + +
    + +
    +
    + {!! view_render_event('admin.settings.marketing.events.index.breadcrumbs.before') !!} + + + + + {!! view_render_event('admin.settings.marketing.events.index.breadcrumbs.after') !!} + +
    + @lang('admin::app.settings.marketing.events.index.title') +
    +
    + +
    + +
    + {!! view_render_event('admin.settings.marketing.events.index.breadcrumbs.after') !!} + + @if (bouncer()->hasPermission('settings.automation.events.create')) + + @endif + + {!! view_render_event('admin.settings.marketing.events.index.create_button.after') !!} +
    +
    +
    + + + + +
    + + @pushOnce('scripts') + + + + @endPushOnce +
    diff --git a/packages/Webkul/Admin/src/Resources/views/settings/pipelines/create.blade.php b/packages/Webkul/Admin/src/Resources/views/settings/pipelines/create.blade.php new file mode 100644 index 0000000..0c91cb8 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/settings/pipelines/create.blade.php @@ -0,0 +1,427 @@ + + + + @lang('admin::app.settings.pipelines.create.title') + + + {!! view_render_event('admin.settings.pipelines.create.form.before') !!} + + +
    +
    +
    + {!! view_render_event('admin.settings.pipelines.create.breadcrumbs.before') !!} + + + + + {!! view_render_event('admin.settings.pipelines.create.breadcrumbs.after') !!} + + +
    + @lang('admin::app.settings.pipelines.create.title') +
    +
    + +
    +
    + {!! view_render_event('admin.settings.pipelines.create.save_button.before') !!} + + + + + {!! view_render_event('admin.settings.pipelines.create.save_button.after') !!} +
    +
    +
    + +
    + {!! view_render_event('admin.settings.pipelines.create.form.name.before') !!} + + + + + @lang('admin::app.settings.pipelines.create.name') + + + + + + + + {!! view_render_event('admin.settings.pipelines.create.form.name.after') !!} + + {!! view_render_event('admin.settings.pipelines.create.form.rotten_days.before') !!} + + + + + @lang('admin::app.settings.pipelines.create.rotten-days') + + + + + + + + {!! view_render_event('admin.settings.pipelines.create.form.rotten_days.after') !!} + + {!! view_render_event('admin.settings.pipelines.create.form.is_default.before') !!} + + + + + @lang('admin::app.settings.pipelines.create.mark-as-default') + + + + + + + + {!! view_render_event('admin.settings.pipelines.create.form.is_default.after') !!} +
    +
    + + +
    + {!! view_render_event('admin.settings.pipelines.create.form.stages.before') !!} + + + + + + {!! view_render_event('admin.settings.pipelines.create.form.stages.after') !!} +
    +
    + + {!! view_render_event('admin.settings.pipelines.create.form.after') !!} + + @pushOnce('scripts') + + + + @endPushOnce +
    \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/settings/pipelines/edit.blade.php b/packages/Webkul/Admin/src/Resources/views/settings/pipelines/edit.blade.php new file mode 100644 index 0000000..d61ea32 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/settings/pipelines/edit.blade.php @@ -0,0 +1,377 @@ + + + + @lang('admin::app.settings.pipelines.edit.title') + + + {!! view_render_event('admin.settings.pipelines.edit.form.before', ['pipeline' => $pipeline]) !!} + + + +
    +
    +
    + {!! view_render_event('admin.settings.pipelines.edit.breadcrumbs.before', ['pipeline' => $pipeline]) !!} + + + + + {!! view_render_event('admin.settings.pipelines.edit.breadcrumbs.after', ['pipeline' => $pipeline]) !!} + + +
    + @lang('admin::app.settings.pipelines.edit.title') +
    +
    + +
    +
    + {!! view_render_event('admin.settings.pipelines.edit.save_button.before', ['pipeline' => $pipeline]) !!} + + + + + {!! view_render_event('admin.settings.pipelines.edit.save_button.after', ['pipeline' => $pipeline]) !!} +
    +
    +
    + +
    + {!! view_render_event('admin.settings.pipelines.edit.form.name.before', ['pipeline' => $pipeline]) !!} + + + + + @lang('admin::app.settings.pipelines.edit.name') + + + + + + + + {!! view_render_event('admin.settings.pipelines.edit.form.name.after', ['pipeline' => $pipeline]) !!} + + {!! view_render_event('admin.settings.pipelines.edit.form.rotten_days.before', ['pipeline' => $pipeline]) !!} + + + + + @lang('admin::app.settings.pipelines.edit.rotten-days') + + + + + + + + {!! view_render_event('admin.settings.pipelines.edit.form.rotten_days.after', ['pipeline' => $pipeline]) !!} + + {!! view_render_event('admin.settings.pipelines.edit.form.is_default.before', ['pipeline' => $pipeline]) !!} + + + + + @lang('admin::app.settings.pipelines.edit.mark-as-default') + + + + + + + + {!! view_render_event('admin.settings.pipelines.edit.form.is_default.after', ['pipeline' => $pipeline]) !!} +
    +
    + +
    + + + + +
    +
    + + {!! view_render_event('admin.settings.pipelines.edit.form.after', ['pipeline' => $pipeline]) !!} + + @pushOnce('scripts') + + + + @endPushOnce +
    \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/settings/pipelines/index.blade.php b/packages/Webkul/Admin/src/Resources/views/settings/pipelines/index.blade.php new file mode 100644 index 0000000..b5dd042 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/settings/pipelines/index.blade.php @@ -0,0 +1,52 @@ + + + + @lang('admin::app.settings.pipelines.index.title') + + +
    +
    +
    + {!! view_render_event('admin.settings.pipelines.index.breadcrumbs.before') !!} + + + + + {!! view_render_event('admin.settings.pipelines.index.breadcrumbs.after') !!} + +
    + + @lang('admin::app.settings.pipelines.index.title') +
    +
    + +
    +
    + {!! view_render_event('admin.settings.pipelines.index.create_button.before') !!} + + @if (bouncer()->hasPermission('settings.lead.pipelines.create')) + + + @lang('admin::app.settings.pipelines.index.create-btn') + + @endif + + {!! view_render_event('admin.settings.pipelines.index.create_button.after') !!} +
    +
    +
    + + {!! view_render_event('admin.settings.pipelines.index.datagrid.before') !!} + + + + + + + + {!! view_render_event('admin.settings.pipelines.index.datagrid.after') !!} +
    +
    diff --git a/packages/Webkul/Admin/src/Resources/views/settings/roles/create.blade.php b/packages/Webkul/Admin/src/Resources/views/settings/roles/create.blade.php new file mode 100644 index 0000000..e158578 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/settings/roles/create.blade.php @@ -0,0 +1,214 @@ + + + + @lang('admin::app.settings.roles.create.title') + + + {!! view_render_event('admin.settings.roles.create.form.before') !!} + + + +
    +
    +
    + {!! view_render_event('admin.settings.roles.create.breadcrumbs.before') !!} + + + + + {!! view_render_event('admin.settings.roles.create.breadcrumbs.after') !!} + +
    + @lang('admin::app.settings.roles.create.title') +
    +
    + +
    +
    + {!! view_render_event('admin.settings.roles.create.create_button.before') !!} + + @if (bouncer()->hasPermission('settings.user.roles.create')) + + + @endif + + {!! view_render_event('admin.settings.roles.create.create_button.after') !!} +
    +
    +
    + + {!! view_render_event('admin.settings.roles.create.content.before') !!} + + +
    + {!! view_render_event('admin.settings.roles.create.content.left.before') !!} + + +
    +
    + + + +
    +
    + +
    +
    + + + +
    +
    +
    + + {!! view_render_event('admin.settings.roles.create.content.left.after') !!} + + {!! view_render_event('admin.settings.roles.create.content.right.before') !!} + + +
    + {!! view_render_event('admin.settings.roles.create.accordion.general.before') !!} + + + +
    +

    + @lang('admin::app.settings.roles.create.general') +

    +
    + + + + {!! view_render_event('admin.settings.roles.create.form.name.before') !!} + + + + + @lang('admin::app.settings.roles.create.name') + + + + + + + + {!! view_render_event('admin.settings.roles.create.form.name.after') !!} + + {!! view_render_event('admin.settings.roles.create.form.description.before') !!} + + + + + @lang('admin::app.settings.roles.create.description') + + + + + + + + {!! view_render_event('admin.settings.roles.create.form.description.after') !!} + +
    + + {!! view_render_event('admin.settings.roles.create.accordion.general.after') !!} +
    + + {!! view_render_event('admin.settings.roles.create.content.right.after') !!} +
    + + {!! view_render_event('admin.settings.roles.create.content.after') !!} +
    +
    + + {!! view_render_event('admin.settings.roles.create.form.after') !!} + + @pushOnce('scripts') + + + + @endPushOnce +
    diff --git a/packages/Webkul/Admin/src/Resources/views/settings/roles/edit.blade.php b/packages/Webkul/Admin/src/Resources/views/settings/roles/edit.blade.php new file mode 100644 index 0000000..a631feb --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/settings/roles/edit.blade.php @@ -0,0 +1,222 @@ + + + + @lang('admin::app.settings.roles.edit.title') + + + {!! view_render_event('admin.settings.roles.edit.form.before', ['role' => $role]) !!} + + +
    +
    +
    + {!! view_render_event('admin.settings.roles.edit.breadcrumbs.before', ['role' => $role]) !!} + + + + + {!! view_render_event('admin.settings.roles.edit.breadcrumbs.after', ['role' => $role]) !!} + +
    + @lang('admin::app.settings.roles.edit.title') +
    +
    + +
    +
    + {!! view_render_event('admin.settings.roles.edit.save_button.before', ['role' => $role]) !!} + + @if (bouncer()->hasPermission('settings.user.roles.edit')) + + + @endif + + {!! view_render_event('admin.settings.roles.edit.save_button.after', ['role' => $role]) !!} +
    +
    +
    + + {!! view_render_event('admin.settings.roles.edit.content.before', ['role' => $role]) !!} + + +
    + {!! view_render_event('admin.settings.roles.edit.content.left.before', ['role' => $role]) !!} + + +
    +
    +

    + @lang('admin::app.settings.roles.edit.access-control') +

    + + + + +
    +
    + +
    +
    + + + +
    +
    +
    + + {!! view_render_event('admin.settings.roles.edit.content.left.after', ['role' => $role]) !!} + + {!! view_render_event('admin.settings.roles.edit.content.right.before', ['role' => $role]) !!} + + +
    + {!! view_render_event('admin.settings.roles.edit.accordion.general.before', ['role' => $role]) !!} + + + +
    +

    + @lang('admin::app.settings.roles.edit.general') +

    +
    + + + + {!! view_render_event('admin.settings.roles.edit.form.name.before', ['role' => $role]) !!} + + + + + @lang('admin::app.settings.roles.edit.name') + + + + + + + + {!! view_render_event('admin.settings.roles.edit.form.name.after', ['role' => $role]) !!} + + {!! view_render_event('admin.settings.roles.edit.form.description.before', ['role' => $role]) !!} + + + + + @lang('admin::app.settings.roles.edit.description') + + + + + + + + {!! view_render_event('admin.settings.roles.edit.form.description.after', ['role' => $role]) !!} + +
    + + {!! view_render_event('admin.settings.roles.edit.accordion.general.after', ['role' => $role]) !!} +
    +
    + + {!! view_render_event('admin.settings.roles.edit.content.after', ['role' => $role]) !!} +
    +
    + + {!! view_render_event('admin.settings.roles.edit.form.after', ['role' => $role]) !!} + + @pushOnce('scripts') + + + + @endPushOnce +
    diff --git a/packages/Webkul/Admin/src/Resources/views/settings/roles/index.blade.php b/packages/Webkul/Admin/src/Resources/views/settings/roles/index.blade.php new file mode 100644 index 0000000..2c0ad94 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/settings/roles/index.blade.php @@ -0,0 +1,47 @@ + + + + @lang('admin::app.settings.roles.index.title') + + +
    +
    +
    + {!! view_render_event('admin.settings.roles.index.breadcrumbs.before') !!} + + + + + {!! view_render_event('admin.settings.roles.index.breadcrumbs.after') !!} + +
    + + @lang('admin::app.settings.roles.index.title') +
    +
    + +
    + +
    + {!! view_render_event('admin.settings.roles.index.create_button.before') !!} + + @if (bouncer()->hasPermission('settings.user.roles.create')) + + @lang('admin::app.settings.roles.index.create-btn') + + @endif + + {!! view_render_event('admin.settings.roles.index.create_button.after') !!} +
    +
    +
    + + + + + +
    +
    diff --git a/packages/Webkul/Admin/src/Resources/views/settings/sources/index.blade.php b/packages/Webkul/Admin/src/Resources/views/settings/sources/index.blade.php new file mode 100644 index 0000000..5b43059 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/settings/sources/index.blade.php @@ -0,0 +1,317 @@ + + + @lang('admin::app.settings.sources.index.title') + + +
    + +
    +
    + {!! view_render_event('admin.settings.sources.index.breadcrumbs.before') !!} + + + + + {!! view_render_event('admin.settings.sources.index.breadcrumbs.after') !!} + +
    + @lang('admin::app.settings.sources.index.title') +
    +
    + +
    + {!! view_render_event('admin.settings.sources.index.create_button.before') !!} + + + @if (bouncer()->hasPermission('settings.lead.sources.create')) +
    + +
    + @endif + + {!! view_render_event('admin.settings.sources.index.create_button.after') !!} +
    +
    + + + + + +
    + + @pushOnce('scripts') + + + + @endPushOnce +
    diff --git a/packages/Webkul/Admin/src/Resources/views/settings/tags/index.blade.php b/packages/Webkul/Admin/src/Resources/views/settings/tags/index.blade.php new file mode 100644 index 0000000..371a344 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/settings/tags/index.blade.php @@ -0,0 +1,392 @@ + + + + @lang('admin::app.settings.tags.index.title') + + +
    + +
    +
    + {!! view_render_event('admin.settings.tags.index.breadcrumbs.before') !!} + + + + + {!! view_render_event('admin.settings.tags.index.breadcrumbs.after') !!} + +
    + @lang('admin::app.settings.tags.index.title') +
    +
    + +
    + {!! view_render_event('admin.settings.tags.index.create_button.before') !!} + + + @if (bouncer()->hasPermission('settings.other_settings.tags.create')) +
    + +
    + @endif + + {!! view_render_event('admin.settings.tags.index.create_button.after') !!} +
    +
    + + + + + +
    + + @pushOnce('scripts') + + + + @endPushOnce +
    diff --git a/packages/Webkul/Admin/src/Resources/views/settings/types/index.blade.php b/packages/Webkul/Admin/src/Resources/views/settings/types/index.blade.php new file mode 100644 index 0000000..f4cd1b1 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/settings/types/index.blade.php @@ -0,0 +1,311 @@ + + + @lang('admin::app.settings.types.index.title') + + +
    + +
    +
    + + + +
    + @lang('admin::app.settings.types.index.title') +
    +
    + +
    + {!! view_render_event('admin.settings.types.index.create_button.before') !!} + + +
    + @if (bouncer()->hasPermission('settings.lead.types.create')) + + @endif +
    + + {!! view_render_event('admin.settings.types.index.create_button.after') !!} +
    +
    + + + + + +
    + + @pushOnce('scripts') + + + + @endPushOnce +
    diff --git a/packages/Webkul/Admin/src/Resources/views/settings/users/index.blade.php b/packages/Webkul/Admin/src/Resources/views/settings/users/index.blade.php new file mode 100644 index 0000000..1366fa2 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/settings/users/index.blade.php @@ -0,0 +1,592 @@ + + + @lang('admin::app.settings.users.index.title') + + +
    +
    +
    + + + +
    + @lang('admin::app.settings.users.index.title') +
    +
    + +
    + {!! view_render_event('admin.settings.users.index.create_button.before') !!} + + + @if (bouncer()->hasPermission('settings.user.users.create')) +
    + +
    + @endif + + {!! view_render_event('admin.settings.users.index.create_button.after') !!} +
    +
    + + + + + +
    + + @pushOnce('scripts') + + + + @endPushOnce +
    diff --git a/packages/Webkul/Admin/src/Resources/views/settings/warehouses/create.blade.php b/packages/Webkul/Admin/src/Resources/views/settings/warehouses/create.blade.php new file mode 100644 index 0000000..d9a316c --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/settings/warehouses/create.blade.php @@ -0,0 +1,106 @@ + + + + + @lang('admin::app.settings.warehouses.create.title') + + + {!! view_render_event('admin.settings.warehouses.create.form.before') !!} + + +
    +
    +
    + {!! view_render_event('admin.settings.warehouses.create.breadcrumbs.before') !!} + + + + + {!! view_render_event('admin.settings.warehouses.create.breadcrumbs.after') !!} + +
    + @lang('admin::app.settings.warehouses.create.title') +
    +
    + +
    +
    + {!! view_render_event('admin.settings.warehouses.create.save_button.before') !!} + + + + + {!! view_render_event('admin.settings.warehouses.create.save_button.after') !!} +
    +
    +
    + +
    + +
    +
    +

    + @lang('admin::app.settings.warehouses.create.contact-info') +

    + + {!! view_render_event('admin.settings.warehouses.create.left.form_controls.before') !!} + + + + {!! view_render_event('admin.settings.warehouses.create.left.form_controls.after') !!} +
    +
    + + +
    + + +
    +

    + @lang('admin::app.settings.roles.create.general') +

    +
    + + + + {!! view_render_event('admin.settings.warehouses.create.right.form_controls.before') !!} + + + + {!! view_render_event('admin.settings.warehouses.create.right.form_controls.after') !!} + +
    +
    +
    +
    +
    + + {!! view_render_event('admin.settings.warehouses.create.form.after') !!} + +
    diff --git a/packages/Webkul/Admin/src/Resources/views/settings/warehouses/edit.blade.php b/packages/Webkul/Admin/src/Resources/views/settings/warehouses/edit.blade.php new file mode 100644 index 0000000..6803ccb --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/settings/warehouses/edit.blade.php @@ -0,0 +1,110 @@ + + + + + @lang('admin::app.settings.warehouses.edit.title') + + + {!! view_render_event('admin.settings.warehouses.edit.form.before', ['warehouse' => $warehouse]) !!} + + +
    +
    +
    + {!! view_render_event('admin.settings.warehouses.edit.breadcrumbs.before') !!} + + + + + {!! view_render_event('admin.settings.warehouses.edit.breadcrumbs.after') !!} + +
    + @lang('admin::app.settings.warehouses.edit.title') +
    +
    + +
    +
    + {!! view_render_event('admin.settings.warehouses.edit.save_button.after') !!} + + + + + {!! view_render_event('admin.settings.warehouses.edit.save_button.before') !!} +
    +
    +
    + +
    + +
    +
    +

    + @lang('admin::app.settings.warehouses.edit.contact-info') +

    + + {!! view_render_event('admin.settings.warehouses.edit.left.form_controls.before', ['warehouse' => $warehouse]) !!} + + + + {!! view_render_event('admin.settings.warehouses.edit.left.form_controls.after', ['warehouse' => $warehouse]) !!} +
    +
    + + +
    + + +
    +

    + @lang('admin::app.settings.roles.create.general') +

    +
    + + + + {!! view_render_event('admin.settings.warehouses.edit.right.form_controls.before', ['warehouse' => $warehouse]) !!} + + + + {!! view_render_event('admin.settings.warehouses.edit.right.form_controls.after', ['warehouse' => $warehouse]) !!} + +
    +
    +
    +
    +
    + + {!! view_render_event('admin.settings.warehouses.edit.form.after', ['warehouse' => $warehouse]) !!} +
    diff --git a/packages/Webkul/Admin/src/Resources/views/settings/warehouses/index.blade.php b/packages/Webkul/Admin/src/Resources/views/settings/warehouses/index.blade.php new file mode 100644 index 0000000..d4e5078 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/settings/warehouses/index.blade.php @@ -0,0 +1,47 @@ + + + @lang('admin::app.settings.warehouses.index.title') + + +
    +
    +
    + + + +
    + + @lang('admin::app.settings.warehouses.index.title') +
    +
    + +
    + +
    + {!! view_render_event('admin.settings.warehouses.index.create_button.before') !!} + + @if (bouncer()->hasPermission('settings.automation.warehouses.create')) + + @lang('admin::app.settings.warehouses.index.create-btn') + + @endif + + {!! view_render_event('admin.settings.warehouses.index.create_button.after') !!} +
    +
    +
    + + {!! view_render_event('admin.settings.warehouses.index.datagrid.before') !!} + + + + + + + + {!! view_render_event('admin.settings.warehouses.index.datagrid.after') !!} +
    +
    diff --git a/packages/Webkul/Admin/src/Resources/views/settings/warehouses/view.blade.php b/packages/Webkul/Admin/src/Resources/views/settings/warehouses/view.blade.php new file mode 100644 index 0000000..2960d9d --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/settings/warehouses/view.blade.php @@ -0,0 +1,117 @@ + + + @lang ($warehouse->name) + + +
    + + {!! view_render_event('admin.settings.warehouses.view.left.before', ['warehouse' => $warehouse]) !!} + +
    + +
    + +
    + +
    + + {!! view_render_event('admin.settings.warehouses.view.left.tags.before', ['warehouse' => $warehouse]) !!} + + + + + {!! view_render_event('admin.settings.warehouses.view.left.tags.after', ['warehouse' => $warehouse]) !!} + + {!! view_render_event('admin.settings.warehouses.view.left.title.before', ['warehouse' => $warehouse]) !!} + + +

    + {{ $warehouse->name }} +

    + + {!! view_render_event('admin.settings.warehouses.view.left.title.after', ['warehouse' => $warehouse]) !!} + + {!! view_render_event('admin.settings.warehouses.view.left.actions.before', ['warehouse' => $warehouse]) !!} + + +
    + {!! view_render_event('admin.settings.warehouses.view.left.actions.file.before', ['warehouse' => $warehouse]) !!} + + + + + {!! view_render_event('admin.settings.warehouses.view.left.actions.file.after', ['warehouse' => $warehouse]) !!} + + {!! view_render_event('admin.settings.warehouses.view.left.actions.note.before', ['warehouse' => $warehouse]) !!} + + + + + {!! view_render_event('admin.settings.warehouses.view.left.actions.note.after', ['warehouse' => $warehouse]) !!} + + {!! view_render_event('admin.settings.warehouses.view.left.actions.activity.before', ['warehouse' => $warehouse]) !!} + + + + + {!! view_render_event('admin.settings.warehouses.view.left.actions.activity.after', ['warehouse' => $warehouse]) !!} +
    + + {!! view_render_event('admin.settings.warehouses.view.left.actions.after', ['warehouse' => $warehouse]) !!} +
    + + + @include ('admin::settings.warehouses.view.general-information') + + + @include ('admin::settings.warehouses.view.contact-information') +
    + + {!! view_render_event('admin.settings.warehouses.view.left.after', ['warehouse' => $warehouse]) !!} + + {!! view_render_event('admin.settings.warehouses.view.right.before', ['warehouse' => $warehouse]) !!} + + +
    + {!! view_render_event('admin.settings.warehouses.view.right.attributes.before', ['warehouse' => $warehouse]) !!} + + + + + @include ('admin::settings.warehouses.view.locations') + + + + {!! view_render_event('admin.settings.warehouses.view.right.attributes.after', ['warehouse' => $warehouse]) !!} +
    + + {!! view_render_event('admin.warehouse.view.right.after', ['warehouse' => $warehouse]) !!} +
    +
    \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/settings/warehouses/view/contact-information.blade.php b/packages/Webkul/Admin/src/Resources/views/settings/warehouses/view/contact-information.blade.php new file mode 100644 index 0000000..de87d97 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/settings/warehouses/view/contact-information.blade.php @@ -0,0 +1,38 @@ +{!! view_render_event('admin.leads.view.person.before', ['warehouse' => $warehouse]) !!} + +
    + + +

    + @lang('admin::app.settings.warehouses.view.contact-information.title') +

    + + + + + +
    + {!! view_render_event('admin.leads.view.person.attributes.view.before', ['warehouse' => $warehouse]) !!} + + + + {!! view_render_event('admin.leads.view.person.attributes.view.after', ['warehouse' => $warehouse]) !!} + +
    + +
    +
    + +{!! view_render_event('admin.leads.view.person.after', ['warehouse' => $warehouse]) !!} \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/settings/warehouses/view/general-information.blade.php b/packages/Webkul/Admin/src/Resources/views/settings/warehouses/view/general-information.blade.php new file mode 100644 index 0000000..acb02b7 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/settings/warehouses/view/general-information.blade.php @@ -0,0 +1,38 @@ +{!! view_render_event('admin.leads.view.person.before', ['warehouse' => $warehouse]) !!} + +
    + + +

    + @lang('admin::app.settings.warehouses.view.general-information.title') +

    + + + + + +
    + {!! view_render_event('admin.leads.view.person.attributes.view.before', ['warehouse' => $warehouse]) !!} + + + + {!! view_render_event('admin.leads.view.person.attributes.view.after', ['warehouse' => $warehouse]) !!} + +
    + +
    +
    + +{!! view_render_event('admin.leads.view.person.after', ['warehouse' => $warehouse]) !!} \ No newline at end of file diff --git a/packages/Webkul/Admin/src/Resources/views/settings/warehouses/view/locations.blade.php b/packages/Webkul/Admin/src/Resources/views/settings/warehouses/view/locations.blade.php new file mode 100644 index 0000000..b8c32ed --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/settings/warehouses/view/locations.blade.php @@ -0,0 +1,208 @@ + + + +@pushOnce('scripts') + + + +@endPushOnce diff --git a/packages/Webkul/Admin/src/Resources/views/settings/web-forms/create.blade.php b/packages/Webkul/Admin/src/Resources/views/settings/web-forms/create.blade.php new file mode 100644 index 0000000..68ede2c --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/settings/web-forms/create.blade.php @@ -0,0 +1,717 @@ + + + + @lang('admin::app.settings.webforms.create.title') + + + +
    +
    +
    + {!! view_render_event('admin.settings.webform.create.breadcrumbs.before') !!} + + + + + {!! view_render_event('admin.settings.webform.create.breadcrumbs.after') !!} + +
    + @lang('admin::app.settings.webforms.create.title') +
    +
    + +
    +
    + {!! view_render_event('admin.settings.webform.create.save_button.before') !!} + + + + + {!! view_render_event('admin.settings.webform.create.save_button.after') !!} +
    +
    +
    + + +
    +
    + + @pushOnce('scripts') + + + + + + + + @endPushOnce +
    diff --git a/packages/Webkul/Admin/src/Resources/views/settings/web-forms/edit.blade.php b/packages/Webkul/Admin/src/Resources/views/settings/web-forms/edit.blade.php new file mode 100644 index 0000000..0807583 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/settings/web-forms/edit.blade.php @@ -0,0 +1,832 @@ + + + + @lang('admin::app.settings.webforms.edit.title') + + + +
    +
    +
    + {!! view_render_event('admin.settings.webform.edit.breadcrumbs.before', ['webform' => $webForm]) !!} + + + + + {!! view_render_event('admin.settings.webform.edit.breadcrumbs.after', ['webform' => $webForm]) !!} + +
    + @lang('admin::app.settings.webforms.edit.title') +
    +
    + +
    +
    + {!! view_render_event('admin.settings.webform.edit.embed_button.before', ['webform' => $webForm]) !!} + + + + + {!! view_render_event('admin.settings.webform.edit.embed_button.after', ['webform' => $webForm]) !!} + + {!! view_render_event('admin.settings.webform.edit.preview_button.before', ['webform' => $webForm]) !!} + + + @lang('admin::app.settings.webforms.edit.preview') + + + {!! view_render_event('admin.settings.webform.edit.preview_button.after', ['webform' => $webForm]) !!} + + {!! view_render_event('admin.settings.webform.edit.save_button.before', ['webform' => $webForm]) !!} + + + + {!! view_render_event('admin.settings.webform.edit.save_button.after', ['webform' => $webForm]) !!} +
    +
    +
    + + + +
    +
    + + @pushOnce('scripts') + ' }}" + /> + + + @lang('admin::app.settings.webforms.edit.copy') + + + + {!! view_render_event('admin.settings.webform.edit.modal.form_controls.after', ['webform' => $webForm]) !!} + + +
    + + + + + + + + @endPushOnce + diff --git a/packages/Webkul/Admin/src/Resources/views/settings/web-forms/index.blade.php b/packages/Webkul/Admin/src/Resources/views/settings/web-forms/index.blade.php new file mode 100644 index 0000000..fe6ace9 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/settings/web-forms/index.blade.php @@ -0,0 +1,120 @@ + + + @lang('admin::app.settings.webforms.index.title') + + + +
    +
    +
    + + + +
    + @lang('admin::app.settings.webforms.index.title') +
    +
    + +
    + +
    + @if (bouncer()->hasPermission('admin.settings.web_forms.create')) + + @endif +
    +
    +
    + + + +
    +
    + + @pushOnce('scripts') + + + + @endPushOnce +
    diff --git a/packages/Webkul/Admin/src/Resources/views/settings/webhook/create.blade.php b/packages/Webkul/Admin/src/Resources/views/settings/webhook/create.blade.php new file mode 100644 index 0000000..b6ebd9d --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/settings/webhook/create.blade.php @@ -0,0 +1,699 @@ +@php($placeholders = app('\Webkul\Automation\Helpers\Entity')->getEmailTemplatePlaceholders()) + + + + + @lang('admin::app.settings.webhooks.create.title') + + + {!! view_render_event('admin.settings.webhook.edit.form.before') !!} + + +
    +
    +
    + {!! view_render_event('admin.settings.webhook.edit.breadrumbs.before') !!} + + + + + {!! view_render_event('admin.settings.webhook.edit.breadrumbs.after') !!} + +
    + @lang('admin::app.settings.webhooks.create.title') +
    +
    + +
    +
    + {!! view_render_event('admin.settings.webhook.edit.save_button.before') !!} + + + + + {!! view_render_event('admin.settings.webhook.edit.save_button.after') !!} +
    +
    +
    + + +
    +
    + + {!! view_render_event('admin.settings.webhook.edit.form.after') !!} + + @pushOnce('scripts') + + + + + + + + + + + + + @endPushOnce + + @pushOnce('styles') + + + + + + @endPushOnce +
    diff --git a/packages/Webkul/Admin/src/Resources/views/settings/webhook/edit.blade.php b/packages/Webkul/Admin/src/Resources/views/settings/webhook/edit.blade.php new file mode 100644 index 0000000..75376f5 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/settings/webhook/edit.blade.php @@ -0,0 +1,712 @@ +@php($placeholders = app('\Webkul\Automation\Helpers\Entity')->getEmailTemplatePlaceholders()) + + + + + @lang('admin::app.settings.webhooks.edit.title') + + + {!! view_render_event('admin.settings.webhook.edit.form.before', ['webhook' => $webhook]) !!} + + +
    +
    +
    + {!! view_render_event('admin.settings.webhook.edit.breadcrumbs.before', ['webhook' => $webhook]) !!} + + + + + {!! view_render_event('admin.settings.webhook.edit.breadcrumbs.after', ['webhook' => $webhook]) !!} + +
    + @lang('admin::app.settings.webhooks.edit.title') +
    +
    + +
    +
    + {!! view_render_event('admin.settings.webhook.edit.save_button.before', ['webhook' => $webhook]) !!} + + + + + {!! view_render_event('admin.settings.webhook.edit.save_button.after', ['webhook' => $webhook]) !!} +
    +
    +
    + + +
    +
    + + {!! view_render_event('admin.settings.webhook.edit.form.after', ['webhook' => $webhook]) !!} + + @pushOnce('scripts') + + + + + + + + + + + + @endPushOnce + + @pushOnce('styles') + + + + + + @endPushOnce +
    diff --git a/packages/Webkul/Admin/src/Resources/views/settings/webhook/index.blade.php b/packages/Webkul/Admin/src/Resources/views/settings/webhook/index.blade.php new file mode 100644 index 0000000..84264da --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/settings/webhook/index.blade.php @@ -0,0 +1,46 @@ + + + @lang('admin::app.settings.webhooks.index.title') + + +
    +
    +
    + {!! view_render_event('admin.settings.webhooks.breadcrumbs.datagrid.before') !!} + + + + {!! view_render_event('admin.settings.webhooks.breadcrumbs.datagrid.after') !!} + +
    + @lang('admin::app.settings.webhooks.index.title') +
    +
    + +
    +
    + {!! view_render_event('admin.settings.webhooks.create_button.datagrid.before') !!} + + + + @lang('admin::app.settings.webhooks.index.create-btn') + + + {!! view_render_event('admin.settings.webhooks.create_button.datagrid.after') !!} +
    +
    +
    + + {!! view_render_event('admin.settings.webhooks.index.datagrid.before') !!} + + + + + + + {!! view_render_event('admin.settings.webhooks.index.datagrid.after') !!} +
    +
    diff --git a/packages/Webkul/Admin/src/Resources/views/settings/workflows/create.blade.php b/packages/Webkul/Admin/src/Resources/views/settings/workflows/create.blade.php new file mode 100644 index 0000000..66ec4c0 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/settings/workflows/create.blade.php @@ -0,0 +1,1262 @@ + + + @lang('admin::app.settings.workflows.create.title') + + + {!! view_render_event('admin.settings.workflow.form.before') !!} + + +
    +
    +
    + {!! view_render_event('admin.settings.workflow.breadcrumbs.before') !!} + + + + {!! view_render_event('admin.settings.webhooks.breadcrumbs.after') !!} + +
    + @lang('admin::app.settings.workflows.create.title') +
    +
    + +
    +
    + {!! view_render_event('admin.settings.workflow.save_button.before') !!} + + + + + {!! view_render_event('admin.settings.workflow.save_button.after') !!} +
    +
    +
    + + + + + +
    +
    + + {!! view_render_event('admin.settings.workflow.form.after') !!} + + @pushOnce('scripts') + + + + + + + + + + + + @endPushOnce + + @pushOnce('styles') + + @endPushOnce +
    diff --git a/packages/Webkul/Admin/src/Resources/views/settings/workflows/edit.blade.php b/packages/Webkul/Admin/src/Resources/views/settings/workflows/edit.blade.php new file mode 100644 index 0000000..12f5999 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/settings/workflows/edit.blade.php @@ -0,0 +1,1280 @@ + + + @lang('admin::app.settings.workflows.edit.title') + + + {!! view_render_event('admin.activities.edit.form.before') !!} + + +
    +
    +
    + {!! view_render_event('admin.settings.workflows.edit.breadcrumbs.before', ['workflow' => $workflow]) !!} + + + + {!! view_render_event('admin.settings.workflows.edit.breadcrumbs.after', ['workflow' => $workflow]) !!} + +
    + @lang('admin::app.settings.workflows.edit.title') +
    +
    + +
    +
    + {!! view_render_event('admin.settings.workflows.edit.save_button.before', ['workflow' => $workflow]) !!} + + + + + {!! view_render_event('admin.settings.workflows.edit.save_button.after', ['workflow' => $workflow]) !!} +
    +
    +
    + + + + + +
    +
    + + @pushOnce('scripts') + + + + + + + + + + + + @endPushOnce + + @pushOnce('styles') + + @endPushOnce +
    diff --git a/packages/Webkul/Admin/src/Resources/views/settings/workflows/index.blade.php b/packages/Webkul/Admin/src/Resources/views/settings/workflows/index.blade.php new file mode 100644 index 0000000..46a4546 --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/settings/workflows/index.blade.php @@ -0,0 +1,50 @@ + + + + @lang('admin::app.settings.workflows.index.title') + + +
    +
    +
    + {!! view_render_event('admin.settings.workflows.index.breadcrumbs.before') !!} + + + + + {!! view_render_event('admin.settings.workflows.index.breadcrumbs.after') !!} + +
    + @lang('admin::app.settings.workflows.index.title') +
    +
    + +
    + +
    + {!! view_render_event('admin.settings.workflows.index.create_button.before') !!} + + @if (bouncer()->hasPermission('settings.automation.workflows.create')) + + @lang('admin::app.settings.workflows.index.create-btn') + + @endif + + {!! view_render_event('admin.settings.workflows.index.create_button.after') !!} +
    +
    +
    + + {!! view_render_event('admin.settings.workflows.index.datagrid.before') !!} + + + + + + + {!! view_render_event('admin.settings.workflows.index.datagrid.after') !!} +
    +
    diff --git a/packages/Webkul/Admin/src/Resources/views/user/account/edit.blade.php b/packages/Webkul/Admin/src/Resources/views/user/account/edit.blade.php new file mode 100644 index 0000000..60da96d --- /dev/null +++ b/packages/Webkul/Admin/src/Resources/views/user/account/edit.blade.php @@ -0,0 +1,201 @@ + + + + @lang('admin::app.account.edit.title') + + + {!! view_render_event('admin.user.account.form.before', ['user' => $user]) !!} + + + +
    +
    + {!! view_render_event('admin.user.account.breadcrumbs.before', ['user' => $user]) !!} + + + + + {!! view_render_event('admin.user.account.breadcrumbs.after', ['user' => $user]) !!} + +
    + {!! view_render_event('admin.user.account.title.before', ['user' => $user]) !!} + + @lang('admin::app.account.edit.title') + + {!! view_render_event('admin.user.account.title.after', ['user' => $user]) !!} +
    +
    + +
    + +
    + {!! view_render_event('admin.user.account.save_btn.before', ['user' => $user]) !!} + + + + {!! view_render_event('admin.user.account.save_btn.after', ['user' => $user]) !!} +
    +
    +
    + + +
    + {!! view_render_event('admin.user.account.left.before', ['user' => $user]) !!} + + +
    + +
    +

    + @lang('admin::app.account.edit.general') +

    + + + + + + +

    + @lang('admin::app.account.edit.upload-image-info') +

    + + + + + @lang('admin::app.account.edit.name') + + + + + + + + + + + @lang('admin::app.account.edit.email') + + + + + + +
    +
    + + {!! view_render_event('admin.user.account.left.after', ['user' => $user]) !!} + + {!! view_render_event('admin.user.account.right.before', ['user' => $user]) !!} + + +
    + + +

    + @lang('admin::app.account.edit.change-password') +

    + + + + + {!! view_render_event('admin.user.current_password.before', ['user' => $user]) !!} + + + + + @lang('admin::app.account.edit.current-password') + + + + + + + + {!! view_render_event('admin.user.current_password.after', ['user' => $user]) !!} + + {!! view_render_event('admin.user.password.before', ['user' => $user]) !!} + + + + + @lang('admin::app.account.edit.password') + + + + + + + + {!! view_render_event('admin.user.password.after', ['user' => $user]) !!} + + {!! view_render_event('admin.user.confirm-password.before', ['user' => $user]) !!} + + + + + @lang('admin::app.account.edit.confirm-password') + + + + + + + + {!! view_render_event('admin.user.confirm-password.after', ['user' => $user]) !!} + +
    +
    + + {!! view_render_event('admin.user.account.right.after', ['user' => $user]) !!} +
    +
    + + {!! view_render_event('admin.user.account.form.after') !!} +
    diff --git a/packages/Webkul/Admin/src/Routes/Admin/activities-routes.php b/packages/Webkul/Admin/src/Routes/Admin/activities-routes.php new file mode 100644 index 0000000..1fe00ec --- /dev/null +++ b/packages/Webkul/Admin/src/Routes/Admin/activities-routes.php @@ -0,0 +1,24 @@ +prefix('activities')->group(function () { + Route::get('', 'index')->name('admin.activities.index'); + + Route::get('get', 'get')->name('admin.activities.get'); + + Route::post('create', 'store')->name('admin.activities.store'); + + Route::get('edit/{id}', 'edit')->name('admin.activities.edit'); + + Route::put('edit/{id}', 'update')->name('admin.activities.update'); + + Route::get('download/{id}', 'download')->name('admin.activities.file_download'); + + Route::delete('{id}', 'destroy')->name('admin.activities.delete'); + + Route::post('mass-update', 'massUpdate')->name('admin.activities.mass_update'); + + Route::post('mass-destroy', 'massDestroy')->name('admin.activities.mass_delete'); +}); diff --git a/packages/Webkul/Admin/src/Routes/Admin/auth-routes.php b/packages/Webkul/Admin/src/Routes/Admin/auth-routes.php new file mode 100644 index 0000000..783223c --- /dev/null +++ b/packages/Webkul/Admin/src/Routes/Admin/auth-routes.php @@ -0,0 +1,47 @@ +group(function () { + /** + * Redirect route. + */ + Route::get('/', [Controller::class, 'redirectToLogin']); + + /** + * Session routes. + */ + Route::controller(SessionController::class)->group(function () { + Route::prefix('login')->group(function () { + Route::get('', 'create')->name('admin.session.create'); + + Route::post('', 'store')->name('admin.session.store'); + }); + + Route::middleware(['user'])->group(function () { + Route::delete('logout', 'destroy')->name('admin.session.destroy'); + }); + }); + + /** + * Forgot password routes. + */ + Route::controller(ForgotPasswordController::class)->prefix('forget-password')->group(function () { + Route::get('', 'create')->name('admin.forgot_password.create'); + + Route::post('', 'store')->name('admin.forgot_password.store'); + }); + + /** + * Reset password routes. + */ + Route::controller(ResetPasswordController::class)->prefix('reset-password')->group(function () { + Route::get('{token}', 'create')->name('admin.reset_password.create'); + + Route::post('', 'store')->name('admin.reset_password.store'); + }); +}); diff --git a/packages/Webkul/Admin/src/Routes/Admin/configuration-routes.php b/packages/Webkul/Admin/src/Routes/Admin/configuration-routes.php new file mode 100644 index 0000000..f6c253e --- /dev/null +++ b/packages/Webkul/Admin/src/Routes/Admin/configuration-routes.php @@ -0,0 +1,16 @@ +prefix('configuration')->group(function () { + Route::get('search', 'search')->name('admin.configuration.search'); + + Route::prefix('{slug?}/{slug2?}')->group(function () { + Route::get('', 'index')->name('admin.configuration.index'); + + Route::post('', 'store')->name('admin.configuration.store'); + + Route::get('{path}', 'download')->name('admin.configuration.download'); + }); +}); diff --git a/packages/Webkul/Admin/src/Routes/Admin/contacts-routes.php b/packages/Webkul/Admin/src/Routes/Admin/contacts-routes.php new file mode 100644 index 0000000..7bdb394 --- /dev/null +++ b/packages/Webkul/Admin/src/Routes/Admin/contacts-routes.php @@ -0,0 +1,67 @@ +group(function () { + /** + * Persons routes. + */ + Route::controller(PersonController::class)->prefix('persons')->group(function () { + Route::get('', 'index')->name('admin.contacts.persons.index'); + + Route::get('create', 'create')->name('admin.contacts.persons.create'); + + Route::post('create', 'store')->name('admin.contacts.persons.store'); + + Route::get('view/{id}', 'show')->name('admin.contacts.persons.view'); + + Route::get('edit/{id}', 'edit')->name('admin.contacts.persons.edit'); + + Route::put('edit/{id}', 'update')->name('admin.contacts.persons.update'); + + Route::get('search', 'search')->name('admin.contacts.persons.search'); + + Route::middleware(['throttle:100,60'])->delete('{id}', 'destroy')->name('admin.contacts.persons.delete'); + + Route::post('mass-destroy', 'massDestroy')->name('admin.contacts.persons.mass_delete'); + + /** + * Tag routes. + */ + Route::controller(TagController::class)->prefix('{id}/tags')->group(function () { + Route::post('', 'attach')->name('admin.contacts.persons.tags.attach'); + + Route::delete('', 'detach')->name('admin.contacts.persons.tags.detach'); + }); + + /** + * Activity routes. + */ + Route::controller(ActivityController::class)->prefix('{id}/activities')->group(function () { + Route::get('', 'index')->name('admin.contacts.persons.activities.index'); + }); + }); + + /** + * Organization routes. + */ + Route::controller(OrganizationController::class)->prefix('organizations')->group(function () { + Route::get('', 'index')->name('admin.contacts.organizations.index'); + + Route::get('create', 'create')->name('admin.contacts.organizations.create'); + + Route::post('create', 'store')->name('admin.contacts.organizations.store'); + + Route::get('edit/{id?}', 'edit')->name('admin.contacts.organizations.edit'); + + Route::put('edit/{id}', 'update')->name('admin.contacts.organizations.update'); + + Route::delete('{id}', 'destroy')->name('admin.contacts.organizations.delete'); + + Route::put('mass-destroy', 'massDestroy')->name('admin.contacts.organizations.mass_delete'); + }); +}); diff --git a/packages/Webkul/Admin/src/Routes/Admin/leads-routes.php b/packages/Webkul/Admin/src/Routes/Admin/leads-routes.php new file mode 100644 index 0000000..43a0be0 --- /dev/null +++ b/packages/Webkul/Admin/src/Routes/Admin/leads-routes.php @@ -0,0 +1,64 @@ +prefix('leads')->group(function () { + Route::get('', 'index')->name('admin.leads.index'); + + Route::get('create', 'create')->name('admin.leads.create'); + + Route::post('create', 'store')->name('admin.leads.store'); + + Route::post('create-by-ai', 'createByAI')->name('admin.leads.create_by_ai'); + + Route::get('view/{id}', 'view')->name('admin.leads.view'); + + Route::get('edit/{id}', 'edit')->name('admin.leads.edit'); + + Route::put('edit/{id}', 'update')->name('admin.leads.update'); + + Route::put('attributes/edit/{id}', 'updateAttributes')->name('admin.leads.attributes.update'); + + Route::put('stage/edit/{id}', 'updateStage')->name('admin.leads.stage.update'); + + Route::get('search', 'search')->name('admin.leads.search'); + + Route::delete('{id}', 'destroy')->name('admin.leads.delete'); + + Route::post('mass-update', 'massUpdate')->name('admin.leads.mass_update'); + + Route::post('mass-destroy', 'massDestroy')->name('admin.leads.mass_delete'); + + Route::get('get/{pipeline_id?}', 'get')->name('admin.leads.get'); + + Route::delete('product/{lead_id}', 'removeProduct')->name('admin.leads.product.remove'); + + Route::put('product/{lead_id}', 'addProduct')->name('admin.leads.product.add'); + + Route::get('kanban/look-up', [LeadController::class, 'kanbanLookup'])->name('admin.leads.kanban.look_up'); + + Route::controller(ActivityController::class)->prefix('{id}/activities')->group(function () { + Route::get('', 'index')->name('admin.leads.activities.index'); + }); + + Route::controller(TagController::class)->prefix('{id}/tags')->group(function () { + Route::post('', 'attach')->name('admin.leads.tags.attach'); + + Route::delete('', 'detach')->name('admin.leads.tags.detach'); + }); + + Route::controller(EmailController::class)->prefix('{id}/emails')->group(function () { + Route::post('', 'store')->name('admin.leads.emails.store'); + + Route::delete('', 'detach')->name('admin.leads.emails.detach'); + }); + + Route::controller(QuoteController::class)->prefix('{id}/quotes')->group(function () { + Route::delete('{quote_id?}', 'delete')->name('admin.leads.quotes.delete'); + }); +}); diff --git a/packages/Webkul/Admin/src/Routes/Admin/mail-routes.php b/packages/Webkul/Admin/src/Routes/Admin/mail-routes.php new file mode 100644 index 0000000..371fe62 --- /dev/null +++ b/packages/Webkul/Admin/src/Routes/Admin/mail-routes.php @@ -0,0 +1,33 @@ +group(function () { + Route::controller(EmailController::class)->group(function () { + Route::post('create', 'store')->name('admin.mail.store'); + + Route::put('edit/{id}', 'update')->name('admin.mail.update'); + + Route::get('attachment-download/{id?}', 'download')->name('admin.mail.attachment_download'); + + Route::get('{route?}', 'index')->name('admin.mail.index'); + + Route::get('{route}/{id}', 'view')->name('admin.mail.view'); + + Route::delete('{id}', 'destroy')->name('admin.mail.delete'); + + Route::post('mass-update', 'massUpdate')->name('admin.mail.mass_update'); + + Route::post('mass-destroy', 'massDestroy')->name('admin.mail.mass_delete'); + + Route::post('inbound-parse', 'inboundParse')->name('admin.mail.inbound_parse')->withoutMiddleware('user'); + }); + + Route::controller(TagController::class)->prefix('{id}/tags')->group(function () { + Route::post('', 'attach')->name('admin.mail.tags.attach'); + + Route::delete('', 'detach')->name('admin.mail.tags.detach'); + }); +}); diff --git a/packages/Webkul/Admin/src/Routes/Admin/products-routes.php b/packages/Webkul/Admin/src/Routes/Admin/products-routes.php new file mode 100644 index 0000000..6a58e12 --- /dev/null +++ b/packages/Webkul/Admin/src/Routes/Admin/products-routes.php @@ -0,0 +1,42 @@ + ['user']], function () { + Route::controller(ProductController::class)->prefix('products')->group(function () { + Route::get('', 'index')->name('admin.products.index'); + + Route::get('create', 'create')->name('admin.products.create'); + + Route::post('create', 'store')->name('admin.products.store'); + + Route::get('view/{id}', 'view')->name('admin.products.view'); + + Route::get('edit/{id}', 'edit')->name('admin.products.edit'); + + Route::put('edit/{id}', 'update')->name('admin.products.update'); + + Route::get('search', 'search')->name('admin.products.search'); + + Route::get('{id}/warehouses', 'warehouses')->name('admin.products.warehouses'); + + Route::post('{id}/inventories/{warehouseId?}', 'storeInventories')->name('admin.products.inventories.store'); + + Route::delete('{id}', 'destroy')->name('admin.products.delete'); + + Route::post('mass-destroy', 'massDestroy')->name('admin.products.mass_delete'); + + Route::controller(ActivityController::class)->prefix('{id}/activities')->group(function () { + Route::get('', 'index')->name('admin.products.activities.index'); + }); + + Route::controller(TagController::class)->prefix('{id}/tags')->group(function () { + Route::post('', 'attach')->name('admin.products.tags.attach'); + + Route::delete('', 'detach')->name('admin.products.tags.detach'); + }); + }); +}); diff --git a/packages/Webkul/Admin/src/Routes/Admin/quote-routes.php b/packages/Webkul/Admin/src/Routes/Admin/quote-routes.php new file mode 100644 index 0000000..25421ab --- /dev/null +++ b/packages/Webkul/Admin/src/Routes/Admin/quote-routes.php @@ -0,0 +1,24 @@ +prefix('quotes')->group(function () { + Route::get('', 'index')->name('admin.quotes.index'); + + Route::get('create/{lead_id?}', 'create')->name('admin.quotes.create'); + + Route::post('create', 'store')->name('admin.quotes.store'); + + Route::get('edit/{id?}', 'edit')->name('admin.quotes.edit'); + + Route::put('edit/{id}', 'update')->name('admin.quotes.update'); + + Route::get('print/{id?}', 'print')->name('admin.quotes.print'); + + Route::delete('{id}', 'destroy')->name('admin.quotes.delete'); + + Route::get('search', 'search')->name('admin.quotes.search'); + + Route::post('mass-destroy', 'massDestroy')->name('admin.quotes.mass_delete'); +}); diff --git a/packages/Webkul/Admin/src/Routes/Admin/rest-routes.php b/packages/Webkul/Admin/src/Routes/Admin/rest-routes.php new file mode 100644 index 0000000..7167a03 --- /dev/null +++ b/packages/Webkul/Admin/src/Routes/Admin/rest-routes.php @@ -0,0 +1,54 @@ +prefix('dashboard')->group(function () { + Route::get('', 'index')->name('admin.dashboard.index'); + + Route::get('stats', 'stats')->name('admin.dashboard.stats'); +}); + +/** + * DataGrid routes. + */ +Route::prefix('datagrid')->group(function () { + /** + * Saved filter routes. + */ + Route::controller(SavedFilterController::class)->prefix('datagrid/saved-filters')->group(function () { + Route::post('', 'store')->name('admin.datagrid.saved_filters.store'); + + Route::get('', 'get')->name('admin.datagrid.saved_filters.index'); + + Route::put('{id}', 'update')->name('admin.datagrid.saved_filters.update'); + + Route::delete('{id}', 'destroy')->name('admin.datagrid.saved_filters.destroy'); + }); + + /** + * Lookup routes. + */ + Route::get('datagrid/look-up', [DataGridController::class, 'lookUp'])->name('admin.datagrid.look_up'); +}); + +/** + * Tinymce file upload handler. + */ +Route::post('tinymce/upload', [TinyMCEController::class, 'upload'])->name('admin.tinymce.upload'); + +/** + * User profile routes. + */ +Route::controller(AccountController::class)->prefix('account')->group(function () { + Route::get('', 'edit')->name('admin.user.account.edit'); + + Route::put('update', 'update')->name('admin.user.account.update'); +}); diff --git a/packages/Webkul/Admin/src/Routes/Admin/settings-routes.php b/packages/Webkul/Admin/src/Routes/Admin/settings-routes.php new file mode 100644 index 0000000..7bdfcb2 --- /dev/null +++ b/packages/Webkul/Admin/src/Routes/Admin/settings-routes.php @@ -0,0 +1,377 @@ +group(function () { + /** + * Settings routes. + */ + Route::controller(SettingController::class)->prefix('settings')->group(function () { + Route::get('', 'index')->name('admin.settings.index'); + + Route::get('search', 'search')->name('admin.settings.search'); + }); + + /** + * Groups routes. + */ + Route::controller(GroupController::class)->prefix('groups')->group(function () { + Route::get('', 'index')->name('admin.settings.groups.index'); + + Route::post('create', 'store')->name('admin.settings.groups.store'); + + Route::get('edit/{id}', 'edit')->name('admin.settings.groups.edit'); + + Route::put('edit/{id}', 'update')->name('admin.settings.groups.update'); + + Route::delete('{id}', 'destroy')->name('admin.settings.groups.delete'); + }); + + /** + * Type routes. + */ + Route::controller(TypeController::class)->prefix('types')->group(function () { + Route::get('', 'index')->name('admin.settings.types.index'); + + Route::post('create', 'store')->name('admin.settings.types.store'); + + Route::get('edit/{id?}', 'edit')->name('admin.settings.types.edit'); + + Route::put('edit/{id}', 'update')->name('admin.settings.types.update'); + + Route::delete('{id}', 'destroy')->name('admin.settings.types.delete'); + }); + + /** + * Roles routes. + */ + Route::controller(RoleController::class)->prefix('roles')->group(function () { + Route::get('', 'index')->name('admin.settings.roles.index'); + + Route::get('create', 'create')->name('admin.settings.roles.create'); + + Route::post('create', 'store')->name('admin.settings.roles.store'); + + Route::get('edit/{id}', 'edit')->name('admin.settings.roles.edit'); + + Route::put('edit/{id}', 'update')->name('admin.settings.roles.update'); + + Route::delete('{id}', 'destroy')->name('admin.settings.roles.delete'); + }); + + /** + * WebForms Routes. + */ + Route::controller(WebFormController::class)->prefix('web-forms')->group(function () { + Route::group(['middleware' => ['user']], function () { + Route::get('', 'index')->name('admin.settings.web_forms.index'); + + Route::get('create', 'create')->name('admin.settings.web_forms.create'); + + Route::post('create', 'store')->name('admin.settings.web_forms.store'); + + Route::get('edit/{id?}', 'edit')->name('admin.settings.web_forms.edit'); + + Route::put('edit/{id}', 'update')->name('admin.settings.web_forms.update'); + + Route::delete('{id}', 'destroy')->name('admin.settings.web_forms.delete'); + }); + }); + + /** + * Workflows Routes. + */ + Route::controller(WorkflowController::class)->prefix('workflows')->group(function () { + Route::get('', 'index')->name('admin.settings.workflows.index'); + + Route::get('create', 'create')->name('admin.settings.workflows.create'); + + Route::post('create', 'store')->name('admin.settings.workflows.store'); + + Route::get('edit/{id?}', 'edit')->name('admin.settings.workflows.edit'); + + Route::put('edit/{id}', 'update')->name('admin.settings.workflows.update'); + + Route::delete('{id}', 'destroy')->name('admin.settings.workflows.delete'); + }); + + /** + * Webhook Routes. + */ + Route::controller(WebhookController::class)->prefix('webhooks')->group(function () { + Route::get('', 'index')->name('admin.settings.webhooks.index'); + + Route::get('create', 'create')->name('admin.settings.webhooks.create'); + + Route::post('create', 'store')->name('admin.settings.webhooks.store'); + + Route::get('edit/{id?}', 'edit')->name('admin.settings.webhooks.edit'); + + Route::put('edit/{id}', 'update')->name('admin.settings.webhooks.update'); + + Route::delete('{id}', 'destroy')->name('admin.settings.webhooks.delete'); + }); + + /** + * Tags Routes. + */ + Route::controller(TagController::class)->prefix('tags')->group(function () { + Route::get('', 'index')->name('admin.settings.tags.index'); + + Route::post('create', 'store')->name('admin.settings.tags.store'); + + Route::get('edit/{id}', 'edit')->name('admin.settings.tags.edit'); + + Route::put('edit/{id}', 'update')->name('admin.settings.tags.update'); + + Route::get('search', 'search')->name('admin.settings.tags.search'); + + Route::delete('{id}', 'destroy')->name('admin.settings.tags.delete'); + + Route::post('mass-destroy', 'massDestroy')->name('admin.settings.tags.mass_delete'); + }); + + /** + * Users Routes. + */ + Route::controller(UserController::class)->prefix('users')->group(function () { + Route::get('', 'index')->name('admin.settings.users.index'); + + Route::post('create', 'store')->name('admin.settings.users.store'); + + Route::get('edit/{id?}', 'edit')->name('admin.settings.users.edit'); + + Route::put('edit/{id}', 'update')->name('admin.settings.users.update'); + + Route::get('search', 'search')->name('admin.settings.users.search'); + + Route::delete('{id}', 'destroy')->name('admin.settings.users.delete'); + + Route::post('mass-update', 'massUpdate')->name('admin.settings.users.mass_update'); + + Route::post('mass-destroy', 'massDestroy')->name('admin.settings.users.mass_delete'); + }); + + /** + * Pipelines Routes. + */ + Route::controller(PipelineController::class)->prefix('pipelines')->group(function () { + Route::get('', 'index')->name('admin.settings.pipelines.index'); + + Route::get('create', 'create')->name('admin.settings.pipelines.create'); + + Route::post('create', 'store')->name('admin.settings.pipelines.store'); + + Route::get('edit/{id?}', 'edit')->name('admin.settings.pipelines.edit'); + + Route::post('edit/{id}', 'update')->name('admin.settings.pipelines.update'); + + Route::delete('{id}', 'destroy')->name('admin.settings.pipelines.delete'); + }); + + /** + * Sources Routes. + */ + Route::controller(SourceController::class)->prefix('sources')->group(function () { + Route::get('', 'index')->name('admin.settings.sources.index'); + + Route::post('create', 'store')->name('admin.settings.sources.store'); + + Route::get('edit/{id?}', 'edit')->name('admin.settings.sources.edit'); + + Route::put('edit/{id}', 'update')->name('admin.settings.sources.update'); + + Route::delete('{id}', 'destroy')->name('admin.settings.sources.delete'); + }); + + /** + * Attributes Routes. + */ + Route::controller(AttributeController::class)->prefix('attributes')->group(function () { + Route::get('', 'index')->name('admin.settings.attributes.index'); + + Route::get('check-unique-validation', 'checkUniqueValidation')->name('admin.settings.attributes.check_unique_validation'); + + Route::get('create', 'create')->name('admin.settings.attributes.create'); + + Route::post('create', 'store')->name('admin.settings.attributes.store'); + + Route::get('edit/{id}', 'edit')->name('admin.settings.attributes.edit'); + + Route::put('edit/{id}', 'update')->name('admin.settings.attributes.update'); + + Route::get('lookup/{lookup?}', 'lookup')->name('admin.settings.attributes.lookup'); + + Route::get('lookup-entity/{lookup?}', 'lookupEntity')->name('admin.settings.attributes.lookup_entity'); + + Route::delete('{id}', 'destroy')->name('admin.settings.attributes.delete'); + + Route::get('{id}/options', 'getAttributeOptions')->name('admin.settings.attributes.options'); + + Route::post('mass-update', 'massUpdate')->name('admin.settings.attributes.mass_update'); + + Route::post('mass-destroy', 'massDestroy')->name('admin.settings.attributes.mass_delete'); + + Route::get('download', 'download')->name('admin.settings.attributes.download'); + }); + + /** + * Warehouses Routes. + */ + Route::controller(WarehouseController::class)->prefix('warehouses')->group(function () { + Route::put('edit/{id}', 'update')->name('admin.settings.warehouses.update'); + + Route::get('', 'index')->name('admin.settings.warehouses.index'); + + Route::get('search', 'search')->name('admin.settings.warehouses.search'); + + Route::get('{id}/products', 'products')->name('admin.settings.warehouses.products.index'); + + Route::get('create', 'create')->name('admin.settings.warehouses.create'); + + Route::post('create', 'store')->name('admin.settings.warehouses.store'); + + Route::get('view/{id}', 'view')->name('admin.settings.warehouses.view'); + + Route::get('edit/{id?}', 'edit')->name('admin.settings.warehouses.edit'); + + Route::delete('{id}', 'destroy')->name('admin.settings.warehouses.delete'); + + Route::controller(WarehouseTagController::class)->prefix('{id}/tags')->group(function () { + Route::post('', 'attach')->name('admin.settings.warehouses.tags.attach'); + + Route::delete('', 'detach')->name('admin.settings.warehouses.tags.detach'); + }); + + Route::controller(ActivityController::class)->prefix('{id}/activities')->group(function () { + Route::get('', 'index')->name('admin.settings.warehouse.activities.index'); + }); + }); + + /** + * Warehouses Location Routes. + */ + Route::controller(LocationController::class)->prefix('locations')->group(function () { + Route::get('search', 'search')->name('admin.settings.locations.search'); + + Route::post('create', 'store')->name('admin.settings.locations.store'); + + Route::put('edit/{id}', 'update')->name('admin.settings.locations.update'); + + Route::delete('{id}', 'destroy')->name('admin.settings.locations.delete'); + }); + + /** + * Email Templates Routes. + */ + Route::controller(EmailTemplateController::class)->prefix('email-templates')->group(function () { + Route::get('', 'index')->name('admin.settings.email_templates.index'); + + Route::get('create', 'create')->name('admin.settings.email_templates.create'); + + Route::post('create', 'store')->name('admin.settings.email_templates.store'); + + Route::get('edit/{id?}', 'edit')->name('admin.settings.email_templates.edit'); + + Route::put('edit/{id}', 'update')->name('admin.settings.email_templates.update'); + + Route::delete('{id}', 'destroy')->name('admin.settings.email_templates.delete'); + }); + + /** + * Events Routes. + */ + Route::group(['prefix' => 'marketing'], function () { + Route::controller(EventController::class)->prefix('events')->group(function () { + Route::get('', 'index')->name('admin.settings.marketing.events.index'); + + Route::post('create', 'store')->name('admin.settings.marketing.events.store'); + + Route::get('edit/{id?}', 'edit')->name('admin.settings.marketing.events.edit'); + + Route::put('edit/{id}', 'update')->name('admin.settings.marketing.events.update'); + + Route::delete('{id}', 'destroy')->name('admin.settings.marketing.events.delete'); + + Route::post('mass-destroy', 'massDestroy')->name('admin.settings.marketing.events.mass_delete'); + }); + + Route::controller(CampaignsController::class)->prefix('campaigns')->group(function () { + Route::get('', 'index')->name('admin.settings.marketing.campaigns.index'); + + Route::get('events', 'getEvents')->name('admin.settings.marketing.campaigns.events'); + + Route::get('email-templates', 'getEmailTemplates')->name('admin.settings.marketing.campaigns.email-templates'); + + Route::post('', 'store')->name('admin.settings.marketing.campaigns.store'); + + Route::get('{id}', 'show')->name('admin.settings.marketing.campaigns.edit'); + + Route::put('{id}', 'update')->name('admin.settings.marketing.campaigns.update'); + + Route::delete('{id}', 'destroy')->name('admin.settings.marketing.campaigns.delete'); + + Route::post('mass-destroy', 'massDestroy')->name('admin.settings.marketing.campaigns.mass_delete'); + }); + }); + + Route::prefix('data-transfer')->group(function () { + /** + * Import routes. + */ + Route::controller(ImportController::class)->prefix('imports')->group(function () { + Route::get('', 'index')->name('admin.settings.data_transfer.imports.index'); + + Route::get('create', 'create')->name('admin.settings.data_transfer.imports.create'); + + Route::post('create', 'store')->name('admin.settings.data_transfer.imports.store'); + + Route::get('edit/{id}', 'edit')->name('admin.settings.data_transfer.imports.edit'); + + Route::put('update/{id}', 'update')->name('admin.settings.data_transfer.imports.update'); + + Route::delete('destroy/{id}', 'destroy')->name('admin.settings.data_transfer.imports.delete'); + + Route::get('import/{id}', 'import')->name('admin.settings.data_transfer.imports.import'); + + Route::get('validate/{id}', 'validateImport')->name('admin.settings.data_transfer.imports.validate'); + + Route::get('start/{id}', 'start')->name('admin.settings.data_transfer.imports.start'); + + Route::get('link/{id}', 'link')->name('admin.settings.data_transfer.imports.link'); + + Route::get('index/{id}', 'indexData')->name('admin.settings.data_transfer.imports.index_data'); + + Route::get('stats/{id}/{state?}', 'stats')->name('admin.settings.data_transfer.imports.stats'); + + Route::get('download-sample/{sample?}', 'downloadSample')->name('admin.settings.data_transfer.imports.download_sample'); + + Route::get('download/{id}', 'download')->name('admin.settings.data_transfer.imports.download'); + + Route::get('download-error-report/{id}', 'downloadErrorReport')->name('admin.settings.data_transfer.imports.download_error_report'); + }); + }); +}); diff --git a/packages/Webkul/Admin/src/Routes/Admin/web.php b/packages/Webkul/Admin/src/Routes/Admin/web.php new file mode 100644 index 0000000..10683c3 --- /dev/null +++ b/packages/Webkul/Admin/src/Routes/Admin/web.php @@ -0,0 +1,51 @@ +name('krayin.home'); diff --git a/packages/Webkul/Admin/src/Traits/ProvideDropdownOptions.php b/packages/Webkul/Admin/src/Traits/ProvideDropdownOptions.php new file mode 100644 index 0000000..545cd6f --- /dev/null +++ b/packages/Webkul/Admin/src/Traits/ProvideDropdownOptions.php @@ -0,0 +1,279 @@ +booleanDropdownChoices); + } + + /** + * Get boolean dropdown options. + * + * @param string $choice + */ + public function getBooleanDropdownOptions($choice = 'active_inactive'): array + { + return $this->isBooleanDropdownChoiceExists($choice) && $choice == 'active_inactive' + ? $this->getActiveInactiveDropdownOptions() + : $this->getYesNoDropdownOptions(); + } + + /** + * Get active/inactive dropdown options. + */ + public function getActiveInactiveDropdownOptions(): array + { + return [ + [ + 'value' => '', + 'label' => __('admin::app.common.select-options'), + 'disabled' => true, + 'selected' => true, + ], + [ + 'label' => trans('admin::app.datagrid.active'), + 'value' => 1, + 'disabled' => false, + 'selected' => false, + ], [ + 'label' => trans('admin::app.datagrid.inactive'), + 'value' => 0, + 'disabled' => false, + 'selected' => false, + ], + ]; + } + + /** + * Get yes/no dropdown options. + */ + public function getYesNoDropdownOptions(): array + { + return [ + [ + 'value' => '', + 'label' => __('admin::app.common.select-options'), + 'disabled' => true, + 'selected' => true, + ], + [ + 'value' => 0, + 'label' => __('admin::app.common.no'), + 'disabled' => false, + 'selected' => false, + ], [ + 'value' => 1, + 'label' => __('admin::app.common.yes'), + 'disabled' => false, + 'selected' => false, + ], + ]; + } + + /** + * Get user dropdown options. + */ + public function getUserDropdownOptions(): array + { + $options = app(\Webkul\User\Repositories\UserRepository::class) + ->get(['id as value', 'name as label']) + ->map(function ($item, $key) { + $item->disabled = false; + + $item->selected = false; + + return $item; + }) + ->toArray(); + + return [ + [ + 'label' => __('admin::app.common.select-users'), + 'value' => '', + 'disabled' => true, + 'selected' => true, + ], + ...$options, + ]; + } + + /** + * Get lead source options. + */ + public function getLeadSourcesOptions(): array + { + $options = app(\Webkul\Lead\Repositories\SourceRepository::class) + ->get(['id as value', 'name as label']) + ->map(function ($item, $key) { + $item->disabled = false; + + $item->selected = false; + + return $item; + }) + ->toArray(); + + return [ + [ + 'label' => __('admin::app.common.select-users'), + 'value' => '', + 'disabled' => true, + 'selected' => true, + ], + ...$options, + ]; + } + + /** + * Get organization dropdown options. + */ + public function getOrganizationDropdownOptions(): array + { + $options = app(\Webkul\Contact\Repositories\OrganizationRepository::class) + ->get(['id as value', 'name as label']) + ->map(function ($item, $key) { + $item->disabled = false; + + $item->selected = false; + + return $item; + }) + ->toArray(); + + return [ + [ + 'label' => __('admin::app.common.select-organization'), + 'value' => '', + 'disabled' => true, + 'selected' => true, + ], + ...$options, + ]; + } + + /** + * Get role dropdown options. + */ + public function getRoleDropdownOptions(): array + { + return [ + [ + 'label' => trans('admin::app.settings.roles.all'), + 'value' => 'all', + 'disabled' => false, + 'selected' => false, + ], [ + 'label' => trans('admin::app.settings.roles.custom'), + 'value' => 'custom', + 'disabled' => false, + 'selected' => false, + ], + ]; + } + + /** + * Get activity type dropdown options. + */ + public function getActivityTypeDropdownOptions(): array + { + return [ + [ + 'label' => trans('admin::app.common.select-type'), + 'value' => '', + 'disabled' => true, + 'selected' => true, + ], [ + 'label' => trans('admin::app.common.select-call'), + 'value' => 'call', + 'disabled' => false, + 'selected' => false, + ], [ + 'label' => trans('admin::app.common.select-meeting'), + 'value' => 'meeting', + 'disabled' => false, + 'selected' => false, + ], [ + 'label' => trans('admin::app.common.select-lunch'), + 'value' => 'lunch', + 'disabled' => false, + 'selected' => false, + ], + ]; + } + + /** + * Get attribute type dropdown options. + */ + public function getAttributeTypeDropdownOptions(): array + { + return [ + [ + 'label' => trans('admin::app.common.select-options'), + 'value' => '', + 'disabled' => true, + 'selected' => true, + ], + [ + 'label' => trans('admin::app.common.system_attribute'), + 'value' => '0', + 'disabled' => false, + 'selected' => false, + ], + [ + 'label' => trans('admin::app.common.custom_attribute'), + 'value' => '1', + 'disabled' => false, + 'selected' => false, + ], + ]; + } + + /** + * Get organization dropdown options. + */ + public function getWarehouseDropdownOptions(): array + { + $options = app(\Webkul\Warehouse\Repositories\WarehouseRepository::class) + ->get(['id as value', 'name as label']) + ->map(function ($item, $key) { + $item->disabled = false; + + $item->selected = false; + + return $item; + }) + ->toArray(); + + return [ + [ + 'label' => __('admin::app.common.select-warehouse'), + 'value' => '', + 'disabled' => true, + 'selected' => true, + ], + ...$options, + ]; + } +} diff --git a/packages/Webkul/Admin/tailwind.config.js b/packages/Webkul/Admin/tailwind.config.js new file mode 100644 index 0000000..7fe663a --- /dev/null +++ b/packages/Webkul/Admin/tailwind.config.js @@ -0,0 +1,49 @@ +/** @type {import('tailwindcss').Config} */ +module.exports = { + content: ["./src/Resources/**/*.blade.php", "./src/Resources/**/*.js"], + + theme: { + container: { + center: true, + + screens: { + "4xl": "1920px", + }, + + padding: { + DEFAULT: "16px", + }, + }, + + screens: { + sm: "525px", + md: "768px", + lg: "1024px", + xl: "1240px", + "2xl": "1440px", + "3xl": "1680px", + "4xl": "1920px", + }, + + extend: { + colors: { + brandColor: "var(--brand-color)", + }, + + fontFamily: { + inter: ['Inter'], + icon: ['icomoon'] + } + }, + }, + + darkMode: 'class', + + plugins: [], + + safelist: [ + { + pattern: /icon-/, + } + ] +}; \ No newline at end of file diff --git a/packages/Webkul/Admin/tests/e2e-pw/.gitignore b/packages/Webkul/Admin/tests/e2e-pw/.gitignore new file mode 100644 index 0000000..52e84d7 --- /dev/null +++ b/packages/Webkul/Admin/tests/e2e-pw/.gitignore @@ -0,0 +1,2 @@ +/playwright-report +/test-results diff --git a/packages/Webkul/Admin/tests/e2e-pw/data/images/1.webp b/packages/Webkul/Admin/tests/e2e-pw/data/images/1.webp new file mode 100644 index 0000000..4886617 Binary files /dev/null and b/packages/Webkul/Admin/tests/e2e-pw/data/images/1.webp differ diff --git a/packages/Webkul/Admin/tests/e2e-pw/data/images/10.webp b/packages/Webkul/Admin/tests/e2e-pw/data/images/10.webp new file mode 100644 index 0000000..933f801 Binary files /dev/null and b/packages/Webkul/Admin/tests/e2e-pw/data/images/10.webp differ diff --git a/packages/Webkul/Admin/tests/e2e-pw/data/images/11.webp b/packages/Webkul/Admin/tests/e2e-pw/data/images/11.webp new file mode 100644 index 0000000..9a9bdb2 Binary files /dev/null and b/packages/Webkul/Admin/tests/e2e-pw/data/images/11.webp differ diff --git a/packages/Webkul/Admin/tests/e2e-pw/data/images/12.webp b/packages/Webkul/Admin/tests/e2e-pw/data/images/12.webp new file mode 100644 index 0000000..aae603c Binary files /dev/null and b/packages/Webkul/Admin/tests/e2e-pw/data/images/12.webp differ diff --git a/packages/Webkul/Admin/tests/e2e-pw/data/images/2.webp b/packages/Webkul/Admin/tests/e2e-pw/data/images/2.webp new file mode 100644 index 0000000..0c2d450 Binary files /dev/null and b/packages/Webkul/Admin/tests/e2e-pw/data/images/2.webp differ diff --git a/packages/Webkul/Admin/tests/e2e-pw/data/images/3.webp b/packages/Webkul/Admin/tests/e2e-pw/data/images/3.webp new file mode 100644 index 0000000..8fd0799 Binary files /dev/null and b/packages/Webkul/Admin/tests/e2e-pw/data/images/3.webp differ diff --git a/packages/Webkul/Admin/tests/e2e-pw/data/images/4.webp b/packages/Webkul/Admin/tests/e2e-pw/data/images/4.webp new file mode 100644 index 0000000..c220013 Binary files /dev/null and b/packages/Webkul/Admin/tests/e2e-pw/data/images/4.webp differ diff --git a/packages/Webkul/Admin/tests/e2e-pw/data/images/5.webp b/packages/Webkul/Admin/tests/e2e-pw/data/images/5.webp new file mode 100644 index 0000000..a775e3a Binary files /dev/null and b/packages/Webkul/Admin/tests/e2e-pw/data/images/5.webp differ diff --git a/packages/Webkul/Admin/tests/e2e-pw/data/images/6.webp b/packages/Webkul/Admin/tests/e2e-pw/data/images/6.webp new file mode 100644 index 0000000..fbd3733 Binary files /dev/null and b/packages/Webkul/Admin/tests/e2e-pw/data/images/6.webp differ diff --git a/packages/Webkul/Admin/tests/e2e-pw/data/images/7.webp b/packages/Webkul/Admin/tests/e2e-pw/data/images/7.webp new file mode 100644 index 0000000..aae603c Binary files /dev/null and b/packages/Webkul/Admin/tests/e2e-pw/data/images/7.webp differ diff --git a/packages/Webkul/Admin/tests/e2e-pw/data/images/8.webp b/packages/Webkul/Admin/tests/e2e-pw/data/images/8.webp new file mode 100644 index 0000000..933f801 Binary files /dev/null and b/packages/Webkul/Admin/tests/e2e-pw/data/images/8.webp differ diff --git a/packages/Webkul/Admin/tests/e2e-pw/data/images/9.webp b/packages/Webkul/Admin/tests/e2e-pw/data/images/9.webp new file mode 100644 index 0000000..767430e Binary files /dev/null and b/packages/Webkul/Admin/tests/e2e-pw/data/images/9.webp differ diff --git a/packages/Webkul/Admin/tests/e2e-pw/playwright.config.ts b/packages/Webkul/Admin/tests/e2e-pw/playwright.config.ts new file mode 100644 index 0000000..35d745e --- /dev/null +++ b/packages/Webkul/Admin/tests/e2e-pw/playwright.config.ts @@ -0,0 +1,56 @@ +import { defineConfig, devices } from "@playwright/test"; +import dotenv from "dotenv"; +import path from "path"; +import { fileURLToPath } from "url"; + +const __filename = fileURLToPath(import.meta.url); +const __dirname = path.dirname(__filename); + +export const TESTS_ROOT_PATH = __dirname; +export const STATE_DIR_PATH = `${ TESTS_ROOT_PATH }/.state/`; +export const ADMIN_AUTH_STATE_PATH = `${ STATE_DIR_PATH }/admin-auth.json`; + +dotenv.config({ path: path.resolve(__dirname, "../../../../../.env") }); + +export default defineConfig({ + testDir: "./tests", + + timeout: 30 * 1000, + + expect: { timeout: 20 * 1000 }, + + outputDir: "./test-results", + + fullyParallel: false, + + workers: 1, + + forbidOnly: !!process.env.CI, + + retries: 0, + + reportSlowTests: null, + + reporter: [ + [ + "html", + { + outputFolder: "./playwright-report", + }, + ], + ], + + use: { + baseURL: `${process.env.APP_URL}/`.replace(/\/+$/, "/"), + screenshot: { mode: "only-on-failure", fullPage: true }, + video: "retain-on-failure", + trace: "retain-on-failure", + }, + + projects: [ + { + name: "chromium", + use: { ...devices["Desktop Chrome"] }, + }, + ], +}); diff --git a/packages/Webkul/Admin/tests/e2e-pw/setup.ts b/packages/Webkul/Admin/tests/e2e-pw/setup.ts new file mode 100644 index 0000000..80a053e --- /dev/null +++ b/packages/Webkul/Admin/tests/e2e-pw/setup.ts @@ -0,0 +1,25 @@ +import { test as base, expect, type Page } from "@playwright/test"; + +type AdminFixtures = { + adminPage: Page; +}; + +export const test = base.extend({ + adminPage: async ({ page }, use) => { + const adminCredentials = { + email: "admin@example.com", + password: "admin123", + }; + + await page.goto("admin/login"); + await page.fill('input[name="email"]', adminCredentials.email); + await page.fill('input[name="password"]', adminCredentials.password); + await page.press('input[name="password"]', "Enter"); + + await page.waitForURL("**/admin/dashboard"); + + await use(page); + }, +}); + +export { expect }; diff --git a/packages/Webkul/Admin/tests/e2e-pw/tests/auth.spec.ts b/packages/Webkul/Admin/tests/e2e-pw/tests/auth.spec.ts new file mode 100644 index 0000000..80caec0 --- /dev/null +++ b/packages/Webkul/Admin/tests/e2e-pw/tests/auth.spec.ts @@ -0,0 +1,36 @@ +import { test, expect } from "../setup"; + +const adminCredentials = { + email: "admin@example.com", + password: "admin123", +}; + +test("should be able to login", async ({ page }) => { + /** + * Login as admin. + */ + await page.goto("admin/login"); + await page.getByPlaceholder("Email Address").click(); + await page.getByPlaceholder("Email Address").fill(adminCredentials.email); + await page.getByPlaceholder("Password").click(); + await page.getByPlaceholder("Password").fill(adminCredentials.password); + await page.getByRole("button", { name: "Sign In" }).click(); + + await expect(page.getByPlaceholder("Mega Search").first()).toBeVisible(); +}); + +test("should be able to logout", async ({ page }) => { + /** + * Login as admin. + */ + await page.goto("admin/login"); + await page.getByPlaceholder("Email Address").click(); + await page.getByPlaceholder("Email Address").fill(adminCredentials.email); + await page.getByPlaceholder("Password").click(); + await page.getByPlaceholder("Password").fill(adminCredentials.password); + await page.getByLabel("Sign In").click(); + await page.getByRole('button', { name: "E" }).click(); + await page.getByRole('link', { name: 'Sign Out' }).click(); + + await expect(page.getByPlaceholder("Password").first()).toBeVisible(); +}); diff --git a/packages/Webkul/Admin/tests/e2e-pw/tests/contacts/organization.spec.ts b/packages/Webkul/Admin/tests/e2e-pw/tests/contacts/organization.spec.ts new file mode 100644 index 0000000..0a92153 --- /dev/null +++ b/packages/Webkul/Admin/tests/e2e-pw/tests/contacts/organization.spec.ts @@ -0,0 +1,113 @@ +import { test, expect } from '../../setup'; +import {generateCompanyName, createOrganization} from "../../utils/faker" + +test.describe("organization management", () => { + test('should be able to create organization', async ({ adminPage }) => { + /** + * Create Organization. + */ + await createOrganization(adminPage); + }); + + test('should be able to edit detail of organization', async ({ adminPage }) => { + /** + * Create Organization. + */ + const companyName = await createOrganization(adminPage); + + /** + * Edit Organization detail. + */ + await adminPage.locator('div').filter({ hasText: companyName }).locator('span.icon-edit').first().click(); + await adminPage.getByRole('textbox', { name: 'City' }).click(); + await adminPage.getByRole('textbox', { name: 'City' }).fill('Gurugram'); + await adminPage.getByRole('button', { name: 'Save Organization' }).click(); + + /** + * Check detail are Edit + */ + await adminPage.locator('div').filter({ hasText: companyName }).locator('span.icon-edit').first().click(); + await expect(adminPage.getByRole('textbox', { name: 'City' })).toHaveValue('Gurugram'); + }); + + test('should be able to delete organization', async ({ adminPage }) => { + await adminPage.goto('admin/contacts/organizations'); + + /** + * Delete Organization. + */ + await adminPage.locator('div') + .locator('span.icon-delete') + .first() + .click(); + + await adminPage.getByRole('button', { name: 'Agree', exact: true }).click(); + await expect(adminPage.locator('#app')).toContainText('Success'); + }); + + test('should be able to mass delete organization', async ({ adminPage }) => { + /** + * Create Multiple Organizations. + */ + await createOrganization(adminPage); + await createOrganization(adminPage); + await createOrganization(adminPage); + await createOrganization(adminPage); + await createOrganization(adminPage); + + /** + * Check if any organization has value greater than 0. + */ + const organizationCount = await adminPage.locator('#app').getByText('1', { exact: true }).count(); + + /** + * Mass Delete Organization. + */ + await adminPage.locator('.icon-checkbox-outline').first().click(); + await adminPage.getByRole('button', { name: 'Delete' }).click(); + await adminPage.getByRole('button', { name: 'Agree', exact: true }).click(); + + if (organizationCount > 0) { + await expect(adminPage.getByText('Error')).toBeVisible(); + } + else{ + await expect(adminPage.locator('#app')).toContainText('Success'); + } + }); + + + test('should not be able to create same name organization', async ({ adminPage }) => { + /** + * Create Organization. + */ + const companyName = await createOrganization(adminPage); + await adminPage.getByRole('link', { name: 'Create Organization' }).click(); + + /** + * Fill in organization details + */ + await adminPage.getByRole('textbox', { name: 'Name *' }).fill(companyName); + await adminPage.locator('textarea[name="address\\[address\\]"]').fill('ARV Park'); + await adminPage.getByRole('combobox').selectOption('IN'); + await adminPage.locator('select[name="address\\[state\\]"]').selectOption('DL'); + await adminPage.getByRole('textbox', { name: 'City' }).fill('Delhi'); + await adminPage.getByRole('textbox', { name: 'Postcode' }).fill('123456'); + + /** + * Click to add extra details + */ + await adminPage.locator('div').filter({ hasText: /^Click to add$/ }).nth(2).click(); + await adminPage.getByRole('textbox', { name: 'Search...' }).fill('exampl'); + await adminPage.getByRole('listitem').filter({ hasText: 'Example' }).click(); + + /** + * Click on "Save Organization" + */ + await adminPage.getByRole('button', { name: 'Save Organization' }).click(); + + /** + * Expect Error message + */ + await expect(adminPage.locator('#app')).toContainText('The value has already been taken.'); + }); +}); \ No newline at end of file diff --git a/packages/Webkul/Admin/tests/e2e-pw/tests/contacts/person.spec.ts b/packages/Webkul/Admin/tests/e2e-pw/tests/contacts/person.spec.ts new file mode 100644 index 0000000..4ea1157 --- /dev/null +++ b/packages/Webkul/Admin/tests/e2e-pw/tests/contacts/person.spec.ts @@ -0,0 +1,40 @@ +import { test, expect } from "../../setup"; +import { createPerson, generateCompanyName } from "../../utils/faker"; + +test("should be able to create person", async ({ adminPage }) => { + /** + * Create person. + */ + await adminPage.goto("admin/contacts/persons"); + await createPerson(adminPage); +}); + +test("should be able to assign a company to person", async ({ adminPage }) => { + /** + * Create person. + */ + await adminPage.goto("admin/contacts/persons"); + await createPerson(adminPage); + await adminPage.locator("span.icon-edit").first().click(); + await adminPage + .locator("div") + .filter({ hasText: /^Click to add$/ }) + .nth(2) + .click(); + await adminPage.getByRole("textbox", { name: "Search..." }).click(); + await adminPage + .getByRole("textbox", { name: "Search..." }) + .fill(generateCompanyName()); + await adminPage.getByText("Add as New").click(); + await adminPage.getByRole("button", { name: "Save Person" }).click(); +}); + +test("should be able to delete person", async ({ adminPage }) => { + /** + * Delete person. + */ + await adminPage.goto("admin/contacts/persons"); + await adminPage.locator("span.icon-delete").nth(1).click(); + await adminPage.getByRole("button", { name: "Agree", exact: true }).click(); + await expect(adminPage.locator("#app")).toContainText("Success"); +}); diff --git a/packages/Webkul/Admin/tests/e2e-pw/tests/lang/lang.spec.ts b/packages/Webkul/Admin/tests/e2e-pw/tests/lang/lang.spec.ts new file mode 100644 index 0000000..b875870 --- /dev/null +++ b/packages/Webkul/Admin/tests/e2e-pw/tests/lang/lang.spec.ts @@ -0,0 +1,81 @@ +import { expect, test } from '@playwright/test'; +import { execSync } from 'child_process'; +import fs from 'fs'; +import path from 'path'; +import { fileURLToPath } from 'url'; + +// Resolve file paths relative to this test file +const __filename = fileURLToPath(import.meta.url); +const __dirname = path.dirname(__filename); + +// Absolute path to /lang directory +const LANG_DIR = path.resolve( + __dirname, + '../../../../src/Resources/lang' +); + +const BASE_LANG = 'en'; + +// Helper to extract just the keys from app.php +function getNormalizedKeys(filePath: string): string[] { + // PHP one-liner to output the array as JSON + const phpCode = `echo json_encode(include '${filePath}');`; + const json = execSync(`php -r "${phpCode.replace(/"/g, '\\"')}"`).toString(); + const obj = JSON.parse(json); + + function flattenKeys(obj: any, prefix = ''): string[] { + return Object.keys(obj).flatMap(key => { + const fullKey = prefix ? `${prefix}.${key}` : key; + if (typeof obj[key] === 'object' && obj[key] !== null) { + return flattenKeys(obj[key], fullKey); + } + return [fullKey]; + }); + } + + return flattenKeys(obj); +} +test('All language files must match number of keys and key names with English app.php', () => { + const baseFile = path.join(LANG_DIR, BASE_LANG, 'app.php'); + const baseKeys = getNormalizedKeys(baseFile); +// All locales except the base one + const locales = fs + .readdirSync(LANG_DIR) + .filter(locale => locale !== BASE_LANG && fs.existsSync(path.join(LANG_DIR, locale, 'app.php'))); + +// Array to collect any locales that have issues + let failedLocales: { locale: string; missingKeys: string[]; extraKeys: string[] }[] = []; + + for (const locale of locales) { + const filePath = path.join(LANG_DIR, locale, 'app.php'); + const keys = getNormalizedKeys(filePath); + + const missingKeys = baseKeys.filter(key => !keys.includes(key)); + const extraKeys = keys.filter(key => !baseKeys.includes(key)); + + if (missingKeys.length > 0 || extraKeys.length > 0) { + failedLocales.push({ locale, missingKeys, extraKeys }); + } + } + + if (failedLocales.length > 0) { + for (const { locale, missingKeys, extraKeys } of failedLocales) { + console.error(` ${locale}/app.php has issues:`); + + if (missingKeys.length) { + console.error(` Missing keys (${missingKeys.length}):`); + for (const key of missingKeys) console.error(` - ${key}`); + } + + if (extraKeys.length) { + console.error(` Extra keys (${extraKeys.length}):`); + for (const key of extraKeys) console.error(` + ${key}`); + } + } + + // Fail the test + expect(failedLocales).toEqual([]); + } else { + console.log('All language files have matching keys and counts with en/app.php'); + } +}); diff --git a/packages/Webkul/Admin/tests/e2e-pw/tests/lead.spec.ts b/packages/Webkul/Admin/tests/e2e-pw/tests/lead.spec.ts new file mode 100644 index 0000000..6a8a5f6 --- /dev/null +++ b/packages/Webkul/Admin/tests/e2e-pw/tests/lead.spec.ts @@ -0,0 +1,235 @@ +import { test, expect } from "../setup"; +import fs from "fs"; +import { generateName, getRandomDateTime, generateDescription, generateDate, generateEmail, generatePhoneNumber,generateEmailSubject } from '../utils/faker'; + +async function generateLead(adminPage) { + /** + * Go to the lead listing page. + */ + await adminPage.goto("admin/leads"); + await adminPage.getByRole('link', { name: 'Create Lead' }).click(); + + /** + * Fill the lead form. + */ + const leadTitle = generateName(); + const leadDescription = generateDescription(); + const leadDate = generateDate(); + const leadEmail = generateEmail(); + const leadPhoneNumber = generatePhoneNumber(); + + await adminPage.fill('input[name="title"]', leadTitle); + await adminPage.fill('textarea[name="description"]', leadDescription); + await adminPage.locator('select[name="lead_source_id"]').selectOption("1"); + await adminPage.fill('input[name="expected_close_date"]', leadDate); + await adminPage.locator('select[name="lead_type_id"]').selectOption("1"); + await adminPage.locator('select[name="user_id"]').selectOption("1"); + await adminPage.fill('input[name="lead_value"]', '1000'); + + /** + * Add a new person. + */ + await adminPage.locator('div').filter({ hasText: /^Click to Add$/ }).nth(1).click(); + await adminPage.getByRole('textbox', { name: 'Search...' }).fill(leadTitle); + await adminPage.getByText('Add as New').click(); + + await adminPage.fill('input[name="person[emails][0][value]"]', leadEmail); + await adminPage.fill('input[name="person[contact_numbers][0][value]"]', leadPhoneNumber); + + /** + * Associate an organization. + */ + await adminPage.locator('div').filter({ hasText: /^Click to add$/ }).nth(2).click(); + await adminPage.getByRole('textbox', { name: 'Search...' }).fill(leadTitle); + await adminPage.getByText('Add as New').click(); + + /** + * Save the lead. + */ + await adminPage.getByRole('button', { name: 'Save' }).click(); + + /** + * Assertion to confirm lead creation. + */ + await expect(adminPage.getByText('Success', { exact: true })).toBeVisible(); + + return { leadTitle, leadDescription, leadDate, leadEmail, leadPhoneNumber }; +} + +function generateFile(fileName, content) { + fs.writeFileSync(fileName, content); + return fileName; +} + +test.describe("lead management", () => { + + test("should create a new lead", async ({ adminPage }) => { + /** + * Create a new lead. + */ + await generateLead(adminPage); + }); + + test("should able to update lead", async ({ adminPage }) => { + /** + * Create a new lead. + */ + const lead = await generateLead(adminPage); + + /** + * Update the lead. + */ + await adminPage.getByRole('link', { name: lead.leadTitle }).click(); + const page1Promise = adminPage.waitForEvent('popup'); + await adminPage.getByRole('link', { name: '' }).first().click(); + const page1 = await page1Promise; + await page1.fill('textarea[name="description"]', generateDescription()); + await page1.fill('input[name="title"]', generateName()); + await page1.getByLabel('Source').selectOption('3'); + await page1.fill('input[name="lead_value"]', '30000'); + await page1.getByRole('button', { name: 'Save' }).click(); + await page1.getByText('Success', { exact: true }).click(); + }); + + test("should able to delete lead", async ({ adminPage }) => { + /** + * Create a new lead. + */ + const lead = await generateLead(adminPage); + + /** + * Delete the lead. + */ + await adminPage.getByRole('link', { name: '' }).click(); + await adminPage.locator('div:nth-child(4) > .flex > span:nth-child(2)').click(); + await adminPage.getByRole('button', { name: 'Agree', exact: true }).click(); + await expect(adminPage.getByText('Success', { exact: true })).toBeVisible(); + await expect(adminPage.locator('#app')).toContainText('Lead deleted successfully.'); + }); + + test("should sent a mail", async ({ adminPage }) => { + /** + * Create a new lead. + */ + const lead = await generateLead(adminPage); + + /** + * fill mail detail. + */ + await adminPage.getByRole('link', { name: lead.leadTitle}).click(); + await adminPage.getByRole('button', { name: ' Mail' }).click(); + await adminPage.fill('input[name="temp-reply_to"]', generateEmail()); + await adminPage.fill('input[name="subject"]', generateEmailSubject()); + await adminPage.fill('textarea[name="reply"]', generateDescription()); + + /** + * Sending mail and closing the modal. + */ + await adminPage.getByRole('button', { name: 'Send' }).click(); + + await expect(adminPage.getByText('Email sent successfully.')).toBeVisible(); + }); + + test("should able to upload file in lead", async ({ adminPage }) => { + /** + * Create a new lead. + */ + const lead = await generateLead(adminPage); + + /** + * fill the file detail or upload a file. + */ + await adminPage.getByRole('link', { name: lead.leadTitle}).click(); + await adminPage.getByRole('button', { name: ' File' }).click(); + await adminPage.locator('input[name="title"]').fill(lead.leadTitle); + await adminPage.locator('textarea[name="comment"]').fill(generateDescription()); + await adminPage.locator('input[name="name"]').fill(generateName()); + await adminPage.locator('#file').setInputFiles(generateFile('example.txt', 'Hello, this is a generated file!')); + await adminPage.getByRole('button', { name: 'Save File' }).click(); + }); + + test("should able to write a note in lead", async ({ adminPage }) => { + /** + * Create a new lead. + */ + const lead = await generateLead(adminPage); + + /** + * write a notes + */ + await adminPage.getByRole('link', { name: lead.leadTitle}).click(); + await adminPage.getByRole('button', { name: ' Note' }).click(); + await adminPage.locator('textarea[name="comment"]').fill(generateDescription()); + await adminPage.getByRole('button', { name: 'Save Note' }).click(); + }); + + test("should able to add call activity in lead", async ({ adminPage }) => { + /** + * Create a new lead. + */ + const lead = await generateLead(adminPage); + + /** + * write a call activity detail + */ + await adminPage.getByRole('link', { name: lead.leadTitle}).click(); + await adminPage.getByRole('button', { name: ' Activity' }).click(); + await adminPage.getByRole('heading', { name: 'Add Activity - Call ' }).locator('span').click(); + await adminPage.getByText('Call', { exact: true }).click(); + await adminPage.locator('input[name="title"]').fill(lead.leadTitle); + await adminPage.locator('textarea[name="comment"]').fill(generateDescription()); + await adminPage.locator('input[name="schedule_from"]').click(); + await adminPage.locator('input[name="schedule_from"]').fill(getRandomDateTime()); + await adminPage.locator('input[name="schedule_to"]').click(); + await adminPage.locator('input[name="schedule_to"]').fill(getRandomDateTime()); + await adminPage.locator('input[name="location"]').fill('call'); + await adminPage.getByRole('button', { name: 'Save Activity' }).click(); + + }); + + test("should able to add meeting activity in lead", async ({ adminPage }) => { + /** + * Create a new lead. + */ + const lead = await generateLead(adminPage); + + /** + * write a call activity detail + */ + await adminPage.getByRole('link', { name: lead.leadTitle}).click(); + await adminPage.getByRole('button', { name: ' Activity' }).click(); + await adminPage.getByRole('heading', { name: 'Add Activity' }).locator('span').click(); + await adminPage.getByText('Meeting', { exact: true }).click(); + await adminPage.locator('input[name="title"]').fill(lead.leadTitle); + await adminPage.locator('textarea[name="comment"]').fill(generateDescription()); + await adminPage.locator('input[name="schedule_from"]').click(); + await adminPage.locator('input[name="schedule_from"]').fill(getRandomDateTime()); + await adminPage.locator('input[name="schedule_to"]').click(); + await adminPage.locator('input[name="schedule_to"]').fill(getRandomDateTime()); + await adminPage.locator('input[name="location"]').fill('Google meet'); + await adminPage.getByRole('button', { name: 'Save Activity' }).click(); + }); + + test("should able to add lunch activity in lead", async ({ adminPage }) => { + /** + * Create a new lead. + */ + const lead = await generateLead(adminPage); + + /** + * write a call activity detail + */ + await adminPage.getByRole('link', { name: lead.leadTitle}).click(); + await adminPage.getByRole('button', { name: ' Activity' }).click(); + await adminPage.getByRole('heading', { name: 'Add Activity' }).locator('span').click(); + await adminPage.getByText('Lunch', { exact: true }).click(); + await adminPage.locator('input[name="title"]').fill(lead.leadTitle); + await adminPage.locator('textarea[name="comment"]').fill(generateDescription()); + await adminPage.locator('input[name="schedule_from"]').click(); + await adminPage.locator('input[name="schedule_from"]').fill(getRandomDateTime()); + await adminPage.locator('input[name="schedule_to"]').click(); + await adminPage.locator('input[name="schedule_to"]').fill(getRandomDateTime()); + await adminPage.locator('input[name="location"]').fill('Restraunt'); + await adminPage.getByRole('button', { name: 'Save Activity' }).click(); + }); +}); \ No newline at end of file diff --git a/packages/Webkul/Admin/tests/e2e-pw/tests/mail/draft.spec.ts b/packages/Webkul/Admin/tests/e2e-pw/tests/mail/draft.spec.ts new file mode 100644 index 0000000..c01c9a6 --- /dev/null +++ b/packages/Webkul/Admin/tests/e2e-pw/tests/mail/draft.spec.ts @@ -0,0 +1 @@ +import { test, expect } from "../../setup"; diff --git a/packages/Webkul/Admin/tests/e2e-pw/tests/mail/inbox.spec.ts b/packages/Webkul/Admin/tests/e2e-pw/tests/mail/inbox.spec.ts new file mode 100644 index 0000000..7cf2b2f --- /dev/null +++ b/packages/Webkul/Admin/tests/e2e-pw/tests/mail/inbox.spec.ts @@ -0,0 +1,69 @@ +import { test, expect } from '../../setup'; +import { generateEmail, generateEmailSubject, generateDescription } from '../../utils/faker'; + +async function composeMail(adminPage, ccMail = false, bccMail = false) { + /** + * Reaching to the mail listing page. + */ + await adminPage.goto("admin/mail/inbox"); + + /** + * Opening compose mail in modal. + */ + await adminPage.getByRole('button', { name: 'Compose Mail' }).click(); + await adminPage.fill('input[name="temp-reply_to"]', generateEmail()); + await adminPage.fill('input[name="subject"]', generateEmailSubject()); + const frameElementHandle = await adminPage.waitForSelector( + "iframe.tox-edit-area__iframe" + ); + + const frame = await frameElementHandle.contentFrame(); + + await frame.waitForSelector("body"); + await frame.fill("body", generateDescription()); + + /** + * Sending mail and closing the modal. + */ + await adminPage.getByRole("button", { name: "Send" }).click(); + + await expect(adminPage.getByText("Email sent successfully.")).toBeVisible(); +} + +test.describe("mail management", () => { + /** + * Should be able to compose a mail. + */ + test("should compose a mail", async ({ adminPage }) => { + await composeMail(adminPage); + }); + + /** + * Should be able to compose a mail with CC. + */ + test("should compose a mail with CC", async ({ adminPage }) => { + const ccMail = true; + + await composeMail(adminPage, ccMail); + }); + + /** + * Should be able to compose a mail with BCC. + */ + test("should compose a mail with BCC", async ({ adminPage }) => { + const bccMail = true; + + await composeMail(adminPage, bccMail); + }); + + /** + * Should be able to compose a mail with CC & BCC. + */ + test("should compose a mail with CC & BCC", async ({ adminPage }) => { + const ccMail = true; + + const bccMail = true; + + await composeMail(adminPage, ccMail, bccMail); + }); +}); diff --git a/packages/Webkul/Admin/tests/e2e-pw/tests/mail/outbox.spec.ts b/packages/Webkul/Admin/tests/e2e-pw/tests/mail/outbox.spec.ts new file mode 100644 index 0000000..c01c9a6 --- /dev/null +++ b/packages/Webkul/Admin/tests/e2e-pw/tests/mail/outbox.spec.ts @@ -0,0 +1 @@ +import { test, expect } from "../../setup"; diff --git a/packages/Webkul/Admin/tests/e2e-pw/tests/mail/sent.spec.ts b/packages/Webkul/Admin/tests/e2e-pw/tests/mail/sent.spec.ts new file mode 100644 index 0000000..c01c9a6 --- /dev/null +++ b/packages/Webkul/Admin/tests/e2e-pw/tests/mail/sent.spec.ts @@ -0,0 +1 @@ +import { test, expect } from "../../setup"; diff --git a/packages/Webkul/Admin/tests/e2e-pw/tests/mail/trash.spec.ts b/packages/Webkul/Admin/tests/e2e-pw/tests/mail/trash.spec.ts new file mode 100644 index 0000000..c01c9a6 --- /dev/null +++ b/packages/Webkul/Admin/tests/e2e-pw/tests/mail/trash.spec.ts @@ -0,0 +1 @@ +import { test, expect } from "../../setup"; diff --git a/packages/Webkul/Admin/tests/e2e-pw/tests/product.spec.ts b/packages/Webkul/Admin/tests/e2e-pw/tests/product.spec.ts new file mode 100644 index 0000000..f75a5a8 --- /dev/null +++ b/packages/Webkul/Admin/tests/e2e-pw/tests/product.spec.ts @@ -0,0 +1,102 @@ +import { test, expect } from "../setup"; +import { generateName, generateSKU, generateDescription } from "../utils/faker"; + +test.describe("product management", () => { + test("should create a product", async ({ adminPage }) => { + /** + * Go to the product listing page. + */ + await adminPage.goto("admin/products"); + + /** + * Create Product. + */ + await adminPage.getByRole("link", { name: "Create Product" }).click(); + + /** + * Fill the product form. + */ + const name = generateName(); + const description = generateDescription(); + await adminPage.waitForSelector('input[name="name"]', { state: 'visible' }); + await adminPage.getByRole('textbox', { name: 'Name *' }).click(); + await adminPage.locator('#name').clear(); + await adminPage.getByRole('textbox', { name: 'Name *' }).fill(name); + await adminPage.locator('textarea[name="description"]').clear(); + await adminPage + .locator('textarea[name="description"]') + .type(description); + await adminPage.fill('input[name="sku"]', generateSKU()); + await adminPage.waitForSelector('input[name="price"]', { + state: "visible", + }); + await adminPage.fill('input[name="price"]', "100"); + + await adminPage.waitForSelector('input[name="quantity"]', { + state: "visible", + }); + await adminPage.fill('input[name="quantity"]', "50"); + + /** + * Save Product. + */ + await adminPage.getByRole("button", { name: "Save Products" }).click(); + + /** + * sucess message appear. + */ + await expect(adminPage.locator("#app")).toContainText( + "Product created successfully." + ); + }); + + test("should edit a product", async ({ adminPage }) => { + /** + * Go to the product listing page. + */ + await adminPage.goto("admin/products"); + await adminPage.waitForSelector("a.primary-button", { + state: "visible", + }); + + /** + * Clicking on the edit icon. + */ + await adminPage.locator("span.icon-edit").first().click(); + await adminPage.waitForSelector('form[action*="/admin/products/edit"]'); + + /** + * Edit the product Detail + */ + await adminPage.fill('input[name="name"]', generateName()); + await adminPage.fill('input[name="price"]', "1000"); + await adminPage.fill('input[name="quantity"]', "500"); + await adminPage.click('button:has-text("Save Products")'); + await expect(adminPage.locator("#app")).toContainText( + "Product updated successfully." ); + }); + + test("should delete a product", async ({ adminPage }) => { + /** + * Go to the product listing page. + */ + await adminPage.goto("admin/products"); + await adminPage.waitForSelector("a.primary-button", { + state: "visible", + }); + + /** + * Clicking on the delete icon. + */ + await adminPage.waitForSelector("span.cursor-pointer.icon-delete", { + state: "visible", + }); + await adminPage.locator("span.icon-delete").first().click(); + await adminPage.click( + "button.transparent-button + button.primary-button:visible" + ); + await expect(adminPage.locator("#app")).toContainText( + "Product deleted successfully." + ); + }); +}); diff --git a/packages/Webkul/Admin/tests/e2e-pw/tests/quotes.spec.ts b/packages/Webkul/Admin/tests/e2e-pw/tests/quotes.spec.ts new file mode 100644 index 0000000..bad162f --- /dev/null +++ b/packages/Webkul/Admin/tests/e2e-pw/tests/quotes.spec.ts @@ -0,0 +1,103 @@ +import { test, expect } from "../setup"; +import { + generateEmailSubject, + createPerson, + generateDate, + generateName, +} from "../utils/faker"; + +test.describe("quotes management", () => { + test("should create a quotes", async ({ adminPage }) => { + /** + * Create person. + */ + await adminPage.goto("admin/contacts/persons"); + const Person = await createPerson(adminPage); + + /** + * Create quote. + */ + await adminPage.goto("admin/quotes"); + await adminPage.getByRole("link", { name: "Create Quote" }).click(); + await adminPage.getByRole("textbox", { name: "Subject *" }).click(); + await adminPage + .getByRole("textbox", { name: "Subject *" }) + .fill(generateEmailSubject()); + await adminPage.getByRole("textbox", { name: "Description" }).click(); + await adminPage + .getByRole("textbox", { name: "Description" }) + .fill(generateEmailSubject()); + await adminPage.getByLabel("Sales Owner").selectOption("1"); + await adminPage.getByRole("textbox", { name: "Expired At *" }).click(); + await adminPage + .getByRole("textbox", { name: "Expired At *" }) + .fill(generateDate()); + await adminPage.locator(".relative > div > .relative").first().click(); + await adminPage.getByRole("textbox", { name: "Search..." }).click(); + await adminPage + .getByRole("textbox", { name: "Search..." }) + .fill(Person.Name); + await adminPage + .getByRole("listitem") + .filter({ hasText: Person.Name }) + .click(); + + /** + * Fill billing address. + */ + await adminPage + .locator('textarea[name="billing_address\\[address\\]"]') + .click(); + await adminPage + .locator('textarea[name="billing_address\\[address\\]"]') + .fill("ARV Park"); + await adminPage + .locator('select[name="billing_address\\[country\\]"]') + .selectOption("IN"); + await adminPage + .locator('select[name="billing_address\\[state\\]"]') + .selectOption("UP"); + await adminPage + .locator('input[name="billing_address\\[city\\]"]') + .click(); + await adminPage + .locator('input[name="billing_address\\[city\\]"]') + .fill("Noida"); + await adminPage + .locator('input[name="billing_address\\[postcode\\]"]') + .click(); + await adminPage + .locator('input[name="billing_address\\[postcode\\]"]') + .fill("201301"); + + /** + * Fill shipping address. + */ + await adminPage + .locator('textarea[name="shipping_address\\[address\\]"]') + .click(); + await adminPage + .locator('textarea[name="shipping_address\\[address\\]"]') + .fill("ARV Park"); + await adminPage + .locator('select[name="shipping_address\\[country\\]"]') + .selectOption("IN"); + await adminPage + .locator('select[name="shipping_address\\[state\\]"]') + .selectOption("UP"); + await adminPage + .locator('input[name="shipping_address\\[city\\]"]') + .click(); + await adminPage + .locator('input[name="shipping_address\\[city\\]"]') + .fill("Noida"); + await adminPage + .locator('input[name="shipping_address\\[postcode\\]"]') + .click(); + await adminPage + .locator('input[name="shipping_address\\[postcode\\]"]') + .fill("201301"); + await adminPage.getByRole("button", { name: "Save Quote" }).click(); + await expect(adminPage.locator("#app")).toContainText("Success"); + }); +}); diff --git a/packages/Webkul/Admin/tests/e2e-pw/tests/settings/automation/events.spec.ts b/packages/Webkul/Admin/tests/e2e-pw/tests/settings/automation/events.spec.ts new file mode 100644 index 0000000..5026aa4 --- /dev/null +++ b/packages/Webkul/Admin/tests/e2e-pw/tests/settings/automation/events.spec.ts @@ -0,0 +1,94 @@ +import { test, expect } from "../../../setup"; +import { generateFullName, generateDescription, generateDate } from "../../../utils/faker"; +import { confirmModal } from "../../../utils/components"; + +test.describe("event management", () => { + test("should create a event", async ({ adminPage }) => { + /** + * Reaching to the events listing page. + */ + await adminPage.goto("admin/settings/marketing/events"); + + /** + * Opening create event form in modal. + */ + await adminPage.getByRole("button", { name: "Create Event" }).click(); + + /** + * Filling the form with event details. + */ + await adminPage + .locator('input[name="name"]') + .fill(generateFullName()); + await adminPage + .locator('textarea[name="description"]') + .fill(generateDescription()); + await adminPage + .locator('input[name="date"]') + .fill(generateDate()); + await adminPage.getByRole('textbox', { name: 'Date *' }).press('Enter'); + + /** + * Save event and close the modal. + */ + await adminPage.getByRole('button', { name: 'Save Event' }).click(); + + await expect( + adminPage.getByText("Event created successfully.") + ).toBeVisible(); + }); + + test("should edit a event", async ({ adminPage }) => { + /** + * Reaching to the events listing page. + */ + await adminPage.goto("admin/settings/marketing/events"); + + /** + * Clicking on the edit button for the first event opens the modal. + */ + await adminPage.locator('.row > div:nth-child(6) > a').first().click(); + + /** + * Fill the form with the event details. + */ + await adminPage + .locator('input[name="name"]') + .fill(generateFullName()); + await adminPage + .locator('textarea[name="description"]') + .fill(generateDescription()); + await adminPage + .locator('input[name="date"]') + .fill(generateDate()); + + /** + * Saving event and closing the modal. + */ + await adminPage.getByRole('button', { name: 'Save Event' }).click(); + await expect( + adminPage.getByText("Event updated successfully.") + ).toBeVisible(); + }); + + test("should delete a event", async ({ adminPage }) => { + /** + * Reaching to the event listing page. + */ + await adminPage.goto("admin/settings/marketing/events"); + + /** + * Delete the first event. + */ + await adminPage.locator('div:nth-child(6) > a:nth-child(2)').first().click(); + + /** + * Delete confirmation modal. + */ + await adminPage.getByRole('button', { name: 'Agree', exact: true }).click(); + + await expect( + adminPage.getByText("Event deleted successfully.") + ).toBeVisible(); + }); +}); diff --git a/packages/Webkul/Admin/tests/e2e-pw/tests/settings/lead/types.spec.ts b/packages/Webkul/Admin/tests/e2e-pw/tests/settings/lead/types.spec.ts new file mode 100644 index 0000000..2ff2971 --- /dev/null +++ b/packages/Webkul/Admin/tests/e2e-pw/tests/settings/lead/types.spec.ts @@ -0,0 +1,90 @@ +import { test, expect } from "../../../setup"; +import { generateFullName } from "../../../utils/faker"; +import { confirmModal } from "../../../utils/components"; + +test.describe("type management", () => { + test("should create a type", async ({ adminPage }) => { + /** + * Reaching to the types listing page. + */ + await adminPage.goto("admin/settings/types"); + + /** + * Opening create type form in modal. + */ + await adminPage.getByRole("button", { name: "Create Type" }).click(); + + /** + * Filling the form with type details. + */ + await adminPage + .locator('input[name="name"]') + .fill(generateFullName()); + + /** + * Save type and close the modal. + */ + await adminPage.getByRole("button", { name: "Save Type" }).click(); + + await expect( + adminPage.getByText("Type created successfully.") + ).toBeVisible(); + }); + + test("should edit a type", async ({ adminPage }) => { + /** + * Generating new name and email for the type. + */ + const updatedName = generateFullName(); + + /** + * Reaching to the types listing page. + */ + await adminPage.goto("admin/settings/types"); + + /** + * Clicking on the edit button for the first type opens the modal. + */ + await adminPage.waitForSelector("span.cursor-pointer.icon-edit", { + state: "visible", + }); + const iconEdit = await adminPage.$$("span.cursor-pointer.icon-edit"); + await iconEdit[0].click(); + + await adminPage.locator('input[name="name"]').fill(updatedName); + + /** + * Saving type and closing the modal. + */ + await adminPage.getByRole("button", { name: "Save Type" }).click(); + + await expect( + adminPage.getByText("Type updated successfully.") + ).toBeVisible(); + }); + + test("should delete a type", async ({ adminPage }) => { + /** + * Reaching to the type listing page. + */ + await adminPage.goto("admin/settings/types"); + + /** + * Delete the first type. + */ + await adminPage.waitForSelector("span.cursor-pointer.icon-delete"); + const iconDelete = await adminPage.$$( + "span.cursor-pointer.icon-delete" + ); + await iconDelete[0].click(); + + /** + * Delete confirmation modal. + */ + await confirmModal("Are you sure", adminPage); + + await expect( + adminPage.getByText("Type deleted successfully.") + ).toBeVisible(); + }); +}); diff --git a/packages/Webkul/Admin/tests/e2e-pw/tests/settings/user/groups.spec.ts b/packages/Webkul/Admin/tests/e2e-pw/tests/settings/user/groups.spec.ts new file mode 100644 index 0000000..af8ab0a --- /dev/null +++ b/packages/Webkul/Admin/tests/e2e-pw/tests/settings/user/groups.spec.ts @@ -0,0 +1,36 @@ +import { test, expect } from "../../../setup"; +import { generateFullName, generateDescription } from "../../../utils/faker"; + +test.describe("group management", () => { + test("should create a group", async ({ adminPage }) => { + /** + * Reaching to the group listing page. + */ + await adminPage.goto("admin/settings/groups"); + + /** + * Opening create group form in modal. + */ + await adminPage.getByRole("button", { name: "Create group" }).click(); + + + /** + * Filling the form with group details. + */ + await adminPage + .locator('input[name="name"]') + .fill(generateFullName()); + await adminPage + .locator('textarea[name="description"]') + .fill(generateDescription(240)); + + /** + * Save group and close the modal. + */ + await adminPage.getByRole("button", { name: "Save Group" }).click(); + + await expect( + adminPage.getByText("Group created successfully.") + ).toBeVisible(); + }); +}); diff --git a/packages/Webkul/Admin/tests/e2e-pw/tests/settings/user/users.spec.ts b/packages/Webkul/Admin/tests/e2e-pw/tests/settings/user/users.spec.ts new file mode 100644 index 0000000..dd38ecd --- /dev/null +++ b/packages/Webkul/Admin/tests/e2e-pw/tests/settings/user/users.spec.ts @@ -0,0 +1,227 @@ +import { test, expect } from "../../../setup"; +import { + generateFullName, + generateEmail, + generateDescription, +} from "../../../utils/faker"; +import { confirmModal } from "../../../utils/components"; + +async function createGroup(adminPage) { + /** + * Navigate to the group listing page. + */ + await adminPage.goto("admin/settings/groups"); + + /** + * Open the create group form in modal. + */ + await adminPage.getByRole("button", { name: "Create group" }).click(); + + /** + * Generate group name and fill in the form with group details. + */ + const groupName = generateFullName(); + await adminPage.locator('input[name="name"]').fill(groupName); + await adminPage + .locator('textarea[name="description"]') + .fill(generateDescription(240)); + + /** + * Save the group and close the modal. + */ + await adminPage.getByRole("button", { name: "Save Group" }).click(); + + /** + * Validate successful creation. + */ + await expect( + adminPage.getByText("Group created successfully.") + ).toBeVisible(); + + return { groupName }; +} + +test.describe("user management", () => { + test("should create a user with global permission", async ({ adminPage }) => { + /** + * Reaching to the user listing page. + */ + await adminPage.goto("admin/settings/users"); + + /** + * Opening create user form in modal. + */ + await adminPage.getByRole("button", { name: "Create User" }).click(); + + /** + * Filling the form with user details. + */ + await adminPage.locator('input[name="name"]').fill(generateFullName()); + await adminPage.locator('input[name="email"]').fill(generateEmail()); + await adminPage.locator('input[name="password"]').fill("admin123"); + await adminPage + .locator('input[name="confirm_password"]') + .fill("admin123"); + await adminPage.locator('select[name="role_id"]').selectOption("1"); + await adminPage + .locator('select[name="view_permission"]') + .selectOption("global"); + + /** + * Clicking on the status toggler to make the user active. + */ + await adminPage.click('label[for="status"]'); + + /** + * Save user and close the modal. + */ + await adminPage.getByRole("button", { name: "Save User" }).click(); + + await expect( + adminPage.getByText("User created successfully.") + ).toBeVisible(); + }); + + test("should create a user with group permission", async ({ adminPage }) => { + /** + * Creating a group to assign to the user. + */ + const name = await createGroup(adminPage); + + /** + * Reaching to the user listing page. + */ + await adminPage.goto("admin/settings/users"); + + /** + * Opening create user form in modal. + */ + await adminPage.getByRole("button", { name: "Create User" }).click(); + + /** + * Filling the form with user details. + */ + await adminPage.locator('input[name="name"]').fill(generateFullName()); + await adminPage.locator('input[name="email"]').fill(generateEmail()); + await adminPage.locator('input[name="password"]').fill("admin123"); + await adminPage + .locator('input[name="confirm_password"]') + .fill("admin123"); + await adminPage.locator('select[name="role_id"]').selectOption("1"); + await adminPage + .locator('select[name="view_permission"]') + .selectOption("group"); + await adminPage.getByRole('listbox').selectOption({ label: name.groupName }); + + /** + * Clicking on the status toggler to make the user active. + */ + await adminPage.click('label[for="status"]'); + + /** + * Save user and close the modal. + */ + await adminPage.getByRole("button", { name: "Save User" }).click(); + + await expect( + adminPage.getByText("User created successfully.") + ).toBeVisible(); + }); + + test("should create a user with individual permission", async ({ adminPage }) => { + /** + * Reaching to the user listing page. + */ + await adminPage.goto("admin/settings/users"); + + /** + * Opening create user form in modal. + */ + await adminPage.getByRole("button", { name: "Create User" }).click(); + + /** + * Filling the form with user details. + */ + await adminPage.locator('input[name="name"]').fill(generateFullName()); + await adminPage.locator('input[name="email"]').fill(generateEmail()); + await adminPage.locator('input[name="password"]').fill("admin123"); + await adminPage + .locator('input[name="confirm_password"]') + .fill("admin123"); + await adminPage.locator('select[name="role_id"]').selectOption("1"); + await adminPage + .locator('select[name="view_permission"]') + .selectOption("individual"); + + /** + * Clicking on the status toggler to make the user active. + */ + await adminPage.click('label[for="status"]'); + + /** + * Save user and close the modal. + */ + await adminPage.getByRole("button", { name: "Save User" }).click(); + + await expect( + adminPage.getByText("User created successfully.") + ).toBeVisible(); + }); + + test("should edit a users", async ({ adminPage }) => { + /** + * Generating new name and email for the user. + */ + const updatedName = generateFullName(); + const updatedEmail = generateEmail(); + + /** + * Reaching to the user listing page. + */ + await adminPage.goto("admin/settings/users"); + + /** + * Clicking on the edit button for the first user opens the modal. + */ + await adminPage.waitForSelector("span.cursor-pointer.icon-edit", { + state: "visible", + }); + const iconEdit = await adminPage.$$("span.cursor-pointer.icon-edit"); + await iconEdit[0].click(); + + await adminPage.locator('input[name="name"]').fill(updatedName); + await adminPage.locator('input[name="email"]').fill(updatedEmail); + + /** + * Saving user and closing the modal. + */ + await adminPage.getByRole("button", { name: "Save User" }).click(); + await expect(adminPage.locator('#app')).toContainText("User updated successfully."); + await expect(adminPage.locator("#app")).toContainText(updatedName); + await expect( + adminPage.getByRole("paragraph").filter({ hasText: updatedEmail }) + ).toBeVisible(); + }); + + test("should delete a user", async ({ adminPage }) => { + /** + * Reaching to the user listing page. + */ + await adminPage.goto("admin/settings/users"); + + /** + * Delete the first user. + */ + await adminPage.waitForSelector("span.cursor-pointer.icon-delete"); + const iconDelete = await adminPage.$$( + "span.cursor-pointer.icon-delete" + ); + await iconDelete[0].click(); + + /** + * Delete confirmation modal. + */ + await confirmModal("Are you sure", adminPage); + await expect(adminPage.locator('#app')).toContainText("User deleted successfully."); + }); +}); diff --git a/packages/Webkul/Admin/tests/e2e-pw/tests/settings/warehouses/warehouse.spec.ts b/packages/Webkul/Admin/tests/e2e-pw/tests/settings/warehouses/warehouse.spec.ts new file mode 100644 index 0000000..cfad34b --- /dev/null +++ b/packages/Webkul/Admin/tests/e2e-pw/tests/settings/warehouses/warehouse.spec.ts @@ -0,0 +1,57 @@ +import { test, expect } from "../../../setup"; +import { confirmModal } from "../../../utils/components"; + +test.describe("warehouse management", () => { + test("should create a warehouse", async ({ adminPage }) => { + /** + * Reaching to the warehouses listing page. + */ + await adminPage.goto("admin/settings/warehouses"); + + // Add code for creating a warehouse. + + }); + + test("should edit a warehouse", async ({ adminPage }) => { + /** + * Reaching to the warehouses listing page. + */ + await adminPage.goto("admin/settings/warehouses"); + + /** + * Clicking on the edit button for the first warehouse opens the modal. + */ + // await adminPage.waitForSelector("span.cursor-pointer.icon-edit", { + // state: "visible", + // }); + // const iconEdit = await adminPage.$$("span.cursor-pointer.icon-edit"); + // await iconEdit[0].click(); + + // Add code to edit the warehouse. + }); + + test("should delete a warehouse", async ({ adminPage }) => { + /** + * Reaching to the warehouse listing page. + */ + await adminPage.goto("admin/settings/warehouses"); + + /** + * Delete the first warehouse. + */ + // await adminPage.waitForSelector("span.cursor-pointer.icon-delete"); + // const iconDelete = await adminPage.$$( + // "span.cursor-pointer.icon-delete" + // ); + // await iconDelete[0].click(); + + // /** + // * Delete confirmation modal. + // */ + // await confirmModal("Are you sure", adminPage); + + // await expect( + // adminPage.getByText("Warehouse deleted successfully.") + // ).toBeVisible(); + }); +}); \ No newline at end of file diff --git a/packages/Webkul/Admin/tests/e2e-pw/utils/components.ts b/packages/Webkul/Admin/tests/e2e-pw/utils/components.ts new file mode 100644 index 0000000..bbae3b3 --- /dev/null +++ b/packages/Webkul/Admin/tests/e2e-pw/utils/components.ts @@ -0,0 +1,18 @@ +/** + * Confirm the modal dialog. + */ +export function confirmModal(message, page) { + return new Promise(async (resolve, reject) => { + await page.waitForSelector("text=" + message); + const agreeButton = await page.locator( + 'button.primary-button:has-text("Agree")' + ); + + if (await agreeButton.isVisible()) { + await agreeButton.click(); + resolve(true); + } else { + reject("Agree button not found or not visible."); + } + }); +} \ No newline at end of file diff --git a/packages/Webkul/Admin/tests/e2e-pw/utils/faker.ts b/packages/Webkul/Admin/tests/e2e-pw/utils/faker.ts new file mode 100644 index 0000000..95bd77a --- /dev/null +++ b/packages/Webkul/Admin/tests/e2e-pw/utils/faker.ts @@ -0,0 +1,471 @@ +import fs from "fs"; +import path from "path"; +import { fileURLToPath } from "url"; + +const __filename = fileURLToPath(import.meta.url); +const __dirname = path.dirname(__filename); + +const usedNames = new Set(); +const usedEmails = new Set(); +const usedNumbers = new Set(); +const usedSlugs = new Set(); + +/** + * Generate a random name. + */ +function generateName() { + const adjectives = [ + "Cool", "Smart", "Fast", "Sleek", "Innovative", "Shiny", "Bold", + "Elegant", "Epic", "Mystic", "Brilliant", "Luminous", "Radiant", + "Majestic", "Vivid", "Glowing", "Dynamic", "Fearless", "Silent", + "Electric", "Golden", "Blazing", "Timeless", "Noble", "Eternal" + ]; + + const nouns = [ + "Star", "Vision", "Echo", "Spark", "Horizon", "Nova", "Shadow", + "Wave", "Pulse", "Vortex", "Zenith", "Element", "Flare", "Comet", + "Galaxy", "Ember", "Crystal", "Sky", "Stone", "Blaze", "Eclipse", + "Storm", "Orbit", "Phantom", "Mirage" + ]; + + let name = ""; + + do { + const adj = adjectives[Math.floor(Math.random() * adjectives.length)]; + const noun = nouns[Math.floor(Math.random() * nouns.length)]; + + name = `${adj} ${noun}`; + } while (usedNames.has(name)); + + usedNames.add(name); + + return name; +} + +/** + * Generate the first Name. + */ +function generateFirstName() { + const firstNames = [ + "James", + "Emma", + "Liam", + "Olivia", + "Noah", + "Ava", + "William", + "Sophia", + "Benjamin", + "Isabella", + "Lucas", + "Mia", + ]; + + return firstNames[Math.floor(Math.random() * firstNames.length)]; +} + +/** + * Generate the last name. + */ +function generateLastName() { + const lastNames = [ + "Smith", + "Johnson", + "Brown", + "Williams", + "Jones", + "Garcia", + "Miller", + "Davis", + "Rodriguez", + "Martinez", + "Hernandez", + "Lopez", + ]; + + return lastNames[Math.floor(Math.random() * lastNames.length)]; +} + +/** + * Generate the full name. + */ +function generateFullName() { + return `${generateFirstName()} ${generateLastName()}`; +} + +/** + * Generate the email address. + */ +function generateEmail() { + const adjectives = [ + "Cool", + "Smart", + "Fast", + "Sleek", + "Innovative", + "Shiny", + "Bold", + "Elegant", + "Epic", + "Mystic", + "Brilliant", + "Luminous", + ]; + + const nouns = [ + "Star", + "Vision", + "Echo", + "Spark", + "Horizon", + "Nova", + "Shadow", + "Wave", + "Pulse", + "Vortex", + "Zenith", + "Element", + ]; + + let email = ""; + + do { + const adj = adjectives[Math.floor(Math.random() * adjectives.length)]; + const noun = nouns[Math.floor(Math.random() * nouns.length)]; + const number = Math.floor(1000 + Math.random() * 9000); + + email = `${adj}${noun}${number}@example.com`.toLowerCase(); + } while (usedEmails.has(email)); + + usedEmails.add(email); + + return email; +} + +/** + * Generate the phone number. + */ +function generatePhoneNumber() { + let phoneNumber; + + do { + phoneNumber = Math.floor(6000000000 + Math.random() * 4000000000); + } while (usedNumbers.has(phoneNumber)); + + usedNumbers.add(phoneNumber); + + return `${phoneNumber}`; +} + +/** + * Generate a random SKU. + */ +function generateSKU() { + const letters = Array.from({ length: 3 }, () => + String.fromCharCode(65 + Math.floor(Math.random() * 26)) + ).join(""); + + const numbers = Math.floor(1000 + Math.random() * 9000); + + return `${letters}${numbers}`; +} + +/** + * Generate a random URL. + */ +function generateSlug(delimiter = "-") { + let slug; + + do { + const name = generateName(); + + const randomStr = Math.random().toString(36).substring(2, 8); + + slug = `${name + .toLowerCase() + .replace(/\s+/g, delimiter)}${delimiter}${randomStr}`; + } while (usedSlugs.has(slug)); + + usedSlugs.add(slug); + + return slug; +} + +/** + * Generate a random email subject. + */ +function generateEmailSubject() { + const subjects = [ + "Exciting news just for you!", + "Don't miss out on this opportunity!", + "Limited time offer – act now!", + "An exclusive deal awaits you!", + "Your next big opportunity is here!", + "Something special just for you!", + "Unlock amazing benefits today!", + "Surprise! A special gift inside!", + "This could change everything for you!", + "You're invited to something amazing!", + "Get ready for a game-changing experience!", + "Hurry! This offer won't last long!", + "A deal you simply can’t resist!", + "Exclusive access – only for you!", + "We’ve got something exciting for you!", + "Your perfect opportunity is here!", + "Important update – check this out!", + "Discover what’s waiting for you!", + "A limited-time surprise for you!", + "Special invitation – don’t miss out!", + ]; + + return subjects[Math.floor(Math.random() * subjects.length)]; +} + + +/** + * Generate the description. + */ +function generateDescription(length = 255) { + const phrases = [ + "An innovative and sleek design.", + "Built for speed and efficiency.", + "Experience the future today.", + "A perfect blend of style and power.", + "Engineered to perfection.", + "Designed for those who dream big.", + "Unleash creativity with this masterpiece.", + "A game-changer in every way.", + "Smart, fast, and reliable.", + "The perfect companion for your journey.", + "Crafted with precision and excellence.", + "Innovation that redefines possibilities.", + "Enhancing your experience like never before.", + "Where technology meets elegance.", + "Power, performance, and perfection combined.", + "Redefining the way you experience the world.", + "A masterpiece of engineering and design.", + "Unmatched quality and exceptional performance.", + "Designed to elevate your lifestyle.", + "Beyond expectations, beyond limits.", + ]; + + let description = ""; + + while (length > 0) { + let phrase = phrases[Math.floor(Math.random() * phrases.length)]; + + if (phrase.length <= length) { + description += (description ? " " : "") + phrase; + length -= phrase.length; + } else { + description += " " + phrase.substring(0, length); + break; + } + } + + return description.trim(); +} + +/** + * Generate the host name. + */ +function generateHostname() { + const words = [ + "tech", + "cloud", + "byte", + "stream", + "nexus", + "core", + "pulse", + "data", + "sync", + "wave", + "hub", + "zone", + ]; + + const domains = [".com", ".net", ".io", ".ai", ".xyz", ".co"]; + + const part1 = words[Math.floor(Math.random() * words.length)]; + const part2 = words[Math.floor(Math.random() * words.length)]; + const domain = domains[Math.floor(Math.random() * domains.length)]; + + return `https://${part1}${part2}${domain}`; +} + +/** + * Generate a random element from the array. + */ +function randomElement(array) { + return array[Math.floor(Math.random() * array.length)]; +} + +/** + * Get a random image file from the directory. + */ +function getImageFile( + directory = path.resolve(__dirname, "../data/images/") +) { + if (!fs.existsSync(directory)) { + throw new Error(`Directory does not exist: ${directory}`); + } + + const files = fs.readdirSync(directory); + const imageFiles = files.filter((file) => + /\.(gif|jpeg|jpg|png|svg|webp)$/i.test(file) + ); + + if (!imageFiles.length) { + throw new Error("No image files found in the directory."); + } + + const randomIndex = Math.floor(Math.random() * imageFiles.length); + + return path.join(directory, imageFiles[randomIndex]); +} + +/** + * Generate a random date from today onwards in YYYY-MM-DD format. + */ +function generateDate(): string { + const today = new Date().getTime(); + const futureEnd = new Date(2030, 11, 31).getTime(); + const randomDate = new Date(today + Math.random() * (futureEnd - today)); + + return randomDate.toISOString().split('T')[0]; +} + +/** + * Function to generate a random company name + */ +function generateCompanyName() { + const prefixes = [ + "Tech", "Software", "Innovate", "NextGen", "Cloud", "AI", "Cyber", "Digital", + "Technical", "Product", "Organization", "Vendor", "Rock-on", "Super", "Quantum", + "Neural", "Hyper", "Ultra", "Smart", "Future", "Mega", "Omni", "Virtual", "Dynamic", + "Secure", "Data", "Meta", "Nano", "Robo", "Infinity", "Vision", "Intelli", "Strato", + "Blue", "Green", "Red", "White", "Black", "Deep", "Elite", "Prime", "Titan", "Nova", + "Storm", "Lightning", "Vertex", "Pioneer", "Omnis", "Synergy", "Core", "Nexus" + ]; + const suffixes = [ + "Solutions", "Systems", "Pvt Ltd", "Technologies", "Enterprises", "Labs", "Networks", + "Corporation", "Group", "Ventures", "Holdings", "Consulting", "Industries", "Analytics", + "Innovations", "Services", "Softwares", "Developers", "AI", "Cloud", "Security", "Dynamics", + "Technica", "Data", "Infotech", "Research", "Automation", "Synergy", "Strategies", "Platform", + "Operations", "Logistics", "Infrastructure", "Management", "Digital", "Interactive", + "Vision", "Connect", "Smart", "Solutions Inc", "Partners", "Tech Ltd", "Info Systems", + "Growth", "Intelligence", "RoboCorp", "Edge", "Enterprise", "Global", "Power", "NextGen", + "Creative" + ]; + return `${prefixes[Math.floor(Math.random() * prefixes.length)]} ${suffixes[Math.floor(Math.random() * suffixes.length)]}`; +} + +/** + * Function to automate organization creation + */ +async function createOrganization(page) { + const companyName = generateCompanyName(); + + /** + * Click on "Create Organization" button + */ + await page.goto('admin/contacts/organizations'); + await page.getByRole('link', { name: 'Create Organization' }).click(); + + /** + * Fill in organization details + */ + await page.getByRole('textbox', { name: 'Name *' }).fill(companyName); + await page.locator('textarea[name="address\\[address\\]"]').fill('ARV Park'); + await page.getByRole('combobox').selectOption('IN'); + await page.locator('select[name="address\\[state\\]"]').selectOption('DL'); + await page.getByRole('textbox', { name: 'City' }).fill('Delhi'); + await page.getByRole('textbox', { name: 'Postcode' }).fill('123456'); + + /** + * Click to add extra details + */ + await page.locator('div').filter({ hasText: /^Click to add$/ }).nth(2).click(); + await page.getByRole('textbox', { name: 'Search...' }).fill('exampl'); + await page.getByRole('listitem').filter({ hasText: 'Example' }).click(); + + /** + * Click on "Save Organization" + */ + await page.getByRole('button', { name: 'Save Organization' }).click(); + // await expect(page.getByText(companyName)).toBeVisible(); + return companyName; +} + +function generateJobProfile() { + const jobProfiles = [ + "Playwright Automation Tester", + "Software Engineer", + "Data Analyst", + "Project Manager", + "DevOps Engineer", + "QA Engineer", + "UI/UX Designer", + "Product Manager", + "Cybersecurity Analyst", + "Cloud Architect" + ]; + const randomIndex = Math.floor(Math.random() * jobProfiles.length); + return jobProfiles[randomIndex]; +} + +async function createPerson(page) { + const Name = generateFullName(); + const email = generateEmail(); + const phone = generatePhoneNumber(); + const Job = generateJobProfile(); + + await page.getByRole('link', { name: 'Create Person' }).click(); + + await page.getByRole('textbox', { name: 'Name *' }).fill(Name); + await page.getByRole('textbox', { name: 'Emails *' }).fill(email); + await page.getByRole('textbox', { name: 'Contact Numbers' }).fill(phone); + await page.getByRole('textbox', { name: 'Job Title' }).fill(Job); + + // Select an organization + await page.locator('.relative > div > .relative').first().click(); + await page.getByRole('textbox', { name: 'Search...' }).fill('examp'); + await page.getByRole('listitem').filter({ hasText: 'Example' }).click(); + + // Save person + await page.getByRole('button', { name: 'Save Person' }).click(); + + return { Name, email, phone }; +} +function getRandomDateTime() { + const year = Math.floor(Math.random() * (2030 - 2020 + 1)) + 2020; + const month = String(Math.floor(Math.random() * 12) + 1).padStart(2, '0'); + const day = String(Math.floor(Math.random() * 28) + 1).padStart(2, '0'); + const hours = String(Math.floor(Math.random() * 24)).padStart(2, '0'); + const minutes = String(Math.floor(Math.random() * 60)).padStart(2, '0'); + const seconds = String(Math.floor(Math.random() * 60)).padStart(2, '0'); + + return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`; + } + +export { + generateName, + generateFirstName, + generateLastName, + generateFullName, + generateEmail, + generatePhoneNumber, + generateSKU, + generateSlug, + generateEmailSubject, + generateDescription, + generateHostname, + randomElement, + getImageFile, + generateDate, + createOrganization, + generateCompanyName, + createPerson, + getRandomDateTime +}; \ No newline at end of file diff --git a/packages/Webkul/Admin/vite.config.js b/packages/Webkul/Admin/vite.config.js new file mode 100644 index 0000000..23ca05c --- /dev/null +++ b/packages/Webkul/Admin/vite.config.js @@ -0,0 +1,48 @@ +import { defineConfig, loadEnv } from "vite"; +import vue from "@vitejs/plugin-vue"; +import laravel from "laravel-vite-plugin"; +import path from "path"; + +export default defineConfig(({ mode }) => { + const envDir = "../../../"; + + Object.assign(process.env, loadEnv(mode, envDir)); + + return { + build: { + emptyOutDir: true, + }, + + envDir, + + server: { + host: process.env.VITE_HOST || "localhost", + port: process.env.VITE_PORT || 5173, + cors: true, + }, + + plugins: [ + vue(), + + laravel({ + hotFile: "../../../public/admin-vite.hot", + publicDirectory: "../../../public", + buildDirectory: "admin/build", + input: [ + "src/Resources/assets/css/app.css", + "src/Resources/assets/js/app.js", + "src/Resources/assets/js/chart.js", + ], + refresh: true, + }), + ], + + experimental: { + renderBuiltUrl(filename, { hostId, hostType, type }) { + if (hostType === "css") { + return path.basename(filename); + } + }, + }, + }; +}); diff --git a/packages/Webkul/Attribute/composer.json b/packages/Webkul/Attribute/composer.json new file mode 100755 index 0000000..6b4552b --- /dev/null +++ b/packages/Webkul/Attribute/composer.json @@ -0,0 +1,27 @@ +{ + "name": "krayin/laravel-attribute", + "license": "MIT", + "authors": [ + { + "name": "Jitendra Singh", + "email": "jitendra@webkul.com" + } + ], + "require": { + "krayin/laravel-core": "^1.0" + }, + "autoload": { + "psr-4": { + "Webkul\\Attribute\\": "src/" + } + }, + "extra": { + "laravel": { + "providers": [ + "Webkul\\Attribute\\Providers\\AttributeServiceProvider" + ], + "aliases": {} + } + }, + "minimum-stability": "dev" +} \ No newline at end of file diff --git a/packages/Webkul/Attribute/src/Config/attribute_lookups.php b/packages/Webkul/Attribute/src/Config/attribute_lookups.php new file mode 100644 index 0000000..ca5d8ed --- /dev/null +++ b/packages/Webkul/Attribute/src/Config/attribute_lookups.php @@ -0,0 +1,5 @@ +increments('id'); + $table->string('code'); + $table->string('name'); + $table->string('type'); + $table->string('lookup_type')->nullable(); + $table->string('entity_type'); + $table->integer('sort_order')->nullable(); + $table->string('validation')->nullable(); + $table->boolean('is_required')->default(0); + $table->boolean('is_unique')->default(0); + $table->boolean('quick_add')->default(0); + $table->boolean('is_user_defined')->default(1); + $table->unique(['code', 'entity_type']); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('attributes'); + } +}; diff --git a/packages/Webkul/Attribute/src/Database/Migrations/2021_04_02_080837_create_attribute_options_table.php b/packages/Webkul/Attribute/src/Database/Migrations/2021_04_02_080837_create_attribute_options_table.php new file mode 100644 index 0000000..015e07f --- /dev/null +++ b/packages/Webkul/Attribute/src/Database/Migrations/2021_04_02_080837_create_attribute_options_table.php @@ -0,0 +1,34 @@ +increments('id'); + $table->string('name')->nullable(); + $table->integer('sort_order')->nullable(); + $table->integer('attribute_id')->unsigned(); + $table->foreign('attribute_id')->references('id')->on('attributes')->onDelete('cascade'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('attribute_options'); + } +}; diff --git a/packages/Webkul/Attribute/src/Database/Migrations/2021_04_06_122751_create_attribute_values_table.php b/packages/Webkul/Attribute/src/Database/Migrations/2021_04_06_122751_create_attribute_values_table.php new file mode 100644 index 0000000..79b4f9d --- /dev/null +++ b/packages/Webkul/Attribute/src/Database/Migrations/2021_04_06_122751_create_attribute_values_table.php @@ -0,0 +1,44 @@ +increments('id'); + $table->string('entity_type')->default('leads'); + $table->text('text_value')->nullable(); + $table->boolean('boolean_value')->nullable(); + $table->integer('integer_value')->nullable(); + $table->double('float_value')->nullable(); + $table->datetime('datetime_value')->nullable(); + $table->date('date_value')->nullable(); + $table->json('json_value')->nullable(); + + $table->integer('entity_id')->unsigned(); + $table->integer('attribute_id')->unsigned(); + + $table->foreign('attribute_id')->references('id')->on('attributes')->onDelete('cascade'); + $table->unique(['entity_type', 'entity_id', 'attribute_id'], 'entity_type_attribute_value_index_unique'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('attribute_values'); + } +}; diff --git a/packages/Webkul/Attribute/src/Database/Migrations/2025_07_02_191710_alter_attribute_values_table.php b/packages/Webkul/Attribute/src/Database/Migrations/2025_07_02_191710_alter_attribute_values_table.php new file mode 100644 index 0000000..b0792b9 --- /dev/null +++ b/packages/Webkul/Attribute/src/Database/Migrations/2025_07_02_191710_alter_attribute_values_table.php @@ -0,0 +1,39 @@ +string('unique_id')->nullable(); + }); + + $tablePrefix = DB::getTablePrefix(); + + DB::statement('UPDATE '.$tablePrefix."attribute_values SET unique_id = CONCAT(entity_id, '|', attribute_id)"); + + Schema::table('attribute_values', function (Blueprint $table) { + $table->unique('unique_id'); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('attribute_values', function (Blueprint $table) { + $table->dropUnique(['unique_id']); + + $table->dropColumn('unique_id'); + }); + } +}; diff --git a/packages/Webkul/Attribute/src/Models/Attribute.php b/packages/Webkul/Attribute/src/Models/Attribute.php new file mode 100644 index 0000000..06c901a --- /dev/null +++ b/packages/Webkul/Attribute/src/Models/Attribute.php @@ -0,0 +1,35 @@ +hasMany(AttributeOptionProxy::modelClass()); + } +} diff --git a/packages/Webkul/Attribute/src/Models/AttributeOption.php b/packages/Webkul/Attribute/src/Models/AttributeOption.php new file mode 100644 index 0000000..2ec0622 --- /dev/null +++ b/packages/Webkul/Attribute/src/Models/AttributeOption.php @@ -0,0 +1,30 @@ +belongsTo(AttributeProxy::modelClass()); + } +} diff --git a/packages/Webkul/Attribute/src/Models/AttributeOptionProxy.php b/packages/Webkul/Attribute/src/Models/AttributeOptionProxy.php new file mode 100644 index 0000000..63de852 --- /dev/null +++ b/packages/Webkul/Attribute/src/Models/AttributeOptionProxy.php @@ -0,0 +1,7 @@ + 'array', + ]; + + /** + * The attributes that are fillable for the model. + * + * @var array + */ + protected $fillable = [ + 'attribute_id', + 'text_value', + 'boolean_value', + 'integer_value', + 'float_value', + 'datetime_value', + 'date_value', + 'json_value', + 'entity_id', + 'entity_type', + ]; + + /** + * The attributes that are used for logging activity. + * + * @var array + */ + public static $attributeTypeFields = [ + 'text' => 'text_value', + 'textarea' => 'text_value', + 'price' => 'float_value', + 'boolean' => 'boolean_value', + 'select' => 'integer_value', + 'multiselect' => 'text_value', + 'checkbox' => 'text_value', + 'email' => 'json_value', + 'address' => 'json_value', + 'phone' => 'json_value', + 'lookup' => 'integer_value', + 'datetime' => 'datetime_value', + 'date' => 'date_value', + 'file' => 'text_value', + 'image' => 'text_value', + ]; + + /** + * Get the attribute that owns the attribute value. + */ + public function attribute() + { + return $this->belongsTo(AttributeProxy::modelClass()); + } + + /** + * Get the parent entity model (leads, products, persons or organizations). + */ + public function entity() + { + return $this->morphTo(); + } +} diff --git a/packages/Webkul/Attribute/src/Models/AttributeValueProxy.php b/packages/Webkul/Attribute/src/Models/AttributeValueProxy.php new file mode 100644 index 0000000..777a768 --- /dev/null +++ b/packages/Webkul/Attribute/src/Models/AttributeValueProxy.php @@ -0,0 +1,7 @@ +loadMigrationsFrom(__DIR__.'/../Database/Migrations'); + } + + /** + * Register services. + * + * @return void + */ + public function register() + { + $this->registerConfig(); + } + + /** + * Register package config. + * + * @return void + */ + protected function registerConfig() + { + $this->mergeConfigFrom( + dirname(__DIR__).'/Config/attribute_lookups.php', 'attribute_lookups' + ); + } +} diff --git a/packages/Webkul/Attribute/src/Providers/ModuleServiceProvider.php b/packages/Webkul/Attribute/src/Providers/ModuleServiceProvider.php new file mode 100644 index 0000000..6f363b4 --- /dev/null +++ b/packages/Webkul/Attribute/src/Providers/ModuleServiceProvider.php @@ -0,0 +1,14 @@ +model->create($data); + + if (in_array($attribute->type, ['select', 'multiselect', 'checkbox']) && count($options)) { + $sortOrder = 1; + + foreach ($options as $optionInputs) { + $this->attributeOptionRepository->create(array_merge([ + 'attribute_id' => $attribute->id, + 'sort_order' => $sortOrder++, + ], $optionInputs)); + } + } + + return $attribute; + } + + /** + * @param int $id + * @param string $attribute + * @return \Webkul\Attribute\Contracts\Attribute + */ + public function update(array $data, $id, $attribute = 'id') + { + $attribute = $this->find($id); + + $attribute->update($data); + + if (! in_array($attribute->type, ['select', 'multiselect', 'checkbox'])) { + return $attribute; + } + + if (! isset($data['options'])) { + return $attribute; + } + + foreach ($data['options'] as $optionId => $optionInputs) { + $isNew = $optionInputs['isNew'] == 'true'; + + if ($isNew) { + $this->attributeOptionRepository->create(array_merge([ + 'attribute_id' => $attribute->id, + ], $optionInputs)); + } else { + $isDelete = $optionInputs['isDelete'] == 'true'; + + if ($isDelete) { + $this->attributeOptionRepository->delete($optionId); + } else { + $this->attributeOptionRepository->update($optionInputs, $optionId); + } + } + } + + return $attribute; + } + + /** + * @param string $code + * @return \Webkul\Attribute\Contracts\Attribute + */ + public function getAttributeByCode($code) + { + static $attributes = []; + + if (array_key_exists($code, $attributes)) { + return $attributes[$code]; + } + + return $attributes[$code] = $this->findOneByField('code', $code); + } + + /** + * @param int $lookup + * @param string $query + * @param array $columns + * @return array + */ + public function getLookUpOptions($lookup, $query = '', $columns = []) + { + $lookup = config('attribute_lookups.'.$lookup); + + if (! count($columns)) { + $columns = [($lookup['value_column'] ?? 'id').' as id', ($lookup['label_column'] ?? 'name').' as name']; + } + + if (Str::contains($lookup['repository'], 'UserRepository')) { + $userRepository = app($lookup['repository'])->where('status', 1); + + $currentUser = auth()->guard('user')->user(); + + if ($currentUser?->view_permission === 'group') { + $query = urldecode($query); + + $userIds = bouncer()->getAuthorizedUserIds(); + + return $userRepository + ->when(! empty($userIds), fn ($queryBuilder) => $queryBuilder->whereIn('users.id', $userIds)) + ->when(! empty($query), fn ($queryBuilder) => $queryBuilder->where('users.name', 'like', "%{$query}%")) + ->get(); + } elseif ($currentUser?->view_permission === 'individual') { + return $userRepository->where('users.id', $currentUser->id); + } + + return $userRepository->where('users.name', 'like', '%'.urldecode($query).'%')->get(); + } + + return app($lookup['repository'])->findWhere([ + [$lookup['label_column'] ?? 'name', 'like', '%'.urldecode($query).'%'], + ], $columns); + } + + /** + * @param string $lookup + * @param int|array $entityId + * @param array $columns + * @return mixed + */ + public function getLookUpEntity($lookup, $entityId = null, $columns = []) + { + if (! $entityId) { + return; + } + + $lookup = config('attribute_lookups.'.$lookup); + + if (! count($columns)) { + $columns = [($lookup['value_column'] ?? 'id').' as id', ($lookup['label_column'] ?? 'name').' as name']; + } + + if (is_array($entityId)) { + return app($lookup['repository'])->findWhereIn( + 'id', + $entityId, + $columns + ); + } else { + return app($lookup['repository'])->find($entityId, $columns); + } + } +} diff --git a/packages/Webkul/Attribute/src/Repositories/AttributeValueRepository.php b/packages/Webkul/Attribute/src/Repositories/AttributeValueRepository.php new file mode 100755 index 0000000..ef61128 --- /dev/null +++ b/packages/Webkul/Attribute/src/Repositories/AttributeValueRepository.php @@ -0,0 +1,267 @@ + $data['entity_type']]; + + if (isset($data['quick_add'])) { + $conditions['quick_add'] = 1; + } + + $attributes = $this->attributeRepository->where($conditions)->get(); + } + + foreach ($attributes as $attribute) { + $typeColumn = $this->model::$attributeTypeFields[$attribute->type]; + + if ($attribute->type === 'boolean') { + $data[$attribute->code] = isset($data[$attribute->code]) && $data[$attribute->code] ? 1 : 0; + } + + if (! array_key_exists($attribute->code, $data)) { + continue; + } + + if ($attribute->type === 'price' + && isset($data[$attribute->code]) + && $data[$attribute->code] === '' + ) { + $data[$attribute->code] = null; + } + + if ($attribute->type === 'date' && $data[$attribute->code] === '') { + $data[$attribute->code] = null; + } + + if ($attribute->type === 'multiselect' || $attribute->type === 'checkbox') { + $data[$attribute->code] = implode(',', $data[$attribute->code]); + } + + if ($attribute->type === 'email' || $attribute->type === 'phone') { + $data[$attribute->code] = $this->sanitizeEmailAndPhone($data[$attribute->code]); + } + + if ($attribute->type === 'image' || $attribute->type === 'file') { + $data[$attribute->code] = $data[$attribute->code] instanceof UploadedFile + ? $data[$attribute->code]->store($data['entity_type'].'/'.$data['entity_id']) + : null; + } + + $attributeValue = $this->findOneWhere([ + 'entity_type' => $data['entity_type'], + 'entity_id' => $data['entity_id'], + 'attribute_id' => $attribute->id, + ]); + + if (! $attributeValue) { + $this->create([ + 'entity_type' => $data['entity_type'], + 'entity_id' => $data['entity_id'], + 'attribute_id' => $attribute->id, + $typeColumn => $data[$attribute->code], + ]); + } else { + $this->update([ + $typeColumn => $data[$attribute->code], + ], $attributeValue->id); + + if ($attribute->type == 'image' || $attribute->type == 'file') { + if ($attributeValue->text_value) { + Storage::delete($attributeValue->text_value); + } + } + } + } + } + + /** + * Is value unique. + * + * @param int $entityId + * @param string $entityType + * @param \Webkul\Attribute\Contracts\Attribute $attribute + * @param string $value + * @return bool + */ + public function isValueUnique($entityId, $entityType, $attribute, $value) + { + $query = $this->resetScope()->model + ->where('attribute_id', $attribute->id) + ->where('entity_type', $entityType) + ->where('entity_id', '!=', $entityId); + + /** + * If the attribute type is email or phone, check the JSON value. + */ + if (in_array($attribute->type, ['email', 'phone'])) { + $query->whereJsonContains($this->model::$attributeTypeFields[$attribute->type], [['value' => $value]]); + } else { + $query->where($this->model::$attributeTypeFields[$attribute->type], $value); + } + + return $query->get()->count() ? false : true; + } + + /** + * Removed null values from email and phone fields. + * + * @param array $data + * @return array + */ + public function sanitizeEmailAndPhone($data) + { + foreach ($data as $key => $row) { + if (is_null($row['value'])) { + unset($data[$key]); + } + } + + return $data; + } + + /** + * Replace placeholders with values + */ + public function getAttributeLabel(mixed $value, mixed $attribute) + { + switch ($attribute?->type) { + case 'price': + $label = core()->formatBasePrice($value); + + break; + + case 'boolean': + $label = $value ? 'Yes' : 'No'; + + break; + + case 'select': + case 'radio': + case 'lookup': + if ($attribute->lookup_type) { + $option = $this->attributeRepository->getLookUpEntity($attribute->lookup_type, $value); + } else { + $option = $attribute->options->where('id', $value)->first(); + } + + $label = $option?->name; + + break; + + case 'multiselect': + case 'checkbox': + if ($attribute->lookup_type) { + $options = $this->attributeRepository->getLookUpEntity($attribute->lookup_type, explode(',', $value)); + } else { + $options = $attribute->options->whereIn('id', explode(',', $value)); + } + + $optionsLabels = []; + + foreach ($options as $key => $option) { + $optionsLabels[] = $option->name; + } + + $label = implode(', ', $optionsLabels); + + break; + + case 'email': + case 'phone': + if (! is_array($value)) { + break; + } + + $optionsLabels = []; + + foreach ($value as $item) { + $optionsLabels[] = $item['value'].' ('.$item['label'].')'; + } + + $label = implode(', ', $optionsLabels); + + break; + + case 'address': + if ( + ! $value + || ! count(array_filter($value)) + ) { + break; + } + + $label = $value['address'].'
    ' + .$value['postcode'].' '.$value['city'].'
    ' + .core()->state_name($value['state']).'
    ' + .core()->country_name($value['country']).'
    '; + + break; + + case 'date': + if ($value) { + $label = Carbon::parse($value)->format('D M d, Y'); + } else { + $label = null; + } + + break; + + case 'datetime': + if ($value) { + $label = Carbon::parse($value)->format('D M d, Y H:i A'); + } else { + $label = null; + } + + break; + + default: + if ($value instanceof Carbon) { + $label = $value->format('D M d, Y H:i A'); + } else { + $label = $value; + } + + break; + } + + return $label ?? null; + } +} diff --git a/packages/Webkul/Attribute/src/Traits/CustomAttribute.php b/packages/Webkul/Attribute/src/Traits/CustomAttribute.php new file mode 100644 index 0000000..acb3830 --- /dev/null +++ b/packages/Webkul/Attribute/src/Traits/CustomAttribute.php @@ -0,0 +1,175 @@ + 'text_value', + 'textarea' => 'text_value', + 'price' => 'float_value', + 'boolean' => 'boolean_value', + 'select' => 'integer_value', + 'multiselect' => 'text_value', + 'checkbox' => 'text_value', + 'email' => 'json_value', + 'address' => 'json_value', + 'phone' => 'json_value', + 'lookup' => 'integer_value', + 'datetime' => 'datetime_value', + 'date' => 'date_value', + 'file' => 'text_value', + 'image' => 'text_value', + ]; + + /** + * Get the attribute values that owns the entity. + */ + public function attribute_values() + { + return $this->morphMany(AttributeValueProxy::modelClass(), 'entity'); + } + + /** + * Get an attribute from the model. + * + * @param string $key + * @return mixed + */ + public function getAttribute($key) + { + if (! method_exists(static::class, $key) && ! isset($this->attributes[$key])) { + if (isset($this->id)) { + $this->attributes[$key] = ''; + + $attribute = app(AttributeRepository::class)->getAttributeByCode($key); + + $this->attributes[$key] = $this->getCustomAttributeValue($attribute); + + return $this->getAttributeValue($key); + } + } + + return parent::getAttribute($key); + } + + /** + * @return array + */ + public function attributesToArray() + { + $attributes = parent::attributesToArray(); + + $hiddenAttributes = $this->getHidden(); + + if (isset($this->id)) { + $customAttributes = $this->getCustomAttributes(); + + foreach ($customAttributes as $attribute) { + if (in_array($attribute->code, $hiddenAttributes) && isset($this->attributes[$attribute->code])) { + continue; + } + + $attributes[$attribute->code] = $this->getCustomAttributeValue($attribute); + } + } + + return $attributes; + } + + /** + * Check in loaded family attributes. + * + * @return object + */ + public function getCustomAttributes() + { + static $attributes; + + if ($attributes) { + return $attributes; + } + + return $attributes = app(AttributeRepository::class)->where('entity_type', $this->getTable())->get(); + } + + /** + * Get an product attribute value. + * + * @return mixed + */ + public function getCustomAttributeValue($attribute) + { + if (! $attribute) { + return; + } + + $attributeValue = $this->attribute_values->where('attribute_id', $attribute->id)->first(); + + return $attributeValue[self::$attributeTypeFields[$attribute->type]] ?? null; + } + + /** + * Create a new instance of the given model. + * + * @param array $attributes + * @return Collection + */ + public function getLookUpAttributes($attributes) + { + $attributes = app(AttributeRepository::class)->scopeQuery(function ($query) use ($attributes) { + return $query->distinct() + ->where('type', 'lookup') + ->where('entity_type', request('entity_type')) + ->whereIn('code', array_keys($attributes, '', false)); + })->get(); + + return $attributes; + } + + /** + * Create a new instance of the given model. + * + * @param array $attributes + * @param bool $exists + * @return static + */ + public function newInstance($attributes = [], $exists = false) + { + // $attributes = $this->getLookUpAttributes($attributes); + + // Play with data here + + return parent::newInstance($attributes, $exists); + } + + /** + * Fill the model with an array of attributes. + * + * @return $this + * + * @throws \Illuminate\Database\Eloquent\MassAssignmentException + */ + public function fill(array $attributes) + { + // Play with data here + + return parent::fill($attributes); + } + + // Delete model's attribute values + public static function boot() + { + parent::boot(); + + static::deleting(function ($entity) { + $entity->attribute_values()->delete(); + }); + } +} diff --git a/packages/Webkul/Automation/src/Config/workflows.php b/packages/Webkul/Automation/src/Config/workflows.php new file mode 100644 index 0000000..67fc929 --- /dev/null +++ b/packages/Webkul/Automation/src/Config/workflows.php @@ -0,0 +1,74 @@ + [ + + 'leads' => [ + 'name' => 'Leads', + 'class' => 'Webkul\Automation\Helpers\Entity\Lead', + 'events' => [ + [ + 'event' => 'lead.create.after', + 'name' => 'Created', + ], [ + 'event' => 'lead.update.after', + 'name' => 'Updated', + ], [ + 'event' => 'lead.delete.before', + 'name' => 'Deleted', + ], + ], + ], + + 'activities' => [ + 'name' => 'Activities', + 'class' => 'Webkul\Automation\Helpers\Entity\Activity', + 'events' => [ + [ + 'event' => 'activity.create.after', + 'name' => 'Created', + ], [ + 'event' => 'activity.update.after', + 'name' => 'Updated', + ], [ + 'event' => 'activity.delete.before', + 'name' => 'Deleted', + ], + ], + ], + + 'persons' => [ + 'name' => 'Persons', + 'class' => 'Webkul\Automation\Helpers\Entity\Person', + 'events' => [ + [ + 'event' => 'contacts.person.create.after', + 'name' => 'Created', + ], [ + 'event' => 'contacts.person.update.after', + 'name' => 'Updated', + ], [ + 'event' => 'contacts.person.delete.before', + 'name' => 'Deleted', + ], + ], + ], + + 'quotes' => [ + 'name' => 'Quotes', + 'class' => 'Webkul\Automation\Helpers\Entity\Quote', + 'events' => [ + [ + 'event' => 'quote.create.after', + 'name' => 'Created', + ], [ + 'event' => 'quote.update.after', + 'name' => 'Updated', + ], [ + 'event' => 'quote.delete.before', + 'name' => 'Deleted', + ], + ], + ], + ], +]; diff --git a/packages/Webkul/Automation/src/Contracts/Webhook.php b/packages/Webkul/Automation/src/Contracts/Webhook.php new file mode 100644 index 0000000..ac97275 --- /dev/null +++ b/packages/Webkul/Automation/src/Contracts/Webhook.php @@ -0,0 +1,5 @@ +increments('id'); + $table->string('name'); + $table->string('description')->nullable(); + $table->string('entity_type'); + $table->string('event'); + $table->string('condition_type')->default('and'); + $table->json('conditions')->nullable(); + $table->json('actions')->nullable(); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('workflows'); + } +}; diff --git a/packages/Webkul/Automation/src/Database/Migrations/2024_07_24_150821_create_webhooks_table.php b/packages/Webkul/Automation/src/Database/Migrations/2024_07_24_150821_create_webhooks_table.php new file mode 100644 index 0000000..9554e90 --- /dev/null +++ b/packages/Webkul/Automation/src/Database/Migrations/2024_07_24_150821_create_webhooks_table.php @@ -0,0 +1,37 @@ +id(); + $table->string('name'); + $table->string('entity_type'); + $table->string('description')->nullable(); + $table->string('method'); + $table->string('end_point'); + $table->json('query_params')->nullable(); + $table->json('headers')->nullable(); + $table->string('payload_type'); + $table->string('raw_payload_type'); + $table->json('payload')->nullable(); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('webhooks'); + } +}; diff --git a/packages/Webkul/Automation/src/Helpers/Entity.php b/packages/Webkul/Automation/src/Helpers/Entity.php new file mode 100644 index 0000000..0322648 --- /dev/null +++ b/packages/Webkul/Automation/src/Helpers/Entity.php @@ -0,0 +1,103 @@ + $entity) { + $object = app($entity['class']); + + $events[$key] = [ + 'id' => $key, + 'name' => $entity['name'], + 'events' => $entity['events'], + ]; + } + + return $events; + } + + /** + * Returns conditions to match for the entity + * + * @return array + */ + public function getConditions() + { + $entities = config('workflows.trigger_entities'); + + $conditions = []; + + foreach ($entities as $key => $entity) { + $object = app($entity['class']); + + $conditions[$key] = $object->getConditions(); + } + + return $conditions; + } + + /** + * Returns workflow actions + * + * @return array + */ + public function getActions() + { + $entities = config('workflows.trigger_entities'); + + $conditions = []; + + foreach ($entities as $key => $entity) { + $object = app($entity['class']); + + $conditions[$key] = $object->getActions(); + } + + return $conditions; + } + + /** + * Returns placeholders for email templates + * + * @return array + */ + public function getEmailTemplatePlaceholders() + { + $entities = config('workflows.trigger_entities'); + + $placeholders = []; + + foreach ($entities as $key => $entity) { + $object = app($entity['class']); + + $placeholders[] = $object->getEmailTemplatePlaceholders($entity); + } + + return $placeholders; + } +} diff --git a/packages/Webkul/Automation/src/Helpers/Entity/AbstractEntity.php b/packages/Webkul/Automation/src/Helpers/Entity/AbstractEntity.php new file mode 100644 index 0000000..b9d2dca --- /dev/null +++ b/packages/Webkul/Automation/src/Helpers/Entity/AbstractEntity.php @@ -0,0 +1,232 @@ +getAttributes($this->entityType); + } + + /** + * Get attributes for entity. + */ + public function getAttributes(string $entityType, array $skipAttributes = ['textarea', 'image', 'file', 'address']): array + { + $attributes = []; + + foreach ($this->attributeRepository->findByField('entity_type', $entityType) as $attribute) { + if (in_array($attribute->type, $skipAttributes)) { + continue; + } + + if ($attribute->lookup_type) { + $options = []; + } else { + $options = $attribute->options; + } + + $attributes[] = [ + 'id' => $attribute->code, + 'type' => $attribute->type, + 'name' => $attribute->name, + 'lookup_type' => $attribute->lookup_type, + 'options' => $options, + ]; + } + + return $attributes; + } + + /** + * Returns placeholders for email templates. + */ + public function getEmailTemplatePlaceholders(array $entity): array + { + $menuItems = []; + + foreach ($this->getAttributes($this->entityType) as $attribute) { + $menuItems[] = [ + 'text' => $attribute['name'], + 'value' => '{%'.$this->entityType.'.'.$attribute['id'].'%}', + ]; + } + + return [ + 'text' => $entity['name'], + 'menu' => $menuItems, + ]; + } + + /** + * Replace placeholders with values. + */ + public function replacePlaceholders(mixed $entity, string $content): string + { + foreach ($this->getAttributes($this->entityType, []) as $attribute) { + $value = ''; + + switch ($attribute['type']) { + case 'price': + $value = core()->formatBasePrice($entity->{$attribute['id']}); + + break; + + case 'boolean': + $value = $entity->{$attribute['id']} ? __('admin::app.common.yes') : __('admin::app.common.no'); + + break; + + case 'select': + case 'radio': + case 'lookup': + if ($attribute['lookup_type']) { + $option = $this->attributeRepository->getLookUpEntity($attribute['lookup_type'], $entity->{$attribute['id']}); + } else { + $option = $attribute['options']->where('id', $entity->{$attribute['id']})->first(); + } + + $value = $option ? $option->name : ''; + + break; + + case 'multiselect': + case 'checkbox': + if ($attribute['lookup_type']) { + $options = $this->attributeRepository->getLookUpEntity($attribute['lookup_type'], explode(',', $entity->{$attribute['id']})); + } else { + $options = $attribute['options']->whereIn('id', explode(',', $entity->{$attribute['id']})); + } + + $optionsLabels = []; + + foreach ($options as $key => $option) { + $optionsLabels[] = $option->name; + } + + $value = implode(', ', $optionsLabels); + + break; + + case 'email': + case 'phone': + if (! is_array($entity->{$attribute['id']})) { + break; + } + + $optionsLabels = []; + + foreach ($entity->{$attribute['id']} as $item) { + $optionsLabels[] = $item['value'].' ('.$item['label'].')'; + } + + $value = implode(', ', $optionsLabels); + + break; + + case 'address': + if (! $entity->{$attribute['id']} || ! count(array_filter($entity->{$attribute['id']}))) { + break; + } + + $value = $entity->{$attribute['id']}['address'].'
    ' + .$entity->{$attribute['id']}['postcode'].' '.$entity->{$attribute['id']}['city'].'
    ' + .core()->state_name($entity->{$attribute['id']}['state']).'
    ' + .core()->country_name($entity->{$attribute['id']}['country']).'
    '; + + break; + + case 'date': + if ($entity->{$attribute['id']}) { + $value = ! is_object($entity->{$attribute['id']}) + ? Carbon::parse($entity->{$attribute['id']}) + : $entity->{$attribute['id']}->format('D M d, Y'); + } else { + $value = 'N/A'; + } + + break; + + case 'datetime': + if ($entity->{$attribute['id']}) { + $value = ! is_object($entity->{$attribute['id']}) + ? Carbon::parse($entity->{$attribute['id']}) + : $entity->{$attribute['id']}->format('D M d, Y H:i A'); + } else { + $value = 'N/A'; + } + + break; + + default: + $value = $entity->{$attribute['id']}; + + break; + } + + $content = strtr($content, [ + '{%'.$this->entityType.'.'.$attribute['id'].'%}' => $value, + '{% '.$this->entityType.'.'.$attribute['id'].' %}' => $value, + ]); + } + + return $content; + } + + /** + * Trigger webhook. + * + * @return void + */ + public function triggerWebhook(int $webhookId, mixed $entity) + { + $webhook = $this->webhookRepository->findOrFail($webhookId); + + $payload = [ + 'method' => $webhook->method, + 'query_params' => $this->replacePlaceholders($entity, json_encode($webhook->query_params)), + 'end_point' => $this->replacePlaceholders($entity, $webhook->end_point), + 'payload' => $this->replacePlaceholders($entity, json_encode($webhook->payload)), + 'headers' => $this->replacePlaceholders($entity, json_encode($webhook->headers)), + ]; + + $this->webhookService->triggerWebhook($payload); + } +} diff --git a/packages/Webkul/Automation/src/Helpers/Entity/Activity.php b/packages/Webkul/Automation/src/Helpers/Entity/Activity.php new file mode 100644 index 0000000..41a9ef4 --- /dev/null +++ b/packages/Webkul/Automation/src/Helpers/Entity/Activity.php @@ -0,0 +1,323 @@ + 'title', + 'type' => 'text', + 'name' => 'Title', + 'lookup_type' => null, + 'options' => collect(), + ], [ + 'id' => 'type', + 'type' => 'multiselect', + 'name' => 'Type', + 'lookup_type' => null, + 'options' => collect([ + (object) [ + 'id' => 'note', + 'name' => 'Note', + ], (object) [ + 'id' => 'call', + 'name' => 'Call', + ], (object) [ + 'id' => 'meeting', + 'name' => 'Meeting', + ], (object) [ + 'id' => 'lunch', + 'name' => 'Lunch', + ], (object) [ + 'id' => 'file', + 'name' => 'File', + ], + ]), + ], [ + 'id' => 'location', + 'type' => 'text', + 'name' => 'Location', + 'lookup_type' => null, + 'options' => collect(), + ], [ + 'id' => 'comment', + 'type' => 'textarea', + 'name' => 'Comment', + 'lookup_type' => null, + 'options' => collect(), + ], [ + 'id' => 'schedule_from', + 'type' => 'datetime', + 'name' => 'Schedule From', + 'lookup_type' => null, + 'options' => collect(), + ], [ + 'id' => 'schedule_to', + 'type' => 'datetime', + 'name' => 'Schedule To', + 'lookup_type' => null, + 'options' => collect(), + ], [ + 'id' => 'user_id', + 'type' => 'select', + 'name' => 'User', + 'lookup_type' => 'users', + 'options' => $this->attributeRepository->getLookUpOptions('users'), + ], + ]; + + return $attributes; + } + + /** + * Returns placeholders for email templates. + */ + public function getEmailTemplatePlaceholders(array $entity): array + { + $emailTemplates = parent::getEmailTemplatePlaceholders($entity); + + $emailTemplates['menu'][] = [ + 'text' => 'Participants', + 'value' => '{%activities.participants%}', + ]; + + return $emailTemplates; + } + + /** + * Replace placeholders with values. + */ + public function replacePlaceholders(mixed $entity, string $content): string + { + $content = parent::replacePlaceholders($entity, $content); + + $value = '
      '; + + foreach ($entity->participants as $participant) { + $value .= '
    • '.($participant->user ? $participant->user->name : $participant->person->name).'
    • '; + } + + $value .= '
    '; + + return strtr($content, [ + '{%'.$this->entityType.'.participants%}' => $value, + '{% '.$this->entityType.'.participants %}' => $value, + ]); + } + + /** + * Listing of the entities. + */ + public function getEntity(mixed $entity): mixed + { + if (! $entity instanceof ContractsActivity) { + $entity = $this->activityRepository->find($entity); + } + + return $entity; + } + + /** + * Returns workflow actions. + */ + public function getActions(): array + { + $emailTemplates = $this->emailTemplateRepository->all(['id', 'name']); + + $webhooksOptions = $this->webhookRepository->all(['id', 'name']); + + return [ + [ + 'id' => 'update_related_leads', + 'name' => trans('admin::app.settings.workflows.helpers.update-related-leads'), + 'attributes' => $this->getAttributes('leads'), + ], [ + 'id' => 'send_email_to_sales_owner', + 'name' => trans('admin::app.settings.workflows.helpers.send-email-to-sales-owner'), + 'options' => $emailTemplates, + ], [ + 'id' => 'send_email_to_participants', + 'name' => trans('admin::app.settings.workflows.helpers.send-email-to-participants'), + 'options' => $emailTemplates, + ], [ + 'id' => 'trigger_webhook', + 'name' => trans('admin::app.settings.workflows.helpers.add-webhook'), + 'options' => $webhooksOptions, + ], + ]; + } + + /** + * Execute workflow actions. + */ + public function executeActions(mixed $workflow, mixed $activity): void + { + foreach ($workflow->actions as $action) { + switch ($action['id']) { + case 'update_related_leads': + $leadIds = $this->activityRepository->getModel() + ->leftJoin('lead_activities', 'activities.id', 'lead_activities.activity_id') + ->leftJoin('leads', 'lead_activities.lead_id', 'leads.id') + ->addSelect('leads.id') + ->where('activities.id', $activity->id) + ->pluck('id'); + + foreach ($leadIds as $leadId) { + $this->leadRepository->update( + [ + 'entity_type' => 'leads', + $action['attribute'] => $action['value'], + ], + $leadId, + [$action['attribute']] + ); + } + + break; + + case 'send_email_to_sales_owner': + $emailTemplate = $this->emailTemplateRepository->find($action['value']); + + if (! $emailTemplate) { + break; + } + + try { + Mail::queue(new Common([ + 'to' => $activity->user->email, + 'subject' => $this->replacePlaceholders($activity, $emailTemplate->subject), + 'body' => $this->replacePlaceholders($activity, $emailTemplate->content), + 'attachments' => [ + [ + 'name' => 'invite.ics', + 'mime' => 'text/calendar', + 'content' => $this->getICSContent($activity), + ], + ], + ])); + } catch (\Exception $e) { + } + + break; + + case 'send_email_to_participants': + $emailTemplate = $this->emailTemplateRepository->find($action['value']); + + if (! $emailTemplate) { + break; + } + + try { + foreach ($activity->participants as $participant) { + Mail::queue(new Common([ + 'to' => $participant->user + ? $participant->user->email + : data_get($participant->person->emails, '*.value'), + 'subject' => $this->replacePlaceholders($activity, $emailTemplate->subject), + 'body' => $this->replacePlaceholders($activity, $emailTemplate->content), + 'attachments' => [ + [ + 'name' => 'invite.ics', + 'mime' => 'text/calendar', + 'content' => $this->getICSContent($activity), + ], + ], + ])); + } + } catch (\Exception $e) { + } + + break; + + case 'trigger_webhook': + try { + $this->triggerWebhook($action['value'], $activity); + } catch (\Exception $e) { + report($e); + } + + break; + } + } + } + + /** + * Returns .ics file for attachments. + */ + public function getICSContent(ContractsActivity $activity): string + { + $content = [ + 'BEGIN:VCALENDAR', + 'VERSION:2.0', + 'PRODID:-//Krayincrm//Krayincrm//EN', + 'BEGIN:VEVENT', + 'UID:'.time().'-'.$activity->id, + 'DTSTAMP:'.Carbon::now()->format('YmdTHis'), + 'CREATED:'.$activity->created_at->format('YmdTHis'), + 'SEQUENCE:1', + 'ORGANIZER;CN='.$activity->user->name.':MAILTO:'.$activity->user->email, + ]; + + foreach ($activity->participants as $participant) { + if ($participant->user) { + $content[] = 'ATTENDEE;ROLE=REQ-PARTICIPANT;CN='.$participant->user->name.';PARTSTAT=NEEDS-ACTION:MAILTO:'.$participant->user->email; + } else { + foreach (data_get($participant->person->emails, '*.value') as $email) { + $content[] = 'ATTENDEE;ROLE=REQ-PARTICIPANT;CN='.$participant->person->name.';PARTSTAT=NEEDS-ACTION:MAILTO:'.$email; + } + } + } + + $content = array_merge($content, [ + 'DTSTART:'.$activity->schedule_from->format('YmdTHis'), + 'DTEND:'.$activity->schedule_to->format('YmdTHis'), + 'SUMMARY:'.$activity->title, + 'LOCATION:'.$activity->location, + 'DESCRIPTION:'.$activity->comment, + 'END:VEVENT', + 'END:VCALENDAR', + ]); + + return implode("\r\n", $content); + } +} diff --git a/packages/Webkul/Automation/src/Helpers/Entity/Lead.php b/packages/Webkul/Automation/src/Helpers/Entity/Lead.php new file mode 100644 index 0000000..bf10a7f --- /dev/null +++ b/packages/Webkul/Automation/src/Helpers/Entity/Lead.php @@ -0,0 +1,210 @@ +leadRepository->find($entity); + } + + return $entity; + } + + /** + * Returns attributes. + */ + public function getAttributes(string $entityType, array $skipAttributes = ['textarea', 'image', 'file', 'address']): array + { + return parent::getAttributes($entityType, $skipAttributes); + } + + /** + * Returns workflow actions. + */ + public function getActions(): array + { + $emailTemplates = $this->emailTemplateRepository->all(['id', 'name']); + + $webhooksOptions = $this->webhookRepository->all(['id', 'name']); + + return [ + [ + 'id' => 'update_lead', + 'name' => trans('admin::app.settings.workflows.helpers.update-lead'), + 'attributes' => $this->getAttributes('leads'), + ], [ + 'id' => 'update_person', + 'name' => trans('admin::app.settings.workflows.helpers.update-person'), + 'attributes' => $this->getAttributes('persons'), + ], [ + 'id' => 'send_email_to_person', + 'name' => trans('admin::app.settings.workflows.helpers.send-email-to-person'), + 'options' => $emailTemplates, + ], [ + 'id' => 'send_email_to_sales_owner', + 'name' => trans('admin::app.settings.workflows.helpers.send-email-to-sales-owner'), + 'options' => $emailTemplates, + ], [ + 'id' => 'add_tag', + 'name' => trans('admin::app.settings.workflows.helpers.add-tag'), + ], [ + 'id' => 'add_note_as_activity', + 'name' => trans('admin::app.settings.workflows.helpers.add-note-as-activity'), + ], [ + 'id' => 'trigger_webhook', + 'name' => trans('admin::app.settings.workflows.helpers.add-webhook'), + 'options' => $webhooksOptions, + ], + ]; + } + + /** + * Execute workflow actions. + */ + public function executeActions(mixed $workflow, mixed $lead): void + { + foreach ($workflow->actions as $action) { + switch ($action['id']) { + case 'update_lead': + $this->leadRepository->update( + [ + 'entity_type' => 'leads', + $action['attribute'] => $action['value'], + ], + $lead->id, + [$action['attribute']] + ); + + break; + + case 'update_person': + $this->personRepository->update([ + 'entity_type' => 'persons', + $action['attribute'] => $action['value'], + ], $lead->person_id); + + break; + + case 'send_email_to_person': + $emailTemplate = $this->emailTemplateRepository->find($action['value']); + + if (! $emailTemplate) { + break; + } + + try { + Mail::queue(new Common([ + 'to' => data_get($lead->person->emails, '*.value'), + 'subject' => $this->replacePlaceholders($lead, $emailTemplate->subject), + 'body' => $this->replacePlaceholders($lead, $emailTemplate->content), + ])); + } catch (\Exception $e) { + } + + break; + + case 'send_email_to_sales_owner': + $emailTemplate = $this->emailTemplateRepository->find($action['value']); + + if (! $emailTemplate) { + break; + } + + try { + Mail::queue(new Common([ + 'to' => $lead->user->email, + 'subject' => $this->replacePlaceholders($lead, $emailTemplate->subject), + 'body' => $this->replacePlaceholders($lead, $emailTemplate->content), + ])); + } catch (\Exception $e) { + } + + break; + + case 'add_tag': + $colors = [ + '#337CFF', + '#FEBF00', + '#E5549F', + '#27B6BB', + '#FB8A3F', + '#43AF52', + ]; + + if (! $tag = $this->tagRepository->findOneByField('name', $action['value'])) { + $tag = $this->tagRepository->create([ + 'name' => $action['value'], + 'color' => $colors[rand(0, 5)], + 'user_id' => auth()->guard('user')->user()->id, + ]); + } + + if (! $lead->tags->contains($tag->id)) { + $lead->tags()->attach($tag->id); + } + + break; + + case 'add_note_as_activity': + $activity = $this->activityRepository->create([ + 'type' => 'note', + 'comment' => $action['value'], + 'is_done' => 1, + 'user_id' => auth()->guard('user')->user()->id, + ]); + + $lead->activities()->attach($activity->id); + + break; + + case 'trigger_webhook': + try { + $this->triggerWebhook($action['value'], $lead); + } catch (\Exception $e) { + report($e); + } + + break; + } + } + } +} diff --git a/packages/Webkul/Automation/src/Helpers/Entity/Person.php b/packages/Webkul/Automation/src/Helpers/Entity/Person.php new file mode 100644 index 0000000..0c81980 --- /dev/null +++ b/packages/Webkul/Automation/src/Helpers/Entity/Person.php @@ -0,0 +1,140 @@ +personRepository->find($entity); + } + + return $entity; + } + + /** + * Returns workflow actions. + */ + public function getActions(): array + { + $emailTemplates = $this->emailTemplateRepository->all(['id', 'name']); + + $webhooksOptions = $this->webhookRepository->all(['id', 'name']); + + return [ + [ + 'id' => 'update_person', + 'name' => trans('admin::app.settings.workflows.helpers.update-person'), + 'attributes' => $this->getAttributes('persons'), + ], [ + 'id' => 'update_related_leads', + 'name' => trans('admin::app.settings.workflows.helpers.update-related-leads'), + 'attributes' => $this->getAttributes('leads'), + ], [ + 'id' => 'send_email_to_person', + 'name' => trans('admin::app.settings.workflows.helpers.send-email-to-person'), + 'options' => $emailTemplates, + ], [ + 'id' => 'trigger_webhook', + 'name' => trans('admin::app.settings.workflows.helpers.add-webhook'), + 'options' => $webhooksOptions, + ], + ]; + } + + /** + * Execute workflow actions. + */ + public function executeActions(mixed $workflow, mixed $person): void + { + foreach ($workflow->actions as $action) { + switch ($action['id']) { + case 'update_person': + $this->personRepository->update([ + 'entity_type' => 'persons', + $action['attribute'] => $action['value'], + ], $person->id); + + break; + + case 'update_related_leads': + $leads = $this->leadRepository->findByField('person_id', $person->id); + + foreach ($leads as $lead) { + $this->leadRepository->update( + [ + 'entity_type' => 'leads', + $action['attribute'] => $action['value'], + ], + $lead->id, + [$action['attribute']] + ); + } + + break; + + case 'send_email_to_person': + $emailTemplate = $this->emailTemplateRepository->find($action['value']); + + if (! $emailTemplate) { + break; + } + + try { + Mail::queue(new Common([ + 'to' => data_get($person->emails, '*.value'), + 'subject' => $this->replacePlaceholders($person, $emailTemplate->subject), + 'body' => $this->replacePlaceholders($person, $emailTemplate->content), + ])); + } catch (\Exception $e) { + report($e); + } + + break; + + case 'trigger_webhook': + try { + $this->triggerWebhook($action['value'], $person); + } catch (\Exception $e) { + report($e); + } + + break; + } + } + } +} diff --git a/packages/Webkul/Automation/src/Helpers/Entity/Quote.php b/packages/Webkul/Automation/src/Helpers/Entity/Quote.php new file mode 100644 index 0000000..699c745 --- /dev/null +++ b/packages/Webkul/Automation/src/Helpers/Entity/Quote.php @@ -0,0 +1,172 @@ +quoteRepository->find($entity); + } + + return $entity; + } + + /** + * Returns workflow actions. + */ + public function getActions(): array + { + $emailTemplates = $this->emailTemplateRepository->all(['id', 'name']); + + $webhookOptions = $this->webhookRepository->all(['id', 'name']); + + return [ + [ + 'id' => 'update_quote', + 'name' => trans('admin::app.settings.workflows.helpers.update-quote'), + 'attributes' => $this->getAttributes('quotes'), + ], [ + 'id' => 'update_person', + 'name' => trans('admin::app.settings.workflows.helpers.update-person'), + 'attributes' => $this->getAttributes('persons'), + ], [ + 'id' => 'update_related_leads', + 'name' => trans('admin::app.settings.workflows.helpers.update-related-leads'), + 'attributes' => $this->getAttributes('leads'), + ], [ + 'id' => 'send_email_to_person', + 'name' => trans('admin::app.settings.workflows.helpers.send-email-to-person'), + 'options' => $emailTemplates, + ], [ + 'id' => 'send_email_to_sales_owner', + 'name' => trans('admin::app.settings.workflows.helpers.send-email-to-sales-owner'), + 'options' => $emailTemplates, + ], [ + 'id' => 'trigger_webhook', + 'name' => trans('admin::app.settings.workflows.helpers.add-webhook'), + 'options' => $webhookOptions, + ], + ]; + } + + /** + * Execute workflow actions. + */ + public function executeActions(mixed $workflow, mixed $quote): void + { + foreach ($workflow->actions as $action) { + switch ($action['id']) { + case 'update_quote': + $this->quoteRepository->update([ + 'entity_type' => 'quotes', + $action['attribute'] => $action['value'], + ], $quote->id); + + break; + + case 'update_person': + $this->personRepository->update([ + 'entity_type' => 'persons', + $action['attribute'] => $action['value'], + ], $quote->person_id); + + break; + + case 'update_related_leads': + foreach ($quote->leads as $lead) { + $this->leadRepository->update( + [ + 'entity_type' => 'leads', + $action['attribute'] => $action['value'], + ], + $lead->id, + [$action['attribute']] + ); + } + + break; + + case 'send_email_to_person': + $emailTemplate = $this->emailTemplateRepository->find($action['value']); + + if (! $emailTemplate) { + break; + } + + try { + Mail::queue(new Common([ + 'to' => data_get($quote->person->emails, '*.value'), + 'subject' => $this->replacePlaceholders($quote, $emailTemplate->subject), + 'body' => $this->replacePlaceholders($quote, $emailTemplate->content), + ])); + } catch (\Exception $e) { + } + + break; + + case 'send_email_to_sales_owner': + $emailTemplate = $this->emailTemplateRepository->find($action['value']); + + if (! $emailTemplate) { + break; + } + + try { + Mail::queue(new Common([ + 'to' => $quote->user->email, + 'subject' => $this->replacePlaceholders($quote, $emailTemplate->subject), + 'body' => $this->replacePlaceholders($quote, $emailTemplate->content), + ])); + } catch (\Exception $e) { + } + + break; + + case 'trigger_webhook': + try { + $this->triggerWebhook($action['value'], $quote); + } catch (\Exception $e) { + report($e); + } + + break; + } + } + } +} diff --git a/packages/Webkul/Automation/src/Helpers/Validator.php b/packages/Webkul/Automation/src/Helpers/Validator.php new file mode 100644 index 0000000..908cf8b --- /dev/null +++ b/packages/Webkul/Automation/src/Helpers/Validator.php @@ -0,0 +1,183 @@ +conditions) { + return true; + } + + $validConditionCount = $totalConditionCount = 0; + + foreach ($workflow->conditions as $condition) { + if (! $condition['attribute'] + || ! isset($condition['value']) + || is_null($condition['value']) + || $condition['value'] == '' + ) { + continue; + } + + $totalConditionCount++; + + if ($workflow->condition_type == 'and') { + if (! $this->validateEntity($condition, $entity)) { + return false; + } else { + $validConditionCount++; + } + } else { + if ($this->validateEntity($condition, $entity)) { + return true; + } + } + } + + return $validConditionCount == $totalConditionCount ? true : false; + } + + /** + * Validate object + * + * @param array $condition + * @param mixed $entity + * @return bool + */ + private function validateEntity($condition, $entity) + { + return $this->validateAttribute( + $condition, + $this->getAttributeValue($condition, $entity) + ); + } + + /** + * Return value for the attribute + * + * @param array $condition + * @param mixed $entity + * @return bool + */ + public function getAttributeValue($condition, $entity) + { + $value = $entity->{$condition['attribute']}; + + if (! in_array($condition['attribute_type'], ['multiselect', 'checkbox'])) { + return $value; + } + + return $value ? explode(',', $value) : []; + } + + /** + * Validate attribute value for condition + * + * @param array $condition + * @param mixed $attributeValue + * @return bool + */ + public function validateAttribute($condition, $attributeValue) + { + switch ($condition['operator']) { + case '==': case '!=': + if (is_array($condition['value'])) { + if (! is_array($attributeValue)) { + return false; + } + + $result = ! empty(array_intersect($condition['value'], $attributeValue)); + } elseif (is_object($attributeValue)) { + $result = $attributeValue->value == $condition['value']; + } else { + if (is_array($attributeValue)) { + $result = count($attributeValue) == 1 && array_shift($attributeValue) == $condition['value']; + } else { + $result = $attributeValue == $condition['value']; + } + } + + break; + + case '<=': case '>': + if (! is_scalar($attributeValue)) { + return false; + } + + $result = $attributeValue <= $condition['value']; + + break; + + case '>=': case '<': + if (! is_scalar($attributeValue)) { + return false; + } + + $result = $attributeValue >= $condition['value']; + + break; + + case '{}': case '!{}': + if (is_scalar($attributeValue) && is_array($condition['value'])) { + foreach ($condition['value'] as $item) { + if (stripos($attributeValue, $item) !== false) { + $result = true; + + break; + } + } + } elseif (is_array($condition['value'])) { + if (! is_array($attributeValue)) { + return false; + } + + $result = ! empty(array_intersect($condition['value'], $attributeValue)); + } else { + if (is_array($attributeValue)) { + $result = self::validateArrayValues($attributeValue, $condition['value']); + } else { + $result = strpos($attributeValue, $condition['value']) !== false; + } + } + + break; + } + + if (in_array($condition['operator'], ['!=', '>', '<', '!{}'])) { + $result = ! $result; + } + + return $result; + } + + /** + * Validate the condition value against a multi dimensional array recursively + */ + private static function validateArrayValues(array $attributeValue, string $conditionValue): bool + { + if (in_array($conditionValue, $attributeValue, true) === true) { + return true; + } + + foreach ($attributeValue as $subValue) { + if (! is_array($subValue)) { + continue; + } + + if (self::validateArrayValues($subValue, $conditionValue) === true) { + return true; + } + } + + return false; + } +} diff --git a/packages/Webkul/Automation/src/Listeners/Entity.php b/packages/Webkul/Automation/src/Listeners/Entity.php new file mode 100644 index 0000000..0ca4f05 --- /dev/null +++ b/packages/Webkul/Automation/src/Listeners/Entity.php @@ -0,0 +1,45 @@ +workflowRepository->findByField('event', $eventName); + + foreach ($workflows as $workflow) { + $workflowEntity = app(config('workflows.trigger_entities.'.$workflow->entity_type.'.class')); + + $entity = $workflowEntity->getEntity($entity); + + if (! $this->validator->validate($workflow, $entity)) { + continue; + } + + try { + $workflowEntity->executeActions($workflow, $entity); + } catch (\Exception $e) { + logger()->error($e->getMessage()); + } + } + } +} diff --git a/packages/Webkul/Automation/src/Models/Webhook.php b/packages/Webkul/Automation/src/Models/Webhook.php new file mode 100644 index 0000000..5c8e9e6 --- /dev/null +++ b/packages/Webkul/Automation/src/Models/Webhook.php @@ -0,0 +1,41 @@ + + */ + protected $fillable = [ + 'name', + 'entity_type', + 'description', + 'method', + 'end_point', + 'query_params', + 'headers', + 'payload_type', + 'raw_payload_type', + 'payload', + ]; + + /** + * The attributes that should be cast to native types. + * + * @var array + */ + protected $casts = [ + 'query_params' => 'array', + 'headers' => 'array', + 'payload' => 'array', + ]; +} diff --git a/packages/Webkul/Automation/src/Models/WebhookProxy.php b/packages/Webkul/Automation/src/Models/WebhookProxy.php new file mode 100644 index 0000000..7e46e10 --- /dev/null +++ b/packages/Webkul/Automation/src/Models/WebhookProxy.php @@ -0,0 +1,7 @@ + 'array', + 'actions' => 'array', + ]; + + protected $fillable = [ + 'name', + 'description', + 'entity_type', + 'event', + 'condition_type', + 'conditions', + 'actions', + ]; +} diff --git a/packages/Webkul/Automation/src/Models/WorkflowProxy.php b/packages/Webkul/Automation/src/Models/WorkflowProxy.php new file mode 100644 index 0000000..36ae76b --- /dev/null +++ b/packages/Webkul/Automation/src/Models/WorkflowProxy.php @@ -0,0 +1,7 @@ +loadMigrationsFrom(__DIR__.'/../Database/Migrations'); + + Event::listen('*', function ($eventName, array $data) { + if (! in_array($eventName, data_get(config('workflows.trigger_entities'), '*.events.*.event'))) { + return; + } + + app(\Webkul\Automation\Listeners\Entity::class)->process($eventName, current($data)); + }); + } + + /** + * Register services. + * + * @return void + */ + public function register() + { + $this->registerConfig(); + } + + /** + * Register package config. + * + * @return void + */ + protected function registerConfig() + { + $this->mergeConfigFrom(dirname(__DIR__).'/Config/workflows.php', 'workflows'); + } +} diff --git a/packages/Webkul/Automation/src/Repositories/WebhookRepository.php b/packages/Webkul/Automation/src/Repositories/WebhookRepository.php new file mode 100644 index 0000000..629f4d7 --- /dev/null +++ b/packages/Webkul/Automation/src/Repositories/WebhookRepository.php @@ -0,0 +1,17 @@ +client = new Client([ + 'timeout' => 30, + 'connect_timeout' => 10, + 'verify' => true, + 'http_errors' => false, + ]); + } + + /** + * Trigger the webhook. + */ + public function triggerWebhook(mixed $data): array + { + if ( + ! isset($data['method']) + || ! isset($data['end_point']) + ) { + return [ + 'status' => 'error', + 'response' => 'Missing required fields: method or end_point', + ]; + } + + $headers = isset($data['headers']) ? $this->parseJsonField($data['headers']) : []; + $payload = isset($data['payload']) ? $data['payload'] : null; + $data['end_point'] = $this->appendQueryParams($data['end_point'], $data['query_params'] ?? ''); + + $formattedHeaders = $this->formatHeaders($headers); + + $options = $this->buildRequestOptions($data['method'], $formattedHeaders, $payload); + + try { + $response = $this->client->request( + strtoupper($data['method']), + $data['end_point'], + $options, + ); + + return [ + 'status' => 'success', + 'response' => $response->getBody()->getContents(), + 'status_code' => $response->getStatusCode(), + 'headers' => $response->getHeaders(), + ]; + } catch (RequestException $e) { + return [ + 'status' => 'error', + 'response' => $e->hasResponse() ? Message::toString($e->getResponse()) : $e->getMessage(), + 'status_code' => $e->hasResponse() ? $e->getResponse()->getStatusCode() : null, + ]; + } + } + + /** + * Parse JSON field safely. + */ + protected function parseJsonField(mixed $field): array + { + if (is_array($field)) { + return $field; + } + + if (is_string($field)) { + $decoded = json_decode($field, true); + + if ( + json_last_error() === JSON_ERROR_NONE + && is_array($decoded) + ) { + return $decoded; + } + } + + return []; + } + + /** + * Build request options based on method and content type. + */ + protected function buildRequestOptions(string $method, array $headers, mixed $payload): array + { + $options = []; + + if (! empty($headers)) { + $options['headers'] = $headers; + } + + if ( + $payload !== null + && ! in_array(strtoupper($method), ['GET', 'HEAD']) + ) { + $contentType = $this->getContentType($headers); + + switch ($contentType) { + case 'application/json': + $options['json'] = $this->prepareJsonPayload($payload); + + break; + + case 'application/x-www-form-urlencoded': + $options['form_params'] = $this->prepareFormPayload($payload); + + break; + + case 'multipart/form-data': + $options['multipart'] = $this->prepareMultipartPayload($payload); + + break; + + case 'text/plain': + case 'text/xml': + case 'application/xml': + $options['body'] = $this->prepareRawPayload($payload); + + break; + + default: + $options = array_merge($options, $this->autoDetectPayloadFormat($payload)); + + break; + } + } + + return $options; + } + + /** + * Prepare JSON payload. + */ + protected function prepareJsonPayload(mixed $payload): mixed + { + if (is_string($payload)) { + $decoded = json_decode($payload, true); + + if (json_last_error() === JSON_ERROR_NONE) { + return $decoded; + } + + return $payload; + } + + if (is_array($payload)) { + return $this->formatPayload($payload); + } + + return $payload; + } + + /** + * Prepare form payload. + */ + protected function prepareFormPayload(mixed $payload): array + { + if (is_string($payload)) { + $decoded = json_decode($payload, true); + + if ( + json_last_error() === JSON_ERROR_NONE + && is_array($decoded) + ) { + return $this->formatPayload($decoded); + } + + parse_str($payload, $parsed); + + return $parsed ?: []; + } + + if (is_array($payload)) { + return $this->formatPayload($payload); + } + + return []; + } + + /** + * Prepare multipart payload. + */ + protected function prepareMultipartPayload(mixed $payload): array + { + $formattedPayload = $this->prepareFormPayload($payload); + + return $this->buildMultipartData($formattedPayload); + } + + /** + * Prepare raw payload. + */ + protected function prepareRawPayload(mixed $payload): string + { + if (is_string($payload)) { + return $payload; + } + + if (is_array($payload)) { + return json_encode($payload); + } + + return (string) $payload; + } + + /** + * Auto-detect payload format when no content-type is specified. + */ + protected function autoDetectPayloadFormat(mixed $payload): array + { + if (is_string($payload)) { + $decoded = json_decode($payload, true); + + if (json_last_error() === JSON_ERROR_NONE) { + return ['json' => $decoded]; + } + + if ( + strpos($payload, '=') !== false + && strpos($payload, '&') !== false + ) { + parse_str($payload, $parsed); + + return ['form_params' => $parsed]; + } + + return ['body' => $payload]; + } + + if (is_array($payload)) { + $formatted = $this->formatPayload($payload); + + return ['json' => $formatted]; + } + + return ['body' => (string) $payload]; + } + + /** + * Get content type from headers. + */ + protected function getContentType(array $headers): string + { + foreach ($headers as $key => $value) { + if (strtolower($key) === 'content-type') { + $contentType = strtolower(trim(explode(';', $value)[0])); + + return $contentType; + } + } + + return ''; + } + + /** + * Build multipart data array. + */ + protected function buildMultipartData(array $payload): array + { + $multipart = []; + + foreach ($payload as $key => $value) { + $multipart[] = [ + 'name' => $key, + 'contents' => is_array($value) ? json_encode($value) : (string) $value, + ]; + } + + return $multipart; + } + + /** + * Format headers array. + */ + protected function formatHeaders(array $headers): array + { + if (empty($headers)) { + return []; + } + + $formattedHeaders = []; + + if ($this->isKeyValuePairArray($headers)) { + foreach ($headers as $header) { + if ( + isset($header['key']) + && array_key_exists('value', $header) + ) { + if ( + isset($header['disabled']) + && $header['disabled'] + ) { + continue; + } + + if ( + isset($header['enabled']) + && ! $header['enabled'] + ) { + continue; + } + + $formattedHeaders[$header['key']] = $header['value']; + } + } + } else { + $formattedHeaders = $headers; + } + + return $formattedHeaders; + } + + /** + * Format any incoming payload into a clean associative array. + */ + protected function formatPayload(mixed $payload): array + { + if (empty($payload)) { + return []; + } + + if ( + is_array($payload) + && isset($payload['key']) + && array_key_exists('value', $payload) + ) { + return [$payload['key'] => $payload['value']]; + } + + if ( + is_array($payload) + && array_is_list($payload) + && $this->isKeyValuePairArray($payload) + ) { + $formatted = []; + + foreach ($payload as $item) { + if ( + isset($item['key']) + && array_key_exists('value', $item) + ) { + if ( + isset($item['disabled']) + && $item['disabled'] + ) { + continue; + } + + if ( + isset($item['enabled']) + && ! $item['enabled'] + ) { + continue; + } + + $formatted[$item['key']] = $item['value']; + } + } + + return $formatted; + } + + return is_array($payload) ? $payload : []; + } + + /** + * Check if array is a key-value pair array. + */ + protected function isKeyValuePairArray(array $array): bool + { + if (empty($array)) { + return false; + } + + if ( + isset($array['key']) + && array_key_exists('value', $array) + ) { + return true; + } + + if (array_is_list($array)) { + return collect($array)->every(fn ($item) => is_array($item) && isset($item['key']) && array_key_exists('value', $item) + ); + } + + return false; + } + + /** + * Append query parameters to the endpoint URL. + */ + protected function appendQueryParams(string $endPoint, string $queryParamsJson): string + { + $queryParams = json_decode($queryParamsJson, true); + + if ( + json_last_error() !== JSON_ERROR_NONE + || ! is_array($queryParams) + ) { + return $endPoint; + } + + $queryArray = []; + + foreach ($queryParams as $param) { + if ( + isset($param['key']) + && array_key_exists('value', $param) + ) { + $queryArray[$param['key']] = $param['value']; + } + } + + $queryString = http_build_query($queryArray); + + $glue = str_contains($endPoint, '?') ? '&' : '?'; + + return $endPoint.($queryString ? $glue.$queryString : ''); + } +} diff --git a/packages/Webkul/Contact/composer.json b/packages/Webkul/Contact/composer.json new file mode 100755 index 0000000..205e43f --- /dev/null +++ b/packages/Webkul/Contact/composer.json @@ -0,0 +1,28 @@ +{ + "name": "krayin/laravel-contact", + "license": "MIT", + "authors": [ + { + "name": "Jitendra Singh", + "email": "jitendra@webkul.com" + } + ], + "require": { + "krayin/laravel-attribute": "^1.0", + "krayin/laravel-core": "^1.0" + }, + "autoload": { + "psr-4": { + "Webkul\\Contact\\": "src/" + } + }, + "extra": { + "laravel": { + "providers": [ + "Webkul\\Contact\\Providers\\ContactServiceProvider" + ], + "aliases": {} + } + }, + "minimum-stability": "dev" +} \ No newline at end of file diff --git a/packages/Webkul/Contact/src/Contracts/Organization.php b/packages/Webkul/Contact/src/Contracts/Organization.php new file mode 100644 index 0000000..50b0e12 --- /dev/null +++ b/packages/Webkul/Contact/src/Contracts/Organization.php @@ -0,0 +1,5 @@ + $this->faker->name(), + 'emails' => [$this->faker->unique()->safeEmail()], + 'contact_numbers' => [$this->faker->randomNumber(9)], + ]; + } +} diff --git a/packages/Webkul/Contact/src/Database/Migrations/2021_04_09_051326_create_organizations_table.php b/packages/Webkul/Contact/src/Database/Migrations/2021_04_09_051326_create_organizations_table.php new file mode 100644 index 0000000..8a2e106 --- /dev/null +++ b/packages/Webkul/Contact/src/Database/Migrations/2021_04_09_051326_create_organizations_table.php @@ -0,0 +1,34 @@ +increments('id'); + $table->string('name'); + $table->json('address')->nullable(); + + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('organizations'); + } +}; diff --git a/packages/Webkul/Contact/src/Database/Migrations/2021_04_09_065617_create_persons_table.php b/packages/Webkul/Contact/src/Database/Migrations/2021_04_09_065617_create_persons_table.php new file mode 100644 index 0000000..fc98d3b --- /dev/null +++ b/packages/Webkul/Contact/src/Database/Migrations/2021_04_09_065617_create_persons_table.php @@ -0,0 +1,37 @@ +increments('id'); + $table->string('name'); + $table->json('emails'); + $table->json('contact_numbers')->nullable(); + + $table->integer('organization_id')->unsigned()->nullable(); + $table->foreign('organization_id')->references('id')->on('organizations')->onDelete('cascade'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('persons'); + } +}; diff --git a/packages/Webkul/Contact/src/Database/Migrations/2021_09_22_194103_add_unique_index_to_name_in_organizations_table.php b/packages/Webkul/Contact/src/Database/Migrations/2021_09_22_194103_add_unique_index_to_name_in_organizations_table.php new file mode 100644 index 0000000..d383cd1 --- /dev/null +++ b/packages/Webkul/Contact/src/Database/Migrations/2021_09_22_194103_add_unique_index_to_name_in_organizations_table.php @@ -0,0 +1,32 @@ +unique('name'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('organizations', function (Blueprint $table) { + $table->dropUnique('organizations_name_unique'); + }); + } +}; diff --git a/packages/Webkul/Contact/src/Database/Migrations/2024_07_31_092951_add_job_title_in_persons_table.php b/packages/Webkul/Contact/src/Database/Migrations/2024_07_31_092951_add_job_title_in_persons_table.php new file mode 100644 index 0000000..ca4514c --- /dev/null +++ b/packages/Webkul/Contact/src/Database/Migrations/2024_07_31_092951_add_job_title_in_persons_table.php @@ -0,0 +1,28 @@ +string('job_title')->nullable(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('persons', function (Blueprint $table) { + $table->dropColumn('job_title'); + }); + } +}; diff --git a/packages/Webkul/Contact/src/Database/Migrations/2024_08_06_145943_create_person_tags_table.php b/packages/Webkul/Contact/src/Database/Migrations/2024_08_06_145943_create_person_tags_table.php new file mode 100644 index 0000000..cd7c7dc --- /dev/null +++ b/packages/Webkul/Contact/src/Database/Migrations/2024_08_06_145943_create_person_tags_table.php @@ -0,0 +1,30 @@ +integer('tag_id')->unsigned(); + $table->foreign('tag_id')->references('id')->on('tags')->onDelete('cascade'); + + $table->integer('person_id')->unsigned(); + $table->foreign('person_id')->references('id')->on('persons')->onDelete('cascade'); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('person_tags'); + } +}; diff --git a/packages/Webkul/Contact/src/Database/Migrations/2024_08_06_161212_create_person_activities_table.php b/packages/Webkul/Contact/src/Database/Migrations/2024_08_06_161212_create_person_activities_table.php new file mode 100644 index 0000000..90917ef --- /dev/null +++ b/packages/Webkul/Contact/src/Database/Migrations/2024_08_06_161212_create_person_activities_table.php @@ -0,0 +1,30 @@ +integer('activity_id')->unsigned(); + $table->foreign('activity_id')->references('id')->on('activities')->onDelete('cascade'); + + $table->integer('person_id')->unsigned(); + $table->foreign('person_id')->references('id')->on('persons')->onDelete('cascade'); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('lead_activities'); + } +}; diff --git a/packages/Webkul/Contact/src/Database/Migrations/2024_08_14_102116_add_user_id_column_in_persons_table.php b/packages/Webkul/Contact/src/Database/Migrations/2024_08_14_102116_add_user_id_column_in_persons_table.php new file mode 100644 index 0000000..069e669 --- /dev/null +++ b/packages/Webkul/Contact/src/Database/Migrations/2024_08_14_102116_add_user_id_column_in_persons_table.php @@ -0,0 +1,30 @@ +integer('user_id')->unsigned()->nullable(); + $table->foreign('user_id')->references('id')->on('users')->onDelete('set null'); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('persons', function (Blueprint $table) { + $table->dropForeign(['user_id']); + $table->dropColumn('user_id'); + }); + } +}; diff --git a/packages/Webkul/Contact/src/Database/Migrations/2024_08_14_102136_add_user_id_column_in_organizations_table.php b/packages/Webkul/Contact/src/Database/Migrations/2024_08_14_102136_add_user_id_column_in_organizations_table.php new file mode 100644 index 0000000..98f2910 --- /dev/null +++ b/packages/Webkul/Contact/src/Database/Migrations/2024_08_14_102136_add_user_id_column_in_organizations_table.php @@ -0,0 +1,30 @@ +integer('user_id')->unsigned()->nullable(); + $table->foreign('user_id')->references('id')->on('users')->onDelete('set null'); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('organizations', function (Blueprint $table) { + $table->dropForeign(['user_id']); + $table->dropColumn('user_id'); + }); + } +}; diff --git a/packages/Webkul/Contact/src/Database/Migrations/2024_09_09_112201_add_unique_id_to_person_table.php b/packages/Webkul/Contact/src/Database/Migrations/2024_09_09_112201_add_unique_id_to_person_table.php new file mode 100644 index 0000000..d6a5b65 --- /dev/null +++ b/packages/Webkul/Contact/src/Database/Migrations/2024_09_09_112201_add_unique_id_to_person_table.php @@ -0,0 +1,41 @@ +string('unique_id')->nullable()->unique(); + }); + + $tableName = DB::getTablePrefix().'persons'; + + DB::statement(" + UPDATE {$tableName} + SET unique_id = CONCAT( + user_id, '|', + organization_id, '|', + JSON_UNQUOTE(JSON_EXTRACT(emails, '$[0].value')), '|', + JSON_UNQUOTE(JSON_EXTRACT(contact_numbers, '$[0].value')) + ) + "); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('persons', function (Blueprint $table) { + $table->dropColumn('unique_id'); + }); + } +}; diff --git a/packages/Webkul/Contact/src/Database/Migrations/2025_03_19_132236_update_organization_id_column_in_persons_table.php b/packages/Webkul/Contact/src/Database/Migrations/2025_03_19_132236_update_organization_id_column_in_persons_table.php new file mode 100644 index 0000000..bb26d4a --- /dev/null +++ b/packages/Webkul/Contact/src/Database/Migrations/2025_03_19_132236_update_organization_id_column_in_persons_table.php @@ -0,0 +1,32 @@ +dropForeign(['organization_id']); + + $table->foreign('organization_id')->references('id')->on('organizations')->onDelete('set null'); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('persons', function (Blueprint $table) { + $table->dropForeign(['organization_id']); + + $table->foreign('organization_id')->references('id')->on('organizations')->onDelete('cascade'); + }); + } +}; diff --git a/packages/Webkul/Contact/src/Models/Organization.php b/packages/Webkul/Contact/src/Models/Organization.php new file mode 100644 index 0000000..bf551be --- /dev/null +++ b/packages/Webkul/Contact/src/Models/Organization.php @@ -0,0 +1,46 @@ + 'array', + ]; + + /** + * The attributes that are mass assignable. + * + * @var array + */ + protected $fillable = [ + 'name', + 'address', + 'user_id', + ]; + + /** + * Get persons. + * + * @return \Illuminate\Database\Eloquent\Relations\HasMany + */ + public function persons() + { + return $this->hasMany(PersonProxy::modelClass()); + } + + /** + * Get the user that owns the lead. + */ + public function user() + { + return $this->belongsTo(UserProxy::modelClass()); + } +} diff --git a/packages/Webkul/Contact/src/Models/OrganizationProxy.php b/packages/Webkul/Contact/src/Models/OrganizationProxy.php new file mode 100644 index 0000000..1e6d9c0 --- /dev/null +++ b/packages/Webkul/Contact/src/Models/OrganizationProxy.php @@ -0,0 +1,7 @@ + 'array', + 'contact_numbers' => 'array', + ]; + + /** + * The attributes that are mass assignable. + * + * @var array + */ + protected $fillable = [ + 'name', + 'emails', + 'contact_numbers', + 'job_title', + 'user_id', + 'organization_id', + 'unique_id', + ]; + + /** + * Get the user that owns the lead. + */ + public function user(): BelongsTo + { + return $this->belongsTo(UserProxy::modelClass()); + } + + /** + * Get the organization that owns the person. + */ + public function organization(): BelongsTo + { + return $this->belongsTo(OrganizationProxy::modelClass()); + } + + /** + * Get the activities. + */ + public function activities(): BelongsToMany + { + return $this->belongsToMany(ActivityProxy::modelClass(), 'person_activities'); + } + + /** + * The tags that belong to the person. + */ + public function tags(): BelongsToMany + { + return $this->belongsToMany(TagProxy::modelClass(), 'person_tags'); + } + + /** + * Get the leads for the person. + */ + public function leads(): HasMany + { + return $this->hasMany(LeadProxy::modelClass(), 'person_id'); + } + + /** + * Create a new factory instance for the model. + */ + protected static function newFactory(): PersonFactory + { + return PersonFactory::new(); + } +} diff --git a/packages/Webkul/Contact/src/Models/PersonProxy.php b/packages/Webkul/Contact/src/Models/PersonProxy.php new file mode 100644 index 0000000..f768f47 --- /dev/null +++ b/packages/Webkul/Contact/src/Models/PersonProxy.php @@ -0,0 +1,7 @@ +loadMigrationsFrom(__DIR__.'/../Database/Migrations'); + } + + /** + * Register services. + * + * @return void + */ + public function register() {} +} diff --git a/packages/Webkul/Contact/src/Providers/ModuleServiceProvider.php b/packages/Webkul/Contact/src/Providers/ModuleServiceProvider.php new file mode 100644 index 0000000..8d58e3f --- /dev/null +++ b/packages/Webkul/Contact/src/Providers/ModuleServiceProvider.php @@ -0,0 +1,13 @@ +attributeValueRepository->save(array_merge($data, [ + 'entity_id' => $organization->id, + ])); + + return $organization; + } + + /** + * Update. + * + * @param int $id + * @param array $attribute + * @return \Webkul\Contact\Contracts\Organization + */ + public function update(array $data, $id, $attributes = []) + { + if (isset($data['user_id'])) { + $data['user_id'] = $data['user_id'] ?: null; + } + + $organization = parent::update($data, $id); + + /** + * If attributes are provided then only save the provided attributes and return. + */ + if (! empty($attributes)) { + $conditions = ['entity_type' => $data['entity_type']]; + + if (isset($data['quick_add'])) { + $conditions['quick_add'] = 1; + } + + $attributes = $this->attributeRepository->where($conditions) + ->whereIn('code', $attributes) + ->get(); + + $this->attributeValueRepository->save(array_merge($data, [ + 'entity_id' => $organization->id, + ]), $attributes); + + return $organization; + } + + $this->attributeValueRepository->save(array_merge($data, [ + 'entity_id' => $organization->id, + ])); + + return $organization; + } + + /** + * Delete organization and it's persons. + * + * @param int $id + * @return @void + */ + public function delete($id) + { + $organization = $this->findOrFail($id); + + DB::transaction(function () use ($organization, $id) { + $this->attributeValueRepository->deleteWhere([ + 'entity_id' => $id, + 'entity_type' => 'organizations', + ]); + + $organization->delete(); + }); + } +} diff --git a/packages/Webkul/Contact/src/Repositories/PersonRepository.php b/packages/Webkul/Contact/src/Repositories/PersonRepository.php new file mode 100644 index 0000000..7556b40 --- /dev/null +++ b/packages/Webkul/Contact/src/Repositories/PersonRepository.php @@ -0,0 +1,184 @@ +sanitizeRequestedPersonData($data); + + if (! empty($data['organization_name'])) { + $organization = $this->fetchOrCreateOrganizationByName($data['organization_name']); + + $data['organization_id'] = $organization->id; + } + + if (isset($data['user_id'])) { + $data['user_id'] = $data['user_id'] ?: null; + } + + $person = parent::create($data); + + $this->attributeValueRepository->save(array_merge($data, [ + 'entity_id' => $person->id, + ])); + + return $person; + } + + /** + * Update. + * + * @return \Webkul\Contact\Contracts\Person + */ + public function update(array $data, $id, $attributes = []) + { + $data = $this->sanitizeRequestedPersonData($data); + + $data['user_id'] = empty($data['user_id']) ? null : $data['user_id']; + + if (! empty($data['organization_name'])) { + $organization = $this->fetchOrCreateOrganizationByName($data['organization_name']); + + $data['organization_id'] = $organization->id; + + unset($data['organization_name']); + } + + $person = parent::update($data, $id); + + /** + * If attributes are provided then only save the provided attributes and return. + */ + if (! empty($attributes)) { + $conditions = ['entity_type' => $data['entity_type']]; + + if (isset($data['quick_add'])) { + $conditions['quick_add'] = 1; + } + + $attributes = $this->attributeRepository->where($conditions) + ->whereIn('code', $attributes) + ->get(); + + $this->attributeValueRepository->save(array_merge($data, [ + 'entity_id' => $person->id, + ]), $attributes); + + return $person; + } + + $this->attributeValueRepository->save(array_merge($data, [ + 'entity_id' => $person->id, + ])); + + return $person; + } + + /** + * Retrieves customers count based on date. + * + * @return int + */ + public function getCustomerCount($startDate, $endDate) + { + return $this + ->whereBetween('created_at', [$startDate, $endDate]) + ->get() + ->count(); + } + + /** + * Fetch or create an organization. + */ + public function fetchOrCreateOrganizationByName(string $organizationName) + { + $organization = $this->organizationRepository->findOneWhere([ + 'name' => $organizationName, + ]); + + return $organization ?: $this->organizationRepository->create([ + 'entity_type' => 'organizations', + 'name' => $organizationName, + ]); + } + + /** + * Sanitize requested person data and return the clean array. + */ + private function sanitizeRequestedPersonData(array $data): array + { + if ( + array_key_exists('organization_id', $data) + && empty($data['organization_id']) + ) { + $data['organization_id'] = null; + } + + $uniqueIdParts = array_filter([ + $data['user_id'] ?? null, + $data['organization_id'] ?? null, + $data['emails'][0]['value'] ?? null, + ]); + + $data['unique_id'] = implode('|', $uniqueIdParts); + + if (isset($data['contact_numbers'])) { + $data['contact_numbers'] = collect($data['contact_numbers'])->filter(fn ($number) => ! is_null($number['value']))->toArray(); + + $data['unique_id'] .= '|'.$data['contact_numbers'][0]['value']; + } + + return $data; + } +} diff --git a/packages/Webkul/Core/composer.json b/packages/Webkul/Core/composer.json new file mode 100755 index 0000000..e7efca4 --- /dev/null +++ b/packages/Webkul/Core/composer.json @@ -0,0 +1,26 @@ +{ + "name": "krayin/laravel-core", + "license": "MIT", + "authors": [ + { + "name": "Jitendra Singh", + "email": "jitendra@webkul.com" + } + ], + "require": { + }, + "autoload": { + "psr-4": { + "Webkul\\Core\\": "src/" + } + }, + "extra": { + "laravel": { + "providers": [ + "Webkul\\Core\\Providers\\CoreServiceProvider" + ], + "aliases": {} + } + }, + "minimum-stability": "dev" +} \ No newline at end of file diff --git a/packages/Webkul/Core/src/Acl.php b/packages/Webkul/Core/src/Acl.php new file mode 100644 index 0000000..11e2829 --- /dev/null +++ b/packages/Webkul/Core/src/Acl.php @@ -0,0 +1,125 @@ +items[] = $aclItem; + } + + /** + * Get all acl items. + */ + public function getItems(): Collection + { + if (! $this->items) { + $this->prepareAclItems(); + } + + return collect($this->items) + ->sortBy('sort') + ->values(); + } + + /** + * Acl Config. + */ + private function getAclConfig(): array + { + static $aclConfig; + + if ($aclConfig) { + return $aclConfig; + } + + $aclConfig = config('acl'); + + return $aclConfig; + } + + /** + * Get all roles. + */ + public function getRoles(): Collection + { + static $roles; + + if ($roles) { + return $roles; + } + + $roles = collect($this->getAclConfig()) + ->mapWithKeys(function ($role) { + if (is_array($role['route'])) { + return collect($role['route'])->mapWithKeys(function ($route) use ($role) { + return [$route => $role['key']]; + }); + } else { + return [$role['route'] => $role['key']]; + } + }); + + return $roles; + } + + /** + * Prepare acl items. + */ + private function prepareAclItems(): void + { + $aclWithDotNotation = []; + + foreach ($this->getAclConfig() as $item) { + $aclWithDotNotation[$item['key']] = $item; + } + + $acl = Arr::undot(Arr::dot($aclWithDotNotation)); + + foreach ($acl as $aclItemKey => $aclItem) { + $subAclItems = $this->processSubAclItems($aclItem); + + $this->addItem(new AclItem( + key: $aclItemKey, + name: trans($aclItem['name']), + route: $aclItem['route'], + sort: $aclItem['sort'], + children: $subAclItems, + )); + } + } + + /** + * Process sub acl items. + */ + private function processSubAclItems($aclItem): Collection + { + return collect($aclItem) + ->sortBy('sort') + ->filter(fn ($value, $key) => is_array($value) && $key !== 'route') + ->map(function ($subAclItem) { + $subSubAclItems = $this->processSubAclItems($subAclItem); + + return new AclItem( + key: $subAclItem['key'], + name: trans($subAclItem['name']), + route: $subAclItem['route'], + sort: $subAclItem['sort'], + children: $subSubAclItems, + ); + }); + } +} diff --git a/packages/Webkul/Core/src/Acl/AclItem.php b/packages/Webkul/Core/src/Acl/AclItem.php new file mode 100644 index 0000000..66b50af --- /dev/null +++ b/packages/Webkul/Core/src/Acl/AclItem.php @@ -0,0 +1,19 @@ + [ + \Webkul\Activity\Providers\ModuleServiceProvider::class, + \Webkul\Admin\Providers\ModuleServiceProvider::class, + \Webkul\Attribute\Providers\ModuleServiceProvider::class, + \Webkul\Automation\Providers\ModuleServiceProvider::class, + \Webkul\Contact\Providers\ModuleServiceProvider::class, + \Webkul\Core\Providers\ModuleServiceProvider::class, + \Webkul\DataGrid\Providers\ModuleServiceProvider::class, + \Webkul\EmailTemplate\Providers\ModuleServiceProvider::class, + \Webkul\Email\Providers\ModuleServiceProvider::class, + \Webkul\Lead\Providers\ModuleServiceProvider::class, + \Webkul\Product\Providers\ModuleServiceProvider::class, + \Webkul\Quote\Providers\ModuleServiceProvider::class, + \Webkul\Tag\Providers\ModuleServiceProvider::class, + \Webkul\User\Providers\ModuleServiceProvider::class, + \Webkul\Warehouse\Providers\ModuleServiceProvider::class, + \Webkul\WebForm\Providers\ModuleServiceProvider::class, + \Webkul\DataTransfer\Providers\ModuleServiceProvider::class, + ], + + 'register_route_models' => true, +]; diff --git a/packages/Webkul/Core/src/Config/cors.php b/packages/Webkul/Core/src/Config/cors.php new file mode 100644 index 0000000..4222c11 --- /dev/null +++ b/packages/Webkul/Core/src/Config/cors.php @@ -0,0 +1,62 @@ + [ + 'admin/web-forms/forms/*', + ], + + /* + * Matches the request method. `['*']` allows all methods. + */ + 'allowed_methods' => ['*'], + + /* + * Matches the request origin. `['*']` allows all origins. Wildcards can be used, eg `*.mydomain.com` + */ + 'allowed_origins' => ['*'], + + /* + * Patterns that can be used with `preg_match` to match the origin. + */ + 'allowed_origins_patterns' => [], + + /* + * Sets the Access-Control-Allow-Headers response header. `['*']` allows all headers. + */ + 'allowed_headers' => ['*'], + + /* + * Sets the Access-Control-Expose-Headers response header with these headers. + */ + 'exposed_headers' => [], + + /* + * Sets the Access-Control-Max-Age response header when > 0. + */ + 'max_age' => 0, + + /* + * Sets the Access-Control-Allow-Credentials header. + */ + 'supports_credentials' => false, +]; diff --git a/packages/Webkul/Core/src/Config/sanctum.php b/packages/Webkul/Core/src/Config/sanctum.php new file mode 100644 index 0000000..c6c6045 --- /dev/null +++ b/packages/Webkul/Core/src/Config/sanctum.php @@ -0,0 +1,65 @@ + explode(',', env('SANCTUM_STATEFUL_DOMAINS', sprintf( + '%s%s', + 'localhost,localhost:3000,127.0.0.1,127.0.0.1:8000,::1', + env('APP_URL') ? ','.parse_url(env('APP_URL'), PHP_URL_HOST) : '' + ))), + + /* + |-------------------------------------------------------------------------- + | Sanctum Guards + |-------------------------------------------------------------------------- + | + | This array contains the authentication guards that will be checked when + | Sanctum is trying to authenticate a request. If none of these guards + | are able to authenticate the request, Sanctum will use the bearer + | token that's present on an incoming request for authentication. + | + */ + + 'guard' => ['user'], + + /* + |-------------------------------------------------------------------------- + | Expiration Minutes + |-------------------------------------------------------------------------- + | + | This value controls the number of minutes until an issued token will be + | considered expired. If this value is null, personal access tokens do + | not expire. This won't tweak the lifetime of first-party sessions. + | + */ + + 'expiration' => null, + + /* + |-------------------------------------------------------------------------- + | Sanctum Middleware + |-------------------------------------------------------------------------- + | + | When authenticating your first-party SPA with Sanctum you may need to + | customize some of the middleware Sanctum uses while processing the + | request. You may change the middleware listed below as required. + | + */ + + 'middleware' => [ + 'verify_csrf_token' => App\Http\Middleware\VerifyCsrfToken::class, + 'encrypt_cookies' => App\Http\Middleware\EncryptCookies::class, + ], + +]; diff --git a/packages/Webkul/Core/src/Console/Commands/Version.php b/packages/Webkul/Core/src/Console/Commands/Version.php new file mode 100644 index 0000000..5f88378 --- /dev/null +++ b/packages/Webkul/Core/src/Console/Commands/Version.php @@ -0,0 +1,42 @@ +comment('v'.core()->version()); + } +} diff --git a/packages/Webkul/Core/src/Contracts/CoreConfig.php b/packages/Webkul/Core/src/Contracts/CoreConfig.php new file mode 100644 index 0000000..6d89520 --- /dev/null +++ b/packages/Webkul/Core/src/Contracts/CoreConfig.php @@ -0,0 +1,5 @@ + $attribute])); + } + } +} diff --git a/packages/Webkul/Core/src/Core.php b/packages/Webkul/Core/src/Core.php new file mode 100644 index 0000000..e1cb6d7 --- /dev/null +++ b/packages/Webkul/Core/src/Core.php @@ -0,0 +1,243 @@ + $title) { + $options[] = [ + 'title' => $title, + 'value' => $key, + ]; + } + + return $options; + } + + /** + * Retrieve all countries. + * + * @return \Illuminate\Support\Collection + */ + public function countries() + { + return $this->countryRepository->all(); + } + + /** + * Returns country name by code. + */ + public function country_name(string $code): string + { + $country = $this->countryRepository->findOneByField('code', $code); + + return $country ? $country->name : ''; + } + + /** + * Returns state name by code. + */ + public function state_name(string $code): string + { + $state = $this->countryStateRepository->findOneByField('code', $code); + + return $state ? $state->name : $code; + } + + /** + * Retrieve all country states. + * + * @return \Illuminate\Support\Collection + */ + public function states(string $countryCode) + { + return $this->countryStateRepository->findByField('country_code', $countryCode); + } + + /** + * Retrieve all grouped states by country code. + * + * @return \Illuminate\Support\Collection + */ + public function groupedStatesByCountries() + { + $collection = []; + + foreach ($this->countryStateRepository->all() as $state) { + $collection[$state->country_code][] = $state->toArray(); + } + + return $collection; + } + + /** + * Retrieve all grouped states by country code. + * + * @return \Illuminate\Support\Collection + */ + public function findStateByCountryCode($countryCode = null, $stateCode = null) + { + $collection = []; + + $collection = $this->countryStateRepository->findByField([ + 'country_code' => $countryCode, + 'code' => $stateCode, + ]); + + if (count($collection)) { + return $collection->first(); + } else { + return false; + } + } + + /** + * Create singleton object through single facade. + * + * @param string $className + * @return mixed + */ + public function getSingletonInstance($className) + { + static $instances = []; + + if (array_key_exists($className, $instances)) { + return $instances[$className]; + } + + return $instances[$className] = app($className); + } + + /** + * Format date + * + * @return string + */ + public function formatDate($date, $format = 'd M Y h:iA') + { + return Carbon::parse($date)->format($format); + } + + /** + * Week range. + * + * @param string $date + * @param int $day + * @return string + */ + public function xWeekRange($date, $day) + { + $ts = strtotime($date); + + if (! $day) { + $start = (date('D', $ts) == 'Sun') ? $ts : strtotime('last sunday', $ts); + + return date('Y-m-d', $start); + } else { + $end = (date('D', $ts) == 'Sat') ? $ts : strtotime('next saturday', $ts); + + return date('Y-m-d', $end); + } + } + + /** + * Return currency symbol from currency code. + * + * @param float $price + * @return string + */ + public function currencySymbol($code) + { + $formatter = new \NumberFormatter(app()->getLocale().'@currency='.$code, \NumberFormatter::CURRENCY); + + return $formatter->getSymbol(\NumberFormatter::CURRENCY_SYMBOL); + } + + /** + * Format price with base currency symbol. This method also give ability to encode + * the base currency symbol and its optional. + * + * @param float $price + * @return string + */ + public function formatBasePrice($price) + { + if (is_null($price)) { + $price = 0; + } + + $formatter = new \NumberFormatter(app()->getLocale(), \NumberFormatter::CURRENCY); + + return $formatter->formatCurrency($price, config('app.currency')); + } + + /** + * Get the config field. + */ + public function getConfigField(string $fieldName): ?array + { + return system_config()->getConfigField($fieldName); + } + + /** + * Retrieve information for configuration. + */ + public function getConfigData(string $field): mixed + { + return system_config()->getConfigData($field); + } +} diff --git a/packages/Webkul/Core/src/Database/Migrations/2021_03_12_060658_create_core_config_table.php b/packages/Webkul/Core/src/Database/Migrations/2021_03_12_060658_create_core_config_table.php new file mode 100755 index 0000000..9c5f6cc --- /dev/null +++ b/packages/Webkul/Core/src/Database/Migrations/2021_03_12_060658_create_core_config_table.php @@ -0,0 +1,33 @@ +increments('id'); + $table->string('code'); + $table->string('value'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('core_config'); + } +}; diff --git a/packages/Webkul/Core/src/Database/Migrations/2021_04_12_173232_create_countries_table.php b/packages/Webkul/Core/src/Database/Migrations/2021_04_12_173232_create_countries_table.php new file mode 100644 index 0000000..274e574 --- /dev/null +++ b/packages/Webkul/Core/src/Database/Migrations/2021_04_12_173232_create_countries_table.php @@ -0,0 +1,32 @@ +increments('id'); + $table->string('code'); + $table->string('name'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('countries'); + } +}; diff --git a/packages/Webkul/Core/src/Database/Migrations/2021_04_12_173344_create_country_states_table.php b/packages/Webkul/Core/src/Database/Migrations/2021_04_12_173344_create_country_states_table.php new file mode 100644 index 0000000..5939026 --- /dev/null +++ b/packages/Webkul/Core/src/Database/Migrations/2021_04_12_173344_create_country_states_table.php @@ -0,0 +1,36 @@ +increments('id'); + $table->string('country_code'); + $table->string('code'); + $table->string('name'); + + $table->integer('country_id')->unsigned(); + $table->foreign('country_id')->references('id')->on('countries')->onDelete('cascade'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('country_states'); + } +}; diff --git a/packages/Webkul/Core/src/Database/Migrations/2025_01_29_133500_update_text_column_type_in_core_config_table.php b/packages/Webkul/Core/src/Database/Migrations/2025_01_29_133500_update_text_column_type_in_core_config_table.php new file mode 100644 index 0000000..2312701 --- /dev/null +++ b/packages/Webkul/Core/src/Database/Migrations/2025_01_29_133500_update_text_column_type_in_core_config_table.php @@ -0,0 +1,28 @@ +text('value')->change(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('core_config', function (Blueprint $table) { + $table->string('value')->change(); + }); + } +}; diff --git a/packages/Webkul/Core/src/Eloquent/Repository.php b/packages/Webkul/Core/src/Eloquent/Repository.php new file mode 100755 index 0000000..fdce1a7 --- /dev/null +++ b/packages/Webkul/Core/src/Eloquent/Repository.php @@ -0,0 +1,146 @@ +findByField($field, $value, $columns = ['*']); + + return $model->first(); + } + + /** + * Find data by field and value + * + * @param string $field + * @param string $value + * @param array $columns + * @return mixed + */ + public function findOneWhere(array $where, $columns = ['*']) + { + $model = $this->findWhere($where, $columns); + + return $model->first(); + } + + /** + * Find data by id + * + * @param int $id + * @param array $columns + * @return mixed + */ + public function find($id, $columns = ['*']) + { + $this->applyCriteria(); + $this->applyScope(); + $model = $this->model->find($id, $columns); + $this->resetModel(); + + return $this->parserResult($model); + } + + /** + * Find data by id + * + * @param int $id + * @param array $columns + * @return mixed + */ + public function findOrFail($id, $columns = ['*']) + { + $this->applyCriteria(); + $this->applyScope(); + $model = $this->model->findOrFail($id, $columns); + $this->resetModel(); + + return $this->parserResult($model); + } + + /** + * Count results of repository + * + * @param string $columns + * @return int + */ + public function count(array $where = [], $columns = '*') + { + $this->applyCriteria(); + $this->applyScope(); + + if ($where) { + $this->applyConditions($where); + } + + $result = $this->model->count($columns); + $this->resetModel(); + $this->resetScope(); + + return $result; + } + + /** + * @param string $columns + * @return mixed + */ + public function sum($columns) + { + $this->applyCriteria(); + $this->applyScope(); + + $sum = $this->model->sum($columns); + $this->resetModel(); + + return $sum; + } + + /** + * @param string $columns + * @return mixed + */ + public function avg($columns) + { + $this->applyCriteria(); + $this->applyScope(); + + $avg = $this->model->avg($columns); + $this->resetModel(); + + return $avg; + } + + /** + * @return mixed + */ + public function getModel($data = []) + { + return $this->model; + } + + /** + * @throws RepositoryException + */ + public function resetModel() + { + $this->makeModel(); + + return $this; + } +} diff --git a/packages/Webkul/Core/src/Eloquent/TranslatableModel.php b/packages/Webkul/Core/src/Eloquent/TranslatableModel.php new file mode 100755 index 0000000..8d824c7 --- /dev/null +++ b/packages/Webkul/Core/src/Eloquent/TranslatableModel.php @@ -0,0 +1,23 @@ +defaultLocale) { + return $this->defaultLocale; + } + + return config('translatable.locale') ?: app()->make('translator')->getLocale(); + } +} diff --git a/packages/Webkul/Core/src/Exceptions/ViterNotFound.php b/packages/Webkul/Core/src/Exceptions/ViterNotFound.php new file mode 100755 index 0000000..5a7071a --- /dev/null +++ b/packages/Webkul/Core/src/Exceptions/ViterNotFound.php @@ -0,0 +1,17 @@ +getLocale(); + + $path = __DIR__."/../../../$packageName/src/Resources/lang/$currentLocale/app.php"; + + if (is_string($path) && is_readable($path)) { + return include $path; + } else { + $currentLocale = 'en'; + + $path = __DIR__."/../../../$packageName/src/Resources/lang/$currentLocale/app.php"; + + return include $path; + } + } +} diff --git a/packages/Webkul/Core/src/Http/Controllers/CoreController.php b/packages/Webkul/Core/src/Http/Controllers/CoreController.php new file mode 100644 index 0000000..6741e03 --- /dev/null +++ b/packages/Webkul/Core/src/Http/Controllers/CoreController.php @@ -0,0 +1,40 @@ +_config = request('_config'); + } + + /** + * Display a listing of the resource. + * + * @return \Illuminate\Http\Response + */ + public function index() + { + return view($this->_config['view'], $this->_config); + } +} diff --git a/packages/Webkul/Core/src/Http/helpers.php b/packages/Webkul/Core/src/Http/helpers.php new file mode 100755 index 0000000..9ab57a1 --- /dev/null +++ b/packages/Webkul/Core/src/Http/helpers.php @@ -0,0 +1,74 @@ +singleton(ViewRenderEventManager::class); + + $viewEventManager = app()->make(ViewRenderEventManager::class); + + $viewEventManager->handleRenderEvent($eventName, $params); + + return $viewEventManager->render(); + } +} + +if (! function_exists('vite')) { + /** + * Vite helper. + */ + function vite(): Vite + { + return app(Vite::class); + } +} diff --git a/packages/Webkul/Core/src/Menu.php b/packages/Webkul/Core/src/Menu.php new file mode 100644 index 0000000..101e705 --- /dev/null +++ b/packages/Webkul/Core/src/Menu.php @@ -0,0 +1,188 @@ +items[] = $menuItem; + } + + /** + * Get all menu items. + */ + public function getItems(?string $area = null, string $key = ''): Collection + { + if (! $area) { + throw new \Exception('Area must be provided to get menu items.'); + } + + static $items; + + if ($items) { + return $items; + } + + $configMenu = collect(config("menu.$area"))->map(function ($item) { + return Arr::except([ + ...$item, + 'url' => route($item['route'], $item['params'] ?? []), + ], ['params']); + }); + + switch ($area) { + case self::ADMIN: + $this->configMenu = $configMenu + ->filter(fn ($item) => bouncer()->hasPermission($item['key'])) + ->toArray(); + break; + + default: + $this->configMenu = $configMenu->toArray(); + + break; + } + + if (! $this->items) { + $this->prepareMenuItems(); + } + + $items = collect($this->items)->sortBy(fn ($item) => $item->getPosition()); + + return $items; + } + + /** + * Get admin menu by key or keys. + */ + public function getAdminMenuByKey(array|string $keys): mixed + { + $items = $this->getItems('admin'); + + $keysArray = (array) $keys; + + $filteredItems = $items->filter(fn ($item) => in_array($item->getKey(), $keysArray)); + + return is_array($keys) ? $filteredItems : $filteredItems->first(); + } + + /** + * Prepare menu items. + */ + private function prepareMenuItems(): void + { + $menuWithDotNotation = []; + + foreach ($this->configMenu as $item) { + if (strpos(request()->url(), route($item['route'])) !== false) { + $this->currentKey = $item['key']; + } + + $menuWithDotNotation[$item['key']] = $item; + } + + $menu = Arr::undot(Arr::dot($menuWithDotNotation)); + + foreach ($menu as $menuItemKey => $menuItem) { + $this->addItem(new MenuItem( + key: $menuItemKey, + name: trans($menuItem['name']), + route: $menuItem['route'], + url: $menuItem['url'], + sort: $menuItem['sort'], + icon: $menuItem['icon-class'], + info: trans($menuItem['info'] ?? ''), + children: $this->processSubMenuItems($menuItem), + )); + } + } + + /** + * Process sub menu items. + */ + private function processSubMenuItems($menuItem): Collection + { + return collect($menuItem) + ->sortBy('sort') + ->filter(fn ($value) => is_array($value)) + ->map(function ($subMenuItem) { + $subSubMenuItems = $this->processSubMenuItems($subMenuItem); + + return new MenuItem( + key: $subMenuItem['key'], + name: trans($subMenuItem['name']), + route: $subMenuItem['route'], + url: $subMenuItem['url'], + sort: $subMenuItem['sort'], + icon: $subMenuItem['icon-class'], + info: trans($subMenuItem['info'] ?? ''), + children: $subSubMenuItems, + ); + }); + } + + /** + * Get current active menu. + */ + public function getCurrentActiveMenu(?string $area = null): ?MenuItem + { + $currentKey = implode('.', array_slice(explode('.', $this->currentKey), 0, 2)); + + return $this->findMatchingItem($this->getItems($area), $currentKey); + } + + /** + * Finding the matching item. + */ + private function findMatchingItem($items, $currentKey): ?MenuItem + { + foreach ($items as $item) { + if ($item->key == $currentKey) { + return $item; + } + + if ($item->haveChildren()) { + $matchingChild = $this->findMatchingItem($item->getChildren(), $currentKey); + + if ($matchingChild) { + return $matchingChild; + } + } + } + + return null; + } +} diff --git a/packages/Webkul/Core/src/Menu/MenuItem.php b/packages/Webkul/Core/src/Menu/MenuItem.php new file mode 100644 index 0000000..c185488 --- /dev/null +++ b/packages/Webkul/Core/src/Menu/MenuItem.php @@ -0,0 +1,200 @@ +name = $name; + + return $this; + } + + /** + * Get name of menu item. + */ + public function getName(): string + { + return $this->name; + } + + /** + * Set position of menu item. + */ + public function setPosition(int $sort): self + { + $this->sort = $sort; + + return $this; + } + + /** + * Get position of menu item. + */ + public function getPosition() + { + return $this->sort; + } + + /** + * Set icon of menu item. + */ + public function setIcon(string $icon): self + { + $this->icon = $icon; + + return $this; + } + + /** + * Get the icon of menu item. + */ + public function getIcon(): string + { + return $this->icon; + } + + /** + * Set info of menu item. + */ + public function setInfo(string $info): self + { + $this->info = $info; + + return $this; + } + + /** + * Get info of menu item. + */ + public function getInfo(): string + { + return $this->info; + } + + /** + * Set route of menu item. + */ + public function setRoute(string $route): self + { + $this->route = $route; + + return $this; + } + + /** + * Get current route. + */ + public function getRoute(): string + { + return $this->route; + } + + /** + * Set url of menu item. + */ + public function setUrl(string $url): self + { + $this->url = $url; + + return $this; + } + + /** + * Get the url of the menu item. + */ + public function getUrl(): string + { + return $this->url; + } + + /** + * Set the key of the menu item. + */ + public function setKey(string $key): self + { + $this->key = $key; + + return $this; + } + + /** + * Get the key of the menu item. + */ + public function getKey(): string + { + return $this->key; + } + + /** + * Set children of menu item. + */ + public function setChildren(Collection $children): self + { + $this->children = $children; + + return $this; + } + + /** + * Check weather menu item have children or not. + */ + public function haveChildren(): bool + { + return $this->children->isNotEmpty(); + } + + /** + * Get children of menu item. + */ + public function getChildren(): Collection + { + if (! $this->haveChildren()) { + return collect(); + } + + return $this->children; + } + + /** + * Check weather menu item is active or not. + */ + public function isActive(): bool + { + if (request()->fullUrlIs($this->getUrl().'*')) { + return true; + } + + if ($this->haveChildren()) { + foreach ($this->getChildren() as $child) { + if ($child->isActive()) { + return true; + } + } + } + + return false; + } +} diff --git a/packages/Webkul/Core/src/Models/CoreConfig.php b/packages/Webkul/Core/src/Models/CoreConfig.php new file mode 100755 index 0000000..dca3c85 --- /dev/null +++ b/packages/Webkul/Core/src/Models/CoreConfig.php @@ -0,0 +1,24 @@ +areMigrationsEnabled()) { + $this->registerMigrations(); + } + + if ($this->areModelsEnabled()) { + $this->registerModels(); + $this->registerEnums(); + $this->registerRequestTypes(); + } + + if ($this->areViewsEnabled()) { + $this->registerViews(); + } + + if ($routes = $this->config('routes', true)) { + $this->registerRoutes($routes); + } + } +} diff --git a/packages/Webkul/Core/src/Providers/CoreServiceProvider.php b/packages/Webkul/Core/src/Providers/CoreServiceProvider.php new file mode 100644 index 0000000..0eaaa5a --- /dev/null +++ b/packages/Webkul/Core/src/Providers/CoreServiceProvider.php @@ -0,0 +1,90 @@ +loadMigrationsFrom(__DIR__.'/../Database/Migrations'); + + $this->loadTranslationsFrom(__DIR__.'/../Resources/lang', 'core'); + + $this->publishes([ + dirname(__DIR__).'/Config/concord.php' => config_path('concord.php'), + dirname(__DIR__).'/Config/cors.php' => config_path('cors.php'), + dirname(__DIR__).'/Config/sanctum.php' => config_path('sanctum.php'), + ]); + } + + /** + * Register services. + * + * @return void + */ + public function register() + { + $this->registerCommands(); + + $this->registerFacades(); + } + + /** + * Register Bouncer as a singleton. + * + * @return void + */ + protected function registerFacades() + { + $loader = AliasLoader::getInstance(); + + $loader->alias('acl', AclFacade::class); + + $loader->alias('core', CoreFacade::class); + + $loader->alias('system_config', SystemConfigFacade::class); + + $loader->alias('menu', MenuFacade::class); + + $this->app->singleton('acl', fn () => app(Acl::class)); + + $this->app->singleton('core', fn () => app(Core::class)); + + $this->app->singleton('system_config', fn () => app()->make(SystemConfig::class)); + + $this->app->singleton('menu', fn () => app()->make(Menu::class)); + } + + /** + * Register the console commands of this package. + */ + protected function registerCommands(): void + { + if ($this->app->runningInConsole()) { + $this->commands([ + Version::class, + ]); + } + } +} diff --git a/packages/Webkul/Core/src/Providers/ModuleServiceProvider.php b/packages/Webkul/Core/src/Providers/ModuleServiceProvider.php new file mode 100644 index 0000000..fb94d3f --- /dev/null +++ b/packages/Webkul/Core/src/Providers/ModuleServiceProvider.php @@ -0,0 +1,12 @@ +getTitle()) + ) { + return trans($configuration->getTitle()); + } + + if ( + method_exists($configuration, 'getName') + && ! is_null($configuration->getName()) + ) { + return trans($configuration->getName()); + } + + return ''; + } + + /** + * Get children and fields. + */ + protected function getChildrenAndFields(mixed $configuration, string $searchTerm, array $path, array &$results): void + { + if ( + method_exists($configuration, 'getChildren') + || method_exists($configuration, 'getFields') + ) { + $children = $configuration->haveChildren() + ? $configuration->getChildren() + : $configuration->getFields(); + + $tempPath = array_merge($path, [[ + 'key' => $configuration->getKey() ?? null, + 'title' => $this->getTranslatedTitle($configuration), + ]]); + + $results = array_merge($results, $this->search($children, $searchTerm, $tempPath)); + } + } + + /** + * Search configuration. + * + * @param array $items + */ + public function search(Collection $items, string $searchTerm, array $path = []): array + { + $results = []; + + foreach ($items as $configuration) { + $title = $this->getTranslatedTitle($configuration); + + if ( + stripos($title, $searchTerm) !== false + && count($path) + ) { + $queryParam = $path[1]['key'] ?? $configuration->getKey(); + + $results[] = [ + 'title' => implode(' > ', [...Arr::pluck($path, 'title'), $title]), + 'url' => route('admin.configuration.index', Str::replace('.', '/', $queryParam)), + ]; + } + + $this->getChildrenAndFields($configuration, $searchTerm, $path, $results); + } + + return $results; + } + + /** + * Create core configuration. + */ + public function create(array $data): void + { + unset($data['_token']); + + $preparedData = []; + + foreach ($data as $method => $fieldData) { + $recursiveData = $this->recursiveArray($fieldData, $method); + + foreach ($recursiveData as $fieldName => $value) { + if ( + is_array($value) + && isset($value['delete']) + ) { + $coreConfigValues = $this->model->where('code', $fieldName)->get(); + + if ($coreConfigValues->isNotEmpty()) { + foreach ($coreConfigValues as $coreConfig) { + if (! empty($coreConfig['value'])) { + Storage::delete($coreConfig['value']); + } + + parent::delete($coreConfig['id']); + } + } + + continue; + } + } + + foreach ($recursiveData as $fieldName => $value) { + if (is_array($value)) { + foreach ($value as $key => $val) { + $fieldNameWithKey = $fieldName.'.'.$key; + + $coreConfigValues = $this->model->where('code', $fieldNameWithKey)->get(); + + if (request()->hasFile($fieldNameWithKey)) { + $val = request()->file($fieldNameWithKey)->store('configuration'); + } + + if ($coreConfigValues->isNotEmpty()) { + foreach ($coreConfigValues as $coreConfig) { + if (request()->hasFile($fieldNameWithKey)) { + Storage::delete($coreConfig['value']); + } + + parent::update(['code' => $fieldNameWithKey, 'value' => $val], $coreConfig->id); + } + } else { + parent::create(['code' => $fieldNameWithKey, 'value' => $val]); + } + } + } else { + if (request()->hasFile($fieldName)) { + $value = request()->file($fieldName)->store('configuration'); + } + + $preparedData[] = [ + 'code' => $fieldName, + 'value' => $value, + ]; + } + } + } + + if (! empty($preparedData)) { + foreach ($preparedData as $dataItem) { + $coreConfigValues = $this->model->where('code', $dataItem['code'])->get(); + + if ($coreConfigValues->isNotEmpty()) { + foreach ($coreConfigValues as $coreConfig) { + parent::update($dataItem, $coreConfig->id); + } + } else { + parent::create($dataItem); + } + } + } + + Event::dispatch('core.configuration.save.after'); + } + + /** + * Recursive array. + */ + public function recursiveArray(array $formData, string $method): array + { + static $data = []; + + static $recursiveArrayData = []; + + foreach ($formData as $form => $formValue) { + $value = $method.'.'.$form; + + if (is_array($formValue)) { + $dim = $this->countDim($formValue); + + if ($dim > 1) { + $this->recursiveArray($formValue, $value); + } elseif ($dim == 1) { + $data[$value] = $formValue; + } + } + } + + foreach ($data as $key => $value) { + $field = core()->getConfigField($key); + + if ($field) { + $recursiveArrayData[$key] = $value; + } else { + foreach ($value as $key1 => $val) { + $recursiveArrayData[$key.'.'.$key1] = $val; + } + } + } + + return $recursiveArrayData; + } + + /** + * Return dimension of the array. + */ + public function countDim(array|string $array): int + { + if (is_array(reset($array))) { + $return = $this->countDim(reset($array)) + 1; + } else { + $return = 1; + } + + return $return; + } +} diff --git a/packages/Webkul/Core/src/Repositories/CountryRepository.php b/packages/Webkul/Core/src/Repositories/CountryRepository.php new file mode 100755 index 0000000..17b52c3 --- /dev/null +++ b/packages/Webkul/Core/src/Repositories/CountryRepository.php @@ -0,0 +1,21 @@ + [ + 'code' => 'يجب أن يكون الحقل رمزًا صالحًا.', + 'decimal' => 'يجب أن يكون الحقل رقمًا عشريًا.', + ], +]; diff --git a/packages/Webkul/Core/src/Resources/lang/en/app.php b/packages/Webkul/Core/src/Resources/lang/en/app.php new file mode 100644 index 0000000..5ee31a3 --- /dev/null +++ b/packages/Webkul/Core/src/Resources/lang/en/app.php @@ -0,0 +1,8 @@ + [ + 'code' => 'The field must be a valid code.', + 'decimal' => 'The field must be a decimal number.', + ], +]; diff --git a/packages/Webkul/Core/src/Resources/lang/es/app.php b/packages/Webkul/Core/src/Resources/lang/es/app.php new file mode 100644 index 0000000..712979d --- /dev/null +++ b/packages/Webkul/Core/src/Resources/lang/es/app.php @@ -0,0 +1,8 @@ + [ + 'code' => 'El campo debe ser un código válido.', + 'decimal' => 'El campo debe ser un número decimal.', + ], +]; diff --git a/packages/Webkul/Core/src/Resources/lang/fa/app.php b/packages/Webkul/Core/src/Resources/lang/fa/app.php new file mode 100644 index 0000000..a0e8ed0 --- /dev/null +++ b/packages/Webkul/Core/src/Resources/lang/fa/app.php @@ -0,0 +1,8 @@ + [ + 'code' => 'این فیلد باید یک کد معتبر باشد.', + 'decimal' => 'این فیلد باید یک عدد اعشاری باشد.', + ], +]; diff --git a/packages/Webkul/Core/src/Resources/lang/pt_BR/app.php b/packages/Webkul/Core/src/Resources/lang/pt_BR/app.php new file mode 100644 index 0000000..b0b0248 --- /dev/null +++ b/packages/Webkul/Core/src/Resources/lang/pt_BR/app.php @@ -0,0 +1,8 @@ + [ + 'code' => 'O campo deve ser um código válido.', + 'decimal' => 'O campo deve ser um número decimal.', + ], +]; diff --git a/packages/Webkul/Core/src/Resources/lang/tr/app.php b/packages/Webkul/Core/src/Resources/lang/tr/app.php new file mode 100644 index 0000000..e02290c --- /dev/null +++ b/packages/Webkul/Core/src/Resources/lang/tr/app.php @@ -0,0 +1,8 @@ + [ + 'code' => 'Alan geçerli bir kod olmalıdır.', + 'decimal' => 'Alan ondalık bir sayı olmalıdır.', + ], +]; diff --git a/packages/Webkul/Core/src/Resources/lang/vi/app.php b/packages/Webkul/Core/src/Resources/lang/vi/app.php new file mode 100644 index 0000000..9948b25 --- /dev/null +++ b/packages/Webkul/Core/src/Resources/lang/vi/app.php @@ -0,0 +1,8 @@ + [ + 'code' => 'Trường phải là một mã hợp lệ.', + 'decimal' => 'Trường phải là một số thập phân.', + ], +]; diff --git a/packages/Webkul/Core/src/SystemConfig.php b/packages/Webkul/Core/src/SystemConfig.php new file mode 100644 index 0000000..f13f663 --- /dev/null +++ b/packages/Webkul/Core/src/SystemConfig.php @@ -0,0 +1,188 @@ +items[] = $item; + } + + /** + * Get all configuration items. + */ + public function getItems(): Collection + { + if (! $this->items) { + $this->prepareConfigurationItems(); + } + + return collect($this->items) + ->sortBy('sort'); + } + + /** + * Retrieve Core Config + */ + private function retrieveCoreConfig(): array + { + static $items; + + if ($items) { + return $items; + } + + return $items = config('core_config'); + } + + /** + * Prepare configuration items. + */ + public function prepareConfigurationItems() + { + $configWithDotNotation = []; + + foreach ($this->retrieveCoreConfig() as $item) { + $configWithDotNotation[$item['key']] = $item; + } + + $configs = Arr::undot(Arr::dot($configWithDotNotation)); + + foreach ($configs as $configItem) { + $subConfigItems = $this->processSubConfigItems($configItem); + + $this->addItem(new Item( + children: $subConfigItems, + fields: $configItem['fields'] ?? null, + icon: $configItem['icon'] ?? null, + key: $configItem['key'], + name: trans($configItem['name']), + route: $configItem['route'] ?? null, + info: trans($configItem['info']) ?? null, + sort: $configItem['sort'], + )); + } + } + + /** + * Process sub config items. + */ + private function processSubConfigItems($configItem): Collection + { + return collect($configItem) + ->sortBy('sort') + ->filter(fn ($value) => is_array($value) && isset($value['name'])) + ->map(function ($subConfigItem) { + $configItemChildren = $this->processSubConfigItems($subConfigItem); + + return new Item( + children: $configItemChildren, + fields: $subConfigItem['fields'] ?? null, + icon: $subConfigItem['icon'] ?? null, + key: $subConfigItem['key'], + name: trans($subConfigItem['name']), + info: trans($subConfigItem['info']) ?? null, + route: $subConfigItem['route'] ?? null, + sort: $subConfigItem['sort'] ?? null, + ); + }); + } + + /** + * Get active configuration item. + */ + public function getActiveConfigurationItem(): ?Item + { + if (! $slug = request()->route('slug')) { + return null; + } + + $activeItem = $this->getItems()->where('key', $slug)->first() ?? null; + + if (! $activeItem) { + return null; + } + + if ($slug2 = request()->route('slug2')) { + $activeItem = $activeItem->getChildren()[$slug2]; + } + + return $activeItem; + } + + /** + * Get config field. + */ + public function getConfigField(string $fieldName): ?array + { + foreach ($this->retrieveCoreConfig() as $coreData) { + if (! isset($coreData['fields'])) { + continue; + } + + foreach ($coreData['fields'] as $field) { + $name = $coreData['key'].'.'.$field['name']; + + if ($name == $fieldName) { + return $field; + } + } + } + + return null; + } + + /** + * Get default config. + */ + private function getDefaultConfig(string $field): mixed + { + $configFieldInfo = $this->getConfigField($field); + + $fields = explode('.', $field); + + array_shift($fields); + + $field = implode('.', $fields); + + return Config::get($field, $configFieldInfo['default'] ?? null); + } + + /** + * Retrieve information for configuration + */ + public function getConfigData(string $field): mixed + { + $coreConfigValue = $this->coreConfigRepository->findOneWhere([ + 'code' => $field, + ]); + + if (! $coreConfigValue) { + return $this->getDefaultConfig($field); + } + + return $coreConfigValue->value; + } +} diff --git a/packages/Webkul/Core/src/SystemConfig/Item.php b/packages/Webkul/Core/src/SystemConfig/Item.php new file mode 100644 index 0000000..5cc096c --- /dev/null +++ b/packages/Webkul/Core/src/SystemConfig/Item.php @@ -0,0 +1,123 @@ +name ?? ''; + } + + /** + * Format options. + */ + private function formatOptions($options) + { + return is_array($options) ? $options : (is_string($options) ? $options : []); + } + + /** + * Get fields of config item. + */ + public function getFields(): Collection + { + return collect($this->fields)->map(function ($field) { + return new ItemField( + item_key: $this->key, + name: $field['name'], + title: $field['title'], + info: $field['info'] ?? null, + type: $field['type'], + depends: $field['depends'] ?? null, + path: $field['path'] ?? null, + validation: $field['validation'] ?? null, + default: $field['default'] ?? null, + channel_based: $field['channel_based'] ?? null, + locale_based: $field['locale_based'] ?? null, + options: $this->formatOptions($field['options'] ?? null), + tinymce: $field['tinymce'] ?? false, + is_visible: true, + ); + }); + } + + /** + * Get name of config item. + */ + public function getInfo(): ?string + { + return $this->info; + } + + /** + * Get current route. + */ + public function getRoute(): string + { + return $this->route; + } + + /** + * Get the url of the config item. + */ + public function getUrl(): string + { + return route($this->getRoute()); + } + + /** + * Get the key of the config item. + */ + public function getKey(): string + { + return $this->key; + } + + /** + * Get Icon. + */ + public function getIcon(): ?string + { + return $this->icon; + } + + /** + * Check weather config item have children or not. + */ + public function haveChildren(): bool + { + return $this->children->isNotEmpty(); + } + + /** + * Get children of config item. + */ + public function getChildren(): Collection + { + if (! $this->haveChildren()) { + return collect(); + } + + return $this->children; + } +} diff --git a/packages/Webkul/Core/src/SystemConfig/ItemField.php b/packages/Webkul/Core/src/SystemConfig/ItemField.php new file mode 100644 index 0000000..0b33460 --- /dev/null +++ b/packages/Webkul/Core/src/SystemConfig/ItemField.php @@ -0,0 +1,244 @@ + 'min_value', + ]; + + /** + * Create a new ItemField instance. + */ + public function __construct( + public string $item_key, + public string $name, + public string $title, + public ?string $info, + public string $type, + public ?string $path, + public ?string $validation, + public ?string $depends, + public ?string $default, + public ?bool $channel_based, + public ?bool $locale_based, + public array|string $options, + public bool $is_visible = true, + public bool $tinymce = false, + ) { + $this->options = $this->getOptions(); + } + + /** + * Get name of config item. + */ + public function getName(): ?string + { + return $this->name; + } + + /** + * Get info of config item. + */ + public function getInfo(): ?string + { + return $this->info ?? ''; + } + + /** + * Get title of config item. + */ + public function getTitle(): ?string + { + return $this->title ?? ''; + } + + /** + * Determine if the field should use TinyMCE. + */ + public function getTinymce(): bool + { + return $this->tinymce; + } + + /** + * Get type of config item. + */ + public function getType(): string + { + return $this->type; + } + + /** + * Get path of config item. + */ + public function getPath(): ?string + { + return $this->path; + } + + /** + * Get item key of config item. + */ + public function getItemKey(): string + { + return $this->item_key; + } + + /** + * Get validation of config item. + */ + public function getValidations(): ?string + { + if (empty($this->validation)) { + return ''; + } + + foreach ($this->veeValidateMappings as $laravelRule => $veeValidateRule) { + $this->validation = str_replace($laravelRule, $veeValidateRule, $this->validation); + } + + return $this->validation; + } + + /** + * Get depends of config item. + */ + public function getDepends(): ?string + { + return $this->depends; + } + + /** + * Get default value of config item. + */ + public function getDefault(): ?string + { + return $this->default; + } + + /** + * Get channel based of config item. + */ + public function getChannelBased(): ?bool + { + return $this->channel_based; + } + + /** + * Get locale based of config item. + */ + public function getLocaleBased(): ?bool + { + return $this->locale_based; + } + + /** + * Get name field for forms in configuration page. + */ + public function getNameKey(): string + { + return $this->item_key.'.'.$this->name; + } + + /** + * Check if the field is required. + */ + public function isRequired(): string + { + return Str::contains($this->getValidations(), 'required') ? 'required' : ''; + } + + /** + * Get options of config item. + */ + public function getOptions(): array + { + if (is_array($this->options)) { + return collect($this->options)->map(fn ($option) => [ + 'title' => trans($option['title']), + 'value' => $option['value'], + ])->toArray(); + } + + return collect($this->getFieldOptions($this->options))->map(fn ($option) => [ + 'title' => trans($option['title']), + 'value' => $option['value'], + ])->toArray(); + } + + /** + * Convert the field to an array. + */ + public function toArray() + { + return [ + 'name' => $this->getName(), + 'title' => $this->getTitle(), + 'info' => $this->getInfo(), + 'type' => $this->getType(), + 'path' => $this->getPath(), + 'depends' => $this->getDepends(), + 'validation' => $this->getValidations(), + 'default' => $this->getDefault(), + 'channel_based' => $this->getChannelBased(), + 'locale_based' => $this->getLocaleBased(), + 'options' => $this->getOptions(), + 'item_key' => $this->getItemKey(), + 'tinymce' => $this->getTinymce(), + ]; + } + + /** + * Get name field for forms in configuration page. + * + * @param string $key + * @return string + */ + public function getNameField($key = null) + { + if (! $key) { + $key = $this->item_key.'.'.$this->name; + } + + $nameField = ''; + + foreach (explode('.', $key) as $key => $field) { + $nameField .= $key === 0 ? $field : '['.$field.']'; + } + + return $nameField; + } + + /** + * Get depend the field name. + */ + public function getDependFieldName(): string + { + if (empty($depends = $this->getDepends())) { + return ''; + } + + $dependNameKey = $this->getItemKey().'.'.collect(explode(':', $depends))->first(); + + return $this->getNameField($dependNameKey); + } + + /** + * Returns the select options for the field. + */ + protected function getFieldOptions(string $options): array + { + [$class, $method] = Str::parseCallback($options); + + return app($class)->$method(); + } +} diff --git a/packages/Webkul/Core/src/Traits/PDFHandler.php b/packages/Webkul/Core/src/Traits/PDFHandler.php new file mode 100644 index 0000000..ad0709a --- /dev/null +++ b/packages/Webkul/Core/src/Traits/PDFHandler.php @@ -0,0 +1,65 @@ +getLocale(), ['ar', 'he'])) { + $mPDF = new Mpdf([ + 'margin_left' => 0, + 'margin_right' => 0, + 'margin_top' => 0, + 'margin_bottom'=> 0, + ]); + + $mPDF->SetDirectionality($direction); + + $mPDF->SetDisplayMode('fullpage'); + + $mPDF->WriteHTML($this->adjustArabicAndPersianContent($html)); + + return response()->streamDownload(fn () => print ($mPDF->Output('', 'S')), $fileName.'.pdf'); + } + + return PDF::loadHTML($this->adjustArabicAndPersianContent($html)) + ->setPaper('A4', 'portrait') + ->set_option('defaultFont', 'Courier') + ->download($fileName.'.pdf'); + } + + /** + * Adjust arabic and persian content. + * + * @return string + */ + protected function adjustArabicAndPersianContent(string $html) + { + $arabic = new \ArPHP\I18N\Arabic; + + $p = $arabic->arIdentify($html); + + for ($i = count($p) - 1; $i >= 0; $i -= 2) { + $utf8ar = $arabic->utf8Glyphs(substr($html, $p[$i - 1], $p[$i] - $p[$i - 1])); + $html = substr_replace($html, $utf8ar, $p[$i - 1], $p[$i] - $p[$i - 1]); + } + + return $html; + } +} diff --git a/packages/Webkul/Core/src/Traits/Sanitizer.php b/packages/Webkul/Core/src/Traits/Sanitizer.php new file mode 100644 index 0000000..4c0d445 --- /dev/null +++ b/packages/Webkul/Core/src/Traits/Sanitizer.php @@ -0,0 +1,81 @@ +isSvgFile($file)) { + return; + } + + try { + $svgContent = Storage::get($path); + + if (! $svgContent) { + return; + } + + $sanitizer = new MainSanitizer; + $sanitizer->setAllowedAttrs(new AllowedAttributes); + $sanitizer->setAllowedTags(new AllowedTags); + + $sanitizer->minify(true); + $sanitizer->removeRemoteReferences(true); + $sanitizer->removeXMLTag(true); + + $sanitizer->setXMLOptions(LIBXML_NONET | LIBXML_NOBLANKS); + + $sanitizedContent = $sanitizer->sanitize($svgContent); + + if ($sanitizedContent === false) { + $patterns = [ + '/]*>(.*?)<\/script>/is', + '/\bon\w+\s*=\s*["\'][^"\']*["\']/i', + '/javascript\s*:/i', + '/data\s*:[^,]*base64/i', + ]; + + $sanitizedContent = $svgContent; + + foreach ($patterns as $pattern) { + $sanitizedContent = preg_replace($pattern, '', $sanitizedContent); + } + + Storage::put($path, $sanitizedContent); + + return; + } + + $sanitizedContent = preg_replace('/(.*?<\/script>)|(\son\w+\s*=\s*["\'][^"\']*["\'])/is', '', $sanitizedContent); + + Storage::put($path, $sanitizedContent); + } catch (Exception $e) { + report($e->getMessage()); + + Storage::delete($path); + } + } + + /** + * Check if the uploaded file is an SVG based on both extension and mime type. + */ + public function isSvgFile(UploadedFile $file): bool + { + return str_contains(strtolower($file->getClientOriginalExtension()), 'svg'); + } +} diff --git a/packages/Webkul/Core/src/ViewRenderEventManager.php b/packages/Webkul/Core/src/ViewRenderEventManager.php new file mode 100755 index 0000000..4c646b6 --- /dev/null +++ b/packages/Webkul/Core/src/ViewRenderEventManager.php @@ -0,0 +1,89 @@ +params = $params ?? []; + + Event::dispatch($eventName, $this); + + return $this->templates; + } + + /** + * get params + * + * @return array + */ + public function getParams() + { + return $this->params; + } + + /** + * get param + * + * @return mixed + */ + public function getParam($name) + { + return optional($this->params)[$name]; + } + + /** + * Add templates for render + * + * @param string $template + * @return void + */ + public function addTemplate($template) + { + array_push($this->templates, $template); + } + + /** + * Renders templates + * + * @return string + */ + public function render() + { + $string = ''; + + foreach ($this->templates as $template) { + if (view()->exists($template)) { + $string .= view($template, $this->params)->render(); + } elseif (is_string($template)) { + $string .= $template; + } + } + + return $string; + } +} diff --git a/packages/Webkul/Core/src/Vite.php b/packages/Webkul/Core/src/Vite.php new file mode 100644 index 0000000..9df887a --- /dev/null +++ b/packages/Webkul/Core/src/Vite.php @@ -0,0 +1,49 @@ +useBuildDirectory($viters[$namespace]['build_directory']) + ->asset($viteUrl); + } + + /** + * Set krayin vite. + * + * @return mixed + */ + public function set(mixed $entryPoints, string $namespace = 'admin') + { + $viters = config('krayin-vite.viters'); + + if (empty($viters[$namespace])) { + throw new ViterNotFound($namespace); + } + + return BaseVite::useHotFile($viters[$namespace]['hot_file']) + ->useBuildDirectory($viters[$namespace]['build_directory']) + ->withEntryPoints($entryPoints); + } +} diff --git a/packages/Webkul/DataGrid/src/Action.php b/packages/Webkul/DataGrid/src/Action.php new file mode 100644 index 0000000..b0cda2b --- /dev/null +++ b/packages/Webkul/DataGrid/src/Action.php @@ -0,0 +1,34 @@ + $this->index, + 'icon' => $this->icon, + 'title' => $this->title, + 'method' => $this->method, + 'url' => $this->url, + ]; + } +} diff --git a/packages/Webkul/DataGrid/src/Column.php b/packages/Webkul/DataGrid/src/Column.php new file mode 100644 index 0000000..1a43872 --- /dev/null +++ b/packages/Webkul/DataGrid/src/Column.php @@ -0,0 +1,374 @@ +init($column); + } + + /** + * Initialize all necessary settings for the columns. + */ + public function init(array $column): void + { + $this->setIndex($column['index']); + + $this->setLabel($column['label']); + + $this->setType($column['type']); + + $this->setSearchable($column['searchable'] ?? $this->searchable); + + $this->setFilterable($column['filterable'] ?? $this->filterable); + + $this->setFilterableType($column['filterable_type'] ?? $this->filterableType); + + $this->setFilterableOptions($column['filterable_options'] ?? $this->filterableOptions); + + $this->setAllowMultipleValues($column['allow_multiple_values'] ?? $this->allowMultipleValues); + + $this->setSortable($column['sortable'] ?? $this->sortable); + + $this->setVisibility($column['visibility'] ?? $this->visibility); + + $this->setClosure($column['closure'] ?? $this->closure); + + $this->setColumnName($this->index); + } + + /** + * Set index. + */ + public function setIndex(string $index): void + { + $this->index = $index; + } + + /** + * Get index. + */ + public function getIndex(): string + { + return $this->index; + } + + /** + * Set label. + */ + public function setLabel(string $label): void + { + $this->label = $label; + } + + /** + * Get label. + */ + public function getLabel(): string + { + return $this->label; + } + + /** + * Set type. + */ + public function setType(string $type): void + { + $this->type = $type; + } + + /** + * Get type. + */ + public function getType(): string + { + return $this->type; + } + + /** + * Set searchable. + */ + public function setSearchable(bool $searchable): void + { + $this->searchable = $searchable; + } + + /** + * Get searchable. + */ + public function getSearchable(): bool + { + return $this->searchable; + } + + /** + * Set filterable. + */ + public function setFilterable(bool $filterable): void + { + $this->filterable = $filterable; + } + + /** + * Get filterable. + */ + public function getFilterable(): bool + { + return $this->filterable; + } + + /** + * Set filterable type. + */ + public function setFilterableType(?string $filterableType): void + { + $this->filterableType = $filterableType; + } + + /** + * Get filterable type. + */ + public function getFilterableType(): ?string + { + return $this->filterableType; + } + + /** + * Set filterable options. + */ + public function setFilterableOptions(mixed $filterableOptions): void + { + if ($filterableOptions instanceof \Closure) { + $filterableOptions = $filterableOptions(); + } + + $this->filterableOptions = $filterableOptions; + } + + /** + * Get filterable options. + */ + public function getFilterableOptions(): array + { + return $this->filterableOptions; + } + + /** + * Set allow multiple values. + */ + public function setAllowMultipleValues(bool $allowMultipleValues): void + { + $this->allowMultipleValues = $allowMultipleValues; + } + + /** + * Get allow multiple values. + */ + public function getAllowMultipleValues(): bool + { + return $this->allowMultipleValues; + } + + /** + * Set sortable. + */ + public function setSortable(?bool $sortable = null): void + { + $this->sortable = $sortable; + } + + /** + * Get sortable. + */ + public function getSortable(): bool + { + return $this->sortable; + } + + /** + * Set exportable. + */ + public function setExportable(bool $exportable): void + { + $this->exportable = $exportable; + } + + /** + * Get exportable. + */ + public function getExportable(): bool + { + return $this->exportable; + } + + /** + * Set visibility. + */ + public function setVisibility(bool $visibility): void + { + $this->visibility = $visibility; + } + + /** + * Get visibility. + */ + public function getVisibility(): bool + { + return $this->visibility; + } + + /** + * Set closure. + */ + public function setClosure(mixed $closure): void + { + $this->closure = $closure; + } + + /** + * Get closure. + */ + public function getClosure(): mixed + { + return $this->closure; + } + + /** + * Define the table's column name. Initially, it will match the index. However, after adding an alias, + * the column name may change. + */ + public function setColumnName(mixed $columnName): void + { + $this->columnName = $columnName; + } + + /** + * Get the table's column name. + */ + public function getColumnName(): mixed + { + return $this->columnName; + } + + /** + * To array. + */ + public function toArray(): array + { + return [ + 'index' => $this->index, + 'label' => $this->label, + 'type' => $this->type, + 'searchable' => $this->searchable, + 'filterable' => $this->filterable, + 'filterable_type' => $this->filterableType, + 'filterable_options' => $this->filterableOptions, + 'allow_multiple_values' => $this->allowMultipleValues, + 'sortable' => $this->sortable, + 'visibility' => $this->visibility, + ]; + } + + /** + * Validate the column. + */ + public static function validate(array $column): void + { + if (empty($column['index'])) { + throw new InvalidColumnException('The `index` key is required. Ensure that the `index` key is present in all calls to the `addColumn` method.'); + } + + if (empty($column['label'])) { + throw new InvalidColumnException('The `label` key is required. Ensure that the `label` key is present in all calls to the `addColumn` method.'); + } + + if (empty($column['type'])) { + throw new InvalidColumnException('The `type` key is required. Ensure that the `type` key is present in all calls to the `addColumn` method.'); + } + } + + /** + * Resolve the column type class. + */ + public static function resolveType(array $column): self + { + self::validate($column); + + $columnTypeClass = ColumnTypeEnum::getClassName($column['type']); + + return new $columnTypeClass($column); + } +} diff --git a/packages/Webkul/DataGrid/src/ColumnTypes/Aggregate.php b/packages/Webkul/DataGrid/src/ColumnTypes/Aggregate.php new file mode 100644 index 0000000..9ceb9c0 --- /dev/null +++ b/packages/Webkul/DataGrid/src/ColumnTypes/Aggregate.php @@ -0,0 +1,41 @@ +filterableType === FilterTypeEnum::DROPDOWN->value) { + return $queryBuilder->having(function ($scopeQueryBuilder) use ($requestedValues) { + if (is_string($requestedValues)) { + $scopeQueryBuilder->orHaving($this->columnName, $requestedValues); + + return; + } + + foreach ($requestedValues as $value) { + $scopeQueryBuilder->orHaving($this->columnName, $value); + } + }); + } + + return $queryBuilder->having(function ($scopeQueryBuilder) use ($requestedValues) { + if (is_string($requestedValues)) { + $scopeQueryBuilder->orHaving($this->columnName, 'LIKE', '%'.$requestedValues.'%'); + + return; + } + + foreach ($requestedValues as $value) { + $scopeQueryBuilder->orHaving($this->columnName, 'LIKE', '%'.$value.'%'); + } + }); + } +} diff --git a/packages/Webkul/DataGrid/src/ColumnTypes/Boolean.php b/packages/Webkul/DataGrid/src/ColumnTypes/Boolean.php new file mode 100644 index 0000000..f48dba6 --- /dev/null +++ b/packages/Webkul/DataGrid/src/ColumnTypes/Boolean.php @@ -0,0 +1,68 @@ +value) + ) { + throw new InvalidColumnException('Boolean filters will only work with `dropdown` type. Either remove the `filterable_type` or set it to `dropdown`.'); + } + + if (! $filterableType) { + $filterableType = FilterTypeEnum::DROPDOWN->value; + } + + parent::setFilterableType($filterableType); + } + + /** + * Set filterable options. + */ + public function setFilterableOptions(mixed $filterableOptions): void + { + if (empty($filterableOptions)) { + $filterableOptions = [ + [ + 'label' => trans('admin::app.components.datagrid.filters.boolean-options.true'), + 'value' => 1, + ], + [ + 'label' => trans('admin::app.components.datagrid.filters.boolean-options.false'), + 'value' => 0, + ], + ]; + } + + parent::setFilterableOptions($filterableOptions); + } + + /** + * Process filter. + */ + public function processFilter($queryBuilder, $requestedValues): mixed + { + return $queryBuilder->where(function ($scopeQueryBuilder) use ($requestedValues) { + if (is_string($requestedValues)) { + $scopeQueryBuilder->orWhere($this->columnName, $requestedValues); + + return; + } + + foreach ($requestedValues as $value) { + $scopeQueryBuilder->orWhere($this->columnName, $value); + } + }); + } +} diff --git a/packages/Webkul/DataGrid/src/ColumnTypes/Date.php b/packages/Webkul/DataGrid/src/ColumnTypes/Date.php new file mode 100644 index 0000000..07cbf2a --- /dev/null +++ b/packages/Webkul/DataGrid/src/ColumnTypes/Date.php @@ -0,0 +1,61 @@ +value) + ) { + throw new InvalidColumnException('Date filters will only work with `date_range` type. Either remove the `filterable_type` or set it to `date_range`.'); + } + + parent::setFilterableType($filterableType); + } + + /** + * Set filterable options. + */ + public function setFilterableOptions(mixed $filterableOptions): void + { + if (empty($filterableOptions)) { + $filterableOptions = DateRangeOptionEnum::options(); + } + + parent::setFilterableOptions($filterableOptions); + } + + /** + * Process filter. + */ + public function processFilter($queryBuilder, $requestedDates) + { + return $queryBuilder->where(function ($scopeQueryBuilder) use ($requestedDates) { + if (is_string($requestedDates)) { + $rangeOption = collect($this->filterableOptions)->firstWhere('name', $requestedDates); + + $requestedDates = ! $rangeOption + ? [[$requestedDates, $requestedDates]] + : [[$rangeOption['from'], $rangeOption['to']]]; + } + + foreach ($requestedDates as $value) { + $scopeQueryBuilder->whereBetween($this->columnName, [ + ($value[0] ?? '').' 00:00:01', + ($value[1] ?? '').' 23:59:59', + ]); + } + }); + } +} diff --git a/packages/Webkul/DataGrid/src/ColumnTypes/Datetime.php b/packages/Webkul/DataGrid/src/ColumnTypes/Datetime.php new file mode 100644 index 0000000..cb4c271 --- /dev/null +++ b/packages/Webkul/DataGrid/src/ColumnTypes/Datetime.php @@ -0,0 +1,58 @@ +value) + ) { + throw new InvalidColumnException('Datetime filters will only work with `datetime_range` type. Either remove the `filterable_type` or set it to `datetime_range`.'); + } + + parent::setFilterableType($filterableType); + } + + /** + * Set filterable options. + */ + public function setFilterableOptions(mixed $filterableOptions): void + { + if (empty($filterableOptions)) { + $filterableOptions = DateRangeOptionEnum::options(); + } + + parent::setFilterableOptions($filterableOptions); + } + + /** + * Process filter. + */ + public function processFilter($queryBuilder, $requestedDates) + { + return $queryBuilder->where(function ($scopeQueryBuilder) use ($requestedDates) { + if (is_string($requestedDates)) { + $rangeOption = collect($this->filterableOptions)->firstWhere('name', $requestedDates); + + $requestedDates = ! $rangeOption + ? [[$requestedDates, $requestedDates]] + : [[$rangeOption['from'], $rangeOption['to']]]; + } + + foreach ($requestedDates as $value) { + $scopeQueryBuilder->whereBetween($this->columnName, [$value[0] ?? '', $value[1] ?? '']); + } + }); + } +} diff --git a/packages/Webkul/DataGrid/src/ColumnTypes/Decimal.php b/packages/Webkul/DataGrid/src/ColumnTypes/Decimal.php new file mode 100644 index 0000000..d55deb0 --- /dev/null +++ b/packages/Webkul/DataGrid/src/ColumnTypes/Decimal.php @@ -0,0 +1,26 @@ +where(function ($scopeQueryBuilder) use ($requestedValues) { + if (is_string($requestedValues)) { + $scopeQueryBuilder->orWhere($this->columnName, $requestedValues); + + return; + } + + foreach ($requestedValues as $value) { + $scopeQueryBuilder->orWhere($this->columnName, $value); + } + }); + } +} diff --git a/packages/Webkul/DataGrid/src/ColumnTypes/Integer.php b/packages/Webkul/DataGrid/src/ColumnTypes/Integer.php new file mode 100644 index 0000000..f615445 --- /dev/null +++ b/packages/Webkul/DataGrid/src/ColumnTypes/Integer.php @@ -0,0 +1,26 @@ +where(function ($scopeQueryBuilder) use ($requestedValues) { + if (is_string($requestedValues)) { + $scopeQueryBuilder->orWhere($this->columnName, $requestedValues); + + return; + } + + foreach ($requestedValues as $value) { + $scopeQueryBuilder->orWhere($this->columnName, $value); + } + }); + } +} diff --git a/packages/Webkul/DataGrid/src/ColumnTypes/Text.php b/packages/Webkul/DataGrid/src/ColumnTypes/Text.php new file mode 100644 index 0000000..e413cdb --- /dev/null +++ b/packages/Webkul/DataGrid/src/ColumnTypes/Text.php @@ -0,0 +1,41 @@ +filterableType === FilterTypeEnum::DROPDOWN->value) { + return $queryBuilder->where(function ($scopeQueryBuilder) use ($requestedValues) { + if (is_string($requestedValues)) { + $scopeQueryBuilder->orWhere($this->columnName, $requestedValues); + + return; + } + + foreach ($requestedValues as $value) { + $scopeQueryBuilder->orWhere($this->columnName, $value); + } + }); + } + + return $queryBuilder->where(function ($scopeQueryBuilder) use ($requestedValues) { + if (is_string($requestedValues)) { + $scopeQueryBuilder->orWhere($this->columnName, 'LIKE', '%'.$requestedValues.'%'); + + return; + } + + foreach ($requestedValues as $value) { + $scopeQueryBuilder->orWhere($this->columnName, 'LIKE', '%'.$value.'%'); + } + }); + } +} diff --git a/packages/Webkul/DataGrid/src/Contracts/SavedFilter.php b/packages/Webkul/DataGrid/src/Contracts/SavedFilter.php new file mode 100644 index 0000000..9c4c4f8 --- /dev/null +++ b/packages/Webkul/DataGrid/src/Contracts/SavedFilter.php @@ -0,0 +1,5 @@ +columns; + } + + /** + * Get actions. + */ + public function getActions(): array + { + return $this->actions; + } + + /** + * Get mass actions. + */ + public function getMassActions(): array + { + return $this->massActions; + } + + /** + * Add column. + */ + public function addColumn(array $column): void + { + $this->dispatchEvent('columns.add.before', [$this, $column]); + + $this->columns[] = Column::resolveType($column); + + $this->dispatchEvent('columns.add.after', [$this, $this->columns[count($this->columns) - 1]]); + } + + /** + * Add action. + */ + public function addAction(array $action): void + { + $this->dispatchEvent('actions.add.before', [$this, $action]); + + $this->actions[] = new Action( + index: $action['index'] ?? '', + icon: $action['icon'] ?? '', + title: $action['title'], + method: $action['method'], + url: $action['url'], + ); + + $this->dispatchEvent('actions.add.after', [$this, $this->actions[count($this->actions) - 1]]); + } + + /** + * Add mass action. + */ + public function addMassAction(array $massAction): void + { + $this->dispatchEvent('mass_actions.add.before', [$this, $massAction]); + + $this->massActions[] = new MassAction( + icon: $massAction['icon'] ?? '', + title: $massAction['title'], + method: $massAction['method'], + url: $massAction['url'], + options: $massAction['options'] ?? [], + ); + + $this->dispatchEvent('mass_actions.add.after', [$this, $this->massActions[count($this->massActions) - 1]]); + } + + /** + * Set query builder. + * + * @param mixed $queryBuilder + */ + public function setQueryBuilder($queryBuilder = null): void + { + $this->dispatchEvent('query_builder.set.before', [$this, $queryBuilder]); + + $this->queryBuilder = $queryBuilder ?: $this->prepareQueryBuilder(); + + $this->dispatchEvent('query_builder.set.after', $this); + } + + /** + * Get query builder. + */ + public function getQueryBuilder(): mixed + { + return $this->queryBuilder; + } + + /** + * Map your filter. + */ + public function addFilter(string $datagridColumn, mixed $queryColumn): void + { + $this->dispatchEvent('filters.add.before', [$this, $datagridColumn, $queryColumn]); + + foreach ($this->columns as $column) { + if ($column->getIndex() === $datagridColumn) { + $column->setColumnName($queryColumn); + + break; + } + } + + $this->dispatchEvent('filters.add.after', [$this, $datagridColumn, $queryColumn]); + } + + /** + * Set exportable. + */ + public function setExportable(bool $exportable): void + { + $this->dispatchEvent('exportable.set.before', [$this, $exportable]); + + $this->exportable = $exportable; + + $this->dispatchEvent('exportable.set.after', $this); + } + + /** + * Get exportable. + */ + public function getExportable(): bool + { + return $this->exportable; + } + + /** + * Set export file. + * + * @param string $format + * @return void + */ + public function setExportFile($format = 'csv') + { + $this->dispatchEvent('export_file.set.before', [$this, $format]); + + $this->setExportable(true); + + $this->exportFile = Excel::download(new DataGridExport($this), Str::random(36).'.'.$format); + + $this->dispatchEvent('export_file.set.after', $this); + } + + /** + * Download export file. + * + * @return \Symfony\Component\HttpFoundation\BinaryFileResponse + */ + public function downloadExportFile() + { + return $this->exportFile; + } + + /** + * Process the datagrid. + * + * @return \Symfony\Component\HttpFoundation\BinaryFileResponse|\Illuminate\Http\JsonResponse + */ + public function process() + { + $this->prepare(); + + if ($this->getExportable()) { + return $this->downloadExportFile(); + } + + return response()->json($this->formatData()); + } + + /** + * To json. The reason for deprecation is that it is not an action returning JSON; instead, + * it is a process method which returns a download as well as a JSON response. + * + * @deprecated + * + * @return \Symfony\Component\HttpFoundation\BinaryFileResponse|\Illuminate\Http\JsonResponse + */ + public function toJson() + { + $this->prepare(); + + if ($this->getExportable()) { + return $this->downloadExportFile(); + } + + return response()->json($this->formatData()); + } + + /** + * Validated request. + */ + protected function validatedRequest(): array + { + request()->validate([ + 'filters' => ['sometimes', 'required', 'array'], + 'sort' => ['sometimes', 'required', 'array'], + 'pagination' => ['sometimes', 'required', 'array'], + 'export' => ['sometimes', 'required', 'boolean'], + 'format' => ['sometimes', 'required', 'in:csv,xls,xlsx'], + ]); + + return request()->only(['filters', 'sort', 'pagination', 'export', 'format']); + } + + /** + * Process all requested filters. + * + * @return \Illuminate\Database\Query\Builder + */ + protected function processRequestedFilters(array $requestedFilters) + { + foreach ($requestedFilters as $requestedColumn => $requestedValues) { + if ($requestedColumn === 'all') { + $this->queryBuilder->where(function ($scopeQueryBuilder) use ($requestedValues) { + foreach ($requestedValues as $value) { + collect($this->columns) + ->filter(fn ($column) => $column->getSearchable() && ! in_array($column->getType(), [ + ColumnTypeEnum::BOOLEAN->value, + ColumnTypeEnum::AGGREGATE->value, + ])) + ->each(fn ($column) => $scopeQueryBuilder->orWhere($column->getColumnName(), 'LIKE', '%'.$value.'%')); + } + }); + } else { + collect($this->columns) + ->first(fn ($column) => $column->getIndex() === $requestedColumn) + ->processFilter($this->queryBuilder, $requestedValues); + } + } + + return $this->queryBuilder; + } + + /** + * Process requested sorting. + * + * @return \Illuminate\Database\Query\Builder + */ + protected function processRequestedSorting($requestedSort) + { + if (! $this->sortColumn) { + $this->sortColumn = $this->primaryColumn; + } + + return $this->queryBuilder->orderBy($requestedSort['column'] ?? $this->sortColumn, $requestedSort['order'] ?? $this->sortOrder); + } + + /** + * Process requested pagination. + */ + protected function processRequestedPagination($requestedPagination): LengthAwarePaginator + { + return $this->queryBuilder->paginate( + $requestedPagination['per_page'] ?? $this->itemsPerPage, + ['*'], + 'page', + $requestedPagination['page'] ?? 1 + ); + } + + /** + * Process paginated request. + */ + protected function processPaginatedRequest(array $requestedParams): void + { + $this->dispatchEvent('process_request.paginated.before', $this); + + $this->paginator = $this->processRequestedPagination($requestedParams['pagination'] ?? []); + + $this->dispatchEvent('process_request.paginated.after', $this); + } + + /** + * Process export request. + */ + protected function processExportRequest(array $requestedParams): void + { + $this->dispatchEvent('process_request.export.before', $this); + + $this->setExportFile($requestedParams['format']); + + $this->dispatchEvent('process_request.export.after', $this); + } + + /** + * Process request. + */ + protected function processRequest(): void + { + $this->dispatchEvent('process_request.before', $this); + + /** + * Store all request parameters in this variable; avoid using direct request helpers afterward. + */ + $requestedParams = $this->validatedRequest(); + + $this->queryBuilder = $this->processRequestedFilters($requestedParams['filters'] ?? []); + + $this->queryBuilder = $this->processRequestedSorting($requestedParams['sort'] ?? []); + + /** + * The `export` parameter is validated as a boolean in the `validatedRequest`. An `empty` function will not work, + * as it will always be treated as true because of "0" and "1". + */ + isset($requestedParams['export']) && (bool) $requestedParams['export'] + ? $this->processExportRequest($requestedParams) + : $this->processPaginatedRequest($requestedParams); + + $this->dispatchEvent('process_request.after', $this); + } + + /** + * Prepare all the setup for datagrid. + */ + protected function sanitizeRow($row): \stdClass + { + /** + * Convert stdClass to array. + */ + $tempRow = json_decode(json_encode($row), true); + + foreach ($tempRow as $column => $value) { + if (! is_string($tempRow[$column])) { + continue; + } + + if (is_array($value)) { + return $this->sanitizeRow($tempRow[$column]); + } else { + $row->{$column} = strip_tags($value); + } + } + + return $row; + } + + /** + * Format columns. + */ + protected function formatColumns(): array + { + return collect($this->columns) + ->map(fn ($column) => $column->toArray()) + ->toArray(); + } + + /** + * Format actions. + */ + protected function formatActions(): array + { + return collect($this->actions) + ->map(fn ($action) => $action->toArray()) + ->toArray(); + } + + /** + * Format mass actions. + */ + protected function formatMassActions(): array + { + return collect($this->massActions) + ->map(fn ($massAction) => $massAction->toArray()) + ->toArray(); + } + + /** + * Format records. + */ + protected function formatRecords($records): mixed + { + foreach ($records as $record) { + $record = $this->sanitizeRow($record); + + foreach ($this->columns as $column) { + if ($closure = $column->getClosure()) { + $record->{$column->getIndex()} = $closure($record); + } + } + + $record->actions = []; + + foreach ($this->actions as $index => $action) { + $getUrl = $action->url; + + $record->actions[] = [ + 'index' => ! empty($action->index) ? $action->index : 'action_'.$index + 1, + 'icon' => $action->icon, + 'title' => $action->title, + 'method' => $action->method, + 'url' => $getUrl($record), + ]; + } + } + + return $records; + } + + /** + * Format data. + */ + protected function formatData(): array + { + $paginator = $this->paginator->toArray(); + + return [ + 'id' => Crypt::encryptString(get_called_class()), + 'columns' => $this->formatColumns(), + 'actions' => $this->formatActions(), + 'mass_actions' => $this->formatMassActions(), + 'records' => $this->formatRecords($paginator['data']), + 'meta' => [ + 'primary_column' => $this->primaryColumn, + 'from' => $paginator['from'], + 'to' => $paginator['to'], + 'total' => $paginator['total'], + 'per_page_options' => $this->perPageOptions, + 'per_page' => $paginator['per_page'], + 'current_page' => $paginator['current_page'], + 'last_page' => $paginator['last_page'], + ], + ]; + } + + /** + * Dispatch event. + */ + protected function dispatchEvent(string $eventName, mixed $payload): void + { + $reflection = new \ReflectionClass($this); + + $datagridName = Str::snake($reflection->getShortName()); + + Event::dispatch("datagrid.{$datagridName}.{$eventName}", $payload); + } + + /** + * Prepare all the setup for datagrid. + */ + protected function prepare(): void + { + $this->dispatchEvent('prepare.before', $this); + + $this->prepareColumns(); + + $this->dispatchEvent('columns.prepare.after', $this); + + $this->prepareActions(); + + $this->dispatchEvent('actions.prepare.after', $this); + + $this->prepareMassActions(); + + $this->dispatchEvent('mass_actions.prepare.after', $this); + + $this->setQueryBuilder(); + + $this->dispatchEvent('query_builder.prepare.after', $this); + + $this->processRequest(); + + $this->dispatchEvent('prepare.after', $this); + } +} diff --git a/packages/Webkul/DataGrid/src/Database/Migrations/2024_05_10_152848_create_saved_filters_table.php b/packages/Webkul/DataGrid/src/Database/Migrations/2024_05_10_152848_create_saved_filters_table.php new file mode 100644 index 0000000..de5d20b --- /dev/null +++ b/packages/Webkul/DataGrid/src/Database/Migrations/2024_05_10_152848_create_saved_filters_table.php @@ -0,0 +1,33 @@ +id(); + $table->integer('user_id')->unsigned(); + $table->string('name'); + $table->string('src'); + $table->json('applied'); + $table->timestamps(); + + $table->unique(['user_id', 'name', 'src']); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('datagrid_saved_filters'); + } +}; diff --git a/packages/Webkul/DataGrid/src/Enums/ColumnTypeEnum.php b/packages/Webkul/DataGrid/src/Enums/ColumnTypeEnum.php new file mode 100644 index 0000000..b96bb12 --- /dev/null +++ b/packages/Webkul/DataGrid/src/Enums/ColumnTypeEnum.php @@ -0,0 +1,67 @@ +value => Text::class, + self::INTEGER->value => Integer::class, + self::FLOAT->value => Decimal::class, + self::BOOLEAN->value => Boolean::class, + self::DATE->value => Date::class, + self::DATETIME->value => Datetime::class, + self::AGGREGATE->value => Aggregate::class, + default => throw new InvalidColumnTypeException("Invalid column type: {$type}"), + }; + } +} diff --git a/packages/Webkul/DataGrid/src/Enums/DateRangeOptionEnum.php b/packages/Webkul/DataGrid/src/Enums/DateRangeOptionEnum.php new file mode 100644 index 0000000..feae627 --- /dev/null +++ b/packages/Webkul/DataGrid/src/Enums/DateRangeOptionEnum.php @@ -0,0 +1,103 @@ + self::TODAY->value, + 'label' => trans('admin::app.components.datagrid.filters.date-options.today'), + 'from' => now()->today()->format($format), + 'to' => now()->endOfDay()->format($format), + ], + [ + 'name' => self::YESTERDAY->value, + 'label' => trans('admin::app.components.datagrid.filters.date-options.yesterday'), + 'from' => now()->yesterday()->format($format), + 'to' => now()->today()->subSecond(1)->format($format), + ], + [ + 'name' => self::THIS_WEEK->value, + 'label' => trans('admin::app.components.datagrid.filters.date-options.this-week'), + 'from' => now()->startOfWeek()->format($format), + 'to' => now()->endOfWeek()->format($format), + ], + [ + 'name' => self::THIS_MONTH->value, + 'label' => trans('admin::app.components.datagrid.filters.date-options.this-month'), + 'from' => now()->startOfMonth()->format($format), + 'to' => now()->endOfMonth()->format($format), + ], + [ + 'name' => self::LAST_MONTH->value, + 'label' => trans('admin::app.components.datagrid.filters.date-options.last-month'), + 'from' => now()->subMonth(1)->startOfMonth()->format($format), + 'to' => now()->subMonth(1)->endOfMonth()->format($format), + ], + [ + 'name' => self::LAST_THREE_MONTHS->value, + 'label' => trans('admin::app.components.datagrid.filters.date-options.last-three-months'), + 'from' => now()->subMonth(3)->startOfMonth()->format($format), + 'to' => now()->subMonth(1)->endOfMonth()->format($format), + ], + [ + 'name' => self::LAST_SIX_MONTHS->value, + 'label' => trans('admin::app.components.datagrid.filters.date-options.last-six-months'), + 'from' => now()->subMonth(6)->startOfMonth()->format($format), + 'to' => now()->subMonth(1)->endOfMonth()->format($format), + ], + [ + 'name' => self::THIS_YEAR->value, + 'label' => trans('admin::app.components.datagrid.filters.date-options.this-year'), + 'from' => now()->startOfYear()->format($format), + 'to' => now()->endOfYear()->format($format), + ], + ]; + } +} diff --git a/packages/Webkul/DataGrid/src/Enums/FilterTypeEnum.php b/packages/Webkul/DataGrid/src/Enums/FilterTypeEnum.php new file mode 100644 index 0000000..df38a94 --- /dev/null +++ b/packages/Webkul/DataGrid/src/Enums/FilterTypeEnum.php @@ -0,0 +1,21 @@ +datagrid->getQueryBuilder(); + } + + /** + * Headings. + */ + public function headings(): array + { + return collect($this->datagrid->getColumns()) + ->filter(fn ($column) => $column->getExportable()) + ->map(fn ($column) => $column->getLabel()) + ->toArray(); + } + + /** + * Map each row for export. + */ + public function map(mixed $record): array + { + return collect($this->datagrid->getColumns()) + ->filter(fn ($column) => $column->getExportable()) + ->map(function ($column) use ($record) { + $index = $column->getIndex(); + $value = $record->{$index}; + + if ( + in_array($index, ['emails', 'contact_numbers']) + && is_string($value) + ) { + return $this->extractValuesFromJson($value); + } + + return $value; + }) + ->toArray(); + } + + /** + * Extract 'value' fields from a JSON string. + */ + protected function extractValuesFromJson(string $json): string + { + $items = json_decode($json, true); + + if ( + json_last_error() === JSON_ERROR_NONE + && is_array($items) + ) { + return collect($items)->map(fn ($item) => "{$item['value']} ({$item['label']})")->implode(', '); + } + + return $json; + } +} diff --git a/packages/Webkul/DataGrid/src/Http/helpers.php b/packages/Webkul/DataGrid/src/Http/helpers.php new file mode 100644 index 0000000..b174f1c --- /dev/null +++ b/packages/Webkul/DataGrid/src/Http/helpers.php @@ -0,0 +1,18 @@ + $this->icon, + 'title' => $this->title, + 'method' => $this->method, + 'url' => $this->url, + 'options' => $this->options, + ]; + } +} diff --git a/packages/Webkul/DataGrid/src/Models/SavedFilter.php b/packages/Webkul/DataGrid/src/Models/SavedFilter.php new file mode 100755 index 0000000..4eebe64 --- /dev/null +++ b/packages/Webkul/DataGrid/src/Models/SavedFilter.php @@ -0,0 +1,40 @@ + 'json', + ]; +} diff --git a/packages/Webkul/DataGrid/src/Models/SavedFilterProxy.php b/packages/Webkul/DataGrid/src/Models/SavedFilterProxy.php new file mode 100644 index 0000000..226823c --- /dev/null +++ b/packages/Webkul/DataGrid/src/Models/SavedFilterProxy.php @@ -0,0 +1,7 @@ +loadMigrationsFrom(__DIR__.'/../Database/Migrations'); + } + + /** + * Register any application services. + */ + public function register(): void {} +} diff --git a/packages/Webkul/DataGrid/src/Providers/ModuleServiceProvider.php b/packages/Webkul/DataGrid/src/Providers/ModuleServiceProvider.php new file mode 100644 index 0000000..f8e41ea --- /dev/null +++ b/packages/Webkul/DataGrid/src/Providers/ModuleServiceProvider.php @@ -0,0 +1,12 @@ + [ + 'title' => 'data_transfer::app.importers.persons.title', + 'importer' => 'Webkul\DataTransfer\Helpers\Importers\Persons\Importer', + 'sample_path' => 'data-transfer/samples/persons.csv', + ], + + 'products' => [ + 'title' => 'data_transfer::app.importers.products.title', + 'importer' => 'Webkul\DataTransfer\Helpers\Importers\Products\Importer', + 'sample_path' => 'data-transfer/samples/products.csv', + ], + + 'leads' => [ + 'title' => 'data_transfer::app.importers.leads.title', + 'importer' => 'Webkul\DataTransfer\Helpers\Importers\Leads\Importer', + 'sample_path' => 'data-transfer/samples/leads.csv', + ], +]; diff --git a/packages/Webkul/DataTransfer/src/Contracts/Import.php b/packages/Webkul/DataTransfer/src/Contracts/Import.php new file mode 100644 index 0000000..d9f02b8 --- /dev/null +++ b/packages/Webkul/DataTransfer/src/Contracts/Import.php @@ -0,0 +1,5 @@ +increments('id'); + $table->string('state')->default('pending'); + $table->boolean('process_in_queue')->default(1); + $table->string('type'); + $table->string('action'); + $table->string('validation_strategy'); + $table->integer('allowed_errors')->default(0); + $table->integer('processed_rows_count')->default(0); + $table->integer('invalid_rows_count')->default(0); + $table->integer('errors_count')->default(0); + $table->json('errors')->nullable(); + $table->string('field_separator'); + $table->string('file_path'); + $table->string('error_file_path')->nullable(); + $table->json('summary')->nullable(); + + $table->datetime('started_at')->nullable(); + $table->datetime('completed_at')->nullable(); + + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('imports'); + } +}; diff --git a/packages/Webkul/DataTransfer/src/Database/Migrations/2024_01_11_154741_create_import_batches_table.php b/packages/Webkul/DataTransfer/src/Database/Migrations/2024_01_11_154741_create_import_batches_table.php new file mode 100644 index 0000000..0139541 --- /dev/null +++ b/packages/Webkul/DataTransfer/src/Database/Migrations/2024_01_11_154741_create_import_batches_table.php @@ -0,0 +1,32 @@ +increments('id'); + $table->string('state')->default('pending'); + $table->json('data'); + $table->json('summary')->nullable(); + $table->integer('import_id')->unsigned(); + + $table->foreign('import_id')->references('id')->on('imports')->onDelete('cascade'); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('import_batches'); + } +}; diff --git a/packages/Webkul/DataTransfer/src/Helpers/Error.php b/packages/Webkul/DataTransfer/src/Helpers/Error.php new file mode 100644 index 0000000..3683d39 --- /dev/null +++ b/packages/Webkul/DataTransfer/src/Helpers/Error.php @@ -0,0 +1,186 @@ +messageTemplate[$code] = $template; + + return $this; + } + + /** + * Add error message. + */ + public function addError(string $code, ?int $rowNumber = null, ?string $columnName = null, ?string $message = null): self + { + if ($this->isErrorAlreadyAdded($rowNumber, $code, $columnName)) { + return $this; + } + + $this->addRowToInvalid($rowNumber); + + $message = $this->getErrorMessage($code, $message, $columnName); + + $this->items[$rowNumber][] = [ + 'code' => $code, + 'column' => $columnName, + 'message' => $message, + ]; + + $this->errorsCount++; + + return $this; + } + + /** + * Check if error is already added for the row, code and column. + */ + public function isErrorAlreadyAdded(?int $rowNumber, string $code, ?string $columnName): bool + { + return collect($this->items[$rowNumber] ?? []) + ->where('code', $code) + ->where('column', $columnName) + ->isNotEmpty(); + } + + /** + * Add specific row to invalid list via row number. + */ + protected function addRowToInvalid(?int $rowNumber): self + { + if (is_null($rowNumber)) { + return $this; + } + + if (! in_array($rowNumber, $this->invalidRows)) { + $this->invalidRows[] = $rowNumber; + } + + return $this; + } + + /** + * Add specific row to invalid list via row number. + */ + public function addRowToSkip(?int $rowNumber): self + { + if (is_null($rowNumber)) { + return $this; + } + + if (! in_array($rowNumber, $this->skippedRows)) { + $this->skippedRows[] = $rowNumber; + } + + return $this; + } + + /** + * Check if row is invalid by row number. + */ + public function isRowInvalid(int $rowNumber): bool + { + return in_array($rowNumber, array_merge($this->invalidRows, $this->skippedRows)); + } + + /** + * Build an error message via code, message and column name. + */ + protected function getErrorMessage(?string $code, ?string $message, ?string $columnName): string + { + if ( + empty($message) + && isset($this->messageTemplate[$code]) + ) { + $message = (string) $this->messageTemplate[$code]; + } + + if ( + $columnName + && $message + ) { + $message = sprintf($message, $columnName); + } + + if (! $message) { + $message = $code; + } + + return $message; + } + + /** + * Get number of invalid rows. + */ + public function getInvalidRowsCount(): int + { + return count($this->invalidRows); + } + + /** + * Get current error count. + */ + public function getErrorsCount(): int + { + return $this->errorsCount; + } + + /** + * Get all errors from an import process. + */ + public function getAllErrors(): array + { + return $this->items; + } + + /** + * Return all errors grouped by code. + */ + public function getAllErrorsGroupedByCode(): array + { + $errors = []; + + foreach ($this->items as $rowNumber => $rowErrors) { + foreach ($rowErrors as $error) { + if ($rowNumber === '') { + $errors[$error['code']][$error['message']] = null; + } else { + $errors[$error['code']][$error['message']][] = $rowNumber; + } + } + } + + return $errors; + } +} diff --git a/packages/Webkul/DataTransfer/src/Helpers/Import.php b/packages/Webkul/DataTransfer/src/Helpers/Import.php new file mode 100644 index 0000000..aad39cb --- /dev/null +++ b/packages/Webkul/DataTransfer/src/Helpers/Import.php @@ -0,0 +1,573 @@ +import = $import; + + return $this; + } + + /** + * Returns import instance. + */ + public function getImport(): ImportContract + { + return $this->import; + } + + /** + * Returns error helper instance. + * + * @return \Webkul\DataTransfer\Helpers\Error + */ + public function getErrorHelper() + { + return $this->errorHelper; + } + + /** + * Returns source helper instance. + */ + public function getSource(): AbstractSource + { + if (Str::contains($this->import->file_path, '.csv')) { + $source = new CSVSource( + $this->import->file_path, + $this->import->field_separator, + ); + } else { + $source = new ExcelSource( + $this->import->file_path, + $this->import->field_separator, + ); + } + + return $source; + } + + /** + * Validates import and returns validation result. + */ + public function validate(): bool + { + try { + $source = $this->getSource(); + + $typeImporter = $this->getTypeImporter()->setSource($source); + + $typeImporter->validateData(); + } catch (\Exception $e) { + $this->errorHelper->addError( + AbstractImporter::ERROR_CODE_SYSTEM_EXCEPTION, + null, + null, + $e->getMessage() + ); + } + + $import = $this->importRepository->update([ + 'state' => self::STATE_VALIDATED, + 'processed_rows_count' => $this->getProcessedRowsCount(), + 'invalid_rows_count' => $this->errorHelper->getInvalidRowsCount(), + 'errors_count' => $this->errorHelper->getErrorsCount(), + 'errors' => $this->getFormattedErrors(), + 'error_file_path' => $this->uploadErrorReport(), + ], $this->import->id); + + $this->setImport($import); + + return $this->isValid(); + } + + /** + * Starts import process. + */ + public function isValid(): bool + { + if ($this->isErrorLimitExceeded()) { + return false; + } + + if ($this->import->processed_rows_count <= $this->import->invalid_rows_count) { + return false; + } + + return true; + } + + /** + * Check if error limit has been exceeded. + */ + public function isErrorLimitExceeded(): bool + { + if ( + $this->import->validation_strategy == self::VALIDATION_STRATEGY_STOP_ON_ERROR + && $this->import->errors_count > $this->import->allowed_errors + ) { + return true; + } + + return false; + } + + /** + * Starts import process. + */ + public function start(?ImportBatchContract $importBatch = null): bool + { + DB::beginTransaction(); + + try { + $typeImporter = $this->getTypeImporter(); + + $typeImporter->importData($importBatch); + } catch (\Exception $e) { + /** + * Rollback transaction. + */ + DB::rollBack(); + + throw $e; + } finally { + /** + * Commit transaction. + */ + DB::commit(); + } + + return true; + } + + /** + * Link import resources. + */ + public function link(ImportBatchContract $importBatch): bool + { + DB::beginTransaction(); + + try { + $typeImporter = $this->getTypeImporter(); + + $typeImporter->linkData($importBatch); + } catch (\Exception $e) { + /** + * Rollback transaction. + */ + DB::rollBack(); + + throw $e; + } finally { + /** + * Commit transaction. + */ + DB::commit(); + } + + return true; + } + + /** + * Index import resources. + */ + public function index(ImportBatchContract $importBatch): bool + { + DB::beginTransaction(); + + try { + $typeImporter = $this->getTypeImporter(); + + $typeImporter->indexData($importBatch); + } catch (\Exception $e) { + /** + * Rollback transaction. + */ + DB::rollBack(); + + throw $e; + } finally { + /** + * Commit transaction. + */ + DB::commit(); + } + + return true; + } + + /** + * Started the import process. + */ + public function started(): void + { + $import = $this->importRepository->update([ + 'state' => self::STATE_PROCESSING, + 'started_at' => now(), + 'summary' => [], + ], $this->import->id); + + $this->setImport($import); + + Event::dispatch('data_transfer.imports.started', $import); + } + + /** + * Started the import linking process. + */ + public function linking(): void + { + $import = $this->importRepository->update([ + 'state' => self::STATE_LINKING, + ], $this->import->id); + + $this->setImport($import); + + Event::dispatch('data_transfer.imports.linking', $import); + } + + /** + * Started the import indexing process. + */ + public function indexing(): void + { + $import = $this->importRepository->update([ + 'state' => self::STATE_INDEXING, + ], $this->import->id); + + $this->setImport($import); + + Event::dispatch('data_transfer.imports.indexing', $import); + } + + /** + * Start the import process. + */ + public function completed(): void + { + $summary = $this->importBatchRepository + ->select( + DB::raw('SUM(json_unquote(json_extract(summary, \'$."created"\'))) AS created'), + DB::raw('SUM(json_unquote(json_extract(summary, \'$."updated"\'))) AS updated'), + DB::raw('SUM(json_unquote(json_extract(summary, \'$."deleted"\'))) AS deleted'), + ) + ->where('import_id', $this->import->id) + ->groupBy('import_id') + ->first() + ->toArray(); + + $import = $this->importRepository->update([ + 'state' => self::STATE_COMPLETED, + 'summary' => $summary, + 'completed_at' => now(), + ], $this->import->id); + + $this->setImport($import); + + Event::dispatch('data_transfer.imports.completed', $import); + } + + /** + * Returns import stats. + */ + public function stats(string $state): array + { + $total = $this->import->batches->count(); + + $completed = $this->import->batches->where('state', $state)->count(); + + $progress = $total + ? round($completed / $total * 100) + : 0; + + $summary = $this->importBatchRepository + ->select( + DB::raw('SUM(json_unquote(json_extract(summary, \'$."created"\'))) AS created'), + DB::raw('SUM(json_unquote(json_extract(summary, \'$."updated"\'))) AS updated'), + DB::raw('SUM(json_unquote(json_extract(summary, \'$."deleted"\'))) AS deleted'), + ) + ->where('import_id', $this->import->id) + ->where('state', $state) + ->groupBy('import_id') + ->first() + ?->toArray(); + + return [ + 'batches' => [ + 'total' => $total, + 'completed' => $completed, + 'remaining' => $total - $completed, + ], + 'progress' => $progress, + 'summary' => $summary ?? [ + 'created' => 0, + 'updated' => 0, + 'deleted' => 0, + ], + ]; + } + + /** + * Return all error grouped by error code. + */ + public function getFormattedErrors(): array + { + $errors = []; + + foreach ($this->errorHelper->getAllErrorsGroupedByCode() as $groupedErrors) { + foreach ($groupedErrors as $errorMessage => $rowNumbers) { + if (! empty($rowNumbers)) { + $errors[] = 'Row(s) '.implode(', ', $rowNumbers).': '.$errorMessage; + } else { + $errors[] = $errorMessage; + } + } + } + + return $errors; + } + + /** + * Uploads error report and save the path to the database. + */ + public function uploadErrorReport(): ?string + { + /** + * Return null if there are no errors. + */ + if (! $this->errorHelper->getErrorsCount()) { + return null; + } + + /** + * Return null if there are no invalid rows. + */ + if (! $this->errorHelper->getInvalidRowsCount()) { + return null; + } + + $errors = $this->errorHelper->getAllErrors(); + + $source = $this->getTypeImporter()->getSource(); + + $source->rewind(); + + $spreadsheet = new Spreadsheet; + + $sheet = $spreadsheet->getActiveSheet(); + + /** + * Add headers with extra error column. + */ + $sheet->fromArray( + [array_merge($source->getColumnNames(), [ + 'error', + ])], + null, + 'A1' + ); + + $rowNumber = 2; + + while ($source->valid()) { + try { + $rowData = $source->current(); + } catch (\InvalidArgumentException $e) { + $source->next(); + + continue; + } + + $rowErrors = $errors[$source->getCurrentRowNumber()] ?? []; + + if (! empty($rowErrors)) { + $rowErrors = Arr::pluck($rowErrors, 'message'); + } + + $rowData[] = implode('|', $rowErrors); + + $sheet->fromArray([$rowData], null, 'A'.$rowNumber++); + + $source->next(); + } + + $fileType = pathinfo($this->import->file_path, PATHINFO_EXTENSION); + + switch ($fileType) { + case 'csv': + $writer = new Csv($spreadsheet); + + $writer->setDelimiter($this->import->field_separator); + + break; + + case 'xls': + $writer = new Xls($spreadsheet); + + case 'xlsx': + $writer = new Xlsx($spreadsheet); + + break; + + default: + throw new \InvalidArgumentException("Unsupported file type: $fileType"); + } + + $errorFilePath = 'imports/'.time().'-error-report.'.$fileType; + + $writer->save(Storage::disk('public')->path($errorFilePath)); + + return $errorFilePath; + } + + /** + * Validates source file and returns validation result. + */ + public function getTypeImporter(): AbstractImporter + { + if (! $this->typeImporter) { + $importerConfig = config('importers.'.$this->import->type); + + $this->typeImporter = app()->make($importerConfig['importer']) + ->setImport($this->import) + ->setErrorHelper($this->errorHelper); + } + + return $this->typeImporter; + } + + /** + * Returns number of checked rows. + */ + public function getProcessedRowsCount(): int + { + return $this->getTypeImporter()->getProcessedRowsCount(); + } + + /** + * Is linking resource required for the import operation. + */ + public function isLinkingRequired(): bool + { + return $this->getTypeImporter()->isLinkingRequired(); + } + + /** + * Is indexing resource required for the import operation. + */ + public function isIndexingRequired(): bool + { + return $this->getTypeImporter()->isIndexingRequired(); + } +} diff --git a/packages/Webkul/DataTransfer/src/Helpers/Importers/AbstractImporter.php b/packages/Webkul/DataTransfer/src/Helpers/Importers/AbstractImporter.php new file mode 100644 index 0000000..bb38b4f --- /dev/null +++ b/packages/Webkul/DataTransfer/src/Helpers/Importers/AbstractImporter.php @@ -0,0 +1,551 @@ + 'data_transfer::app.validation.errors.system', + self::ERROR_CODE_COLUMN_NOT_FOUND => 'data_transfer::app.validation.errors.column-not-found', + self::ERROR_CODE_COLUMN_EMPTY_HEADER => 'data_transfer::app.validation.errors.column-empty-headers', + self::ERROR_CODE_COLUMN_NAME_INVALID => 'data_transfer::app.validation.errors.column-name-invalid', + self::ERROR_CODE_INVALID_ATTRIBUTE => 'data_transfer::app.validation.errors.invalid-attribute', + self::ERROR_CODE_WRONG_QUOTES => 'data_transfer::app.validation.errors.wrong-quotes', + self::ERROR_CODE_COLUMNS_NUMBER => 'data_transfer::app.validation.errors.column-numbers', + ]; + + public const BATCH_SIZE = 100; + + /** + * Is linking required. + */ + protected bool $linkingRequired = false; + + /** + * Is indexing required. + */ + protected bool $indexingRequired = false; + + /** + * Error helper instance. + * + * @var \Webkul\DataTransfer\Helpers\Error + */ + protected $errorHelper; + + /** + * Import instance. + */ + protected ImportContract $import; + + /** + * Source instance. + * + * @var \Webkul\DataTransfer\Helpers\Source + */ + protected $source; + + /** + * Valid column names. + */ + protected array $validColumnNames = []; + + /** + * Array of numbers of validated rows as keys and boolean TRUE as values. + */ + protected array $validatedRows = []; + + /** + * Number of rows processed by validation. + */ + protected int $processedRowsCount = 0; + + /** + * Number of created items. + */ + protected int $createdItemsCount = 0; + + /** + * Number of updated items. + */ + protected int $updatedItemsCount = 0; + + /** + * Number of deleted items. + */ + protected int $deletedItemsCount = 0; + + /** + * Create a new helper instance. + * + * @return void + */ + public function __construct( + protected ImportBatchRepository $importBatchRepository, + protected AttributeRepository $attributeRepository, + protected AttributeValueRepository $attributeValueRepository + ) {} + + /** + * Validate data row. + */ + abstract public function validateRow(array $rowData, int $rowNumber): bool; + + /** + * Import data rows. + */ + abstract public function importBatch(ImportBatchContract $importBatchContract): bool; + + /** + * Initialize Product error messages. + */ + protected function initErrorMessages(): void + { + foreach ($this->errorMessages as $errorCode => $message) { + $this->errorHelper->addErrorMessage($errorCode, trans($message)); + } + } + + /** + * Import instance. + */ + public function setImport(ImportContract $import): self + { + $this->import = $import; + + return $this; + } + + /** + * Import instance. + * + * @param \Webkul\DataTransfer\Helpers\Source $errorHelper + */ + public function setSource($source) + { + $this->source = $source; + + return $this; + } + + /** + * Import instance. + * + * @param \Webkul\DataTransfer\Helpers\Error $errorHelper + */ + public function setErrorHelper($errorHelper): self + { + $this->errorHelper = $errorHelper; + + $this->initErrorMessages(); + + return $this; + } + + /** + * Import instance. + * + * @return \Webkul\DataTransfer\Helpers\Source + */ + public function getSource() + { + return $this->source; + } + + /** + * Retrieve valid column names. + */ + public function getValidColumnNames(): array + { + return $this->validColumnNames; + } + + /** + * Validate data. + */ + public function validateData(): void + { + Event::dispatch('data_transfer.imports.validate.before', $this->import); + + $errors = []; + + $absentColumns = array_diff($this->permanentAttributes, $columns = $this->getSource()->getColumnNames()); + + if (! empty($absentColumns)) { + $errors[self::ERROR_CODE_COLUMN_NOT_FOUND] = $absentColumns; + } + + foreach ($columns as $columnNumber => $columnName) { + if (empty($columnName)) { + $errors[self::ERROR_CODE_COLUMN_EMPTY_HEADER][] = $columnNumber + 1; + } elseif (! preg_match('/^[a-z][a-z0-9_]*$/', $columnName)) { + $errors[self::ERROR_CODE_COLUMN_NAME_INVALID][] = $columnName; + } elseif (! in_array($columnName, $this->getValidColumnNames())) { + $errors[self::ERROR_CODE_INVALID_ATTRIBUTE][] = $columnName; + } + } + + /** + * Add Columns Errors. + */ + foreach ($errors as $errorCode => $error) { + $this->addErrors($errorCode, $error); + } + + if (! $this->errorHelper->getErrorsCount()) { + $this->saveValidatedBatches(); + } + + Event::dispatch('data_transfer.imports.validate.after', $this->import); + } + + /** + * Save validated batches. + */ + protected function saveValidatedBatches(): self + { + $source = $this->getSource(); + + $batchRows = []; + + $source->rewind(); + + /** + * Clean previous saved batches. + */ + $this->importBatchRepository->deleteWhere([ + 'import_id' => $this->import->id, + ]); + + while ( + $source->valid() + || count($batchRows) + ) { + if ( + count($batchRows) == self::BATCH_SIZE + || ! $source->valid() + ) { + $this->importBatchRepository->create([ + 'import_id' => $this->import->id, + 'data' => $batchRows, + ]); + + $batchRows = []; + } + + if ($source->valid()) { + $rowData = $source->current(); + + if ($this->validateRow($rowData, $source->getCurrentRowNumber())) { + $batchRows[] = $this->prepareRowForDb($rowData); + } + + $this->processedRowsCount++; + + $source->next(); + } + } + + return $this; + } + + /** + * Prepare validation rules. + */ + public function getValidationRules(string $entityType, array $rowData): array + { + if (empty($entityType)) { + return []; + } + + $rules = []; + + $attributes = $this->attributeRepository->scopeQuery(fn ($query) => $query->whereIn('code', array_keys($rowData))->where('entity_type', $entityType))->get(); + + foreach ($attributes as $attribute) { + $validations = []; + + if ($attribute->type == 'boolean') { + continue; + } elseif ($attribute->type == 'address') { + if (! $attribute->is_required) { + continue; + } + + $validations = [ + $attribute->code.'.address' => 'required', + $attribute->code.'.country' => 'required', + $attribute->code.'.state' => 'required', + $attribute->code.'.city' => 'required', + $attribute->code.'.postcode' => 'required', + ]; + } elseif ($attribute->type == 'email') { + $validations = [ + $attribute->code => [$attribute->is_required ? 'required' : 'nullable'], + $attribute->code.'.*.value' => [$attribute->is_required ? 'required' : 'nullable', 'email'], + $attribute->code.'.*.label' => $attribute->is_required ? 'required' : 'nullable', + ]; + } elseif ($attribute->type == 'phone') { + $validations = [ + $attribute->code => [$attribute->is_required ? 'required' : 'nullable'], + $attribute->code.'.*.value' => [$attribute->is_required ? 'required' : 'nullable'], + $attribute->code.'.*.label' => $attribute->is_required ? 'required' : 'nullable', + ]; + } else { + $validations[$attribute->code] = [$attribute->is_required ? 'required' : 'nullable']; + + if ($attribute->type == 'text' && $attribute->validation) { + array_push($validations[$attribute->code], + $attribute->validation == 'decimal' + ? new Decimal + : $attribute->validation + ); + } + + if ($attribute->type == 'price') { + array_push($validations[$attribute->code], new Decimal); + } + } + + if ($attribute->is_unique) { + array_push($validations[in_array($attribute->type, ['email', 'phone']) + ? $attribute->code.'.*.value' + : $attribute->code + ], function ($field, $value, $fail) use ($attribute) { + if (! $this->attributeValueRepository->isValueUnique(null, $attribute->entity_type, $attribute, $field)) { + $fail(trans('data_transfer::app.validation.errors.already-exists', ['attribute' => $attribute->name])); + } + }); + } + + $rules = [ + ...$rules, + ...$validations, + ]; + } + + return $rules; + } + + /** + * Start the import process. + */ + public function importData(?ImportBatchContract $importBatch = null): bool + { + if ($importBatch) { + $this->importBatch($importBatch); + + return true; + } + + $typeBatches = []; + + foreach ($this->import->batches as $batch) { + $typeBatches['import'][] = new ImportBatchJob($batch); + + if ($this->isLinkingRequired()) { + $typeBatches['link'][] = new LinkBatchJob($batch); + } + + if ($this->isIndexingRequired()) { + $typeBatches['index'][] = new IndexBatchJob($batch); + } + } + + $chain[] = Bus::batch($typeBatches['import']); + + if (! empty($typeBatches['link'])) { + $chain[] = new LinkingJob($this->import); + + $chain[] = Bus::batch($typeBatches['link']); + } + + if (! empty($typeBatches['index'])) { + $chain[] = new IndexingJob($this->import); + + $chain[] = Bus::batch($typeBatches['index']); + } + + $chain[] = new CompletedJob($this->import); + + Bus::chain($chain)->dispatch(); + + return true; + } + + /** + * Link resource data. + */ + public function linkData(ImportBatchContract $importBatch): bool + { + $this->linkBatch($importBatch); + + return true; + } + + /** + * Index resource data. + */ + public function indexData(ImportBatchContract $importBatch): bool + { + $this->indexBatch($importBatch); + + return true; + } + + /** + * Add errors to error aggregator. + */ + protected function addErrors(string $code, mixed $errors): void + { + $this->errorHelper->addError( + $code, + null, + implode('", "', $errors) + ); + } + + /** + * Add row as skipped. + * + * @param int|null $rowNumber + * @param string|null $columnName + * @param string|null $errorMessage + * @return $this + */ + protected function skipRow($rowNumber, string $errorCode, $columnName = null, $errorMessage = null): self + { + $this->errorHelper->addError( + $errorCode, + $rowNumber, + $columnName, + $errorMessage + ); + + $this->errorHelper->addRowToSkip($rowNumber); + + return $this; + } + + /** + * Prepare row data to save into the database. + */ + protected function prepareRowForDb(array $rowData): array + { + $rowData = array_map(function ($value) { + return $value === '' ? null : $value; + }, $rowData); + + return $rowData; + } + + /** + * Returns number of checked rows. + */ + public function getProcessedRowsCount(): int + { + return $this->processedRowsCount; + } + + /** + * Returns number of created items count. + */ + public function getCreatedItemsCount(): int + { + return $this->createdItemsCount; + } + + /** + * Returns number of updated items count. + */ + public function getUpdatedItemsCount(): int + { + return $this->updatedItemsCount; + } + + /** + * Returns number of deleted items count. + */ + public function getDeletedItemsCount(): int + { + return $this->deletedItemsCount; + } + + /** + * Is linking resource required for the import operation. + */ + public function isLinkingRequired(): bool + { + if ($this->import->action == Import::ACTION_DELETE) { + return false; + } + + return $this->linkingRequired; + } + + /** + * Is indexing resource required for the import operation. + */ + public function isIndexingRequired(): bool + { + if ($this->import->action == Import::ACTION_DELETE) { + return false; + } + + return $this->indexingRequired; + } +} diff --git a/packages/Webkul/DataTransfer/src/Helpers/Importers/Leads/Importer.php b/packages/Webkul/DataTransfer/src/Helpers/Importers/Leads/Importer.php new file mode 100644 index 0000000..15e4121 --- /dev/null +++ b/packages/Webkul/DataTransfer/src/Helpers/Importers/Leads/Importer.php @@ -0,0 +1,515 @@ + 'data_transfer::app.importers.leads.validation.errors.id-not-found', + ]; + + /** + * Permanent entity columns. + * + * @var string[] + */ + protected $permanentAttributes = ['title']; + + /** + * Permanent entity column. + */ + protected string $masterAttributeCode = 'id'; + + /** + * Is linking required + */ + protected bool $linkingRequired = true; + + /** + * Create a new helper instance. + * + * @return void + */ + public function __construct( + protected ImportBatchRepository $importBatchRepository, + protected LeadRepository $leadRepository, + protected LeadProductRepository $leadProductRepository, + protected AttributeRepository $attributeRepository, + protected AttributeValueRepository $attributeValueRepository, + protected Storage $leadsStorage, + ) { + parent::__construct( + $importBatchRepository, + $attributeRepository, + $attributeValueRepository, + ); + } + + /** + * Initialize leads error templates. + */ + protected function initErrorMessages(): void + { + foreach ($this->messages as $errorCode => $message) { + $this->errorHelper->addErrorMessage($errorCode, trans($message)); + } + + parent::initErrorMessages(); + } + + /** + * Validate data. + */ + public function validateData(): void + { + $this->leadsStorage->init(); + + parent::validateData(); + } + + /** + * Validates row. + */ + public function validateRow(array $rowData, int $rowNumber): bool + { + /** + * If row is already validated than no need for further validation. + */ + if (isset($this->validatedRows[$rowNumber])) { + return ! $this->errorHelper->isRowInvalid($rowNumber); + } + + $this->validatedRows[$rowNumber] = true; + + /** + * If import action is delete than no need for further validation. + */ + if ($this->import->action == Import::ACTION_DELETE) { + if (! $this->isTitleExist($rowData['title'])) { + $this->skipRow($rowNumber, self::ERROR_ID_NOT_FOUND_FOR_DELETE, 'id'); + + return false; + } + + return true; + } + + if (! empty($rowData['product'])) { + $product = $this->parseProducts($rowData['product']); + + $validator = Validator::make($product, [ + 'id' => 'required|exists:products,id', + 'price' => 'required', + 'quantity' => 'required', + ]); + + if ($validator->fails()) { + $failedAttributes = $validator->failed(); + + foreach ($validator->errors()->getMessages() as $attributeCode => $message) { + $errorCode = array_key_first($failedAttributes[$attributeCode] ?? []); + + $this->skipRow($rowNumber, $errorCode, $attributeCode, current($message)); + } + } + } + + /** + * Validate leads attributes. + */ + $validator = Validator::make($rowData, [ + ...$this->getValidationRules('leads|persons', $rowData), + 'id' => 'numeric', + 'status' => 'sometimes|required|in:0,1', + 'user_id' => 'required|exists:users,id', + 'person_id' => 'required|exists:persons,id', + 'lead_source_id' => 'required|exists:lead_sources,id', + 'lead_type_id' => 'required|exists:lead_types,id', + 'lead_pipeline_id' => 'required|exists:lead_pipelines,id', + 'lead_pipeline_stage_id' => 'required|exists:lead_pipeline_stages,id', + ]); + + if ($validator->fails()) { + $failedAttributes = $validator->failed(); + + foreach ($validator->errors()->getMessages() as $attributeCode => $message) { + $errorCode = array_key_first($failedAttributes[$attributeCode] ?? []); + + $this->skipRow($rowNumber, $errorCode, $attributeCode, current($message)); + } + } + + return ! $this->errorHelper->isRowInvalid($rowNumber); + } + + /** + * Prepare row data for lead product. + */ + protected function parseProducts(?string $products): array + { + $productData = []; + + $productArray = explode(',', $products); + + foreach ($productArray as $product) { + if (empty($product)) { + continue; + } + + [$key, $value] = explode('=', $product); + + $productData[$key] = $value; + } + + if ( + isset($productData['price']) + && isset($productData['quantity']) + ) { + $productData['amount'] = $productData['price'] * $productData['quantity']; + } + + return $productData; + } + + /** + * Get validation rules. + */ + public function getValidationRules(string $entityTypes, array $rowData): array + { + $rules = []; + + foreach (explode('|', $entityTypes) as $entityType) { + $attributes = $this->attributeRepository->scopeQuery(fn ($query) => $query->whereIn('code', array_keys($rowData))->where('entity_type', $entityType))->get(); + + foreach ($attributes as $attribute) { + if ($entityType == 'persons') { + $attribute->code = 'person.'.$attribute->code; + } + + $validations = []; + + if ($attribute->type == 'boolean') { + continue; + } elseif ($attribute->type == 'address') { + if (! $attribute->is_required) { + continue; + } + + $validations = [ + $attribute->code.'.address' => 'required', + $attribute->code.'.country' => 'required', + $attribute->code.'.state' => 'required', + $attribute->code.'.city' => 'required', + $attribute->code.'.postcode' => 'required', + ]; + } elseif ($attribute->type == 'email') { + $validations = [ + $attribute->code => [$attribute->is_required ? 'required' : 'nullable'], + $attribute->code.'.*.value' => [$attribute->is_required ? 'required' : 'nullable', 'email'], + $attribute->code.'.*.label' => $attribute->is_required ? 'required' : 'nullable', + ]; + } elseif ($attribute->type == 'phone') { + $validations = [ + $attribute->code => [$attribute->is_required ? 'required' : 'nullable'], + $attribute->code.'.*.value' => [$attribute->is_required ? 'required' : 'nullable'], + $attribute->code.'.*.label' => $attribute->is_required ? 'required' : 'nullable', + ]; + } else { + $validations[$attribute->code] = [$attribute->is_required ? 'required' : 'nullable']; + + if ($attribute->type == 'text' && $attribute->validation) { + array_push($validations[$attribute->code], + $attribute->validation == 'decimal' + ? new Decimal + : $attribute->validation + ); + } + + if ($attribute->type == 'price') { + array_push($validations[$attribute->code], new Decimal); + } + } + + if ($attribute->is_unique) { + array_push($validations[in_array($attribute->type, ['email', 'phone']) + ? $attribute->code.'.*.value' + : $attribute->code + ], function ($field, $value, $fail) use ($attribute) { + if (! $this->attributeValueRepository->isValueUnique( + null, + $attribute->entity_type, + $attribute, + request($field) + ) + ) { + $fail(trans('data_transfer::app.validation.errors.already-exists', ['attribute' => $attribute->name])); + } + }); + } + + $rules = [ + ...$rules, + ...$validations, + ]; + } + } + + return $rules; + } + + /** + * Start the import process. + */ + public function importBatch(ImportBatchContract $batch): bool + { + Event::dispatch('data_transfer.imports.batch.import.before', $batch); + + if ($batch->import->action == Import::ACTION_DELETE) { + $this->deleteLeads($batch); + } else { + $this->saveLeads($batch); + } + + /** + * Update import batch summary. + */ + $batch = $this->importBatchRepository->update([ + 'state' => Import::STATE_PROCESSED, + + 'summary' => [ + 'created' => $this->getCreatedItemsCount(), + 'updated' => $this->getUpdatedItemsCount(), + 'deleted' => $this->getDeletedItemsCount(), + ], + ], $batch->id); + + Event::dispatch('data_transfer.imports.batch.import.after', $batch); + + return true; + } + + /** + * Start the products linking process + */ + public function linkBatch(ImportBatchContract $batch): bool + { + Event::dispatch('data_transfer.imports.batch.linking.before', $batch); + + /** + * Load leads storage with batch ids. + */ + $this->leadsStorage->load(Arr::pluck($batch->data, 'title')); + + $products = []; + + foreach ($batch->data as $rowData) { + /** + * Prepare products. + */ + $this->prepareProducts($rowData, $products); + } + + $this->saveProducts($products); + + /** + * Update import batch summary + */ + $this->importBatchRepository->update([ + 'state' => Import::STATE_LINKED, + ], $batch->id); + + Event::dispatch('data_transfer.imports.batch.linking.after', $batch); + + return true; + } + + /** + * Prepare products. + */ + public function prepareProducts($rowData, &$product): void + { + if (! empty($rowData['product'])) { + $product[$rowData['title']] = $this->parseProducts($rowData['product']); + } + } + + /** + * Save products. + */ + public function saveProducts(array $products): void + { + $leadProducts = []; + + foreach ($products as $title => $product) { + $lead = $this->leadsStorage->get($title); + + $leadProducts['insert'][] = [ + 'lead_id' => $lead['id'], + 'product_id' => $product['id'], + 'price' => $product['price'], + 'quantity' => $product['quantity'], + 'amount' => $product['amount'], + ]; + } + + foreach ($leadProducts['insert'] as $key => $leadProduct) { + $this->leadProductRepository->deleteWhere([ + 'lead_id' => $leadProduct['lead_id'], + 'product_id' => $leadProduct['product_id'], + ]); + } + + $this->leadProductRepository->upsert($leadProducts['insert'], ['lead_id', 'product_id']); + } + + /** + * Delete leads from current batch. + */ + protected function deleteLeads(ImportBatchContract $batch): bool + { + /** + * Load leads storage with batch ids. + */ + $this->leadsStorage->load(Arr::pluck($batch->data, 'title')); + + $idsToDelete = []; + + foreach ($batch->data as $rowData) { + if (! $this->isTitleExist($rowData['title'])) { + continue; + } + + $idsToDelete[] = $this->leadsStorage->get($rowData['title']); + } + + $idsToDelete = array_unique($idsToDelete); + + $this->deletedItemsCount = count($idsToDelete); + + $this->leadRepository->deleteWhere([['id', 'IN', $idsToDelete]]); + + return true; + } + + /** + * Save leads from current batch. + */ + protected function saveLeads(ImportBatchContract $batch): bool + { + /** + * Load lead storage with batch unique title. + */ + $this->leadsStorage->load(Arr::pluck($batch->data, 'title')); + + $leads = []; + + /** + * Prepare leads for import. + */ + foreach ($batch->data as $rowData) { + if (isset($rowData['id'])) { + $leads['update'][$rowData['id']] = Arr::except($rowData, ['product']); + } else { + $leads['insert'][$rowData['title']] = [ + ...Arr::except($rowData, ['id', 'product']), + 'created_at' => $rowData['created_at'] ?? now(), + 'updated_at' => $rowData['updated_at'] ?? now(), + ]; + } + } + + if (! empty($leads['update'])) { + $this->updatedItemsCount += count($leads['update']); + + $this->leadRepository->upsert( + $leads['update'], + $this->masterAttributeCode + ); + } + + if (! empty($leads['insert'])) { + $this->createdItemsCount += count($leads['insert']); + + $this->leadRepository->insert($leads['insert']); + + /** + * Update the sku storage with newly created products + */ + $newLeads = $this->leadRepository->findWhereIn( + 'title', + array_keys($leads['insert']), + [ + 'id', + 'title', + ] + ); + + foreach ($newLeads as $lead) { + $this->leadsStorage->set($lead->title, [ + 'id' => $lead->id, + 'title' => $lead->title, + ]); + } + } + + return true; + } + + /** + * Check if title exists. + */ + public function isTitleExist(string $title): bool + { + return $this->leadsStorage->has($title); + } + + /** + * Prepare row data to save into the database. + */ + protected function prepareRowForDb(array $rowData): array + { + return parent::prepareRowForDb($rowData); + } +} diff --git a/packages/Webkul/DataTransfer/src/Helpers/Importers/Leads/Storage.php b/packages/Webkul/DataTransfer/src/Helpers/Importers/Leads/Storage.php new file mode 100644 index 0000000..f9d657d --- /dev/null +++ b/packages/Webkul/DataTransfer/src/Helpers/Importers/Leads/Storage.php @@ -0,0 +1,97 @@ +items = []; + + $this->load(); + } + + /** + * Load the leads. + */ + public function load(array $titles = []): void + { + if (empty($titles)) { + $leads = $this->leadRepository->all($this->selectColumns); + } else { + $leads = $this->leadRepository->findWhereIn('title', $titles, $this->selectColumns); + } + + foreach ($leads as $lead) { + $this->set($lead->title, [ + 'id' => $lead->id, + 'title' => $lead->title, + ]); + } + } + + /** + * Get Ids and Unique Id. + */ + public function set(string $title, array $data): self + { + $this->items[$title] = $data; + + return $this; + } + + /** + * Check if unique id exists. + */ + public function has(string $title): bool + { + return isset($this->items[$title]); + } + + /** + * Get unique id information. + */ + public function get(string $title): ?array + { + if (! $this->has($title)) { + return null; + } + + return $this->items[$title]; + } + + public function getItems(): array + { + return $this->items; + } + + /** + * Is storage is empty. + */ + public function isEmpty(): bool + { + return empty($this->items); + } +} diff --git a/packages/Webkul/DataTransfer/src/Helpers/Importers/Persons/Importer.php b/packages/Webkul/DataTransfer/src/Helpers/Importers/Persons/Importer.php new file mode 100644 index 0000000..0c9ebe9 --- /dev/null +++ b/packages/Webkul/DataTransfer/src/Helpers/Importers/Persons/Importer.php @@ -0,0 +1,492 @@ + 'data_transfer::app.importers.persons.validation.errors.email-not-found', + self::ERROR_DUPLICATE_EMAIL => 'data_transfer::app.importers.persons.validation.errors.duplicate-email', + self::ERROR_DUPLICATE_PHONE => 'data_transfer::app.importers.persons.validation.errors.duplicate-phone', + ]; + + /** + * Permanent entity columns. + * + * @var string[] + */ + protected $permanentAttributes = ['emails']; + + /** + * Permanent entity column. + */ + protected string $masterAttributeCode = 'unique_id'; + + /** + * Emails storage. + */ + protected array $emails = []; + + /** + * Phones storage. + */ + protected array $phones = []; + + /** + * Create a new helper instance. + * + * @return void + */ + public function __construct( + protected ImportBatchRepository $importBatchRepository, + protected PersonRepository $personRepository, + protected AttributeRepository $attributeRepository, + protected AttributeValueRepository $attributeValueRepository, + protected Storage $personStorage, + ) { + parent::__construct( + $importBatchRepository, + $attributeRepository, + $attributeValueRepository, + ); + } + + /** + * Initialize Product error templates. + */ + protected function initErrorMessages(): void + { + foreach ($this->messages as $errorCode => $message) { + $this->errorHelper->addErrorMessage($errorCode, trans($message)); + } + + parent::initErrorMessages(); + } + + /** + * Validate data. + */ + public function validateData(): void + { + $this->personStorage->init(); + + parent::validateData(); + } + + /** + * Validates row. + */ + public function validateRow(array $rowData, int $rowNumber): bool + { + $rowData = $this->parsedRowData($rowData); + + /** + * If row is already validated than no need for further validation. + */ + if (isset($this->validatedRows[$rowNumber])) { + return ! $this->errorHelper->isRowInvalid($rowNumber); + } + + $this->validatedRows[$rowNumber] = true; + + /** + * If import action is delete than no need for further validation. + */ + if ($this->import->action == Import::ACTION_DELETE) { + foreach ($rowData['emails'] as $email) { + if (! $this->isEmailExist($email['value'])) { + $this->skipRow($rowNumber, self::ERROR_EMAIL_NOT_FOUND_FOR_DELETE, 'email'); + + return false; + } + + return true; + } + } + + /** + * Validate row data. + */ + $validator = Validator::make($rowData, [ + ...$this->getValidationRules('persons', $rowData), + 'organization_id' => 'required|exists:organizations,id', + 'user_id' => 'required|exists:users,id', + 'contact_numbers' => 'required|array', + 'contact_numbers.*.value' => 'required|numeric', + 'contact_numbers.*.label' => 'required|in:home,work', + 'emails' => 'required|array', + 'emails.*.value' => 'required|email', + 'emails.*.label' => 'required|in:home,work', + ]); + + if ($validator->fails()) { + $failedAttributes = $validator->failed(); + + foreach ($validator->errors()->getMessages() as $attributeCode => $message) { + $errorCode = array_key_first($failedAttributes[$attributeCode] ?? []); + + $this->skipRow($rowNumber, $errorCode, $attributeCode, current($message)); + } + } + + /** + * Check if email is unique. + */ + if (! empty($emails = $rowData['emails'])) { + foreach ($emails as $email) { + if (! in_array($email['value'], $this->emails)) { + $this->emails[] = $email['value']; + } else { + $message = sprintf( + trans($this->messages[self::ERROR_DUPLICATE_EMAIL]), + $email['value'] + ); + + $this->skipRow($rowNumber, self::ERROR_DUPLICATE_EMAIL, 'email', $message); + } + } + } + + /** + * Check if phone(s) are unique. + */ + if (! empty($rowData['contact_numbers'])) { + foreach ($rowData['contact_numbers'] as $phone) { + if (! in_array($phone['value'], $this->phones)) { + if (! empty($phone['value'])) { + $this->phones[] = $phone['value']; + } + } else { + $message = sprintf( + trans($this->messages[self::ERROR_DUPLICATE_PHONE]), + $phone['value'] + ); + + $this->skipRow($rowNumber, self::ERROR_DUPLICATE_PHONE, 'phone', $message); + } + } + } + + return ! $this->errorHelper->isRowInvalid($rowNumber); + } + + /** + * Start the import process. + */ + public function importBatch(ImportBatchContract $batch): bool + { + Event::dispatch('data_transfer.imports.batch.import.before', $batch); + + if ($batch->import->action == Import::ACTION_DELETE) { + $this->deletePersons($batch); + } else { + $this->savePersonData($batch); + } + + /** + * Update import batch summary. + */ + $batch = $this->importBatchRepository->update([ + 'state' => Import::STATE_PROCESSED, + + 'summary' => [ + 'created' => $this->getCreatedItemsCount(), + 'updated' => $this->getUpdatedItemsCount(), + 'deleted' => $this->getDeletedItemsCount(), + ], + ], $batch->id); + + Event::dispatch('data_transfer.imports.batch.import.after', $batch); + + return true; + } + + /** + * Delete persons from current batch. + */ + protected function deletePersons(ImportBatchContract $batch): bool + { + /** + * Load person storage with batch emails. + */ + $emails = collect(Arr::pluck($batch->data, 'emails')) + ->map(function ($emails) { + $emails = json_decode($emails, true); + + foreach ($emails as $email) { + return $email['value']; + } + }); + + $this->personStorage->load($emails->toArray()); + + $idsToDelete = []; + + foreach ($batch->data as $rowData) { + $rowData = $this->parsedRowData($rowData); + + foreach ($rowData['emails'] as $email) { + if (! $this->isEmailExist($email['value'])) { + continue; + } + + $idsToDelete[] = $this->personStorage->get($email['value']); + } + } + + $idsToDelete = array_unique($idsToDelete); + + $this->deletedItemsCount = count($idsToDelete); + + $this->personRepository->deleteWhere([['id', 'IN', $idsToDelete]]); + + return true; + } + + /** + * Save person from current batch. + */ + protected function savePersonData(ImportBatchContract $batch): bool + { + /** + * Load person storage with batch email. + */ + $emails = collect(Arr::pluck($batch->data, 'emails')) + ->map(function ($emails) { + $emails = json_decode($emails, true); + + foreach ($emails as $email) { + return $email['value']; + } + }); + + $this->personStorage->load($emails->toArray()); + + $persons = []; + + $attributeValues = []; + + /** + * Prepare persons for import. + */ + foreach ($batch->data as $rowData) { + $this->preparePersons($rowData, $persons); + + $this->prepareAttributeValues($rowData, $attributeValues); + } + + $this->savePersons($persons); + + $this->saveAttributeValues($attributeValues); + + return true; + } + + /** + * Prepare persons from current batch. + */ + public function preparePersons(array $rowData, array &$persons): void + { + $emails = $this->prepareEmail($rowData['emails']); + + foreach ($emails as $email) { + $contactNumber = json_decode($rowData['contact_numbers'], true); + + $rowData['unique_id'] = "{$rowData['user_id']}|{$rowData['organization_id']}|{$email}|{$contactNumber[0]['value']}"; + + if ($this->isEmailExist($email)) { + $persons['update'][$email] = $rowData; + } else { + $persons['insert'][$email] = [ + ...$rowData, + 'created_at' => $rowData['created_at'] ?? now(), + 'updated_at' => $rowData['updated_at'] ?? now(), + ]; + } + } + } + + /** + * Save persons from current batch. + */ + public function savePersons(array $persons): void + { + if (! empty($persons['update'])) { + $this->updatedItemsCount += count($persons['update']); + + $this->personRepository->upsert( + $persons['update'], + $this->masterAttributeCode, + ); + } + + if (! empty($persons['insert'])) { + $this->createdItemsCount += count($persons['insert']); + + $this->personRepository->insert($persons['insert']); + + /** + * Update the sku storage with newly created products + */ + $emails = array_keys($persons['insert']); + + $newPersons = $this->personRepository->where(function ($query) use ($emails) { + foreach ($emails as $email) { + $query->orWhereJsonContains('emails', [['value' => $email]]); + } + })->get(); + + foreach ($newPersons as $person) { + $this->personStorage->set($person->emails[0]['value'], $person->id); + } + } + } + + /** + * Save attribute values for the person. + */ + public function saveAttributeValues(array $attributeValues): void + { + $personAttributeValues = []; + + foreach ($attributeValues as $email => $attributeValue) { + foreach ($attributeValue as $attribute) { + $attribute['entity_id'] = (int) $this->personStorage->get($email); + + $attribute['unique_id'] = implode('|', array_filter([ + $attribute['entity_id'], + $attribute['attribute_id'], + ])); + + $attribute['entity_type'] = 'persons'; + + $personAttributeValues[$attribute['unique_id']] = $attribute; + } + } + + $this->attributeValueRepository->upsert($personAttributeValues, 'unique_id'); + } + + /** + * Check if email exists. + */ + public function isEmailExist(string $email): bool + { + return $this->personStorage->has($email); + } + + /** + * Prepare attribute values for the person. + */ + public function prepareAttributeValues(array $rowData, array &$attributeValues): void + { + foreach ($rowData as $code => $value) { + if (is_null($value)) { + continue; + } + + $where = ['code' => $code]; + + if ($code === 'name') { + $where['entity_type'] = 'persons'; + } + + $attribute = $this->attributeRepository->findOneWhere($where); + + if (! $attribute) { + continue; + } + + $typeFields = $this->personRepository->getModel()::$attributeTypeFields; + + $attributeTypeValues = array_fill_keys(array_values($typeFields), null); + + $emails = $this->prepareEmail($rowData['emails']); + + foreach ($emails as $email) { + $attributeValues[$email][] = array_merge($attributeTypeValues, [ + 'attribute_id' => $attribute->id, + $typeFields[$attribute->type] => $value, + ]); + } + } + } + + /** + * Get parsed email and phone. + */ + private function parsedRowData(array $rowData): array + { + $rowData['emails'] = json_decode($rowData['emails'], true); + + $rowData['contact_numbers'] = json_decode($rowData['contact_numbers'], true); + + return $rowData; + } + + /** + * Prepare email from row data. + */ + private function prepareEmail(array|string $emails): Collection + { + static $cache = []; + + return collect($emails) + ->map(function ($emailString) use (&$cache) { + if (isset($cache[$emailString])) { + return $cache[$emailString]; + } + + $decoded = json_decode($emailString, true); + + $emailValue = is_array($decoded) + && isset($decoded[0]['value']) + ? $decoded[0]['value'] + : null; + + return $cache[$emailString] = $emailValue; + }); + } +} diff --git a/packages/Webkul/DataTransfer/src/Helpers/Importers/Persons/Storage.php b/packages/Webkul/DataTransfer/src/Helpers/Importers/Persons/Storage.php new file mode 100644 index 0000000..f18761b --- /dev/null +++ b/packages/Webkul/DataTransfer/src/Helpers/Importers/Persons/Storage.php @@ -0,0 +1,99 @@ +items = []; + + $this->load(); + } + + /** + * Load the Emails. + */ + public function load(array $emails = []): void + { + if (empty($emails)) { + $persons = $this->personRepository->all($this->selectColumns); + } else { + $persons = $this->personRepository->scopeQuery(function ($query) use ($emails) { + return $query->where(function ($subQuery) use ($emails) { + foreach ($emails as $email) { + $subQuery->orWhereJsonContains('emails', ['value' => $email]); + } + }); + })->all($this->selectColumns); + } + + $persons->each(function ($person) { + collect($person->emails) + ->each(fn ($email) => $this->set($email['value'], $person->id)); + }); + } + + /** + * Get email information. + */ + public function set(string $email, int $id): self + { + $this->items[$email] = $id; + + return $this; + } + + /** + * Check if email exists. + */ + public function has(string $email): bool + { + return isset($this->items[$email]); + } + + /** + * Get email information. + */ + public function get(string $email): ?int + { + if (! $this->has($email)) { + return null; + } + + return $this->items[$email]; + } + + /** + * Is storage is empty. + */ + public function isEmpty(): int + { + return empty($this->items); + } +} diff --git a/packages/Webkul/DataTransfer/src/Helpers/Importers/Products/Importer.php b/packages/Webkul/DataTransfer/src/Helpers/Importers/Products/Importer.php new file mode 100644 index 0000000..9048bea --- /dev/null +++ b/packages/Webkul/DataTransfer/src/Helpers/Importers/Products/Importer.php @@ -0,0 +1,369 @@ + 'data_transfer::app.importers.products.validation.errors.sku-not-found', + ]; + + /** + * Permanent entity columns. + */ + protected array $permanentAttributes = ['sku']; + + /** + * Permanent entity column. + */ + protected string $masterAttributeCode = 'sku'; + + /** + * Cached attributes. + */ + protected mixed $attributes = []; + + /** + * Valid csv columns. + */ + protected array $validColumnNames = [ + 'sku', + 'name', + 'description', + 'quantity', + 'price', + ]; + + /** + * Create a new helper instance. + * + * @return void + */ + public function __construct( + protected ImportBatchRepository $importBatchRepository, + protected AttributeRepository $attributeRepository, + protected AttributeOptionRepository $attributeOptionRepository, + protected ProductRepository $productRepository, + protected ProductInventoryRepository $productInventoryRepository, + protected AttributeValueRepository $attributeValueRepository, + protected SKUStorage $skuStorage + ) { + parent::__construct( + $importBatchRepository, + $attributeRepository, + $attributeValueRepository + ); + + $this->initAttributes(); + } + + /** + * Load all attributes and families to use later. + */ + protected function initAttributes(): void + { + $this->attributes = $this->attributeRepository->all(); + + foreach ($this->attributes as $attribute) { + $this->validColumnNames[] = $attribute->code; + } + } + + /** + * Initialize Product error templates. + */ + protected function initErrorMessages(): void + { + foreach ($this->messages as $errorCode => $message) { + $this->errorHelper->addErrorMessage($errorCode, trans($message)); + } + + parent::initErrorMessages(); + } + + /** + * Save validated batches. + */ + protected function saveValidatedBatches(): self + { + $source = $this->getSource(); + + $source->rewind(); + + $this->skuStorage->init(); + + while ($source->valid()) { + try { + $rowData = $source->current(); + } catch (\InvalidArgumentException $e) { + $source->next(); + + continue; + } + + $this->validateRow($rowData, $source->getCurrentRowNumber()); + + $source->next(); + } + + parent::saveValidatedBatches(); + + return $this; + } + + /** + * Validates row. + */ + public function validateRow(array $rowData, int $rowNumber): bool + { + /** + * If row is already validated than no need for further validation. + */ + if (isset($this->validatedRows[$rowNumber])) { + return ! $this->errorHelper->isRowInvalid($rowNumber); + } + + $this->validatedRows[$rowNumber] = true; + + /** + * If import action is delete than no need for further validation. + */ + if ($this->import->action == Import::ACTION_DELETE) { + if (! $this->isSKUExist($rowData['sku'])) { + $this->skipRow($rowNumber, self::ERROR_SKU_NOT_FOUND_FOR_DELETE, 'sku'); + + return false; + } + + return true; + } + + /** + * Validate product attributes + */ + $validator = Validator::make($rowData, $this->getValidationRules('products', $rowData)); + + if ($validator->fails()) { + foreach ($validator->errors()->getMessages() as $attributeCode => $message) { + $failedAttributes = $validator->failed(); + + $errorCode = array_key_first($failedAttributes[$attributeCode] ?? []); + + $this->skipRow($rowNumber, $errorCode, $attributeCode, current($message)); + } + } + + return ! $this->errorHelper->isRowInvalid($rowNumber); + } + + /** + * Start the import process. + */ + public function importBatch(ImportBatchContract $batch): bool + { + Event::dispatch('data_transfer.imports.batch.import.before', $batch); + + if ($batch->import->action == Import::ACTION_DELETE) { + $this->deleteProducts($batch); + } else { + $this->saveProductsData($batch); + } + + /** + * Update import batch summary. + */ + $batch = $this->importBatchRepository->update([ + 'state' => Import::STATE_PROCESSED, + + 'summary' => [ + 'created' => $this->getCreatedItemsCount(), + 'updated' => $this->getUpdatedItemsCount(), + 'deleted' => $this->getDeletedItemsCount(), + ], + ], $batch->id); + + Event::dispatch('data_transfer.imports.batch.import.after', $batch); + + return true; + } + + /** + * Delete products from current batch. + */ + protected function deleteProducts(ImportBatchContract $batch): bool + { + /** + * Load SKU storage with batch skus. + */ + $this->skuStorage->load(Arr::pluck($batch->data, 'sku')); + + $idsToDelete = []; + + foreach ($batch->data as $rowData) { + if (! $this->isSKUExist($rowData['sku'])) { + continue; + } + + $product = $this->skuStorage->get($rowData['sku']); + + $idsToDelete[] = $product['id']; + } + + $idsToDelete = array_unique($idsToDelete); + + $this->deletedItemsCount = count($idsToDelete); + + $this->productRepository->deleteWhere([['id', 'IN', $idsToDelete]]); + + return true; + } + + /** + * Save products from current batch. + */ + protected function saveProductsData(ImportBatchContract $batch): bool + { + /** + * Load SKU storage with batch skus. + */ + $this->skuStorage->load(Arr::pluck($batch->data, 'sku')); + + $products = []; + + /** + * Prepare products for import. + */ + foreach ($batch->data as $rowData) { + $this->prepareProducts($rowData, $products); + } + + $this->saveProducts($products); + + return true; + } + + /** + * Prepare products from current batch. + */ + public function prepareProducts(array $rowData, array &$products): void + { + if ($this->isSKUExist($rowData['sku'])) { + $products['update'][$rowData['sku']] = $rowData; + } else { + $products['insert'][$rowData['sku']] = [ + ...$rowData, + 'created_at' => $rowData['created_at'] ?? now(), + 'updated_at' => $rowData['updated_at'] ?? now(), + ]; + } + } + + /** + * Save products from current batch. + */ + public function saveProducts(array $products): void + { + if (! empty($products['update'])) { + $this->updatedItemsCount += count($products['update']); + + $this->productRepository->upsert( + $products['update'], + $this->masterAttributeCode + ); + } + + if (! empty($products['insert'])) { + $this->createdItemsCount += count($products['insert']); + + $this->productRepository->insert($products['insert']); + } + } + + /** + * Save channels from current batch. + */ + public function saveChannels(array $channels): void + { + $productChannels = []; + + foreach ($channels as $sku => $channelIds) { + $product = $this->skuStorage->get($sku); + + foreach (array_unique($channelIds) as $channelId) { + $productChannels[] = [ + 'product_id' => $product['id'], + 'channel_id' => $channelId, + ]; + } + } + + DB::table('product_channels')->upsert( + $productChannels, + [ + 'product_id', + 'channel_id', + ], + ); + } + + /** + * Save links. + */ + public function loadUnloadedSKUs(array $skus): void + { + $notLoadedSkus = []; + + foreach ($skus as $sku) { + if ($this->skuStorage->has($sku)) { + continue; + } + + $notLoadedSkus[] = $sku; + } + + /** + * Load not loaded SKUs to the sku storage. + */ + if (! empty($notLoadedSkus)) { + $this->skuStorage->load($notLoadedSkus); + } + } + + /** + * Check if SKU exists. + */ + public function isSKUExist(string $sku): bool + { + return $this->skuStorage->has($sku); + } + + /** + * Prepare row data to save into the database. + */ + protected function prepareRowForDb(array $rowData): array + { + return parent::prepareRowForDb($rowData); + } +} diff --git a/packages/Webkul/DataTransfer/src/Helpers/Importers/Products/SKUStorage.php b/packages/Webkul/DataTransfer/src/Helpers/Importers/Products/SKUStorage.php new file mode 100644 index 0000000..792d0c0 --- /dev/null +++ b/packages/Webkul/DataTransfer/src/Helpers/Importers/Products/SKUStorage.php @@ -0,0 +1,107 @@ +items = []; + + $this->load(); + } + + /** + * Load the SKU. + */ + public function load(array $skus = []): void + { + if (empty($skus)) { + $products = $this->productRepository->all($this->selectColumns); + } else { + $products = $this->productRepository->findWhereIn('sku', $skus, $this->selectColumns); + } + + foreach ($products as $product) { + $this->set($product->sku, [ + 'id' => $product->id, + 'sku' => $product->sku, + ]); + } + } + + /** + * Get SKU information. + */ + public function set(string $sku, array $data): self + { + $this->items[$sku] = implode(self::DELIMITER, [ + $data['id'], + $data['sku'], + ]); + + return $this; + } + + /** + * Check if SKU exists. + */ + public function has(string $sku): bool + { + return isset($this->items[$sku]); + } + + /** + * Get SKU information. + */ + public function get(string $sku): ?array + { + if (! $this->has($sku)) { + return null; + } + + $data = explode(self::DELIMITER, $this->items[$sku]); + + return [ + 'id' => $data[0], + ]; + } + + /** + * Is storage is empty. + */ + public function isEmpty(): int + { + return empty($this->items); + } +} diff --git a/packages/Webkul/DataTransfer/src/Helpers/Sources/AbstractSource.php b/packages/Webkul/DataTransfer/src/Helpers/Sources/AbstractSource.php new file mode 100644 index 0000000..6d4689d --- /dev/null +++ b/packages/Webkul/DataTransfer/src/Helpers/Sources/AbstractSource.php @@ -0,0 +1,120 @@ +currentRowNumber; + } + + /** + * Checks if current position is valid. + */ + public function valid(): bool + { + return $this->currentRowNumber !== -1; + } + + /** + * Read next line from source. + */ + public function current(): array + { + $row = $this->currentRowData; + + if (count($row) != $this->totalColumns) { + if ($this->foundWrongQuoteFlag) { + throw new \InvalidArgumentException(AbstractImporter::ERROR_CODE_WRONG_QUOTES); + } else { + throw new \InvalidArgumentException(AbstractImporter::ERROR_CODE_COLUMNS_NUMBER); + } + } + + return array_combine($this->columnNames, $row); + } + + /** + * Read next line from source. + */ + public function next(): void + { + $this->currentRowNumber++; + + $row = $this->getNextRow(); + + if ($row === false || $row === []) { + $this->currentRowData = []; + + $this->currentRowNumber = -1; + } else { + $this->currentRowData = $row; + } + } + + /** + * Rewind the iterator to the first row. + */ + public function rewind(): void + { + $this->currentRowNumber = 0; + + $this->currentRowData = []; + + $this->getNextRow(); + + $this->next(); + } + + /** + * Column names getter. + */ + public function getColumnNames(): array + { + return $this->columnNames; + } + + /** + * Column names getter. + */ + public function getTotalColumns(): int + { + return count($this->columnNames); + } +} diff --git a/packages/Webkul/DataTransfer/src/Helpers/Sources/CSV.php b/packages/Webkul/DataTransfer/src/Helpers/Sources/CSV.php new file mode 100644 index 0000000..eee5e88 --- /dev/null +++ b/packages/Webkul/DataTransfer/src/Helpers/Sources/CSV.php @@ -0,0 +1,79 @@ +reader = fopen(Storage::disk('public')->path($filePath), 'r'); + + $this->columnNames = fgetcsv($this->reader, 4096, $delimiter); + + $this->totalColumns = count($this->columnNames); + } catch (\Exception $e) { + throw new \LogicException("Unable to open file: '{$filePath}'"); + } + } + + /** + * Close file handle. + * + * @return void + */ + public function __destruct() + { + if (! is_object($this->reader)) { + return; + } + + $this->reader->close(); + } + + /** + * Read next line from csv. + */ + protected function getNextRow(): array + { + $parsed = fgetcsv($this->reader, 4096, $this->delimiter); + + if (is_array($parsed) && count($parsed) != $this->totalColumns) { + foreach ($parsed as $element) { + if ($element && strpos($element, "'") !== false) { + $this->foundWrongQuoteFlag = true; + + break; + } + } + } else { + $this->foundWrongQuoteFlag = false; + } + + return is_array($parsed) ? $parsed : []; + } + + /** + * Rewind the iterator to the first row. + */ + public function rewind(): void + { + rewind($this->reader); + + parent::rewind(); + } +} diff --git a/packages/Webkul/DataTransfer/src/Helpers/Sources/Excel.php b/packages/Webkul/DataTransfer/src/Helpers/Sources/Excel.php new file mode 100644 index 0000000..1d9e66a --- /dev/null +++ b/packages/Webkul/DataTransfer/src/Helpers/Sources/Excel.php @@ -0,0 +1,70 @@ +path($filePath)); + + $this->reader = $factory->getActiveSheet(); + + $highestColumn = $this->reader->getHighestColumn(); + + $this->totalColumns = Coordinate::columnIndexFromString($highestColumn); + + $this->columnNames = $this->getNextRow(); + } catch (\Exception $e) { + throw new \LogicException("Unable to open file: '{$filePath}'"); + } + } + + /** + * Read next line from csv. + */ + protected function getNextRow(): array|bool + { + for ($column = 1; $column <= $this->totalColumns; $column++) { + $rowData[] = $this->reader->getCellByColumnAndRow($column, $this->currentRowNumber)->getValue(); + } + + $filteredRowData = array_filter($rowData); + + if (empty($filteredRowData)) { + return false; + } + + return $rowData; + } + + /** + * Rewind the iterator to the first row. + */ + public function rewind(): void + { + $this->currentRowNumber = 1; + + $this->next(); + } +} diff --git a/packages/Webkul/DataTransfer/src/Jobs/Import/Completed.php b/packages/Webkul/DataTransfer/src/Jobs/Import/Completed.php new file mode 100644 index 0000000..75f466d --- /dev/null +++ b/packages/Webkul/DataTransfer/src/Jobs/Import/Completed.php @@ -0,0 +1,38 @@ +import = $import; + } + + /** + * Execute the job. + * + * @return void + */ + public function handle() + { + app(ImportHelper::class) + ->setImport($this->import) + ->completed(); + } +} diff --git a/packages/Webkul/DataTransfer/src/Jobs/Import/ImportBatch.php b/packages/Webkul/DataTransfer/src/Jobs/Import/ImportBatch.php new file mode 100644 index 0000000..595dcc7 --- /dev/null +++ b/packages/Webkul/DataTransfer/src/Jobs/Import/ImportBatch.php @@ -0,0 +1,41 @@ +importBatch = $importBatch; + } + + /** + * Execute the job. + * + * @return void + */ + public function handle() + { + $typeImported = app(ImportHelper::class) + ->setImport($this->importBatch->import) + ->getTypeImporter(); + + $typeImported->importBatch($this->importBatch); + } +} diff --git a/packages/Webkul/DataTransfer/src/Jobs/Import/IndexBatch.php b/packages/Webkul/DataTransfer/src/Jobs/Import/IndexBatch.php new file mode 100644 index 0000000..971893b --- /dev/null +++ b/packages/Webkul/DataTransfer/src/Jobs/Import/IndexBatch.php @@ -0,0 +1,41 @@ +importBatch = $importBatch; + } + + /** + * Execute the job. + * + * @return void + */ + public function handle() + { + $typeImported = app(ImportHelper::class) + ->setImport($this->importBatch->import) + ->getTypeImporter(); + + $typeImported->indexBatch($this->importBatch); + } +} diff --git a/packages/Webkul/DataTransfer/src/Jobs/Import/Indexing.php b/packages/Webkul/DataTransfer/src/Jobs/Import/Indexing.php new file mode 100644 index 0000000..b4ed9aa --- /dev/null +++ b/packages/Webkul/DataTransfer/src/Jobs/Import/Indexing.php @@ -0,0 +1,38 @@ +import = $import; + } + + /** + * Execute the job. + * + * @return void + */ + public function handle() + { + app(ImportHelper::class) + ->setImport($this->import) + ->indexing(); + } +} diff --git a/packages/Webkul/DataTransfer/src/Jobs/Import/LinkBatch.php b/packages/Webkul/DataTransfer/src/Jobs/Import/LinkBatch.php new file mode 100644 index 0000000..c02f2cd --- /dev/null +++ b/packages/Webkul/DataTransfer/src/Jobs/Import/LinkBatch.php @@ -0,0 +1,41 @@ +importBatch = $importBatch; + } + + /** + * Execute the job. + * + * @return void + */ + public function handle() + { + $typeImported = app(ImportHelper::class) + ->setImport($this->importBatch->import) + ->getTypeImporter(); + + $typeImported->linkBatch($this->importBatch); + } +} diff --git a/packages/Webkul/DataTransfer/src/Jobs/Import/Linking.php b/packages/Webkul/DataTransfer/src/Jobs/Import/Linking.php new file mode 100644 index 0000000..e826cf2 --- /dev/null +++ b/packages/Webkul/DataTransfer/src/Jobs/Import/Linking.php @@ -0,0 +1,38 @@ +import = $import; + } + + /** + * Execute the job. + * + * @return void + */ + public function handle() + { + app(ImportHelper::class) + ->setImport($this->import) + ->linking(); + } +} diff --git a/packages/Webkul/DataTransfer/src/Models/Import.php b/packages/Webkul/DataTransfer/src/Models/Import.php new file mode 100755 index 0000000..8aa52ab --- /dev/null +++ b/packages/Webkul/DataTransfer/src/Models/Import.php @@ -0,0 +1,63 @@ + 'array', + 'errors' => 'array', + 'started_at' => 'datetime', + 'completed_at' => 'datetime', + ]; + + /** + * Get the options. + */ + public function batches(): HasMany + { + return $this->hasMany(ImportBatchProxy::modelClass()); + } + + /** + * Get the file name. + */ + public function getFileNameAttribute(): string + { + return preg_replace('/^.*?\/\d+-/', '', $this->file_path); + } +} diff --git a/packages/Webkul/DataTransfer/src/Models/ImportBatch.php b/packages/Webkul/DataTransfer/src/Models/ImportBatch.php new file mode 100755 index 0000000..da31c34 --- /dev/null +++ b/packages/Webkul/DataTransfer/src/Models/ImportBatch.php @@ -0,0 +1,48 @@ + 'array', + 'data' => 'array', + ]; + + /** + * Get the import that owns the import batch. + * + * @return \Illuminate\Database\Eloquent\Relations\BelongsTo + */ + public function import() + { + return $this->belongsTo(ImportProxy::modelClass()); + } +} diff --git a/packages/Webkul/DataTransfer/src/Models/ImportBatchProxy.php b/packages/Webkul/DataTransfer/src/Models/ImportBatchProxy.php new file mode 100644 index 0000000..47b0988 --- /dev/null +++ b/packages/Webkul/DataTransfer/src/Models/ImportBatchProxy.php @@ -0,0 +1,7 @@ +loadTranslationsFrom(__DIR__.'/../Resources/lang', 'data_transfer'); + + $this->loadMigrationsFrom(__DIR__.'/../Database/Migrations'); + } + + /** + * Register any application services. + */ + public function register(): void + { + $this->mergeConfigFrom(dirname(__DIR__).'/Config/importers.php', 'importers'); + } +} diff --git a/packages/Webkul/DataTransfer/src/Providers/ModuleServiceProvider.php b/packages/Webkul/DataTransfer/src/Providers/ModuleServiceProvider.php new file mode 100644 index 0000000..0219650 --- /dev/null +++ b/packages/Webkul/DataTransfer/src/Providers/ModuleServiceProvider.php @@ -0,0 +1,18 @@ + [ + 'persons' => [ + 'title' => 'الأشخاص', + + 'validation' => [ + 'errors' => [ + 'duplicate-email' => 'البريد الإلكتروني: \'%s\' تم العثور عليه أكثر من مرة في ملف الاستيراد.', + 'duplicate-phone' => 'الهاتف: \'%s\' تم العثور عليه أكثر من مرة في ملف الاستيراد.', + 'email-not-found' => 'البريد الإلكتروني: \'%s\' لم يتم العثور عليه في النظام.', + ], + ], + ], + + 'products' => [ + 'title' => 'المنتجات', + + 'validation' => [ + 'errors' => [ + 'sku-not-found' => 'المنتج ذو الكود المحدد لم يتم العثور عليه.', + ], + ], + ], + + 'leads' => [ + 'title' => 'العملاء المحتملون', + + 'validation' => [ + 'errors' => [ + 'id-not-found' => 'المعرف: \'%s\' غير موجود في النظام.', + ], + ], + ], + ], + + 'validation' => [ + 'errors' => [ + 'column-empty-headers' => 'الأعمدة رقم "%s" تحتوي على رؤوس فارغة.', + 'column-name-invalid' => 'أسماء الأعمدة غير صالحة: "%s".', + 'column-not-found' => 'الأعمدة المطلوبة غير موجودة: %s.', + 'column-numbers' => 'عدد الأعمدة لا يتوافق مع عدد الصفوف في الرأس.', + 'invalid-attribute' => 'الرأس يحتوي على سمة غير صالحة: "%s".', + 'system' => 'حدث خطأ غير متوقع في النظام.', + 'wrong-quotes' => 'تم استخدام علامات الاقتباس الملتوية بدلاً من الاقتباسات المستقيمة.', + ], + ], +]; diff --git a/packages/Webkul/DataTransfer/src/Resources/lang/en/app.php b/packages/Webkul/DataTransfer/src/Resources/lang/en/app.php new file mode 100644 index 0000000..d226d05 --- /dev/null +++ b/packages/Webkul/DataTransfer/src/Resources/lang/en/app.php @@ -0,0 +1,50 @@ + [ + 'persons' => [ + 'title' => 'Persons', + + 'validation' => [ + 'errors' => [ + 'duplicate-email' => 'Email : \'%s\' is found more than once in the import file.', + 'duplicate-phone' => 'Phone : \'%s\' is found more than once in the import file.', + 'email-not-found' => 'Email : \'%s\' not found in the system.', + ], + ], + ], + + 'products' => [ + 'title' => 'Products', + + 'validation' => [ + 'errors' => [ + 'sku-not-found' => 'Product with specified SKU not found', + ], + ], + ], + + 'leads' => [ + 'title' => 'Leads', + + 'validation' => [ + 'errors' => [ + 'id-not-found' => 'ID : \'%s\' not found in the system.', + ], + ], + ], + ], + + 'validation' => [ + 'errors' => [ + 'column-empty-headers' => 'Columns number "%s" have empty headers.', + 'column-name-invalid' => 'Invalid column names: "%s".', + 'column-not-found' => 'Required columns not found: %s.', + 'column-numbers' => 'Number of columns does not correspond to the number of rows in the header.', + 'invalid-attribute' => 'Header contains invalid attribute(s): "%s".', + 'system' => 'An unexpected system error occurred.', + 'wrong-quotes' => 'Curly quotes used instead of straight quotes.', + 'already-exists' => 'The :attribute already exists.', + ], + ], +]; diff --git a/packages/Webkul/DataTransfer/src/Resources/lang/es/app.php b/packages/Webkul/DataTransfer/src/Resources/lang/es/app.php new file mode 100644 index 0000000..c4453b5 --- /dev/null +++ b/packages/Webkul/DataTransfer/src/Resources/lang/es/app.php @@ -0,0 +1,49 @@ + [ + 'persons' => [ + 'title' => 'Personas', + + 'validation' => [ + 'errors' => [ + 'duplicate-email' => 'Correo electrónico: \'%s\' se encontró más de una vez en el archivo de importación.', + 'duplicate-phone' => 'Teléfono: \'%s\' se encontró más de una vez en el archivo de importación.', + 'email-not-found' => 'Correo electrónico: \'%s\' no se encontró en el sistema.', + ], + ], + ], + + 'products' => [ + 'title' => 'Productos', + + 'validation' => [ + 'errors' => [ + 'sku-not-found' => 'Producto con el SKU especificado no encontrado.', + ], + ], + ], + + 'leads' => [ + 'title' => 'Clientes Potenciales', + + 'validation' => [ + 'errors' => [ + 'id-not-found' => 'ID: \'%s\' no se encuentra en el sistema.', + ], + ], + ], + ], + + 'validation' => [ + 'errors' => [ + 'column-empty-headers' => 'Las columnas número "%s" tienen encabezados vacíos.', + 'column-name-invalid' => 'Nombres de columnas no válidos: "%s".', + 'column-not-found' => 'No se encontraron las columnas requeridas: %s.', + 'column-numbers' => 'El número de columnas no corresponde al número de filas en el encabezado.', + 'invalid-attribute' => 'El encabezado contiene atributos no válidos: "%s".', + 'system' => 'Ocurrió un error inesperado en el sistema.', + 'wrong-quotes' => 'Se usaron comillas curvas en lugar de comillas rectas.', + ], + ], +]; diff --git a/packages/Webkul/DataTransfer/src/Resources/lang/fa/app.php b/packages/Webkul/DataTransfer/src/Resources/lang/fa/app.php new file mode 100644 index 0000000..a3f8562 --- /dev/null +++ b/packages/Webkul/DataTransfer/src/Resources/lang/fa/app.php @@ -0,0 +1,49 @@ + [ + 'persons' => [ + 'title' => 'افراد', + + 'validation' => [ + 'errors' => [ + 'duplicate-email' => 'ایمیل: \'%s\' بیش از یک بار در فایل واردات یافت شد.', + 'duplicate-phone' => 'تلفن: \'%s\' بیش از یک بار در فایل واردات یافت شد.', + 'email-not-found' => 'ایمیل: \'%s\' در سیستم یافت نشد.', + ], + ], + ], + + 'products' => [ + 'title' => 'محصولات', + + 'validation' => [ + 'errors' => [ + 'sku-not-found' => 'محصول با کد SKU مشخص شده یافت نشد.', + ], + ], + ], + + 'leads' => [ + 'title' => 'سرنخ‌ها', + + 'validation' => [ + 'errors' => [ + 'id-not-found' => 'شناسه: \'%s\' در سیستم یافت نشد.', + ], + ], + ], + ], + + 'validation' => [ + 'errors' => [ + 'column-empty-headers' => 'ستون‌های شماره "%s" دارای سرصفحه‌های خالی هستند.', + 'column-name-invalid' => 'نام‌های ستون نامعتبر: "%s".', + 'column-not-found' => 'ستون‌های مورد نیاز یافت نشد: %s.', + 'column-numbers' => 'تعداد ستون‌ها با تعداد سطرهای سرصفحه مطابقت ندارد.', + 'invalid-attribute' => 'سرصفحه شامل ویژگی‌های نامعتبر است: "%s".', + 'system' => 'خطای غیرمنتظره‌ای در سیستم رخ داد.', + 'wrong-quotes' => 'به جای گیومه‌های مستقیم از گیومه‌های خمیده استفاده شده است.', + ], + ], +]; diff --git a/packages/Webkul/DataTransfer/src/Resources/lang/pt_BR/app.php b/packages/Webkul/DataTransfer/src/Resources/lang/pt_BR/app.php new file mode 100644 index 0000000..8107725 --- /dev/null +++ b/packages/Webkul/DataTransfer/src/Resources/lang/pt_BR/app.php @@ -0,0 +1,50 @@ + [ + 'persons' => [ + 'title' => 'Pessoas', + + 'validation' => [ + 'errors' => [ + 'duplicate-email' => 'E-mail : \'%s\' é encontrado mais de uma vez no arquivo de importação.', + 'duplicate-phone' => 'Telefone : \'%s\' é encontrado mais de uma vez no arquivo de importação.', + 'email-not-found' => 'E-mail : \'%s\' não foi encontrado no sistema.', + ], + ], + ], + + 'products' => [ + 'title' => 'Produtos', + + 'validation' => [ + 'errors' => [ + 'sku-not-found' => 'Produto com este código não foi encontrado', + ], + ], + ], + + 'leads' => [ + 'title' => 'Oportunidades', + + 'validation' => [ + 'errors' => [ + 'id-not-found' => 'ID : \'%s\' não foi encontrado no sistema.', + ], + ], + ], + ], + + 'validation' => [ + 'errors' => [ + 'column-empty-headers' => 'As colunas de número "%s" têm cabeçalhos vazios.', + 'column-name-invalid' => 'Nomes de colunas inválidos: "%s".', + 'column-not-found' => 'Colunas obrigatórias não encontradas: %s.', + 'column-numbers' => 'O número de colunas não corresponde ao número de linhas no cabeçalho.', + 'invalid-attribute' => 'O cabeçalho contém atributo(s) inválido(s): "%s".', + 'system' => 'Ocorreu um erro inesperado no sistema.', + 'wrong-quotes' => 'Aspas curvas usadas em vez de aspas retas.', + 'already-exists' => 'O :attribute já existe.', + ], + ], +]; diff --git a/packages/Webkul/DataTransfer/src/Resources/lang/tr/app.php b/packages/Webkul/DataTransfer/src/Resources/lang/tr/app.php new file mode 100644 index 0000000..31430b4 --- /dev/null +++ b/packages/Webkul/DataTransfer/src/Resources/lang/tr/app.php @@ -0,0 +1,49 @@ + [ + 'persons' => [ + 'title' => 'Kişiler', + + 'validation' => [ + 'errors' => [ + 'duplicate-email' => 'E-posta: \'%s\' içe aktarma dosyasında birden fazla kez bulundu.', + 'duplicate-phone' => 'Telefon: \'%s\' içe aktarma dosyasında birden fazla kez bulundu.', + 'email-not-found' => 'E-posta: \'%s\' sistemde bulunamadı.', + ], + ], + ], + + 'products' => [ + 'title' => 'Ürünler', + + 'validation' => [ + 'errors' => [ + 'sku-not-found' => 'Belirtilen SKU\'ya sahip ürün bulunamadı.', + ], + ], + ], + + 'leads' => [ + 'title' => 'Müşteri Adayları', + + 'validation' => [ + 'errors' => [ + 'id-not-found' => 'ID: \'%s\' sistemde bulunamadı.', + ], + ], + ], + ], + + 'validation' => [ + 'errors' => [ + 'column-empty-headers' => '"%s" numaralı sütunların başlıkları boş.', + 'column-name-invalid' => 'Geçersiz sütun adları: "%s".', + 'column-not-found' => 'Gerekli sütunlar bulunamadı: %s.', + 'column-numbers' => 'Sütun sayısı başlıktaki satır sayısına karşılık gelmiyor.', + 'invalid-attribute' => 'Başlık geçersiz öznitelikler içeriyor: "%s".', + 'system' => 'Beklenmeyen bir sistem hatası oluştu.', + 'wrong-quotes' => 'Doğru olmayan tırnak işaretleri kullanıldı.', + ], + ], +]; diff --git a/packages/Webkul/Email/composer.json b/packages/Webkul/Email/composer.json new file mode 100755 index 0000000..3f314f1 --- /dev/null +++ b/packages/Webkul/Email/composer.json @@ -0,0 +1,28 @@ +{ + "name": "krayin/laravel-email", + "license": "MIT", + "authors": [ + { + "name": "Jitendra Singh", + "email": "jitendra@webkul.com" + } + ], + "require": { + "krayin/laravel-contact": "^1.0", + "krayin/laravel-core": "^1.0" + }, + "autoload": { + "psr-4": { + "Webkul\\Email\\": "src/" + } + }, + "extra": { + "laravel": { + "providers": [ + "Webkul\\Email\\Providers\\EmailServiceProvider" + ], + "aliases": {} + } + }, + "minimum-stability": "dev" +} \ No newline at end of file diff --git a/packages/Webkul/Email/src/Console/Commands/ProcessInboundEmails.php b/packages/Webkul/Email/src/Console/Commands/ProcessInboundEmails.php new file mode 100644 index 0000000..a0361ac --- /dev/null +++ b/packages/Webkul/Email/src/Console/Commands/ProcessInboundEmails.php @@ -0,0 +1,48 @@ +info('Processing the incoming emails.'); + + $this->inboundEmailProcessor->processMessagesFromAllFolders(); + + $this->info('Incoming emails processed successfully.'); + } +} diff --git a/packages/Webkul/Email/src/Contracts/Attachment.php b/packages/Webkul/Email/src/Contracts/Attachment.php new file mode 100644 index 0000000..7aa97f7 --- /dev/null +++ b/packages/Webkul/Email/src/Contracts/Attachment.php @@ -0,0 +1,5 @@ +increments('id'); + $table->string('subject')->nullable(); + $table->string('source'); + $table->string('user_type'); + $table->string('name')->nullable(); + $table->text('reply')->nullable(); + $table->boolean('is_read')->default(0); + $table->json('folders')->nullable(); + $table->json('from')->nullable(); + $table->json('sender')->nullable(); + $table->json('reply_to')->nullable(); + $table->json('cc')->nullable(); + $table->json('bcc')->nullable(); + $table->string('unique_id')->nullable()->unique(); + $table->string('message_id')->unique(); + $table->json('reference_ids')->nullable(); + + $table->integer('person_id')->unsigned()->nullable(); + $table->foreign('person_id')->references('id')->on('persons')->onDelete('set null'); + + $table->integer('lead_id')->unsigned()->nullable(); + $table->foreign('lead_id')->references('id')->on('leads')->onDelete('set null'); + + $table->timestamps(); + }); + + Schema::table('emails', function (Blueprint $table) { + $table->integer('parent_id')->unsigned()->nullable(); + $table->foreign('parent_id')->references('id')->on('emails')->onDelete('cascade'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('emails'); + } +}; diff --git a/packages/Webkul/Email/src/Database/Migrations/2021_05_25_072700_create_email_attachments_table.php b/packages/Webkul/Email/src/Database/Migrations/2021_05_25_072700_create_email_attachments_table.php new file mode 100644 index 0000000..93f2251 --- /dev/null +++ b/packages/Webkul/Email/src/Database/Migrations/2021_05_25_072700_create_email_attachments_table.php @@ -0,0 +1,40 @@ +increments('id'); + $table->string('name')->nullable(); + $table->string('path'); + $table->integer('size')->nullable(); + $table->string('content_type')->nullable(); + $table->string('content_id')->nullable(); + + $table->integer('email_id')->unsigned(); + $table->foreign('email_id')->references('id')->on('emails')->onDelete('cascade'); + + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('email_attachments'); + } +}; diff --git a/packages/Webkul/Email/src/Database/Migrations/2024_08_27_091619_create_email_tags_table.php b/packages/Webkul/Email/src/Database/Migrations/2024_08_27_091619_create_email_tags_table.php new file mode 100644 index 0000000..45fd477 --- /dev/null +++ b/packages/Webkul/Email/src/Database/Migrations/2024_08_27_091619_create_email_tags_table.php @@ -0,0 +1,30 @@ +integer('tag_id')->unsigned(); + $table->foreign('tag_id')->references('id')->on('tags')->onDelete('cascade'); + + $table->integer('email_id')->unsigned(); + $table->foreign('email_id')->references('id')->on('emails')->onDelete('cascade'); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('email_tags'); + } +}; diff --git a/packages/Webkul/Email/src/Enums/SupportedFolderEnum.php b/packages/Webkul/Email/src/Enums/SupportedFolderEnum.php new file mode 100644 index 0000000..cf88a85 --- /dev/null +++ b/packages/Webkul/Email/src/Enums/SupportedFolderEnum.php @@ -0,0 +1,46 @@ +filename; + } + + /** + * Retrieve the attachment content type. + * + * @return string + */ + public function getContentType() + { + return $this->contentType; + } + + /** + * Retrieve the attachment content disposition. + * + * @return string + */ + public function getContentDisposition() + { + return $this->contentDisposition; + } + + /** + * Retrieve the attachment content ID. + * + * @return string + */ + public function getContentID() + { + return $this->contentId; + } + + /** + * Retrieve the attachment headers. + * + * @return string + */ + public function getHeaders() + { + return $this->headers; + } + + /** + * Read the contents a few bytes at a time until completed. + * + * Once read to completion, it always returns false. + * + * @param int $bytes + * @return string + */ + public function read($bytes = 2082) + { + return feof($this->stream) ? false : fread($this->stream, $bytes); + } + + /** + * Retrieve the file content in one go. + * + * Once you retrieve the content you cannot use MimeMailParser_attachment::read(). + * + * @return string + */ + public function getContent() + { + if ($this->content === null) { + fseek($this->stream, 0); + + while (($buf = $this->read()) !== false) { + $this->content .= $buf; + } + } + + return $this->content; + } +} diff --git a/packages/Webkul/Email/src/Helpers/Charset.php b/packages/Webkul/Email/src/Helpers/Charset.php new file mode 100644 index 0000000..331d0da --- /dev/null +++ b/packages/Webkul/Email/src/Helpers/Charset.php @@ -0,0 +1,353 @@ + 'us-ascii', + 'us-ascii' => 'us-ascii', + 'ansi_x3.4-1968' => 'us-ascii', + '646' => 'us-ascii', + 'iso-8859-1' => 'ISO-8859-1', + 'iso-8859-2' => 'ISO-8859-2', + 'iso-8859-3' => 'ISO-8859-3', + 'iso-8859-4' => 'ISO-8859-4', + 'iso-8859-5' => 'ISO-8859-5', + 'iso-8859-6' => 'ISO-8859-6', + 'iso-8859-6-i' => 'ISO-8859-6-I', + 'iso-8859-6-e' => 'ISO-8859-6-E', + 'iso-8859-7' => 'ISO-8859-7', + 'iso-8859-8' => 'ISO-8859-8', + 'iso-8859-8-i' => 'ISO-8859-8-I', + 'iso-8859-8-e' => 'ISO-8859-8-E', + 'iso-8859-9' => 'ISO-8859-9', + 'iso-8859-10' => 'ISO-8859-10', + 'iso-8859-11' => 'ISO-8859-11', + 'iso-8859-13' => 'ISO-8859-13', + 'iso-8859-14' => 'ISO-8859-14', + 'iso-8859-15' => 'ISO-8859-15', + 'iso-8859-16' => 'ISO-8859-16', + 'iso-ir-111' => 'ISO-IR-111', + 'iso-2022-cn' => 'ISO-2022-CN', + 'iso-2022-cn-ext' => 'ISO-2022-CN', + 'iso-2022-kr' => 'ISO-2022-KR', + 'iso-2022-jp' => 'ISO-2022-JP', + 'utf-16be' => 'UTF-16BE', + 'utf-16le' => 'UTF-16LE', + 'utf-16' => 'UTF-16', + 'windows-1250' => 'windows-1250', + 'windows-1251' => 'windows-1251', + 'windows-1252' => 'windows-1252', + 'windows-1253' => 'windows-1253', + 'windows-1254' => 'windows-1254', + 'windows-1255' => 'windows-1255', + 'windows-1256' => 'windows-1256', + 'windows-1257' => 'windows-1257', + 'windows-1258' => 'windows-1258', + 'ibm866' => 'IBM866', + 'ibm850' => 'IBM850', + 'ibm852' => 'IBM852', + 'ibm855' => 'IBM855', + 'ibm857' => 'IBM857', + 'ibm862' => 'IBM862', + 'ibm864' => 'IBM864', + 'utf-8' => 'UTF-8', + 'utf-7' => 'UTF-7', + 'shift_jis' => 'Shift_JIS', + 'big5' => 'Big5', + 'euc-jp' => 'EUC-JP', + 'euc-kr' => 'EUC-KR', + 'gb2312' => 'GB2312', + 'gb18030' => 'gb18030', + 'viscii' => 'VISCII', + 'koi8-r' => 'KOI8-R', + 'koi8_r' => 'KOI8-R', + 'cskoi8r' => 'KOI8-R', + 'koi' => 'KOI8-R', + 'koi8' => 'KOI8-R', + 'koi8-u' => 'KOI8-U', + 'tis-620' => 'TIS-620', + 't.61-8bit' => 'T.61-8bit', + 'hz-gb-2312' => 'HZ-GB-2312', + 'big5-hkscs' => 'Big5-HKSCS', + 'gbk' => 'gbk', + 'cns11643' => 'x-euc-tw', + 'x-imap4-modified-utf7' => 'x-imap4-modified-utf7', + 'x-euc-tw' => 'x-euc-tw', + 'x-mac-ce' => 'x-mac-ce', + 'x-mac-turkish' => 'x-mac-turkish', + 'x-mac-greek' => 'x-mac-greek', + 'x-mac-icelandic' => 'x-mac-icelandic', + 'x-mac-croatian' => 'x-mac-croatian', + 'x-mac-romanian' => 'x-mac-romanian', + 'x-mac-cyrillic' => 'x-mac-cyrillic', + 'x-mac-ukrainian' => 'x-mac-cyrillic', + 'x-mac-hebrew' => 'x-mac-hebrew', + 'x-mac-arabic' => 'x-mac-arabic', + 'x-mac-farsi' => 'x-mac-farsi', + 'x-mac-devanagari' => 'x-mac-devanagari', + 'x-mac-gujarati' => 'x-mac-gujarati', + 'x-mac-gurmukhi' => 'x-mac-gurmukhi', + 'armscii-8' => 'armscii-8', + 'x-viet-tcvn5712' => 'x-viet-tcvn5712', + 'x-viet-vps' => 'x-viet-vps', + 'iso-10646-ucs-2' => 'UTF-16BE', + 'x-iso-10646-ucs-2-be' => 'UTF-16BE', + 'x-iso-10646-ucs-2-le' => 'UTF-16LE', + 'x-user-defined' => 'x-user-defined', + 'x-johab' => 'x-johab', + 'latin1' => 'ISO-8859-1', + 'iso_8859-1' => 'ISO-8859-1', + 'iso8859-1' => 'ISO-8859-1', + 'iso8859-2' => 'ISO-8859-2', + 'iso8859-3' => 'ISO-8859-3', + 'iso8859-4' => 'ISO-8859-4', + 'iso8859-5' => 'ISO-8859-5', + 'iso8859-6' => 'ISO-8859-6', + 'iso8859-7' => 'ISO-8859-7', + 'iso8859-8' => 'ISO-8859-8', + 'iso8859-9' => 'ISO-8859-9', + 'iso8859-10' => 'ISO-8859-10', + 'iso8859-11' => 'ISO-8859-11', + 'iso8859-13' => 'ISO-8859-13', + 'iso8859-14' => 'ISO-8859-14', + 'iso8859-15' => 'ISO-8859-15', + 'iso_8859-1:1987' => 'ISO-8859-1', + 'iso-ir-100' => 'ISO-8859-1', + 'l1' => 'ISO-8859-1', + 'ibm819' => 'ISO-8859-1', + 'cp819' => 'ISO-8859-1', + 'csisolatin1' => 'ISO-8859-1', + 'latin2' => 'ISO-8859-2', + 'iso_8859-2' => 'ISO-8859-2', + 'iso_8859-2:1987' => 'ISO-8859-2', + 'iso-ir-101' => 'ISO-8859-2', + 'l2' => 'ISO-8859-2', + 'csisolatin2' => 'ISO-8859-2', + 'latin3' => 'ISO-8859-3', + 'iso_8859-3' => 'ISO-8859-3', + 'iso_8859-3:1988' => 'ISO-8859-3', + 'iso-ir-109' => 'ISO-8859-3', + 'l3' => 'ISO-8859-3', + 'csisolatin3' => 'ISO-8859-3', + 'latin4' => 'ISO-8859-4', + 'iso_8859-4' => 'ISO-8859-4', + 'iso_8859-4:1988' => 'ISO-8859-4', + 'iso-ir-110' => 'ISO-8859-4', + 'l4' => 'ISO-8859-4', + 'csisolatin4' => 'ISO-8859-4', + 'cyrillic' => 'ISO-8859-5', + 'iso_8859-5' => 'ISO-8859-5', + 'iso_8859-5:1988' => 'ISO-8859-5', + 'iso-ir-144' => 'ISO-8859-5', + 'csisolatincyrillic' => 'ISO-8859-5', + 'arabic' => 'ISO-8859-6', + 'iso_8859-6' => 'ISO-8859-6', + 'iso_8859-6:1987' => 'ISO-8859-6', + 'iso-ir-127' => 'ISO-8859-6', + 'ecma-114' => 'ISO-8859-6', + 'asmo-708' => 'ISO-8859-6', + 'csisolatinarabic' => 'ISO-8859-6', + 'csiso88596i' => 'ISO-8859-6-I', + 'csiso88596e' => 'ISO-8859-6-E', + 'greek' => 'ISO-8859-7', + 'greek8' => 'ISO-8859-7', + 'sun_eu_greek' => 'ISO-8859-7', + 'iso_8859-7' => 'ISO-8859-7', + 'iso_8859-7:1987' => 'ISO-8859-7', + 'iso-ir-126' => 'ISO-8859-7', + 'elot_928' => 'ISO-8859-7', + 'ecma-118' => 'ISO-8859-7', + 'csisolatingreek' => 'ISO-8859-7', + 'hebrew' => 'ISO-8859-8', + 'iso_8859-8' => 'ISO-8859-8', + 'visual' => 'ISO-8859-8', + 'iso_8859-8:1988' => 'ISO-8859-8', + 'iso-ir-138' => 'ISO-8859-8', + 'csisolatinhebrew' => 'ISO-8859-8', + 'csiso88598i' => 'ISO-8859-8-I', + 'iso-8859-8i' => 'ISO-8859-8-I', + 'logical' => 'ISO-8859-8-I', + 'csiso88598e' => 'ISO-8859-8-E', + 'latin5' => 'ISO-8859-9', + 'iso_8859-9' => 'ISO-8859-9', + 'iso_8859-9:1989' => 'ISO-8859-9', + 'iso-ir-148' => 'ISO-8859-9', + 'l5' => 'ISO-8859-9', + 'csisolatin5' => 'ISO-8859-9', + 'unicode-1-1-utf-8' => 'UTF-8', + 'utf8' => 'UTF-8', + 'x-sjis' => 'Shift_JIS', + 'shift-jis' => 'Shift_JIS', + 'ms_kanji' => 'Shift_JIS', + 'csshiftjis' => 'Shift_JIS', + 'windows-31j' => 'Shift_JIS', + 'cp932' => 'Shift_JIS', + 'sjis' => 'Shift_JIS', + 'cseucpkdfmtjapanese' => 'EUC-JP', + 'x-euc-jp' => 'EUC-JP', + 'csiso2022jp' => 'ISO-2022-JP', + 'iso-2022-jp-2' => 'ISO-2022-JP', + 'csiso2022jp2' => 'ISO-2022-JP', + 'csbig5' => 'Big5', + 'cn-big5' => 'Big5', + 'x-x-big5' => 'Big5', + 'zh_tw-big5' => 'Big5', + 'cseuckr' => 'EUC-KR', + 'ks_c_5601-1987' => 'EUC-KR', + 'iso-ir-149' => 'EUC-KR', + 'ks_c_5601-1989' => 'EUC-KR', + 'ksc_5601' => 'EUC-KR', + 'ksc5601' => 'EUC-KR', + 'korean' => 'EUC-KR', + 'csksc56011987' => 'EUC-KR', + '5601' => 'EUC-KR', + 'windows-949' => 'EUC-KR', + 'gb_2312-80' => 'GB2312', + 'iso-ir-58' => 'GB2312', + 'chinese' => 'GB2312', + 'csiso58gb231280' => 'GB2312', + 'csgb2312' => 'GB2312', + 'zh_cn.euc' => 'GB2312', + 'gb_2312' => 'GB2312', + 'x-cp1250' => 'windows-1250', + 'x-cp1251' => 'windows-1251', + 'x-cp1252' => 'windows-1252', + 'x-cp1253' => 'windows-1253', + 'x-cp1254' => 'windows-1254', + 'x-cp1255' => 'windows-1255', + 'x-cp1256' => 'windows-1256', + 'x-cp1257' => 'windows-1257', + 'x-cp1258' => 'windows-1258', + 'windows-874' => 'windows-874', + 'ibm874' => 'windows-874', + 'dos-874' => 'windows-874', + 'macintosh' => 'macintosh', + 'x-mac-roman' => 'macintosh', + 'mac' => 'macintosh', + 'csmacintosh' => 'macintosh', + 'cp866' => 'IBM866', + 'cp-866' => 'IBM866', + '866' => 'IBM866', + 'csibm866' => 'IBM866', + 'cp850' => 'IBM850', + '850' => 'IBM850', + 'csibm850' => 'IBM850', + 'cp852' => 'IBM852', + '852' => 'IBM852', + 'csibm852' => 'IBM852', + 'cp855' => 'IBM855', + '855' => 'IBM855', + 'csibm855' => 'IBM855', + 'cp857' => 'IBM857', + '857' => 'IBM857', + 'csibm857' => 'IBM857', + 'cp862' => 'IBM862', + '862' => 'IBM862', + 'csibm862' => 'IBM862', + 'cp864' => 'IBM864', + '864' => 'IBM864', + 'csibm864' => 'IBM864', + 'ibm-864' => 'IBM864', + 't.61' => 'T.61-8bit', + 'iso-ir-103' => 'T.61-8bit', + 'csiso103t618bit' => 'T.61-8bit', + 'x-unicode-2-0-utf-7' => 'UTF-7', + 'unicode-2-0-utf-7' => 'UTF-7', + 'unicode-1-1-utf-7' => 'UTF-7', + 'csunicode11utf7' => 'UTF-7', + 'csunicode' => 'UTF-16BE', + 'csunicode11' => 'UTF-16BE', + 'iso-10646-ucs-basic' => 'UTF-16BE', + 'csunicodeascii' => 'UTF-16BE', + 'iso-10646-unicode-latin1' => 'UTF-16BE', + 'csunicodelatin1' => 'UTF-16BE', + 'iso-10646' => 'UTF-16BE', + 'iso-10646-j-1' => 'UTF-16BE', + 'latin6' => 'ISO-8859-10', + 'iso-ir-157' => 'ISO-8859-10', + 'l6' => 'ISO-8859-10', + 'csisolatin6' => 'ISO-8859-10', + 'iso_8859-15' => 'ISO-8859-15', + 'csisolatin9' => 'ISO-8859-15', + 'l9' => 'ISO-8859-15', + 'ecma-cyrillic' => 'ISO-IR-111', + 'csiso111ecmacyrillic' => 'ISO-IR-111', + 'csiso2022kr' => 'ISO-2022-KR', + 'csviscii' => 'VISCII', + 'zh_tw-euc' => 'x-euc-tw', + 'iso88591' => 'ISO-8859-1', + 'iso88592' => 'ISO-8859-2', + 'iso88593' => 'ISO-8859-3', + 'iso88594' => 'ISO-8859-4', + 'iso88595' => 'ISO-8859-5', + 'iso88596' => 'ISO-8859-6', + 'iso88597' => 'ISO-8859-7', + 'iso88598' => 'ISO-8859-8', + 'iso88599' => 'ISO-8859-9', + 'iso885910' => 'ISO-8859-10', + 'iso885911' => 'ISO-8859-11', + 'iso885912' => 'ISO-8859-12', + 'iso885913' => 'ISO-8859-13', + 'iso885914' => 'ISO-8859-14', + 'iso885915' => 'ISO-8859-15', + 'tis620' => 'TIS-620', + 'cp1250' => 'windows-1250', + 'cp1251' => 'windows-1251', + 'cp1252' => 'windows-1252', + 'cp1253' => 'windows-1253', + 'cp1254' => 'windows-1254', + 'cp1255' => 'windows-1255', + 'cp1256' => 'windows-1256', + 'cp1257' => 'windows-1257', + 'cp1258' => 'windows-1258', + 'x-gbk' => 'gbk', + 'windows-936' => 'gbk', + 'ansi-1251' => 'windows-1251', + ]; + + /** + * Decode the string from charset. + * + * @param string $encodedString + * @param string $charset + * @return string + */ + public function decodeCharset($encodedString, $charset) + { + if (strtolower($charset) == 'utf-8' || strtolower($charset) == 'us-ascii') { + return $encodedString; + } + + try { + return iconv($this->getCharsetAlias($charset), 'UTF-8//TRANSLIT', $encodedString); + } catch (\Exception $e) { + return iconv($this->getCharsetAlias($charset), 'UTF-8//IGNORE', $encodedString); + } + } + + /** + * Get charset alias. + * + * @param string $charset. + * @return string + */ + public function getCharsetAlias($charset) + { + $charset = strtolower($charset); + + if (array_key_exists($charset, $this->charsetAlias)) { + return $this->charsetAlias[$charset]; + } + + return null; + } +} diff --git a/packages/Webkul/Email/src/Helpers/Contracts/CharsetManager.php b/packages/Webkul/Email/src/Helpers/Contracts/CharsetManager.php new file mode 100644 index 0000000..5fc1b3d --- /dev/null +++ b/packages/Webkul/Email/src/Helpers/Contracts/CharsetManager.php @@ -0,0 +1,20 @@ +'; + } else { + $fulltag = '<'.$tagname; + + if (is_array($attary) && count($attary)) { + $atts = []; + + foreach ($attary as $attname => $attvalue) { + array_push($atts, "$attname=$attvalue"); + } + + $fulltag .= ' '.implode(' ', $atts); + } + + if ($tagtype == 3) { + $fulltag .= ' /'; + } + + $fulltag .= '>'; + } + + return $fulltag; + } + + /** + * A small helper function to use with array_walk. Modifies a by-ref + * value and makes it lowercase. + * + * @param string $val + * @return void + */ + public function tln_casenormalize(&$val) + { + $val = strtolower($val); + } + + /** + * This function skips any whitespace from the current position within + * a string and to the next non-whitespace value. + * + * @param string $body + * @param int $offset + * @return int + */ + public function tln_skipspace($body, $offset) + { + preg_match('/^(\s*)/s', substr($body, $offset), $matches); + + try { + if (! empty($matches[1])) { + $count = strlen($matches[1]); + $offset += $count; + } + } catch (\Exception $e) { + } + + return $offset; + } + + /** + * This function looks for the next character within a string. It's + * really just a glorified "strpos", except it catches the failures + * nicely. + * + * @param string $body + * @param int $offset + * @param string $needle + * @return int + */ + public function tln_findnxstr($body, $offset, $needle) + { + $pos = strpos($body, $needle, $offset); + + if ($pos === false) { + $pos = strlen($body); + } + + return $pos; + } + + /** + * This function takes a PCRE-style regexp and tries to match it + * within the string. + * + * @param string $body + * @param int $offset + * @param string $reg + * @return array|bool + */ + public function tln_findnxreg($body, $offset, $reg) + { + $matches = $retarr = []; + + $preg_rule = '%^(.*?)('.$reg.')%s'; + + preg_match($preg_rule, substr($body, $offset), $matches); + + if (! isset($matches[0]) || ! $matches[0]) { + $retarr = false; + } else { + $retarr[0] = $offset + strlen($matches[1]); + + $retarr[1] = $matches[1]; + + $retarr[2] = $matches[2]; + } + + return $retarr; + } + + /** + * This function looks for the next tag. + * + * @param string $body + * @param int $offset + * @return array|bool + */ + public function tln_getnxtag($body, $offset) + { + if ($offset > strlen($body)) { + return false; + } + + $lt = $this->tln_findnxstr($body, $offset, '<'); + + if ($lt == strlen($body)) { + return false; + } + + /** + * We are here: + * blah blah + * \---------^ + */ + $pos = $this->tln_skipspace($body, $lt + 1); + + if ($pos >= strlen($body)) { + return [false, false, false, $lt, strlen($body)]; + } + + /** + * There are 3 kinds of tags: + * 1. Opening tag, e.g.: + * + * 2. Closing tag, e.g.: + * + * 3. XHTML-style content-less tag, e.g.: + * + */ + switch (substr($body, $pos, 1)) { + case '/': + $tagtype = 2; + + $pos++; + break; + + case '!': + /** + * A comment or an SGML declaration. + */ + if (substr($body, $pos + 1, 2) == '--') { + $gt = strpos($body, '-->', $pos); + + if ($gt === false) { + $gt = strlen($body); + } else { + $gt += 2; + } + + return [false, false, false, $lt, $gt]; + } else { + $gt = $this->tln_findnxstr($body, $pos, '>'); + + return [false, false, false, $lt, $gt]; + } + break; + + default: + $tagtype = 1; + break; + + } + + /** + * Look for next [\W-_], which will indicate the end of the tag name. + */ + $regary = $this->tln_findnxreg($body, $pos, '[^\w\-_]'); + + if ($regary == false) { + return [false, false, false, $lt, strlen($body)]; + } + + [$pos, $tagname, $match] = $regary; + + $tagname = strtolower($tagname); + + /** + * $match can be either of these: + * '>' indicating the end of the tag entirely. + * '\s' indicating the end of the tag name. + * '/' indicating that this is type-3 xhtml tag. + * + * Whatever else we find there indicates an invalid tag. + */ + switch ($match) { + case '/': + /** + * This is an xhtml-style tag with a closing / at the + * end, like so: . Check if it's followed + * by the closing bracket. If not, then this tag is invalid + */ + if (substr($body, $pos, 2) == '/>') { + $pos++; + + $tagtype = 3; + } else { + $gt = $this->tln_findnxstr($body, $pos, '>'); + + $retary = [false, false, false, $lt, $gt]; + + return $retary; + } + + // intentional fall-through + case '>': + return [$tagname, false, $tagtype, $lt, $pos]; + + default: + /** + * Check if it's whitespace. + */ + if (! preg_match('/\s/', $match)) { + /** + * This is an invalid tag! Look for the next closing ">". + */ + $gt = $this->tln_findnxstr($body, $lt, '>'); + + return [false, false, false, $lt, $gt]; + } + + break; + } + + /** + * At this point we're here: + * + * \-------^ + * + * At this point we loop in order to find all attributes. + */ + $attary = []; + + while ($pos <= strlen($body)) { + $pos = $this->tln_skipspace($body, $pos); + + if ($pos == strlen($body)) { + /** + * Non-closed tag. + */ + return [false, false, false, $lt, $pos]; + } + + /** + * See if we arrived at a ">" or "/>", which means that we reached + * the end of the tag. + */ + $matches = []; + + if (preg_match('%^(\s*)(>|/>)%s', substr($body, $pos), $matches)) { + /** + * Yep. So we did. + */ + $pos += strlen($matches[1]); + + if ($matches[2] == '/>') { + $tagtype = 3; + + $pos++; + } + + return [$tagname, $attary, $tagtype, $lt, $pos]; + } + + /** + * There are several types of attributes, with optional + * [:space:] between members. + * Type 1: + * attrname[:space:]=[:space:]'CDATA' + * Type 2: + * attrname[:space:]=[:space:]"CDATA" + * Type 3: + * attr[:space:]=[:space:]CDATA + * Type 4: + * attrname + * + * We leave types 1 and 2 the same, type 3 we check for + * '"' and convert to """ if needed, then wrap in + * double quotes. Type 4 we convert into: + * attrname="yes". + */ + $regary = $this->tln_findnxreg($body, $pos, '[^\w\-_]'); + + if ($regary == false) { + /** + * Looks like body ended before the end of tag. + */ + return [false, false, false, $lt, strlen($body)]; + } + + [$pos, $attname, $match] = $regary; + + $attname = strtolower($attname); + + /** + * We arrived at the end of attribute name. Several things possible + * here: + * '>' means the end of the tag and this is attribute type 4 + * '/' if followed by '>' means the same thing as above + * '\s' means a lot of things -- look what it's followed by. + * anything else means the attribute is invalid. + */ + switch ($match) { + case '/': + /** + * This is an xhtml-style tag with a closing / at the + * end, like so: . Check if it's followed + * by the closing bracket. If not, then this tag is invalid + */ + if (substr($body, $pos, 2) == '/>') { + $pos++; + $tagtype = 3; + } else { + $gt = $this->tln_findnxstr($body, $pos, '>'); + $retary = [false, false, false, $lt, $gt]; + + return $retary; + } + + // intentional fall-through + case '>': + $attary[$attname] = '"yes"'; + + return [$tagname, $attary, $tagtype, $lt, $pos]; + break; + + default: + /** + * Skip whitespace and see what we arrive at. + */ + $pos = $this->tln_skipspace($body, $pos); + + $char = substr($body, $pos, 1); + /** + * Two things are valid here: + * '=' means this is attribute type 1 2 or 3. + * \w means this was attribute type 4. + * anything else we ignore and re-loop. End of tag and + * invalid stuff will be caught by our checks at the beginning + * of the loop. + */ + if ($char == '=') { + $pos++; + + $pos = $this->tln_skipspace($body, $pos); + /** + * Here are 3 possibilities: + * "'" attribute type 1 + * '"' attribute type 2 + * everything else is the content of tag type 3 + */ + $quot = substr($body, $pos, 1); + + if ($quot == '\'') { + $regary = $this->tln_findnxreg($body, $pos + 1, '\''); + + if ($regary == false) { + return [false, false, false, $lt, strlen($body)]; + } + + [$pos, $attval, $match] = $regary; + + $pos++; + + $attary[$attname] = '\''.$attval.'\''; + } elseif ($quot == '"') { + $regary = $this->tln_findnxreg($body, $pos + 1, '\"'); + + if ($regary == false) { + return [false, false, false, $lt, strlen($body)]; + } + + [$pos, $attval, $match] = $regary; + + $pos++; + + $attary[$attname] = '"'.$attval.'"'; + } else { + /** + * These are hateful. Look for \s, or >. + */ + $regary = $this->tln_findnxreg($body, $pos, '[\s>]'); + + if ($regary == false) { + return [false, false, false, $lt, strlen($body)]; + } + + [$pos, $attval, $match] = $regary; + + $attval = preg_replace('/\"/s', '"', $attval); + + $attary[$attname] = '"'.$attval.'"'; + } + } elseif (preg_match('|[\w/>]|', $char)) { + $attary[$attname] = '"yes"'; + } else { + $gt = $this->tln_findnxstr($body, $pos, '>'); + + return [false, false, false, $lt, $gt]; + } + break; + } + } + + /** + * The fact that we got here indicates that the tag end was never + * found. Return invalid tag indication so it gets stripped. + */ + return [false, false, false, $lt, strlen($body)]; + } + + /** + * Translates entities into literal values so they can be checked. + * + * @param string $attvalue + * @param string $regex + * @param bool $hex + * @return bool + */ + public function tln_deent(&$attvalue, $regex, $hex = false) + { + preg_match_all($regex, $attvalue, $matches); + + if (is_array($matches) && count($matches[0]) > 0) { + $repl = []; + + for ($i = 0; $i < count($matches[0]); $i++) { + $numval = $matches[1][$i]; + + if ($hex) { + $numval = hexdec($numval); + } + + $repl[$matches[0][$i]] = chr($numval); + } + + $attvalue = strtr($attvalue, $repl); + + return true; + } else { + return false; + } + } + + /** + * This function checks attribute values for entity-encoded values + * and returns them translated into 8-bit strings so we can run + * checks on them. + * + * @param string $attvalue + * @return void + */ + public function tln_defang(&$attvalue) + { + /** + * Skip this if there aren't ampersands or backslashes. + */ + if (strpos($attvalue, '&') === false + && strpos($attvalue, '\\') === false + ) { + return; + } + + do { + $m = false; + $m = $m || $this->tln_deent($attvalue, '/\�*(\d+);*/s'); + $m = $m || $this->tln_deent($attvalue, '/\�*((\d|[a-f])+);*/si', true); + $m = $m || $this->tln_deent($attvalue, '/\\\\(\d+)/s', true); + } while ($m == true); + + $attvalue = stripslashes($attvalue); + } + + /** + * Kill any tabs, newlines, or carriage returns. Our friends the + * makers of the browser with 95% market value decided that it'd + * be funny to make "java[tab]script" be just as good as "javascript". + * + * @param string $attvalue + * @return void + */ + public function tln_unspace(&$attvalue) + { + if (strcspn($attvalue, "\t\r\n\0 ") != strlen($attvalue)) { + $attvalue = str_replace( + ["\t", "\r", "\n", "\0", ' '], + ['', '', '', '', ''], + $attvalue + ); + } + } + + /** + * This function runs various checks against the attributes. + * + * @param string $tagname + * @param array $attary + * @param array $rm_attnames + * @param array $bad_attvals + * @param array $add_attr_to_tag + * @param string $trans_image_path + * @param bool $block_external_images + * @return array with modified attributes. + */ + public function tln_fixatts( + $tagname, + $attary, + $rm_attnames, + $bad_attvals, + $add_attr_to_tag, + $trans_image_path, + $block_external_images + ) { + /** + * Convert to array if is not. + */ + $attary = is_array($attary) ? $attary : []; + + foreach ($attary as $attname => $attvalue) { + /** + * See if this attribute should be removed. + */ + foreach ($rm_attnames as $matchtag => $matchattrs) { + if (preg_match($matchtag, $tagname)) { + foreach ($matchattrs as $matchattr) { + if (preg_match($matchattr, $attname)) { + unset($attary[$attname]); + + continue 2; + } + } + } + } + + $this->tln_defang($attvalue); + + $this->tln_unspace($attvalue); + + /** + * Now let's run checks on the attvalues. + * I don't expect anyone to comprehend this. If you do, + * get in touch with me so I can drive to where you live and + * shake your hand personally. :) + */ + foreach ($bad_attvals as $matchtag => $matchattrs) { + if (preg_match($matchtag, $tagname)) { + foreach ($matchattrs as $matchattr => $valary) { + if (preg_match($matchattr, $attname)) { + [$valmatch, $valrepl] = $valary; + + $newvalue = preg_replace($valmatch, $valrepl, $attvalue); + + if ($newvalue != $attvalue) { + $attary[$attname] = $newvalue; + $attvalue = $newvalue; + } + } + } + } + } + } + + /** + * See if we need to append any attributes to this tag. + */ + foreach ($add_attr_to_tag as $matchtag => $addattary) { + if (preg_match($matchtag, $tagname)) { + $attary = array_merge($attary, $addattary); + } + } + + return $attary; + } + + /** + * Fix url. + * + * @return void + */ + public function tln_fixurl($attname, &$attvalue, $trans_image_path, $block_external_images) + { + $sQuote = '"'; + + $attvalue = trim($attvalue); + + if ($attvalue && ($attvalue[0] == '"' || $attvalue[0] == "'")) { + // remove the double quotes + $sQuote = $attvalue[0]; + + $attvalue = trim(substr($attvalue, 1, -1)); + } + + /** + * Replace empty src tags with the blank image. src is only used + * for frames, images, and image inputs. Doing a replace should + * not affect them working as should be, however it will stop + * IE from being kicked off when src for img tags are not set. + */ + if ($attvalue == '') { + $attvalue = $sQuote.$trans_image_path.$sQuote; + } else { + // first, disallow 8 bit characters and control characters + if (preg_match('/[\0-\37\200-\377]+/', $attvalue)) { + switch ($attname) { + case 'href': + $attvalue = $sQuote.'http://invalid-stuff-detected.example.com'.$sQuote; + break; + + default: + $attvalue = $sQuote.$trans_image_path.$sQuote; + break; + + } + } else { + $aUrl = parse_url($attvalue); + + if (isset($aUrl['scheme'])) { + switch (strtolower($aUrl['scheme'])) { + case 'mailto': + case 'http': + case 'https': + case 'ftp': + if ($attname != 'href') { + if ($block_external_images == true) { + $attvalue = $sQuote.$trans_image_path.$sQuote; + } else { + if (! isset($aUrl['path'])) { + $attvalue = $sQuote.$trans_image_path.$sQuote; + } + } + } else { + $attvalue = $sQuote.$attvalue.$sQuote; + } + break; + + case 'outbind': + $attvalue = $sQuote.$attvalue.$sQuote; + break; + + case 'cid': + $attvalue = $sQuote.$attvalue.$sQuote; + break; + + default: + $attvalue = $sQuote.$trans_image_path.$sQuote; + break; + } + } else { + if (! isset($aUrl['path']) || $aUrl['path'] != $trans_image_path) { + $$attvalue = $sQuote.$trans_image_path.$sQuote; + } + } + } + } + } + + /** + * Fix style. + * + * @return void + */ + public function tln_fixstyle($body, $pos, $trans_image_path, $block_external_images) + { + $me = 'tln_fixstyle'; + + $content = ''; + + $sToken = ''; + + $bSucces = false; + + $bEndTag = false; + + for ($i = $pos,$iCount = strlen($body); $i < $iCount; $i++) { + $char = $body[$i]; + + switch ($char) { + case '<': + $sToken = $char; + break; + case '/': + if ($sToken == '<') { + $sToken .= $char; + + $bEndTag = true; + } else { + $content .= $char; + } + + break; + + case '>': + if ($bEndTag) { + $sToken .= $char; + + if (preg_match('/\<\/\s*style\s*\>/i', $sToken, $aMatch)) { + $newpos = $i + 1; + + $bSucces = true; + + break 2; + + } else { + $content .= $sToken; + } + + $bEndTag = false; + } else { + $content .= $char; + } + break; + case '!': + if ($sToken == '<') { + if (isset($body[$i + 2]) && substr($body, $i, 3) == '!--') { + $i = strpos($body, '-->', $i + 3); + + if (! $i) { + $i = strlen($body); + } + + $sToken = ''; + } + } else { + $content .= $char; + } + break; + default: + if ($bEndTag) { + $sToken .= $char; + } else { + $content .= $char; + } + break; + } + } + + if (! $bSucces) { + return [false, strlen($body)]; + } + + /** + * First look for general BODY style declaration, which would be + * like so: + * body {background: blah-blah} + * and change it to .bodyclass so we can just assign it to a
    + */ + $content = preg_replace("|body(\s*\{.*?\})|si", '.bodyclass\\1', $content); + + $trans_image_path = $trans_image_path; + + // first check for 8bit sequences and disallowed control characters + if (preg_match('/[\16-\37\200-\377]+/', $content)) { + $content = ''; + + return [$content, $newpos]; + } + + // remove @import line + $content = preg_replace("/^\s*(@import.*)$/mi", "\n\n", $content); + + $content = preg_replace('/(\\\\)?u(\\\\)?r(\\\\)?l(\\\\)?/i', 'url', $content); + + preg_match_all("/url\s*\((.+)\)/si", $content, $aMatch); + + if (count($aMatch)) { + $aValue = $aReplace = []; + + foreach ($aMatch[1] as $sMatch) { + $urlvalue = $sMatch; + $this->tln_fixurl('style', $urlvalue, $trans_image_path, $block_external_images); + $aValue[] = $sMatch; + $aReplace[] = $urlvalue; + } + + $content = str_replace($aValue, $aReplace, $content); + } + + /** + * Remove any backslashes, entities, and extraneous whitespace. + */ + $contentTemp = $content; + $this->tln_defang($contentTemp); + $this->tln_unspace($contentTemp); + + $match = ['/\/\*.*\*\//', + '/expression/i', + '/behaviou*r/i', + '/binding/i', + '/include-source/i', + '/javascript/i', + '/script/i', + '/position/i']; + + $replace = ['', 'idiocy', 'idiocy', 'idiocy', 'idiocy', 'idiocy', 'idiocy', '']; + + $contentNew = preg_replace($match, $replace, $contentTemp); + + if ($contentNew !== $contentTemp) { + $content = $contentNew; + } + + return [$content, $newpos]; + } + + /** + * Body to div. + * + * @return void + */ + public function tln_body2div($attary, $trans_image_path) + { + $me = 'tln_body2div'; + + $divattary = ['class' => "'bodyclass'"]; + + $has_bgc_stl = $has_txt_stl = false; + + $styledef = ''; + + if (is_array($attary) && count($attary) > 0) { + foreach ($attary as $attname=>$attvalue) { + $quotchar = substr($attvalue, 0, 1); + + $attvalue = str_replace($quotchar, '', $attvalue); + + switch ($attname) { + case 'background': + $styledef .= "background-image: url('$trans_image_path'); "; + break; + + case 'bgcolor': + $has_bgc_stl = true; + + $styledef .= "background-color: $attvalue; "; + break; + + case 'text': + $has_txt_stl = true; + + $styledef .= "color: $attvalue; "; + break; + + } + } + + // Outlook defines a white bgcolor and no text color. This can lead to white text on a white bg with certain themes. + if ($has_bgc_stl && ! $has_txt_stl) { + $styledef .= 'color: #000000; '; + } + + if (strlen($styledef) > 0) { + $divattary['style'] = "\"$styledef\""; + } + } + + return $divattary; + } + + /** + * Sanitize. + * + * @param string $body + * @param array $tag_list + * @param array $rm_tags_with_content + * @param array $self_closing_tags + * @param bool $force_tag_closing + * @param array $rm_attnames + * @param array $bad_attvals + * @param array $add_attr_to_tag + * @param string $trans_image_path + * @param bool $block_external_images + * @return string + */ + public function tln_sanitize( + $body, + $tag_list, + $rm_tags_with_content, + $self_closing_tags, + $force_tag_closing, + $rm_attnames, + $bad_attvals, + $add_attr_to_tag, + $trans_image_path, + $block_external_images + ) { + /** + * Normalize rm_tags and rm_tags_with_content. + */ + $rm_tags = array_shift($tag_list); + + @array_walk($tag_list, [$this, 'tln_casenormalize']); + + @array_walk($rm_tags_with_content, [$this, 'tln_casenormalize']); + + @array_walk($self_closing_tags, [$this, 'tln_casenormalize']); + + /** + * See if tag_list is of tags to remove or tags to allow. + * false means remove these tags + * true means allow these tags + */ + $curpos = 0; + $open_tags = []; + $trusted = ''; + $skip_content = false; + + /** + * Take care of netscape's stupid javascript entities like + * &{alert('boo')}; + */ + $body = preg_replace('/&(\{.*?\};)/si', '&\\1', $body); + + while (($curtag = $this->tln_getnxtag($body, $curpos)) != false) { + [$tagname, $attary, $tagtype, $lt, $gt] = $curtag; + $free_content = substr($body, $curpos, $lt - $curpos); + + /** + * Take care of + + {!! view_render_event('webform.layout.head') !!} + + + + {!! view_render_event('webform.layout.body.before') !!} + +
    + + + + {!! view_render_event('webform.layout.content.before') !!} + + + {{ $slot }} + + {!! view_render_event('webform.layout.content.after') !!} +
    + + {!! view_render_event('webform.layout.body.after') !!} + + @stack('scripts') + + {!! view_render_event('webform.layout.vue-app-mount.before') !!} + + + + {!! view_render_event('webform.layout.vue-app-mount.after') !!} + + + + + diff --git a/packages/Webkul/WebForm/src/Resources/views/components/spinner/index.blade.php b/packages/Webkul/WebForm/src/Resources/views/components/spinner/index.blade.php new file mode 100644 index 0000000..e195748 --- /dev/null +++ b/packages/Webkul/WebForm/src/Resources/views/components/spinner/index.blade.php @@ -0,0 +1,27 @@ + +@props(['color' => 'currentColor']) + + \ No newline at end of file diff --git a/packages/Webkul/WebForm/src/Resources/views/settings/web-forms/controls.blade.php b/packages/Webkul/WebForm/src/Resources/views/settings/web-forms/controls.blade.php new file mode 100644 index 0000000..603eedf --- /dev/null +++ b/packages/Webkul/WebForm/src/Resources/views/settings/web-forms/controls.blade.php @@ -0,0 +1,257 @@ +@foreach ($webForm->attributes as $attribute) + @php + $parentAttribute = $attribute->attribute; + + $fieldName = $parentAttribute->entity_type . '[' . $parentAttribute->code . ']'; + + $validations = $attribute->is_required ? 'required' : ''; + @endphp + + + + {{ $attribute->name ?? $parentAttribute->name }} + + + @switch($parentAttribute->type) + @case('text') + + + + + @break + + @case('price') + + + + + @break + + @case('email') + + + + + + + @break + + @case('checkbox') + @php + $options = $parentAttribute->lookup_type + ? app('Webkul\Attribute\Repositories\AttributeRepository')->getLookUpOptions($parentAttribute->lookup_type) + : $parentAttribute->options()->orderBy('sort_order')->get(); + @endphp + + @foreach ($options as $option) + + + + + + @endforeach + + @case('file') + @case('image') + + + + + @break; + + @case('phone') + + + + + + + @break + + @case('date') + + + + + @break + + @case('datetime') + + + + + @break + + @case('select') + @case('lookup') + @php + $options = $parentAttribute->lookup_type + ? app('Webkul\Attribute\Repositories\AttributeRepository')->getLookUpOptions($parentAttribute->lookup_type) + : $parentAttribute->options()->orderBy('sort_order')->get(); + @endphp + + + @foreach ($options as $option) + + @endforeach + + + + + @break + + @case('multiselect') + @php + $options = $parentAttribute->lookup_type + ? app('Webkul\Attribute\Repositories\AttributeRepository')->getLookUpOptions($parentAttribute->lookup_type) + : $parentAttribute->options()->orderBy('sort_order')->get(); + @endphp + + + @foreach ($options as $option) + + @endforeach + + + + + @break + + @case('checkbox') +
    + @php + $options = $parentAttribute->lookup_type + ? app('Webkul\Attribute\Repositories\AttributeRepository')->getLookUpOptions($parentAttribute->lookup_type) + : $parentAttribute->options()->orderBy('sort_order')->get(); + @endphp + + @foreach ($options as $option) + + + + + {{ $option->name }} + + @endforeach +
    + +

    + + @break + + @case('boolean') + + + + + + + + @break + @endswitch +
    +@endforeach diff --git a/packages/Webkul/WebForm/src/Resources/views/settings/web-forms/embed.blade.php b/packages/Webkul/WebForm/src/Resources/views/settings/web-forms/embed.blade.php new file mode 100644 index 0000000..26ad197 --- /dev/null +++ b/packages/Webkul/WebForm/src/Resources/views/settings/web-forms/embed.blade.php @@ -0,0 +1,3 @@ +(function() { + document.write(`{!! view('web_form::settings.web-forms.preview', compact('webForm'))->render() !!}`.replaceAll('$', '\$')); +})(); \ No newline at end of file diff --git a/packages/Webkul/WebForm/src/Resources/views/settings/web-forms/preview.blade.php b/packages/Webkul/WebForm/src/Resources/views/settings/web-forms/preview.blade.php new file mode 100644 index 0000000..4d9728c --- /dev/null +++ b/packages/Webkul/WebForm/src/Resources/views/settings/web-forms/preview.blade.php @@ -0,0 +1,156 @@ + + + {{ $webForm->title }} + + + + +
    +
    + +
    +
    +
    + + @pushOnce('scripts') + + + + @endPushOnce +
    diff --git a/packages/Webkul/WebForm/src/Routes/routes.php b/packages/Webkul/WebForm/src/Routes/routes.php new file mode 100644 index 0000000..668f0bd --- /dev/null +++ b/packages/Webkul/WebForm/src/Routes/routes.php @@ -0,0 +1,16 @@ +middleware(['web', 'admin_locale'])->prefix('web-forms')->group(function () { + Route::get('forms/{id}/form.js', 'formJS')->name('admin.settings.web_forms.form_js'); + + Route::get('forms/{id}/form.html', 'preview')->name('admin.settings.web_forms.preview'); + + Route::post('forms/{id}', 'formStore')->name('admin.settings.web_forms.form_store'); + + Route::group(['middleware' => ['user']], function () { + Route::get('form/{id}/form.html', 'view')->name('admin.settings.web_forms.view'); + }); +}); diff --git a/packages/Webkul/WebForm/src/Rules/PhoneNumber.php b/packages/Webkul/WebForm/src/Rules/PhoneNumber.php new file mode 100644 index 0000000..271208a --- /dev/null +++ b/packages/Webkul/WebForm/src/Rules/PhoneNumber.php @@ -0,0 +1,33 @@ + { + const envDir = "../../../"; + + Object.assign(process.env, loadEnv(mode, envDir)); + + return { + build: { + emptyOutDir: true, + }, + + envDir, + + server: { + host: process.env.VITE_HOST || "localhost", + port: process.env.VITE_PORT || 5174, + }, + + plugins: [ + vue(), + + laravel({ + hotFile: "../../../public/webform-vite.hot", + publicDirectory: "../../../public", + buildDirectory: "webform/build", + input: [ + "src/Resources/assets/css/app.css", + "src/Resources/assets/js/app.js", + ], + refresh: true, + }), + ], + + experimental: { + renderBuiltUrl(filename, { hostId, hostType, type }) { + if (hostType === "css") { + return path.basename(filename); + } + }, + }, + }; +}); \ No newline at end of file diff --git a/phpunit.xml b/phpunit.xml new file mode 100644 index 0000000..5bc9705 --- /dev/null +++ b/phpunit.xml @@ -0,0 +1,34 @@ + + + + + ./tests/Unit + + + + ./tests/Feature + + + + + + ./app + + + + + + + + + + + + + diff --git a/pint.json b/pint.json new file mode 100644 index 0000000..d4b5683 --- /dev/null +++ b/pint.json @@ -0,0 +1,10 @@ +{ + "preset": "laravel", + "rules": { + "binary_operator_spaces": { + "operators": { + "=>": "align" + } + } + } +} \ No newline at end of file diff --git a/public/.htaccess b/public/.htaccess new file mode 100644 index 0000000..b9db6a7 --- /dev/null +++ b/public/.htaccess @@ -0,0 +1,22 @@ +# Rewrite Module + + + Options -MultiViews -Indexes + + + RewriteEngine On + + # Handle Authorization Header + RewriteCond %{HTTP:Authorization} . + RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}] + + # Redirect Trailing Slashes If Not A Folder... + RewriteCond %{REQUEST_FILENAME} !-d + RewriteCond %{REQUEST_URI} (.+)/$ + RewriteRule ^ %1 [L,R=301] + + # Handle Front Controller... + RewriteCond %{REQUEST_FILENAME} !-d + RewriteCond %{REQUEST_FILENAME} !-f + RewriteRule ^ index.php [L] + diff --git a/public/admin/build/assets/activities-DpB2XKqX.svg b/public/admin/build/assets/activities-DpB2XKqX.svg new file mode 100644 index 0000000..890d0ea --- /dev/null +++ b/public/admin/build/assets/activities-DpB2XKqX.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/admin/build/assets/app-B6AvubOR.css b/public/admin/build/assets/app-B6AvubOR.css new file mode 100644 index 0000000..e3ca4e8 --- /dev/null +++ b/public/admin/build/assets/app-B6AvubOR.css @@ -0,0 +1 @@ +*,:before,:after{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}:before,:after{--tw-content: ""}html,:host{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol,"Noto Color Emoji";font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}ol,ul,menu{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button,[role=button]{cursor:pointer}:disabled{cursor:default}img,svg,video,canvas,audio,iframe,embed,object{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}.container{width:100%;margin-right:auto;margin-left:auto;padding-right:16px;padding-left:16px}@media (min-width: 1920px){.container{max-width:1920px}}.icon-image:before{content:""}.icon-bookmark:before{content:""}.icon-bookmark-active:before{content:""}.icon-error:before{content:""}.icon-info:before{content:""}.icon-success:before{content:""}.icon-warning:before{content:""}.icon-stats-down:before{content:""}.icon-stats-up:before{content:""}.icon-attribute:before{content:""}.icon-download:before{content:""}.icon-settings-warehouse:before{content:""}.icon-move:before{content:""}.icon-organization:before{content:""}.icon-role:before{content:""}.icon-user:before{content:""}.icon-system-generate:before{content:""}.icon-settings-attributes:before{content:""}.icon-settings-flow:before{content:""}.icon-settings-group:before{content:""}.icon-settings-mail:before{content:""}.icon-settings-pipeline:before{content:""}.icon-settings-roles:before{content:""}.icon-settings-sources:before{content:""}.icon-settings-tag:before{content:""}.icon-settings-type:before{content:""}.icon-settings-user:before{content:""}.icon-settings-webforms:before{content:""}.icon-settings-webhooks:before{content:""}.icon-attached-file:before{content:""}.icon-forward:before{content:""}.icon-location:before{content:""}.icon-pin:before{content:""}.icon-print:before{content:""}.icon-reply-all:before{content:""}.icon-reply:before{content:""}.icon-rotten:before{content:""}.icon-tag:before{content:""}.icon-list:before{content:""}.icon-enter:before{content:""}.icon-kanban:before{content:""}.icon-tick:before{content:""}.icon-eye-hide:before{content:""}.icon-percentage:before{content:""}.icon-dollar:before{content:""}.icon-radio-selected:before{content:""}.icon-radio-normal:before{content:""}.icon-folder:before{content:""}.icon-file:before{content:""}.icon-eye:before{content:""}.icon-notification:before{content:""}.icon-configuration:before{content:""}.icon-note:before{content:""}.icon-edit:before{content:""}.icon-menu:before{content:""}.icon-calendar:before{content:""}.icon-delete:before{content:""}.icon-more:before{content:""}.icon-checkbox-multiple:before{content:""}.icon-checkbox-select:before{content:""}.icon-checkbox-outline:before{content:""}.icon-message:before{content:""}.icon-video:before{content:""}.icon-attachment:before{content:""}.icon-sent:before{content:""}.icon-call:before{content:""}.icon-meeting:before{content:""}.icon-light:before{content:""}.icon-dark:before{content:""}.icon-mail:before{content:""}.icon-leads:before{content:""}.icon-filter:before{content:""}.icon-setting:before{content:""}.icon-product:before{content:""}.icon-contact:before{content:""}.icon-activity:before{content:""}.icon-perosnal:before{content:""}.icon-quote:before{content:""}.icon-dashboard:before{content:""}.icon-cross-large:before{content:""}.icon-left-arrow:before{content:""}.icon-right-arrow:before{content:""}.icon-up-arrow:before{content:""}.icon-down-arrow:before{content:""}.icon-search:before{content:""}.icon-add:before{content:""}.icon-add-2:before{content:""}.label-active{max-width:-moz-max-content;max-width:max-content;border-radius:.375rem;--tw-bg-opacity: 1;background-color:rgb(167 243 208 / var(--tw-bg-opacity, 1));padding:.375rem .75rem;font-size:.75rem;line-height:1rem;font-weight:500;--tw-text-opacity: 1;color:rgb(6 78 59 / var(--tw-text-opacity, 1))}.label-inactive{max-width:-moz-max-content;max-width:max-content;border-radius:.375rem;--tw-bg-opacity: 1;background-color:rgb(254 202 202 / var(--tw-bg-opacity, 1));padding:.375rem .75rem;font-size:.75rem;line-height:1rem;font-weight:500;--tw-text-opacity: 1;color:rgb(153 27 27 / var(--tw-text-opacity, 1))}[dir=ltr] .sidebar-rounded:after{pointer-events:none;position:absolute;top:0;right:-30px;height:30px;width:30px;background-image:url(corner-clip-CRLTKrCT.svg);background-repeat:no-repeat;transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s;--tw-content: "";content:var(--tw-content)}[dir=rtl] .sidebar-rounded:before{pointer-events:none;position:absolute;top:0;left:-30px;height:30px;width:30px;--tw-rotate: 90deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));background-image:url(corner-clip-CRLTKrCT.svg);background-repeat:no-repeat;transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s;--tw-content: "";content:var(--tw-content)}.dark .sidebar-rounded:after{background-image:url(dark-corner-clip-Deux0RQO.svg)}.dark .sidebar-rounded:before{background-image:url(dark-corner-clip-Deux0RQO.svg)}.stage:after{content:"";position:absolute;top:50%;right:-10px;width:24px;height:24px;z-index:1;border-radius:0 0 0 25px;transform:translateY(-50%) rotate(45deg);border-right:4px solid #f3f4f6;border-top:4px solid #f3f4f6}.dark .stage:after{content:"";position:absolute;top:50%;right:-10px;width:24px;height:24px;z-index:1;border-radius:0 0 0 25px;transform:translateY(-50%) rotate(45deg);border-right:4px solid #030712;border-top:4px solid #030712}[dir=rtl] .stage:before{content:"";position:absolute;top:50%;left:-10px;width:24px;height:24px;z-index:1;border-radius:0 0 0 25px;transform:translateY(-50%) rotate(225deg);border-right:4px solid #f3f4f6;border-top:4px solid #f3f4f6}[dir=rtl] .stage:after{display:none}.dark\:bg-gray-400:is(.dark *){--tw-bg-opacity: 1 !important;background-color:#1f2937!important;border:#111827 solid!important;color:#e5e7eb!important}.dark\:bg-gray-800:is(.dark *){--tw-bg-opacity: 1;background-color:#101827}.shimmer{animation-duration:2.2s;animation-fill-mode:forwards;animation-iteration-count:infinite;animation-name:skeleton;animation-timing-function:linear;background:linear-gradient(to right,#f6f6f6 8%,#f0f0f0 18%,#f6f6f6 33%);background-size:1250px 100%}.light-shimmer-bg{background:linear-gradient(to right,#fafafa 8%,#f5f5f5 18%,#fafafa 33%);background-size:1250px 100%}.dark .shimmer{background:linear-gradient(to right,#1f2937 8%,#1a2232 18%,#1f2937 33%)}.primary-button{display:flex;cursor:pointer;place-content:center;align-items:center;-moz-column-gap:.25rem;column-gap:.25rem;border-radius:.375rem;border-width:1px;border-color:var(--brand-color);background-color:var(--brand-color);padding:.375rem .75rem;font-weight:600;--tw-text-opacity: 1;color:rgb(249 250 251 / var(--tw-text-opacity, 1));transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.primary-button:hover{opacity:.9}.primary-button:focus{opacity:.9}.secondary-button{display:flex;cursor:pointer;place-content:center;align-items:center;-moz-column-gap:.25rem;column-gap:.25rem;white-space:nowrap;border-radius:.375rem;border-width:2px;border-color:var(--brand-color);--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1));padding:.375rem .75rem;font-weight:600;color:var(--brand-color);transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.secondary-button:hover{background-color:#eff6ff61}.secondary-button:focus{background-color:#eff6ff61}.secondary-button:is(.dark *){--tw-border-opacity: 1;border-color:rgb(156 163 175 / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(31 41 55 / var(--tw-bg-opacity, 1));--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.secondary-button:hover:is(.dark *){opacity:.8}.transparent-button{display:flex;cursor:pointer;-webkit-appearance:none;-moz-appearance:none;appearance:none;place-content:center;align-items:center;-moz-column-gap:.25rem;column-gap:.25rem;white-space:nowrap;border-radius:.375rem;border-width:2px;border-color:transparent;padding:.375rem .75rem;font-weight:600;--tw-text-opacity: 1;color:rgb(75 85 99 / var(--tw-text-opacity, 1));transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transparent-button *::marker{--tw-shadow: 0 1px 3px 0 rgb(0 0 0 / .1), 0 1px 2px -1px rgb(0 0 0 / .1);--tw-shadow-colored: 0 1px 3px 0 var(--tw-shadow-color), 0 1px 2px -1px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.transparent-button::marker{--tw-shadow: 0 1px 3px 0 rgb(0 0 0 / .1), 0 1px 2px -1px rgb(0 0 0 / .1);--tw-shadow-colored: 0 1px 3px 0 var(--tw-shadow-color), 0 1px 2px -1px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.transparent-button:hover{--tw-bg-opacity: 1;background-color:rgb(243 244 246 / var(--tw-bg-opacity, 1))}.transparent-button:focus{--tw-bg-opacity: 1;background-color:rgb(243 244 246 / var(--tw-bg-opacity, 1))}.transparent-button:hover:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(3 7 18 / var(--tw-bg-opacity, 1))}.transparent-button:focus:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(3 7 18 / var(--tw-bg-opacity, 1))}::-webkit-scrollbar{width:12px}::-webkit-scrollbar-track{background:#f1f1f1}::-webkit-scrollbar-thumb{background:#888;border-radius:6px}::-webkit-scrollbar-thumb:hover{background:#555}*{scrollbar-width:thin;scrollbar-color:#888 #f1f1f1}::-moz-selection{background-color:#0044f233}::selection{background-color:#0044f233}body{--tw-bg-opacity: 1;background-color:rgb(243 244 246 / var(--tw-bg-opacity, 1));font-size:.875rem;line-height:1.25rem;--tw-text-opacity: 1;color:rgb(31 41 55 / var(--tw-text-opacity, 1))}button:disabled{cursor:not-allowed;opacity:.5}button:disabled:hover{cursor:not-allowed;opacity:.5}.draggable-ghost{opacity:.5;background:#e0e7ff}html.dark [class^=icon-],html.dark [class*=" icon-"]{color:#d1d5db}p{font-size:14px;line-height:17px!important}input,textarea,select{outline:2px solid transparent;outline-offset:2px}.journal-scroll::-webkit-scrollbar{width:14px;cursor:pointer;display:none}.journal-scroll::-webkit-scrollbar-track{background-color:#fff;cursor:pointer;border-radius:12px;border:1px solid #e9e9e9}.journal-scroll::-webkit-scrollbar-thumb{cursor:pointer;background-color:#e9e9e9;border-radius:12px;border:3px solid transparent;background-clip:content-box}.custom-select{-webkit-appearance:none;-moz-appearance:none;background:transparent;background-image:url("data:image/svg+xml;utf8,");background-repeat:no-repeat;background-position-x:calc(100% - 10px);background-position-y:50%}.dark .custom-select{background-image:url("data:image/svg+xml;utf8,")}[dir=rtl] .custom-select{background-position-x:calc(100% - (100% - 10px))}.draggable-ghost{border-width:1px;border-style:dashed;--tw-border-opacity: 1 !important;border-color:rgb(209 213 219 / var(--tw-border-opacity, 1))!important}@keyframes skeleton{0%{background-position:-1250px 0}to{background-position:1250px 0}}.required:after{--tw-content: "*";content:var(--tw-content)}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.pointer-events-none{pointer-events:none}.pointer-events-auto{pointer-events:auto}.visible{visibility:visible}.invisible{visibility:hidden}.collapse{visibility:collapse}.\!static{position:static!important}.static{position:static}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.sticky{position:sticky}.inset-0{top:0;right:0;bottom:0;left:0}.inset-x-0{left:0;right:0}.inset-y-0{top:0;bottom:0}.\!bottom-12{bottom:3rem!important}.\!top-7{top:1.75rem!important}.\!top-\[30px\]{top:30px!important}.\!top-auto{top:auto!important}.-bottom-0\.5{bottom:-.125rem}.-right-1{right:-.25rem}.-top-1{top:-.25rem}.bottom-0{bottom:0}.bottom-10{bottom:2.5rem}.bottom-4{bottom:1rem}.bottom-5{bottom:1.25rem}.bottom-full{bottom:100%}.left-0{left:0}.left-1\/2{left:50%}.left-4{left:1rem}.left-\[6px\]{left:6px}.right-0{right:0}.right-1{right:.25rem}.right-1\.5{right:.375rem}.right-2{right:.5rem}.right-3{right:.75rem}.right-4{right:1rem}.right-7{right:1.75rem}.right-8{right:2rem}.right-\[6px\]{right:6px}.top-0{top:0}.top-1\.5{top:.375rem}.top-1\/2{top:50%}.top-10{top:2.5rem}.top-11{top:2.75rem}.top-2{top:.5rem}.top-3{top:.75rem}.top-4{top:1rem}.top-5{top:1.25rem}.top-\[60px\]{top:60px}.top-\[6px\]{top:6px}.top-\[9px\]{top:9px}.top-full{top:100%}.z-10{z-index:10}.z-20{z-index:20}.z-\[10001\]{z-index:10001}.z-\[10002\]{z-index:10002}.z-\[10003\]{z-index:10003}.z-\[10004\]{z-index:10004}.z-\[1000\]{z-index:1000}.z-\[999\]{z-index:999}.float-right{float:right}.m-2{margin:.5rem}.m-3{margin:.75rem}.mx-3{margin-left:.75rem;margin-right:.75rem}.mx-6{margin-left:1.5rem;margin-right:1.5rem}.my-1{margin-top:.25rem;margin-bottom:.25rem}.my-2{margin-top:.5rem;margin-bottom:.5rem}.my-2\.5{margin-top:.625rem;margin-bottom:.625rem}.my-4{margin-top:1rem;margin-bottom:1rem}.\!mb-0{margin-bottom:0!important}.\!mb-2{margin-bottom:.5rem!important}.\!mt-6{margin-top:1.5rem!important}.-mb-px{margin-bottom:-1px}.-mt-2{margin-top:-.5rem}.-mt-px{margin-top:-1px}.mb-0{margin-bottom:0}.mb-0\.5{margin-bottom:.125rem}.mb-1{margin-bottom:.25rem}.mb-1\.5{margin-bottom:.375rem}.mb-2{margin-bottom:.5rem}.mb-2\.5{margin-bottom:.625rem}.mb-3{margin-bottom:.75rem}.mb-4{margin-bottom:1rem}.mb-5{margin-bottom:1.25rem}.mb-6{margin-bottom:1.5rem}.mb-7{margin-bottom:1.75rem}.ml-1{margin-left:.25rem}.ml-4{margin-left:1rem}.mr-1{margin-right:.25rem}.ms-2{margin-inline-start:.5rem}.mt-0\.5{margin-top:.125rem}.mt-1{margin-top:.25rem}.mt-1\.5{margin-top:.375rem}.mt-2{margin-top:.5rem}.mt-3{margin-top:.75rem}.mt-3\.5{margin-top:.875rem}.mt-4{margin-top:1rem}.mt-auto{margin-top:auto}.line-clamp-1{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:1}.block{display:block}.inline-block{display:inline-block}.inline{display:inline}.\!flex{display:flex!important}.flex{display:flex}.inline-flex{display:inline-flex}.table{display:table}.grid{display:grid}.hidden{display:none}.aspect-\[3\.23\/1\]{aspect-ratio:3.23/1}.\!h-10{height:2.5rem!important}.\!h-\[34px\]{height:34px!important}.h-0{height:0px}.h-1{height:.25rem}.h-1\.5{height:.375rem}.h-10{height:2.5rem}.h-11{height:2.75rem}.h-12{height:3rem}.h-14{height:3.5rem}.h-20{height:5rem}.h-3{height:.75rem}.h-3\.5{height:.875rem}.h-4{height:1rem}.h-40{height:10rem}.h-5{height:1.25rem}.h-56{height:14rem}.h-6{height:1.5rem}.h-7{height:1.75rem}.h-9{height:2.25rem}.h-\[100vh\]{height:100vh}.h-\[120px\]{height:120px}.h-\[15px\]{height:15px}.h-\[17px\]{height:17px}.h-\[18px\]{height:18px}.h-\[19px\]{height:19px}.h-\[21px\]{height:21px}.h-\[223px\]{height:223px}.h-\[26px\]{height:26px}.h-\[271px\]{height:271px}.h-\[280px\]{height:280px}.h-\[28px\]{height:28px}.h-\[33px\]{height:33px}.h-\[34px\]{height:34px}.h-\[380px\]{height:380px}.h-\[38px\]{height:38px}.h-\[39px\]{height:39px}.h-\[40px\]{height:40px}.h-\[42px\]{height:42px}.h-\[44px\]{height:44px}.h-\[49px\]{height:49px}.h-\[59px\]{height:59px}.h-\[74px\]{height:74px}.h-\[calc\(100vh-100px\)\]{height:calc(100vh - 100px)}.h-\[calc\(100vh-317px\)\]{height:calc(100vh - 317px)}.h-fit{height:-moz-fit-content;height:fit-content}.h-full{height:100%}.max-h-0{max-height:0px}.max-h-40{max-height:10rem}.max-h-80{max-height:20rem}.max-h-9{max-height:2.25rem}.max-h-\[120px\]{max-height:120px}.max-h-\[200px\]{max-height:200px}.max-h-\[400px\]{max-height:400px}.max-h-\[500px\]{max-height:500px}.max-h-\[80vh\]{max-height:80vh}.min-h-0{min-height:0px}.min-h-9{min-height:2.25rem}.min-h-\[110px\]{min-height:110px}.min-h-\[38px\]{min-height:38px}.min-h-\[39px\]{min-height:39px}.min-h-\[400px\]{min-height:400px}.min-h-\[47px\]{min-height:47px}.min-h-\[calc\(100vh-62px\)\]{min-height:calc(100vh - 62px)}.min-h-full{min-height:100%}.\!w-1\/2{width:50%!important}.\!w-1\/3{width:33.333333%!important}.\!w-1\/4{width:25%!important}.\!w-1\/6{width:16.666667%!important}.\!w-12{width:3rem!important}.\!w-24{width:6rem!important}.\!w-56{width:14rem!important}.\!w-\[140px\]{width:140px!important}.\!w-\[150px\]{width:150px!important}.\!w-full{width:100%!important}.w-0{width:0px}.w-1\.5{width:.375rem}.w-1\/2{width:50%}.w-1\/3{width:33.333333%}.w-1\/5{width:20%}.w-10{width:2.5rem}.w-12{width:3rem}.w-14{width:3.5rem}.w-16{width:4rem}.w-20{width:5rem}.w-24{width:6rem}.w-28{width:7rem}.w-3{width:.75rem}.w-3\.5{width:.875rem}.w-3\/4{width:75%}.w-32{width:8rem}.w-36{width:9rem}.w-4{width:1rem}.w-40{width:10rem}.w-48{width:12rem}.w-5{width:1.25rem}.w-52{width:13rem}.w-6{width:1.5rem}.w-64{width:16rem}.w-7{width:1.75rem}.w-8{width:2rem}.w-80{width:20rem}.w-9{width:2.25rem}.w-\[100px\]{width:100px}.w-\[101px\]{width:101px}.w-\[105px\]{width:105px}.w-\[110px\]{width:110px}.w-\[120px\]{width:120px}.w-\[125px\]{width:125px}.w-\[136px\]{width:136px}.w-\[140px\]{width:140px}.w-\[141px\]{width:141px}.w-\[150px\]{width:150px}.w-\[172px\]{width:172px}.w-\[200px\]{width:200px}.w-\[210px\]{width:210px}.w-\[250px\]{width:250px}.w-\[254px\]{width:254px}.w-\[264px\]{width:264px}.w-\[26px\]{width:26px}.w-\[280px\]{width:280px}.w-\[28px\]{width:28px}.w-\[33px\]{width:33px}.w-\[348px\]{width:348px}.w-\[350px\]{width:350px}.w-\[360px\]{width:360px}.w-\[378px\]{width:378px}.w-\[38px\]{width:38px}.w-\[39px\]{width:39px}.w-\[50px\]{width:50px}.w-\[525px\]{width:525px}.w-\[52px\]{width:52px}.w-\[550px\]{width:550px}.w-\[60px\]{width:60px}.w-\[62px\]{width:62px}.w-\[650px\]{width:650px}.w-\[66px\]{width:66px}.w-\[68px\]{width:68px}.w-\[70px\]{width:70px}.w-\[72px\]{width:72px}.w-\[75px\]{width:75px}.w-\[76px\]{width:76px}.w-\[80px\]{width:80px}.w-\[84px\]{width:84px}.w-\[926px\]{width:926px}.w-\[94px\]{width:94px}.w-\[calc\(100\%-62px\)\]{width:calc(100% - 62px)}.w-fit{width:-moz-fit-content;width:fit-content}.w-full{width:100%}.w-max{width:-moz-max-content;width:max-content}.\!min-w-40{min-width:10rem!important}.\!min-w-\[600px\]{min-width:600px!important}.min-w-0{min-width:0px}.min-w-24{min-width:6rem}.min-w-9{min-width:2.25rem}.min-w-\[110px\]{min-width:110px}.min-w-\[120px\]{min-width:120px}.min-w-\[140px\]{min-width:140px}.min-w-\[177px\]{min-width:177px}.min-w-\[210px\]{min-width:210px}.min-w-\[275px\]{min-width:275px}.min-w-\[300px\]{min-width:300px}.min-w-\[394px\]{min-width:394px}.min-w-\[800px\]{min-width:800px}.min-w-\[80px\]{min-width:80px}.max-w-9{max-width:2.25rem}.max-w-\[110px\]{max-width:110px}.max-w-\[120px\]{max-width:120px}.max-w-\[210px\]{max-width:210px}.max-w-\[250px\]{max-width:250px}.max-w-\[275px\]{max-width:275px}.max-w-\[360px\]{max-width:360px}.max-w-\[394px\]{max-width:394px}.max-w-\[400px\]{max-width:400px}.max-w-\[445px\]{max-width:445px}.max-w-\[525px\]{max-width:525px}.max-w-\[550px\]{max-width:550px}.max-w-\[745px\]{max-width:745px}.max-w-\[768px\]{max-width:768px}.max-w-\[950px\]{max-width:950px}.max-w-full{max-width:100%}.max-w-max{max-width:-moz-max-content;max-width:max-content}.max-w-xs{max-width:20rem}.flex-1{flex:1 1 0%}.flex-shrink-0{flex-shrink:0}.\!table-auto{table-layout:auto!important}.table-fixed{table-layout:fixed}.border-collapse{border-collapse:collapse}.origin-top{transform-origin:top}.-translate-x-1\/2{--tw-translate-x: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.-translate-y-1\/2,.-translate-y-2\/4{--tw-translate-y: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.-translate-y-4{--tw-translate-y: -1rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.-translate-y-full{--tw-translate-y: -100%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-x-0{--tw-translate-x: 0px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-y-0{--tw-translate-y: 0px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-y-4{--tw-translate-y: 1rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-y-full{--tw-translate-y: 100%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.-rotate-90{--tw-rotate: -90deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.rotate-45{--tw-rotate: 45deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.rotate-90{--tw-rotate: 90deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.scale-100{--tw-scale-x: 1;--tw-scale-y: 1;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.scale-95{--tw-scale-x: .95;--tw-scale-y: .95;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.animate-\[on-fade_0\.5s_ease-in-out\]{animation:on-fade .5s ease-in-out}@keyframes spin{to{transform:rotate(360deg)}}.animate-spin{animation:spin 1s linear infinite}.cursor-default{cursor:default}.cursor-grab{cursor:grab}.cursor-not-allowed{cursor:not-allowed}.cursor-pointer{cursor:pointer}.select-none{-webkit-user-select:none;-moz-user-select:none;user-select:none}.select-all{-webkit-user-select:all;-moz-user-select:all;user-select:all}.resize{resize:both}.appearance-none{-webkit-appearance:none;-moz-appearance:none;appearance:none}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.grid-cols-6{grid-template-columns:repeat(6,minmax(0,1fr))}.grid-cols-\[\.1fr_\.2fr_\.2fr_\.2fr_\.2fr_\.2fr\]{grid-template-columns:.1fr .2fr .2fr .2fr .2fr .2fr}.grid-cols-\[\.3fr_\.1fr_\.3fr_\.5fr\]{grid-template-columns:.3fr .1fr .3fr .5fr}.grid-cols-\[1fr_2fr\]{grid-template-columns:1fr 2fr}.grid-cols-\[2fr_1fr_1fr\]{grid-template-columns:2fr 1fr 1fr}.grid-cols-\[2fr_7fr_\.0\.3fr\]{grid-template-columns:2fr 7fr 0.3fr}.grid-cols-\[2fr_7fr_\.1fr\]{grid-template-columns:2fr 7fr .1fr}.grid-rows-1{grid-template-rows:repeat(1,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.place-content-center{place-content:center}.place-content-start{place-content:start}.place-content-between{place-content:space-between}.place-items-start{place-items:start}.content-start{align-content:flex-start}.content-end{align-content:flex-end}.items-start{align-items:flex-start}.items-end{align-items:flex-end}.items-center{align-items:center}.items-baseline{align-items:baseline}.justify-start{justify-content:flex-start}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.justify-items-end{justify-items:end}.justify-items-center{justify-items:center}.gap-0\.5{gap:.125rem}.gap-1{gap:.25rem}.gap-1\.5{gap:.375rem}.gap-10{gap:2.5rem}.gap-11{gap:2.75rem}.gap-16{gap:4rem}.gap-2{gap:.5rem}.gap-2\.5{gap:.625rem}.gap-3{gap:.75rem}.gap-3\.5{gap:.875rem}.gap-4{gap:1rem}.gap-5{gap:1.25rem}.gap-6{gap:1.5rem}.gap-8{gap:2rem}.gap-\[100px\]{gap:100px}.gap-\[124px\]{gap:124px}.gap-x-1{-moz-column-gap:.25rem;column-gap:.25rem}.gap-x-1\.5{-moz-column-gap:.375rem;column-gap:.375rem}.gap-x-12{-moz-column-gap:3rem;column-gap:3rem}.gap-x-2{-moz-column-gap:.5rem;column-gap:.5rem}.gap-x-2\.5{-moz-column-gap:.625rem;column-gap:.625rem}.gap-x-3\.5{-moz-column-gap:.875rem;column-gap:.875rem}.gap-x-4{-moz-column-gap:1rem;column-gap:1rem}.gap-x-5{-moz-column-gap:1.25rem;column-gap:1.25rem}.gap-y-2\.5{row-gap:.625rem}.gap-y-6{row-gap:1.5rem}.gap-y-8{row-gap:2rem}.space-x-1>:not([hidden])~:not([hidden]){--tw-space-x-reverse: 0;margin-right:calc(.25rem * var(--tw-space-x-reverse));margin-left:calc(.25rem * calc(1 - var(--tw-space-x-reverse)))}.divide-y>:not([hidden])~:not([hidden]){--tw-divide-y-reverse: 0;border-top-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)));border-bottom-width:calc(1px * var(--tw-divide-y-reverse))}.divide-gray-100>:not([hidden])~:not([hidden]){--tw-divide-opacity: 1;border-color:rgb(243 244 246 / var(--tw-divide-opacity, 1))}.divide-slate-200>:not([hidden])~:not([hidden]){--tw-divide-opacity: 1;border-color:rgb(226 232 240 / var(--tw-divide-opacity, 1))}.place-self-start{place-self:start}.place-self-end{place-self:end}.self-start{align-self:flex-start}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.text-ellipsis{text-overflow:ellipsis}.whitespace-nowrap{white-space:nowrap}.text-wrap{text-wrap:wrap}.break-words{overflow-wrap:break-word}.break-all{word-break:break-all}.\!rounded-lg{border-radius:.5rem!important}.\!rounded-none{border-radius:0!important}.rounded{border-radius:.25rem}.rounded-2xl{border-radius:1rem}.rounded-3xl{border-radius:1.5rem}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:.5rem}.rounded-md{border-radius:.375rem}.rounded-none{border-radius:0}.rounded-sm{border-radius:.125rem}.rounded-xl{border-radius:.75rem}.\!rounded-l-none{border-top-left-radius:0!important;border-bottom-left-radius:0!important}.\!rounded-r-none{border-top-right-radius:0!important;border-bottom-right-radius:0!important}.rounded-b-lg{border-bottom-right-radius:.5rem;border-bottom-left-radius:.5rem}.rounded-l-none{border-top-left-radius:0;border-bottom-left-radius:0}.rounded-r-lg{border-top-right-radius:.5rem;border-bottom-right-radius:.5rem}.rounded-r-none{border-top-right-radius:0;border-bottom-right-radius:0}.rounded-t{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.rounded-t-lg{border-top-left-radius:.5rem;border-top-right-radius:.5rem}.border{border-width:1px}.border-x-0{border-left-width:0px;border-right-width:0px}.border-y{border-top-width:1px;border-bottom-width:1px}.\!border-b-0{border-bottom-width:0px!important}.border-b{border-bottom-width:1px}.border-b-0{border-bottom-width:0px}.border-b-2{border-bottom-width:2px}.border-l{border-left-width:1px}.border-l-2{border-left-width:2px}.border-t{border-top-width:1px}.border-t-0{border-top-width:0px}.border-t-2{border-top-width:2px}.border-solid{border-style:solid}.border-dashed{border-style:dashed}.\!border-none{border-style:none!important}.\!border-red-600{--tw-border-opacity: 1 !important;border-color:rgb(220 38 38 / var(--tw-border-opacity, 1))!important}.border-blue-200{--tw-border-opacity: 1;border-color:rgb(191 219 254 / var(--tw-border-opacity, 1))}.border-blue-600{--tw-border-opacity: 1;border-color:rgb(37 99 235 / var(--tw-border-opacity, 1))}.border-brandColor{border-color:var(--brand-color)}.border-gray-100{--tw-border-opacity: 1;border-color:rgb(243 244 246 / var(--tw-border-opacity, 1))}.border-gray-200{--tw-border-opacity: 1;border-color:rgb(229 231 235 / var(--tw-border-opacity, 1))}.border-gray-300{--tw-border-opacity: 1;border-color:rgb(209 213 219 / var(--tw-border-opacity, 1))}.border-gray-400{--tw-border-opacity: 1;border-color:rgb(156 163 175 / var(--tw-border-opacity, 1))}.border-gray-500{--tw-border-opacity: 1;border-color:rgb(107 114 128 / var(--tw-border-opacity, 1))}.border-gray-800{--tw-border-opacity: 1;border-color:rgb(31 41 55 / var(--tw-border-opacity, 1))}.border-green-200{--tw-border-opacity: 1;border-color:rgb(187 247 208 / var(--tw-border-opacity, 1))}.border-orange-200{--tw-border-opacity: 1;border-color:rgb(254 215 170 / var(--tw-border-opacity, 1))}.border-red-200{--tw-border-opacity: 1;border-color:rgb(254 202 202 / var(--tw-border-opacity, 1))}.border-red-500{--tw-border-opacity: 1;border-color:rgb(239 68 68 / var(--tw-border-opacity, 1))}.border-slate-300{--tw-border-opacity: 1;border-color:rgb(203 213 225 / var(--tw-border-opacity, 1))}.border-transparent{border-color:transparent}.border-b-gray-300{--tw-border-opacity: 1;border-bottom-color:rgb(209 213 219 / var(--tw-border-opacity, 1))}.border-l-brandColor{border-left-color:var(--brand-color)}.\!bg-green-500{--tw-bg-opacity: 1 !important;background-color:rgb(34 197 94 / var(--tw-bg-opacity, 1))!important}.\!bg-red-500{--tw-bg-opacity: 1 !important;background-color:rgb(239 68 68 / var(--tw-bg-opacity, 1))!important}.bg-\[\#63CFE5\]{--tw-bg-opacity: 1;background-color:rgb(99 207 229 / var(--tw-bg-opacity, 1))}.bg-\[\#8979FF\]{--tw-bg-opacity: 1;background-color:rgb(137 121 255 / var(--tw-bg-opacity, 1))}.bg-\[\#FFA8A1\]{--tw-bg-opacity: 1;background-color:rgb(255 168 161 / var(--tw-bg-opacity, 1))}.bg-black{--tw-bg-opacity: 1;background-color:rgb(0 0 0 / var(--tw-bg-opacity, 1))}.bg-blue-100{--tw-bg-opacity: 1;background-color:rgb(219 234 254 / var(--tw-bg-opacity, 1))}.bg-blue-200{--tw-bg-opacity: 1;background-color:rgb(191 219 254 / var(--tw-bg-opacity, 1))}.bg-blue-50{--tw-bg-opacity: 1;background-color:rgb(239 246 255 / var(--tw-bg-opacity, 1))}.bg-brandColor{background-color:var(--brand-color)}.bg-cyan-200{--tw-bg-opacity: 1;background-color:rgb(165 243 252 / var(--tw-bg-opacity, 1))}.bg-gray-100{--tw-bg-opacity: 1;background-color:rgb(243 244 246 / var(--tw-bg-opacity, 1))}.bg-gray-200{--tw-bg-opacity: 1;background-color:rgb(229 231 235 / var(--tw-bg-opacity, 1))}.bg-gray-300{--tw-bg-opacity: 1;background-color:rgb(209 213 219 / var(--tw-bg-opacity, 1))}.bg-gray-50{--tw-bg-opacity: 1;background-color:rgb(249 250 251 / var(--tw-bg-opacity, 1))}.bg-gray-500{--tw-bg-opacity: 1;background-color:rgb(107 114 128 / var(--tw-bg-opacity, 1))}.bg-gray-600{--tw-bg-opacity: 1;background-color:rgb(75 85 99 / var(--tw-bg-opacity, 1))}.bg-gray-800{--tw-bg-opacity: 1;background-color:rgb(31 41 55 / var(--tw-bg-opacity, 1))}.bg-gray-900{--tw-bg-opacity: 1;background-color:rgb(17 24 39 / var(--tw-bg-opacity, 1))}.bg-gray-950{--tw-bg-opacity: 1;background-color:rgb(3 7 18 / var(--tw-bg-opacity, 1))}.bg-green-100{--tw-bg-opacity: 1;background-color:rgb(220 252 231 / var(--tw-bg-opacity, 1))}.bg-green-200{--tw-bg-opacity: 1;background-color:rgb(187 247 208 / var(--tw-bg-opacity, 1))}.bg-green-50{--tw-bg-opacity: 1;background-color:rgb(240 253 244 / var(--tw-bg-opacity, 1))}.bg-green-500{--tw-bg-opacity: 1;background-color:rgb(34 197 94 / var(--tw-bg-opacity, 1))}.bg-green-600{--tw-bg-opacity: 1;background-color:rgb(22 163 74 / var(--tw-bg-opacity, 1))}.bg-lime-200{--tw-bg-opacity: 1;background-color:rgb(217 249 157 / var(--tw-bg-opacity, 1))}.bg-neutral-100{--tw-bg-opacity: 1;background-color:rgb(245 245 245 / var(--tw-bg-opacity, 1))}.bg-orange-100{--tw-bg-opacity: 1;background-color:rgb(255 237 213 / var(--tw-bg-opacity, 1))}.bg-orange-200{--tw-bg-opacity: 1;background-color:rgb(254 215 170 / var(--tw-bg-opacity, 1))}.bg-orange-50{--tw-bg-opacity: 1;background-color:rgb(255 247 237 / var(--tw-bg-opacity, 1))}.bg-pink-200{--tw-bg-opacity: 1;background-color:rgb(251 207 232 / var(--tw-bg-opacity, 1))}.bg-pink-400{--tw-bg-opacity: 1;background-color:rgb(244 114 182 / var(--tw-bg-opacity, 1))}.bg-purple-100{--tw-bg-opacity: 1;background-color:rgb(243 232 255 / var(--tw-bg-opacity, 1))}.bg-red-100{--tw-bg-opacity: 1;background-color:rgb(254 226 226 / var(--tw-bg-opacity, 1))}.bg-red-200{--tw-bg-opacity: 1;background-color:rgb(254 202 202 / var(--tw-bg-opacity, 1))}.bg-red-50{--tw-bg-opacity: 1;background-color:rgb(254 242 242 / var(--tw-bg-opacity, 1))}.bg-red-500{--tw-bg-opacity: 1;background-color:rgb(239 68 68 / var(--tw-bg-opacity, 1))}.bg-rose-100{--tw-bg-opacity: 1;background-color:rgb(255 228 230 / var(--tw-bg-opacity, 1))}.bg-sky-100{--tw-bg-opacity: 1;background-color:rgb(224 242 254 / var(--tw-bg-opacity, 1))}.bg-sky-600{--tw-bg-opacity: 1;background-color:rgb(2 132 199 / var(--tw-bg-opacity, 1))}.bg-slate-100{--tw-bg-opacity: 1;background-color:rgb(241 245 249 / var(--tw-bg-opacity, 1))}.bg-slate-200{--tw-bg-opacity: 1;background-color:rgb(226 232 240 / var(--tw-bg-opacity, 1))}.bg-transparent{background-color:transparent}.bg-white{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1))}.bg-yellow-200{--tw-bg-opacity: 1;background-color:rgb(254 240 138 / var(--tw-bg-opacity, 1))}.bg-yellow-400{--tw-bg-opacity: 1;background-color:rgb(250 204 21 / var(--tw-bg-opacity, 1))}.bg-opacity-50{--tw-bg-opacity: .5}.bg-gradient-to-r{background-image:linear-gradient(to right,var(--tw-gradient-stops))}.from-transparent{--tw-gradient-from: transparent var(--tw-gradient-from-position);--tw-gradient-to: rgb(0 0 0 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to)}.via-gray-50{--tw-gradient-to: rgb(249 250 251 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), #f9fafb var(--tw-gradient-via-position), var(--tw-gradient-to)}.to-gray-100{--tw-gradient-to: #f3f4f6 var(--tw-gradient-to-position)}.object-contain{-o-object-fit:contain;object-fit:contain}.object-cover{-o-object-fit:cover;object-fit:cover}.\!p-0{padding:0!important}.\!p-2{padding:.5rem!important}.p-0\.5{padding:.125rem}.p-1{padding:.25rem}.p-1\.5{padding:.375rem}.p-2{padding:.5rem}.p-2\.5{padding:.625rem}.p-3{padding:.75rem}.p-3\.5{padding:.875rem}.p-4{padding:1rem}.p-5{padding:1.25rem}.\!px-0{padding-left:0!important;padding-right:0!important}.\!px-2{padding-left:.5rem!important;padding-right:.5rem!important}.\!px-4{padding-left:1rem!important;padding-right:1rem!important}.\!py-0{padding-top:0!important;padding-bottom:0!important}.\!py-\[22px\]{padding-top:22px!important;padding-bottom:22px!important}.px-1{padding-left:.25rem;padding-right:.25rem}.px-10{padding-left:2.5rem;padding-right:2.5rem}.px-12{padding-left:3rem;padding-right:3rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-2\.5{padding-left:.625rem;padding-right:.625rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.px-5{padding-left:1.25rem;padding-right:1.25rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.px-8{padding-left:2rem;padding-right:2rem}.py-0{padding-top:0;padding-bottom:0}.py-0\.5{padding-top:.125rem;padding-bottom:.125rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-1\.5{padding-top:.375rem;padding-bottom:.375rem}.py-12{padding-top:3rem;padding-bottom:3rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-2\.5{padding-top:.625rem;padding-bottom:.625rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.py-3\.5{padding-top:.875rem;padding-bottom:.875rem}.py-4{padding-top:1rem;padding-bottom:1rem}.py-5{padding-top:1.25rem;padding-bottom:1.25rem}.py-\[11px\]{padding-top:11px;padding-bottom:11px}.py-\[7px\]{padding-top:7px;padding-bottom:7px}.py-\[9px\]{padding-top:9px;padding-bottom:9px}.py-px{padding-top:1px;padding-bottom:1px}.\!pb-0{padding-bottom:0!important}.\!pb-3{padding-bottom:.75rem!important}.pb-2\.5{padding-bottom:.625rem}.pb-3\.5{padding-bottom:.875rem}.pb-4{padding-bottom:1rem}.pb-6{padding-bottom:1.5rem}.pb-8{padding-bottom:2rem}.pb-\[9px\]{padding-bottom:9px}.pl-10{padding-left:2.5rem}.pl-2{padding-left:.5rem}.pl-2\.5{padding-left:.625rem}.pl-4{padding-left:1rem}.pl-7{padding-left:1.75rem}.pl-8{padding-left:2rem}.pl-\[2px\]{padding-left:2px}.pr-10{padding-right:2.5rem}.pr-3{padding-right:.75rem}.pr-4{padding-right:1rem}.pr-6{padding-right:1.5rem}.pt-2{padding-top:.5rem}.pt-2\.5{padding-top:.625rem}.pt-3{padding-top:.75rem}.pt-4{padding-top:1rem}.pt-6{padding-top:1.5rem}.pt-8{padding-top:2rem}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.text-end{text-align:end}.align-top{vertical-align:top}.align-text-bottom{vertical-align:text-bottom}.font-inter{font-family:Inter}.\!text-base{font-size:1rem!important;line-height:1.5rem!important}.\!text-sm{font-size:.875rem!important;line-height:1.25rem!important}.text-2xl{font-size:1.5rem;line-height:2rem}.text-3xl{font-size:1.875rem;line-height:2.25rem}.text-\[10px\]{font-size:10px}.text-\[26px\]{font-size:26px}.text-\[38px\]{font-size:38px}.text-base{font-size:1rem;line-height:1.5rem}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.text-xs{font-size:.75rem;line-height:1rem}.\!font-bold{font-weight:700!important}.\!font-normal{font-weight:400!important}.\!font-semibold{font-weight:600!important}.font-bold{font-weight:700}.font-light{font-weight:300}.font-medium{font-weight:500}.font-normal{font-weight:400}.font-semibold{font-weight:600}.uppercase{text-transform:uppercase}.italic{font-style:italic}.leading-5{line-height:1.25rem}.leading-6{line-height:1.5rem}.leading-8{line-height:2rem}.leading-\[140\%\]{line-height:140%}.leading-none{line-height:1}.leading-normal{line-height:1.5}.leading-snug{line-height:1.375}.\!text-brandColor{color:var(--brand-color)!important}.\!text-gray-500{--tw-text-opacity: 1 !important;color:rgb(107 114 128 / var(--tw-text-opacity, 1))!important}.\!text-gray-600{--tw-text-opacity: 1 !important;color:rgb(75 85 99 / var(--tw-text-opacity, 1))!important}.text-black{--tw-text-opacity: 1;color:rgb(0 0 0 / var(--tw-text-opacity, 1))}.text-blue-600{--tw-text-opacity: 1;color:rgb(37 99 235 / var(--tw-text-opacity, 1))}.text-blue-800{--tw-text-opacity: 1;color:rgb(30 64 175 / var(--tw-text-opacity, 1))}.text-blue-900{--tw-text-opacity: 1;color:rgb(30 58 138 / var(--tw-text-opacity, 1))}.text-brandColor{color:var(--brand-color)}.text-cyan-800{--tw-text-opacity: 1;color:rgb(21 94 117 / var(--tw-text-opacity, 1))}.text-cyan-900{--tw-text-opacity: 1;color:rgb(22 78 99 / var(--tw-text-opacity, 1))}.text-gray-200{--tw-text-opacity: 1;color:rgb(229 231 235 / var(--tw-text-opacity, 1))}.text-gray-300{--tw-text-opacity: 1;color:rgb(209 213 219 / var(--tw-text-opacity, 1))}.text-gray-400{--tw-text-opacity: 1;color:rgb(156 163 175 / var(--tw-text-opacity, 1))}.text-gray-500{--tw-text-opacity: 1;color:rgb(107 114 128 / var(--tw-text-opacity, 1))}.text-gray-600{--tw-text-opacity: 1;color:rgb(75 85 99 / var(--tw-text-opacity, 1))}.text-gray-700{--tw-text-opacity: 1;color:rgb(55 65 81 / var(--tw-text-opacity, 1))}.text-gray-800{--tw-text-opacity: 1;color:rgb(31 41 55 / var(--tw-text-opacity, 1))}.text-gray-900{--tw-text-opacity: 1;color:rgb(17 24 39 / var(--tw-text-opacity, 1))}.text-green-500{--tw-text-opacity: 1;color:rgb(34 197 94 / var(--tw-text-opacity, 1))}.text-green-600{--tw-text-opacity: 1;color:rgb(22 163 74 / var(--tw-text-opacity, 1))}.text-green-800{--tw-text-opacity: 1;color:rgb(22 101 52 / var(--tw-text-opacity, 1))}.text-green-900{--tw-text-opacity: 1;color:rgb(20 83 45 / var(--tw-text-opacity, 1))}.text-lime-900{--tw-text-opacity: 1;color:rgb(54 83 20 / var(--tw-text-opacity, 1))}.text-orange-600{--tw-text-opacity: 1;color:rgb(234 88 12 / var(--tw-text-opacity, 1))}.text-orange-800{--tw-text-opacity: 1;color:rgb(154 52 18 / var(--tw-text-opacity, 1))}.text-orange-900{--tw-text-opacity: 1;color:rgb(124 45 18 / var(--tw-text-opacity, 1))}.text-pink-900{--tw-text-opacity: 1;color:rgb(131 24 67 / var(--tw-text-opacity, 1))}.text-purple-800{--tw-text-opacity: 1;color:rgb(107 33 168 / var(--tw-text-opacity, 1))}.text-red-500{--tw-text-opacity: 1;color:rgb(239 68 68 / var(--tw-text-opacity, 1))}.text-red-600{--tw-text-opacity: 1;color:rgb(220 38 38 / var(--tw-text-opacity, 1))}.text-red-800{--tw-text-opacity: 1;color:rgb(153 27 27 / var(--tw-text-opacity, 1))}.text-red-900{--tw-text-opacity: 1;color:rgb(127 29 29 / var(--tw-text-opacity, 1))}.text-rose-600{--tw-text-opacity: 1;color:rgb(225 29 72 / var(--tw-text-opacity, 1))}.text-sky-600{--tw-text-opacity: 1;color:rgb(2 132 199 / var(--tw-text-opacity, 1))}.text-slate-600{--tw-text-opacity: 1;color:rgb(71 85 105 / var(--tw-text-opacity, 1))}.text-slate-800{--tw-text-opacity: 1;color:rgb(30 41 59 / var(--tw-text-opacity, 1))}.text-slate-900{--tw-text-opacity: 1;color:rgb(15 23 42 / var(--tw-text-opacity, 1))}.text-white{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.text-yellow-900{--tw-text-opacity: 1;color:rgb(113 63 18 / var(--tw-text-opacity, 1))}.underline{text-decoration-line:underline}.opacity-0{opacity:0}.opacity-100{opacity:1}.opacity-25{opacity:.25}.opacity-50{opacity:.5}.opacity-70{opacity:.7}.opacity-75{opacity:.75}.opacity-80{opacity:.8}.\!shadow-none{--tw-shadow: 0 0 #0000 !important;--tw-shadow-colored: 0 0 #0000 !important;box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)!important}.shadow{--tw-shadow: 0 1px 3px 0 rgb(0 0 0 / .1), 0 1px 2px -1px rgb(0 0 0 / .1);--tw-shadow-colored: 0 1px 3px 0 var(--tw-shadow-color), 0 1px 2px -1px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-\[0_5px_20px_rgba\(0\,0\,0\,0\.15\)\]{--tw-shadow: 0 5px 20px rgba(0,0,0,.15);--tw-shadow-colored: 0 5px 20px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-\[0px_0px_0px_0px_rgba\(0\,0\,0\,0\.10\)\,0px_1px_3px_0px_rgba\(0\,0\,0\,0\.10\)\,0px_5px_5px_0px_rgba\(0\,0\,0\,0\.09\)\,0px_12px_7px_0px_rgba\(0\,0\,0\,0\.05\)\,0px_22px_9px_0px_rgba\(0\,0\,0\,0\.01\)\,0px_34px_9px_0px_rgba\(0\,0\,0\,0\.00\)\]{--tw-shadow: 0px 0px 0px 0px rgba(0,0,0,.1),0px 1px 3px 0px rgba(0,0,0,.1),0px 5px 5px 0px rgba(0,0,0,.09),0px 12px 7px 0px rgba(0,0,0,.05),0px 22px 9px 0px rgba(0,0,0,.01),0px 34px 9px 0px rgba(0,0,0,0);--tw-shadow-colored: 0px 0px 0px 0px var(--tw-shadow-color), 0px 1px 3px 0px var(--tw-shadow-color), 0px 5px 5px 0px var(--tw-shadow-color), 0px 12px 7px 0px var(--tw-shadow-color), 0px 22px 9px 0px var(--tw-shadow-color), 0px 34px 9px 0px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-\[0px_10px_20px_0px_\#0000001F\]{--tw-shadow: 0px 10px 20px 0px #0000001F;--tw-shadow-colored: 0px 10px 20px 0px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-\[0px_10px_20px_0px_rgba\(0\,0\,0\,0\.12\)\]{--tw-shadow: 0px 10px 20px 0px rgba(0,0,0,.12);--tw-shadow-colored: 0px 10px 20px 0px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-lg{--tw-shadow: 0 10px 15px -3px rgb(0 0 0 / .1), 0 4px 6px -4px rgb(0 0 0 / .1);--tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-md{--tw-shadow: 0 4px 6px -1px rgb(0 0 0 / .1), 0 2px 4px -2px rgb(0 0 0 / .1);--tw-shadow-colored: 0 4px 6px -1px var(--tw-shadow-color), 0 2px 4px -2px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-all{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-opacity{transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-transform{transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.duration-100{transition-duration:.1s}.duration-200{transition-duration:.2s}.duration-300{transition-duration:.3s}.duration-75{transition-duration:75ms}.ease-\[cubic-bezier\(\.4\,0\,\.2\,1\)\]{transition-timing-function:cubic-bezier(.4,0,.2,1)}.ease-in{transition-timing-function:cubic-bezier(.4,0,1,1)}.ease-in-out{transition-timing-function:cubic-bezier(.4,0,.2,1)}.ease-out{transition-timing-function:cubic-bezier(0,0,.2,1)}@font-face{font-family:icomoon;src:url(icomoon-BbY1GX-d.woff?w2trdd) format("woff");font-weight:400;font-style:normal;font-display:block}[class^=icon-],[class*=" icon-"]{font-family:icomoon!important;speak:never;font-style:normal;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.tox .tox-toolbar__group:last-child button{padding:6px 8px;background:#eff6ff;color:#2563eb}.tox .tox-toolbar__group:last-child button:hover{background:#dbeafe}.tox .tox-toolbar__group:last-child button[aria-disabled=true]{cursor:not-allowed;opacity:.5}.tox .tox-toolbar__group:last-child button{background-color:transparent!important}.tox .tox-toolbar__group:last-child button:hover{border-width:0px;--tw-bg-opacity: 1 !important;background-color:rgb(51 137 236 / var(--tw-bg-opacity, 1))!important;--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1));--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.tox.tox-silver-sink.tox-tinymce-aux{z-index:99999}.peer:checked~.peer-checked\:icon-radio-selected:before{content:""}.peer:checked~.peer-checked\:icon-checkbox-multiple:before{content:""}.peer:checked~.peer-checked\:icon-checkbox-select:before{content:""}.dark\:shimmer:is(.dark *){animation-duration:2.2s;animation-fill-mode:forwards;animation-iteration-count:infinite;animation-name:skeleton;animation-timing-function:linear;background:linear-gradient(to right,#f6f6f6 8%,#f0f0f0 18%,#f6f6f6 33%);background-size:1250px 100%}.dark .dark\:shimmer:is(.dark *){background:linear-gradient(to right,#1f2937 8%,#1a2232 18%,#1f2937 33%)}.rtl\:icon-left-arrow:where([dir=rtl],[dir=rtl] *):before{content:""}.rtl\:icon-right-arrow:where([dir=rtl],[dir=rtl] *):before{content:""}.marker\:shadow *::marker{--tw-shadow: 0 1px 3px 0 rgb(0 0 0 / .1), 0 1px 2px -1px rgb(0 0 0 / .1);--tw-shadow-colored: 0 1px 3px 0 var(--tw-shadow-color), 0 1px 2px -1px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.marker\:shadow::marker{--tw-shadow: 0 1px 3px 0 rgb(0 0 0 / .1), 0 1px 2px -1px rgb(0 0 0 / .1);--tw-shadow-colored: 0 1px 3px 0 var(--tw-shadow-color), 0 1px 2px -1px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.after\:absolute:after{content:var(--tw-content);position:absolute}.after\:-right-\[30px\]:after{content:var(--tw-content);right:-30px}.after\:top-0\.5:after{content:var(--tw-content);top:.125rem}.after\:h-4:after{content:var(--tw-content);height:1rem}.after\:w-4:after{content:var(--tw-content);width:1rem}.after\:rounded-full:after{content:var(--tw-content);border-radius:9999px}.after\:border:after{content:var(--tw-content);border-width:1px}.after\:border-gray-300:after{content:var(--tw-content);--tw-border-opacity: 1;border-color:rgb(209 213 219 / var(--tw-border-opacity, 1))}.after\:bg-green-500:after{content:var(--tw-content);--tw-bg-opacity: 1;background-color:rgb(34 197 94 / var(--tw-bg-opacity, 1))}.after\:bg-red-500:after{content:var(--tw-content);--tw-bg-opacity: 1;background-color:rgb(239 68 68 / var(--tw-bg-opacity, 1))}.after\:bg-white:after{content:var(--tw-content);--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1))}.after\:transition-all:after{content:var(--tw-content);transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.after\:content-\[\'\'\]:after{--tw-content: "";content:var(--tw-content)}.after\:content-\[\'\,_\'\]:after{--tw-content: ", ";content:var(--tw-content)}.after\:content-\[\'\/\'\]:after{--tw-content: "/";content:var(--tw-content)}.first\:rounded-l-lg:first-child{border-top-left-radius:.5rem;border-bottom-left-radius:.5rem}.last\:\!mb-0:last-child{margin-bottom:0!important}.last\:mb-0:last-child{margin-bottom:0}.last\:cursor-default:last-child{cursor:default}.last\:border-b-0:last-child{border-bottom-width:0px}.last\:border-none:last-child{border-style:none}.after\:last\:hidden:last-child:after{content:var(--tw-content);display:none}.last\:after\:content-\[\'\'\]:last-child:after{--tw-content: "";content:var(--tw-content)}.focus-within\:border-gray-400:focus-within{--tw-border-opacity: 1;border-color:rgb(156 163 175 / var(--tw-border-opacity, 1))}.hover\:rounded-lg:hover{border-radius:.5rem}.hover\:rounded-md:hover{border-radius:.375rem}.hover\:rounded-sm:hover{border-radius:.125rem}.hover\:border-blue-400:hover{--tw-border-opacity: 1;border-color:rgb(96 165 250 / var(--tw-border-opacity, 1))}.hover\:border-cyan-400:hover{--tw-border-opacity: 1;border-color:rgb(34 211 238 / var(--tw-border-opacity, 1))}.hover\:border-gray-400:hover{--tw-border-opacity: 1;border-color:rgb(156 163 175 / var(--tw-border-opacity, 1))}.hover\:border-green-400:hover{--tw-border-opacity: 1;border-color:rgb(74 222 128 / var(--tw-border-opacity, 1))}.hover\:border-orange-400:hover{--tw-border-opacity: 1;border-color:rgb(251 146 60 / var(--tw-border-opacity, 1))}.hover\:border-red-600:hover{--tw-border-opacity: 1;border-color:rgb(220 38 38 / var(--tw-border-opacity, 1))}.hover\:bg-blue-100:hover{--tw-bg-opacity: 1;background-color:rgb(219 234 254 / var(--tw-bg-opacity, 1))}.hover\:bg-brandColor:hover{background-color:var(--brand-color)}.hover\:bg-gray-100:hover{--tw-bg-opacity: 1;background-color:rgb(243 244 246 / var(--tw-bg-opacity, 1))}.hover\:bg-gray-200:hover{--tw-bg-opacity: 1;background-color:rgb(229 231 235 / var(--tw-bg-opacity, 1))}.hover\:bg-gray-50:hover{--tw-bg-opacity: 1;background-color:rgb(249 250 251 / var(--tw-bg-opacity, 1))}.hover\:bg-green-200:hover{--tw-bg-opacity: 1;background-color:rgb(187 247 208 / var(--tw-bg-opacity, 1))}.hover\:bg-red-200:hover{--tw-bg-opacity: 1;background-color:rgb(254 202 202 / var(--tw-bg-opacity, 1))}.hover\:text-brandColor:hover{color:var(--brand-color)}.hover\:text-gray-800:hover{--tw-text-opacity: 1;color:rgb(31 41 55 / var(--tw-text-opacity, 1))}.hover\:text-sky-600:hover{--tw-text-opacity: 1;color:rgb(2 132 199 / var(--tw-text-opacity, 1))}.hover\:text-white:hover{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.hover\:underline:hover{text-decoration-line:underline}.hover\:opacity-80:hover{opacity:.8}.focus\:border-gray-400:focus{--tw-border-opacity: 1;border-color:rgb(156 163 175 / var(--tw-border-opacity, 1))}.focus\:opacity-80:focus{opacity:.8}.focus\:ring-black:focus{--tw-ring-opacity: 1;--tw-ring-color: rgb(0 0 0 / var(--tw-ring-opacity, 1))}.active\:border-gray-300:active{--tw-border-opacity: 1;border-color:rgb(209 213 219 / var(--tw-border-opacity, 1))}.group\/item:hover .group-hover\/item\:visible,.group:hover .group-hover\:visible{visibility:visible}.group:hover .group-hover\:flex{display:flex}.group:hover .group-hover\:text-gray-700{--tw-text-opacity: 1;color:rgb(55 65 81 / var(--tw-text-opacity, 1))}.group:hover .group-hover\:opacity-100{opacity:1}.group\/container.sidebar-collapsed .group-\[\.sidebar-collapsed\]\/container\:hidden{display:none}.group\/container.sidebar-collapsed .group-\[\.sidebar-collapsed\]\/container\:w-\[70px\]{width:70px}.group\/container.sidebar-collapsed .group-\[\.sidebar-collapsed\]\/container\:overflow-visible{overflow:visible}.peer:checked~.peer-checked\:border-2{border-width:2px}.peer:checked~.peer-checked\:border-4{border-width:4px}.peer:checked~.peer-checked\:border-solid{border-style:solid}.peer:checked~.peer-checked\:border-brandColor{border-color:var(--brand-color)}.peer:checked~.peer-checked\:border-white{--tw-border-opacity: 1;border-color:rgb(255 255 255 / var(--tw-border-opacity, 1))}.peer:checked~.peer-checked\:bg-blue-600{--tw-bg-opacity: 1;background-color:rgb(37 99 235 / var(--tw-bg-opacity, 1))}.peer:checked~.peer-checked\:bg-brandColor{background-color:var(--brand-color)}.peer:checked~.peer-checked\:\!text-brandColor{color:var(--brand-color)!important}.peer:checked~.peer-checked\:text-blue-600{--tw-text-opacity: 1;color:rgb(37 99 235 / var(--tw-text-opacity, 1))}.peer:checked~.peer-checked\:text-brandColor{color:var(--brand-color)}.peer:checked~.peer-checked\:after\:border-white:after{content:var(--tw-content);--tw-border-opacity: 1;border-color:rgb(255 255 255 / var(--tw-border-opacity, 1))}.peer:focus~.peer-focus\:outline-none{outline:2px solid transparent;outline-offset:2px}.peer:focus~.peer-focus\:ring-blue-300{--tw-ring-opacity: 1;--tw-ring-color: rgb(147 197 253 / var(--tw-ring-opacity, 1))}.dark\:divide-gray-700:is(.dark *)>:not([hidden])~:not([hidden]){--tw-divide-opacity: 1;border-color:rgb(55 65 81 / var(--tw-divide-opacity, 1))}.dark\:divide-gray-800:is(.dark *)>:not([hidden])~:not([hidden]){--tw-divide-opacity: 1;border-color:rgb(31 41 55 / var(--tw-divide-opacity, 1))}.dark\:border-gray-300:is(.dark *){--tw-border-opacity: 1;border-color:rgb(209 213 219 / var(--tw-border-opacity, 1))}.dark\:border-gray-400:is(.dark *){--tw-border-opacity: 1;border-color:rgb(156 163 175 / var(--tw-border-opacity, 1))}.dark\:border-gray-600:is(.dark *){--tw-border-opacity: 1;border-color:rgb(75 85 99 / var(--tw-border-opacity, 1))}.dark\:border-gray-700:is(.dark *){--tw-border-opacity: 1;border-color:rgb(55 65 81 / var(--tw-border-opacity, 1))}.dark\:border-gray-800:is(.dark *){--tw-border-opacity: 1;border-color:rgb(31 41 55 / var(--tw-border-opacity, 1))}.dark\:border-gray-900:is(.dark *){--tw-border-opacity: 1;border-color:rgb(17 24 39 / var(--tw-border-opacity, 1))}.dark\:\!bg-gray-900:is(.dark *){--tw-bg-opacity: 1 !important;background-color:rgb(17 24 39 / var(--tw-bg-opacity, 1))!important}.dark\:bg-brandColor:is(.dark *){background-color:var(--brand-color)}.dark\:bg-gray-400:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(156 163 175 / var(--tw-bg-opacity, 1))}.dark\:bg-gray-700:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(55 65 81 / var(--tw-bg-opacity, 1))}.dark\:bg-gray-800:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(31 41 55 / var(--tw-bg-opacity, 1))}.dark\:bg-gray-900:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(17 24 39 / var(--tw-bg-opacity, 1))}.dark\:bg-gray-950:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(3 7 18 / var(--tw-bg-opacity, 1))}.dark\:bg-green-700:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(21 128 61 / var(--tw-bg-opacity, 1))}.dark\:bg-slate-950:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(2 6 23 / var(--tw-bg-opacity, 1))}.dark\:bg-white:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1))}.dark\:via-gray-900:is(.dark *){--tw-gradient-to: rgb(17 24 39 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), #111827 var(--tw-gradient-via-position), var(--tw-gradient-to)}.dark\:to-gray-900:is(.dark *){--tw-gradient-to: #111827 var(--tw-gradient-to-position)}.dark\:\!text-blue-600:is(.dark *){--tw-text-opacity: 1 !important;color:rgb(37 99 235 / var(--tw-text-opacity, 1))!important}.dark\:\!text-blue-800:is(.dark *){--tw-text-opacity: 1 !important;color:rgb(30 64 175 / var(--tw-text-opacity, 1))!important}.dark\:\!text-cyan-800:is(.dark *){--tw-text-opacity: 1 !important;color:rgb(21 94 117 / var(--tw-text-opacity, 1))!important}.dark\:\!text-cyan-900:is(.dark *){--tw-text-opacity: 1 !important;color:rgb(22 78 99 / var(--tw-text-opacity, 1))!important}.dark\:\!text-gray-300:is(.dark *){--tw-text-opacity: 1 !important;color:rgb(209 213 219 / var(--tw-text-opacity, 1))!important}.dark\:\!text-green-500:is(.dark *){--tw-text-opacity: 1 !important;color:rgb(34 197 94 / var(--tw-text-opacity, 1))!important}.dark\:\!text-green-600:is(.dark *){--tw-text-opacity: 1 !important;color:rgb(22 163 74 / var(--tw-text-opacity, 1))!important}.dark\:\!text-green-900:is(.dark *){--tw-text-opacity: 1 !important;color:rgb(20 83 45 / var(--tw-text-opacity, 1))!important}.dark\:\!text-orange-600:is(.dark *){--tw-text-opacity: 1 !important;color:rgb(234 88 12 / var(--tw-text-opacity, 1))!important}.dark\:\!text-orange-800:is(.dark *){--tw-text-opacity: 1 !important;color:rgb(154 52 18 / var(--tw-text-opacity, 1))!important}.dark\:\!text-red-500:is(.dark *){--tw-text-opacity: 1 !important;color:rgb(239 68 68 / var(--tw-text-opacity, 1))!important}.dark\:\!text-red-600:is(.dark *){--tw-text-opacity: 1 !important;color:rgb(220 38 38 / var(--tw-text-opacity, 1))!important}.dark\:\!text-yellow-900:is(.dark *){--tw-text-opacity: 1 !important;color:rgb(113 63 18 / var(--tw-text-opacity, 1))!important}.dark\:text-brandColor:is(.dark *){color:var(--brand-color)}.dark\:text-gray-100:is(.dark *){--tw-text-opacity: 1;color:rgb(243 244 246 / var(--tw-text-opacity, 1))}.dark\:text-gray-300:is(.dark *){--tw-text-opacity: 1;color:rgb(209 213 219 / var(--tw-text-opacity, 1))}.dark\:text-gray-400:is(.dark *){--tw-text-opacity: 1;color:rgb(156 163 175 / var(--tw-text-opacity, 1))}.dark\:text-gray-600:is(.dark *){--tw-text-opacity: 1;color:rgb(75 85 99 / var(--tw-text-opacity, 1))}.dark\:text-gray-800:is(.dark *){--tw-text-opacity: 1;color:rgb(31 41 55 / var(--tw-text-opacity, 1))}.dark\:text-gray-900:is(.dark *){--tw-text-opacity: 1;color:rgb(17 24 39 / var(--tw-text-opacity, 1))}.dark\:text-white:is(.dark *){--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.dark\:mix-blend-exclusion:is(.dark *){mix-blend-mode:exclusion}.dark\:ring-offset-gray-800:is(.dark *){--tw-ring-offset-color: #1f2937}.dark\:invert:is(.dark *){--tw-invert: invert(100%);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.dark\:file\:bg-gray-800:is(.dark *)::file-selector-button{--tw-bg-opacity: 1;background-color:rgb(31 41 55 / var(--tw-bg-opacity, 1))}.dark\:file\:dark\:text-white:is(.dark *):is(.dark *)::file-selector-button{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.dark\:after\:border-white:is(.dark *):after{content:var(--tw-content);--tw-border-opacity: 1;border-color:rgb(255 255 255 / var(--tw-border-opacity, 1))}.dark\:after\:bg-white:is(.dark *):after{content:var(--tw-content);--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1))}.dark\:hover\:border-gray-400:hover:is(.dark *){--tw-border-opacity: 1;border-color:rgb(156 163 175 / var(--tw-border-opacity, 1))}.dark\:hover\:bg-gray-800:hover:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(31 41 55 / var(--tw-bg-opacity, 1))}.dark\:hover\:bg-gray-900:hover:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(17 24 39 / var(--tw-bg-opacity, 1))}.dark\:hover\:bg-gray-950:hover:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(3 7 18 / var(--tw-bg-opacity, 1))}.hover\:dark\:bg-gray-950:is(.dark *):hover{--tw-bg-opacity: 1;background-color:rgb(3 7 18 / var(--tw-bg-opacity, 1))}.dark\:hover\:text-white:hover:is(.dark *){--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.dark\:focus\:border-gray-400:focus:is(.dark *){--tw-border-opacity: 1;border-color:rgb(156 163 175 / var(--tw-border-opacity, 1))}.dark\:focus\:bg-gray-800:focus:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(31 41 55 / var(--tw-bg-opacity, 1))}.peer:checked~.dark\:peer-checked\:bg-gray-950:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(3 7 18 / var(--tw-bg-opacity, 1))}@media not all and (min-width: 1240px){.max-xl\:w-full{width:100%}.max-xl\:flex-auto{flex:1 1 auto}.max-xl\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.max-xl\:flex-wrap{flex-wrap:wrap}.max-xl\:flex-wrap-reverse{flex-wrap:wrap-reverse}}@media not all and (min-width: 1024px){.max-lg\:mt-6{margin-top:1.5rem}.max-lg\:block{display:block}.max-lg\:hidden{display:none}.max-lg\:w-\[400px\]{width:400px}.max-lg\:min-w-full{min-width:100%}.max-lg\:max-w-full{max-width:100%}.max-lg\:grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.max-lg\:flex-wrap{flex-wrap:wrap}.max-lg\:gap-4{gap:1rem}.max-lg\:gap-y-4{row-gap:1rem}}@media not all and (min-width: 768px){.max-md\:hidden{display:none}.max-md\:w-\[90\%\]{width:90%}.max-md\:w-full{width:100%}.max-md\:max-w-full{max-width:100%}.max-md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.max-md\:flex-wrap{flex-wrap:wrap}.max-md\:\!justify-between{justify-content:space-between!important}.max-md\:justify-between{justify-content:space-between}.max-md\:p-4{padding:1rem}.max-md\:py-3{padding-top:.75rem;padding-bottom:.75rem}}@media not all and (min-width: 525px){.max-sm\:hidden{display:none}.max-sm\:\!w-\[calc\(100\%-24px\)\]{width:calc(100% - 24px)!important}.max-sm\:w-full{width:100%}.max-sm\:max-w-full{max-width:100%}.max-sm\:flex-1{flex:1 1 0%}.max-sm\:flex-auto{flex:1 1 auto}.max-sm\:grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.max-sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.max-sm\:flex-wrap{flex-wrap:wrap}.max-sm\:gap-2\.5{gap:.625rem}.max-sm\:place-self-center{place-self:center}.max-sm\:px-4{padding-left:1rem;padding-right:1rem}}@media (min-width: 525px){.sm\:absolute{position:absolute}.sm\:mt-0{margin-top:0}.sm\:hidden{display:none}.sm\:flex-row{flex-direction:row}.sm\:items-center{align-items:center}.sm\:p-0{padding:0}.sm\:px-4{padding-left:1rem;padding-right:1rem}.sm\:py-3{padding-top:.75rem;padding-bottom:.75rem}.sm\:text-right{text-align:right}.sm\:text-base{font-size:1rem;line-height:1.5rem}}@media (min-width: 768px){.md\:hidden{display:none}.md\:translate-y-0{--tw-translate-y: 0px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.md\:scale-100{--tw-scale-x: 1;--tw-scale-y: 1;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.md\:scale-95{--tw-scale-x: .95;--tw-scale-y: .95;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.md\:flex-col{flex-direction:column}}@media (min-width: 1024px){.lg\:sticky{position:sticky}.lg\:top-\[73px\]{top:73px}.lg\:mt-6{margin-top:1.5rem}.lg\:hidden{display:none}}.ltr\:left-0:where([dir=ltr],[dir=ltr] *){left:0}.ltr\:left-3:where([dir=ltr],[dir=ltr] *){left:.75rem}.ltr\:left-4:where([dir=ltr],[dir=ltr] *){left:1rem}.ltr\:left-\[200px\]:where([dir=ltr],[dir=ltr] *){left:200px}.ltr\:right-0:where([dir=ltr],[dir=ltr] *){right:0}.ltr\:right-1\.5:where([dir=ltr],[dir=ltr] *){right:.375rem}.ltr\:right-2:where([dir=ltr],[dir=ltr] *){right:.5rem}.ltr\:right-3:where([dir=ltr],[dir=ltr] *){right:.75rem}.ltr\:right-4:where([dir=ltr],[dir=ltr] *){right:1rem}.ltr\:ml-1\.5:where([dir=ltr],[dir=ltr] *){margin-left:.375rem}.ltr\:ml-11:where([dir=ltr],[dir=ltr] *){margin-left:2.75rem}.ltr\:ml-2\.5:where([dir=ltr],[dir=ltr] *){margin-left:.625rem}.ltr\:mr-1:where([dir=ltr],[dir=ltr] *){margin-right:.25rem}.ltr\:mr-11:where([dir=ltr],[dir=ltr] *){margin-right:2.75rem}.ltr\:mr-5:where([dir=ltr],[dir=ltr] *){margin-right:1.25rem}.ltr\:mr-6:where([dir=ltr],[dir=ltr] *){margin-right:1.5rem}.ltr\:-translate-x-full:where([dir=ltr],[dir=ltr] *){--tw-translate-x: -100%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.ltr\:translate-x-full:where([dir=ltr],[dir=ltr] *){--tw-translate-x: 100%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.ltr\:translate-y-0:where([dir=ltr],[dir=ltr] *){--tw-translate-y: 0px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.ltr\:translate-y-full:where([dir=ltr],[dir=ltr] *){--tw-translate-y: 100%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.ltr\:rounded-l-md:where([dir=ltr],[dir=ltr] *){border-top-left-radius:.375rem;border-bottom-left-radius:.375rem}.ltr\:rounded-r-md:where([dir=ltr],[dir=ltr] *){border-top-right-radius:.375rem;border-bottom-right-radius:.375rem}.ltr\:border-r:where([dir=ltr],[dir=ltr] *){border-right-width:1px}.ltr\:\!pl-14:where([dir=ltr],[dir=ltr] *){padding-left:3.5rem!important}.ltr\:\!pl-5:where([dir=ltr],[dir=ltr] *){padding-left:1.25rem!important}.ltr\:pl-10:where([dir=ltr],[dir=ltr] *){padding-left:2.5rem}.ltr\:pl-2:where([dir=ltr],[dir=ltr] *){padding-left:.5rem}.ltr\:pl-2\.5:where([dir=ltr],[dir=ltr] *){padding-left:.625rem}.ltr\:pl-4:where([dir=ltr],[dir=ltr] *){padding-left:1rem}.ltr\:pr-1\.5:where([dir=ltr],[dir=ltr] *){padding-right:.375rem}.ltr\:pr-10:where([dir=ltr],[dir=ltr] *){padding-right:2.5rem}.ltr\:pr-14:where([dir=ltr],[dir=ltr] *){padding-right:3.5rem}.ltr\:pr-16:where([dir=ltr],[dir=ltr] *){padding-right:4rem}.ltr\:pr-20:where([dir=ltr],[dir=ltr] *){padding-right:5rem}.ltr\:pr-3:where([dir=ltr],[dir=ltr] *){padding-right:.75rem}.ltr\:pr-8:where([dir=ltr],[dir=ltr] *){padding-right:2rem}.ltr\:text-left:where([dir=ltr],[dir=ltr] *){text-align:left}.ltr\:text-right:where([dir=ltr],[dir=ltr] *){text-align:right}.after\:ltr\:left-0\.5:where([dir=ltr],[dir=ltr] *):after{content:var(--tw-content);left:.125rem}.ltr\:after\:bg-green-500:where([dir=ltr],[dir=ltr] *):after{content:var(--tw-content);--tw-bg-opacity: 1;background-color:rgb(34 197 94 / var(--tw-bg-opacity, 1))}.ltr\:after\:bg-red-500:where([dir=ltr],[dir=ltr] *):after{content:var(--tw-content);--tw-bg-opacity: 1;background-color:rgb(239 68 68 / var(--tw-bg-opacity, 1))}.ltr\:first\:rounded-l-lg:first-child:where([dir=ltr],[dir=ltr] *){border-top-left-radius:.5rem;border-bottom-left-radius:.5rem}.peer:checked~.peer-checked\:after\:ltr\:translate-x-full:where([dir=ltr],[dir=ltr] *):after{content:var(--tw-content);--tw-translate-x: 100%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}@media (min-width: 1024px){.ltr\:lg\:pl-\[85px\]:where([dir=ltr],[dir=ltr] *){padding-left:85px}}.rtl\:left-0:where([dir=rtl],[dir=rtl] *){left:0}.rtl\:left-1\.5:where([dir=rtl],[dir=rtl] *){left:.375rem}.rtl\:left-2:where([dir=rtl],[dir=rtl] *){left:.5rem}.rtl\:left-3:where([dir=rtl],[dir=rtl] *){left:.75rem}.rtl\:left-4:where([dir=rtl],[dir=rtl] *){left:1rem}.rtl\:right-0:where([dir=rtl],[dir=rtl] *){right:0}.rtl\:right-3:where([dir=rtl],[dir=rtl] *){right:.75rem}.rtl\:right-4:where([dir=rtl],[dir=rtl] *){right:1rem}.rtl\:right-\[199px\]:where([dir=rtl],[dir=rtl] *){right:199px}.rtl\:ml-1:where([dir=rtl],[dir=rtl] *){margin-left:.25rem}.rtl\:ml-11:where([dir=rtl],[dir=rtl] *){margin-left:2.75rem}.rtl\:ml-5:where([dir=rtl],[dir=rtl] *){margin-left:1.25rem}.rtl\:ml-6:where([dir=rtl],[dir=rtl] *){margin-left:1.5rem}.rtl\:mr-1\.5:where([dir=rtl],[dir=rtl] *){margin-right:.375rem}.rtl\:mr-11:where([dir=rtl],[dir=rtl] *){margin-right:2.75rem}.rtl\:mr-2\.5:where([dir=rtl],[dir=rtl] *){margin-right:.625rem}.rtl\:-translate-x-full:where([dir=rtl],[dir=rtl] *){--tw-translate-x: -100%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.rtl\:-translate-y-0:where([dir=rtl],[dir=rtl] *){--tw-translate-y: -0px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.rtl\:-translate-y-full:where([dir=rtl],[dir=rtl] *){--tw-translate-y: -100%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.rtl\:translate-x-full:where([dir=rtl],[dir=rtl] *){--tw-translate-x: 100%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.rtl\:rounded-l-md:where([dir=rtl],[dir=rtl] *){border-top-left-radius:.375rem;border-bottom-left-radius:.375rem}.rtl\:rounded-r-md:where([dir=rtl],[dir=rtl] *){border-top-right-radius:.375rem;border-bottom-right-radius:.375rem}.rtl\:border-x:where([dir=rtl],[dir=rtl] *){border-left-width:1px;border-right-width:1px}.rtl\:border-l:where([dir=rtl],[dir=rtl] *){border-left-width:1px}.rtl\:\!pr-14:where([dir=rtl],[dir=rtl] *){padding-right:3.5rem!important}.rtl\:\!pr-5:where([dir=rtl],[dir=rtl] *){padding-right:1.25rem!important}.rtl\:pl-1\.5:where([dir=rtl],[dir=rtl] *){padding-left:.375rem}.rtl\:pl-10:where([dir=rtl],[dir=rtl] *){padding-left:2.5rem}.rtl\:pl-14:where([dir=rtl],[dir=rtl] *){padding-left:3.5rem}.rtl\:pl-16:where([dir=rtl],[dir=rtl] *){padding-left:4rem}.rtl\:pl-20:where([dir=rtl],[dir=rtl] *){padding-left:5rem}.rtl\:pl-3:where([dir=rtl],[dir=rtl] *){padding-left:.75rem}.rtl\:pl-8:where([dir=rtl],[dir=rtl] *){padding-left:2rem}.rtl\:pr-10:where([dir=rtl],[dir=rtl] *){padding-right:2.5rem}.rtl\:pr-2:where([dir=rtl],[dir=rtl] *){padding-right:.5rem}.rtl\:pr-2\.5:where([dir=rtl],[dir=rtl] *){padding-right:.625rem}.rtl\:pr-4:where([dir=rtl],[dir=rtl] *){padding-right:1rem}.rtl\:text-left:where([dir=rtl],[dir=rtl] *){text-align:left}.rtl\:text-right:where([dir=rtl],[dir=rtl] *){text-align:right}.rtl\:before\:bg-green-500:where([dir=rtl],[dir=rtl] *):before{content:var(--tw-content);--tw-bg-opacity: 1;background-color:rgb(34 197 94 / var(--tw-bg-opacity, 1))}.rtl\:before\:bg-red-500:where([dir=rtl],[dir=rtl] *):before{content:var(--tw-content);--tw-bg-opacity: 1;background-color:rgb(239 68 68 / var(--tw-bg-opacity, 1))}.after\:rtl\:right-0\.5:where([dir=rtl],[dir=rtl] *):after{content:var(--tw-content);right:.125rem}.rtl\:first\:rounded-r-lg:first-child:where([dir=rtl],[dir=rtl] *){border-top-right-radius:.5rem;border-bottom-right-radius:.5rem}.peer:checked~.peer-checked\:after\:rtl\:-translate-x-full:where([dir=rtl],[dir=rtl] *):after{content:var(--tw-content);--tw-translate-x: -100%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}@media (min-width: 1024px){.rtl\:lg\:pr-\[85px\]:where([dir=rtl],[dir=rtl] *){padding-right:85px}}.\[\&\.active\>\.v-tree-item\]\:block.active>.v-tree-item{display:block}@media not all and (min-width: 1024px){.\[\&\>\*\>\*\:nth-child\(1\)\]\:max-lg\:\!flex-wrap>*>*:nth-child(1){flex-wrap:wrap!important}.\[\&\>\*\>\*\>\*\.toolbarRight\]\:max-lg\:w-full>*>*>*.toolbarRight{width:100%}.\[\&\>\*\>\*\>\*\.toolbarRight\]\:max-lg\:justify-between>*>*>*.toolbarRight{justify-content:space-between}}@media not all and (min-width: 768px){.\[\&\>\*\>\*\>\*\.toolbarRight\]\:max-md\:flex-wrap>*>*>*.toolbarRight{flex-wrap:wrap}.\[\&\>\*\>\*\>\*\.toolbarRight\]\:max-md\:gap-y-2>*>*>*.toolbarRight{row-gap:.5rem}}.\[\&\>\*\]\:after\:content-\[\'_\/_\'\]>*:after{--tw-content: " / ";content:var(--tw-content)}.\[\&\>\.v-tree-item\]\:hidden>.v-tree-item{display:none}.\[\&\>\.v-tree-item\]\:ltr\:pl-6:where([dir=ltr],[dir=ltr] *)>.v-tree-item{padding-left:1.5rem}.\[\&\>\.v-tree-item\]\:rtl\:pr-6:where([dir=rtl],[dir=rtl] *)>.v-tree-item{padding-right:1.5rem}.\[\&\>\:nth-child\(3\)\]\:\!m-0>:nth-child(3){margin:0!important}.\[\&\>\:nth-child\(3\)\]\:\!rounded-l-none>:nth-child(3){border-top-left-radius:0!important;border-bottom-left-radius:0!important}@media not all and (min-width: 525px){.\[\&\>\:nth-child\(3\)\]\:max-sm\:\!w-\[80\%\]>:nth-child(3){width:80%!important}}.\[\&\>div\:last-child\]\:border-b-0>div:last-child{border-bottom-width:0px}.ltr\:\[\&\>span\>i\]\:right-14>span>i:where([dir=ltr],[dir=ltr] *){right:3.5rem}.rtl\:\[\&\>span\>i\]\:left-14>span>i:where([dir=rtl],[dir=rtl] *){left:3.5rem} diff --git a/public/admin/build/assets/app-C2Wq9G4i.css b/public/admin/build/assets/app-C2Wq9G4i.css new file mode 100644 index 0000000..8414cd3 --- /dev/null +++ b/public/admin/build/assets/app-C2Wq9G4i.css @@ -0,0 +1 @@ +.flatpickr-calendar{background:transparent;opacity:0;display:none;text-align:center;visibility:hidden;padding:0;-webkit-animation:none;animation:none;direction:ltr;border:0;font-size:14px;line-height:24px;border-radius:5px;position:absolute;width:307.875px;-webkit-box-sizing:border-box;box-sizing:border-box;-ms-touch-action:manipulation;touch-action:manipulation;background:#fff;-webkit-box-shadow:1px 0 0 #e6e6e6,-1px 0 0 #e6e6e6,0 1px 0 #e6e6e6,0 -1px 0 #e6e6e6,0 3px 13px rgba(0,0,0,.08);box-shadow:1px 0 #e6e6e6,-1px 0 #e6e6e6,0 1px #e6e6e6,0 -1px #e6e6e6,0 3px 13px #00000014}.flatpickr-calendar.open,.flatpickr-calendar.inline{opacity:1;max-height:640px;visibility:visible}.flatpickr-calendar.open{display:inline-block;z-index:99999}.flatpickr-calendar.animate.open{-webkit-animation:fpFadeInDown .3s cubic-bezier(.23,1,.32,1);animation:fpFadeInDown .3s cubic-bezier(.23,1,.32,1)}.flatpickr-calendar.inline{display:block;position:relative;top:2px}.flatpickr-calendar.static{position:absolute;top:calc(100% + 2px)}.flatpickr-calendar.static.open{z-index:999;display:block}.flatpickr-calendar.multiMonth .flatpickr-days .dayContainer:nth-child(n+1) .flatpickr-day.inRange:nth-child(7n+7){-webkit-box-shadow:none!important;box-shadow:none!important}.flatpickr-calendar.multiMonth .flatpickr-days .dayContainer:nth-child(n+2) .flatpickr-day.inRange:nth-child(7n+1){-webkit-box-shadow:-2px 0 0 #e6e6e6,5px 0 0 #e6e6e6;box-shadow:-2px 0 #e6e6e6,5px 0 #e6e6e6}.flatpickr-calendar .hasWeeks .dayContainer,.flatpickr-calendar .hasTime .dayContainer{border-bottom:0;border-bottom-right-radius:0;border-bottom-left-radius:0}.flatpickr-calendar .hasWeeks .dayContainer{border-left:0}.flatpickr-calendar.hasTime .flatpickr-time{height:40px;border-top:1px solid #e6e6e6}.flatpickr-calendar.noCalendar.hasTime .flatpickr-time{height:auto}.flatpickr-calendar:before,.flatpickr-calendar:after{position:absolute;display:block;pointer-events:none;border:solid transparent;content:"";height:0;width:0;left:22px}.flatpickr-calendar.rightMost:before,.flatpickr-calendar.arrowRight:before,.flatpickr-calendar.rightMost:after,.flatpickr-calendar.arrowRight:after{left:auto;right:22px}.flatpickr-calendar.arrowCenter:before,.flatpickr-calendar.arrowCenter:after{left:50%;right:50%}.flatpickr-calendar:before{border-width:5px;margin:0 -5px}.flatpickr-calendar:after{border-width:4px;margin:0 -4px}.flatpickr-calendar.arrowTop:before,.flatpickr-calendar.arrowTop:after{bottom:100%}.flatpickr-calendar.arrowTop:before{border-bottom-color:#e6e6e6}.flatpickr-calendar.arrowTop:after{border-bottom-color:#fff}.flatpickr-calendar.arrowBottom:before,.flatpickr-calendar.arrowBottom:after{top:100%}.flatpickr-calendar.arrowBottom:before{border-top-color:#e6e6e6}.flatpickr-calendar.arrowBottom:after{border-top-color:#fff}.flatpickr-calendar:focus{outline:0}.flatpickr-wrapper{position:relative;display:inline-block}.flatpickr-months{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.flatpickr-months .flatpickr-month{background:transparent;color:#000000e6;fill:#000000e6;height:34px;line-height:1;text-align:center;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;overflow:hidden;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.flatpickr-months .flatpickr-prev-month,.flatpickr-months .flatpickr-next-month{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;text-decoration:none;cursor:pointer;position:absolute;top:0;height:34px;padding:10px;z-index:3;color:#000000e6;fill:#000000e6}.flatpickr-months .flatpickr-prev-month.flatpickr-disabled,.flatpickr-months .flatpickr-next-month.flatpickr-disabled{display:none}.flatpickr-months .flatpickr-prev-month i,.flatpickr-months .flatpickr-next-month i{position:relative}.flatpickr-months .flatpickr-prev-month.flatpickr-prev-month,.flatpickr-months .flatpickr-next-month.flatpickr-prev-month{left:0}.flatpickr-months .flatpickr-prev-month.flatpickr-next-month,.flatpickr-months .flatpickr-next-month.flatpickr-next-month{right:0}.flatpickr-months .flatpickr-prev-month:hover,.flatpickr-months .flatpickr-next-month:hover{color:#959ea9}.flatpickr-months .flatpickr-prev-month:hover svg,.flatpickr-months .flatpickr-next-month:hover svg{fill:#f64747}.flatpickr-months .flatpickr-prev-month svg,.flatpickr-months .flatpickr-next-month svg{width:14px;height:14px}.flatpickr-months .flatpickr-prev-month svg path,.flatpickr-months .flatpickr-next-month svg path{-webkit-transition:fill .1s;transition:fill .1s;fill:inherit}.numInputWrapper{position:relative;height:auto}.numInputWrapper input,.numInputWrapper span{display:inline-block}.numInputWrapper input{width:100%}.numInputWrapper input::-ms-clear{display:none}.numInputWrapper input::-webkit-outer-spin-button,.numInputWrapper input::-webkit-inner-spin-button{margin:0;-webkit-appearance:none}.numInputWrapper span{position:absolute;right:0;width:14px;padding:0 4px 0 2px;height:50%;line-height:50%;opacity:0;cursor:pointer;border:1px solid rgba(57,57,57,.15);-webkit-box-sizing:border-box;box-sizing:border-box}.numInputWrapper span:hover{background:#0000001a}.numInputWrapper span:active{background:#0003}.numInputWrapper span:after{display:block;content:"";position:absolute}.numInputWrapper span.arrowUp{top:0;border-bottom:0}.numInputWrapper span.arrowUp:after{border-left:4px solid transparent;border-right:4px solid transparent;border-bottom:4px solid rgba(57,57,57,.6);top:26%}.numInputWrapper span.arrowDown{top:50%}.numInputWrapper span.arrowDown:after{border-left:4px solid transparent;border-right:4px solid transparent;border-top:4px solid rgba(57,57,57,.6);top:40%}.numInputWrapper span svg{width:inherit;height:auto}.numInputWrapper span svg path{fill:#00000080}.numInputWrapper:hover{background:#0000000d}.numInputWrapper:hover span{opacity:1}.flatpickr-current-month{font-size:135%;line-height:inherit;font-weight:300;color:inherit;position:absolute;width:75%;left:12.5%;padding:7.48px 0 0;line-height:1;height:34px;display:inline-block;text-align:center;-webkit-transform:translate3d(0px,0px,0px);transform:translateZ(0)}.flatpickr-current-month span.cur-month{font-family:inherit;font-weight:700;color:inherit;display:inline-block;margin-left:.5ch;padding:0}.flatpickr-current-month span.cur-month:hover{background:#0000000d}.flatpickr-current-month .numInputWrapper{width:6ch;width:7ch�;display:inline-block}.flatpickr-current-month .numInputWrapper span.arrowUp:after{border-bottom-color:#000000e6}.flatpickr-current-month .numInputWrapper span.arrowDown:after{border-top-color:#000000e6}.flatpickr-current-month input.cur-year{background:transparent;-webkit-box-sizing:border-box;box-sizing:border-box;color:inherit;cursor:text;padding:0 0 0 .5ch;margin:0;display:inline-block;font-size:inherit;font-family:inherit;font-weight:300;line-height:inherit;height:auto;border:0;border-radius:0;vertical-align:initial;-webkit-appearance:textfield;-moz-appearance:textfield;appearance:textfield}.flatpickr-current-month input.cur-year:focus{outline:0}.flatpickr-current-month input.cur-year[disabled],.flatpickr-current-month input.cur-year[disabled]:hover{font-size:100%;color:#00000080;background:transparent;pointer-events:none}.flatpickr-current-month .flatpickr-monthDropdown-months{appearance:menulist;background:transparent;border:none;border-radius:0;box-sizing:border-box;color:inherit;cursor:pointer;font-size:inherit;font-family:inherit;font-weight:300;height:auto;line-height:inherit;margin:-1px 0 0;outline:none;padding:0 0 0 .5ch;position:relative;vertical-align:initial;-webkit-box-sizing:border-box;-webkit-appearance:menulist;-moz-appearance:menulist;width:auto}.flatpickr-current-month .flatpickr-monthDropdown-months:focus,.flatpickr-current-month .flatpickr-monthDropdown-months:active{outline:none}.flatpickr-current-month .flatpickr-monthDropdown-months:hover{background:#0000000d}.flatpickr-current-month .flatpickr-monthDropdown-months .flatpickr-monthDropdown-month{background-color:transparent;outline:none;padding:0}.flatpickr-weekdays{background:transparent;text-align:center;overflow:hidden;width:100%;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;height:28px}.flatpickr-weekdays .flatpickr-weekdaycontainer{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}span.flatpickr-weekday{cursor:default;font-size:90%;background:transparent;color:#0000008a;line-height:1;margin:0;text-align:center;display:block;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;font-weight:bolder}.dayContainer,.flatpickr-weeks{padding:1px 0 0}.flatpickr-days{position:relative;overflow:hidden;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:start;-webkit-align-items:flex-start;-ms-flex-align:start;align-items:flex-start;width:307.875px}.flatpickr-days:focus{outline:0}.dayContainer{padding:0;outline:0;text-align:left;width:307.875px;min-width:307.875px;max-width:307.875px;-webkit-box-sizing:border-box;box-sizing:border-box;display:inline-block;display:-ms-flexbox;display:-webkit-box;display:-webkit-flex;display:flex;-webkit-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-wrap:wrap;-ms-flex-pack:justify;-webkit-justify-content:space-around;justify-content:space-around;-webkit-transform:translate3d(0px,0px,0px);transform:translateZ(0);opacity:1}.dayContainer+.dayContainer{-webkit-box-shadow:-1px 0 0 #e6e6e6;box-shadow:-1px 0 #e6e6e6}.flatpickr-day{background:none;border:1px solid transparent;border-radius:150px;-webkit-box-sizing:border-box;box-sizing:border-box;color:#393939;cursor:pointer;font-weight:400;width:14.2857143%;-webkit-flex-basis:14.2857143%;-ms-flex-preferred-size:14.2857143%;flex-basis:14.2857143%;max-width:39px;height:39px;line-height:39px;margin:0;display:inline-block;position:relative;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;text-align:center}.flatpickr-day.inRange,.flatpickr-day.prevMonthDay.inRange,.flatpickr-day.nextMonthDay.inRange,.flatpickr-day.today.inRange,.flatpickr-day.prevMonthDay.today.inRange,.flatpickr-day.nextMonthDay.today.inRange,.flatpickr-day:hover,.flatpickr-day.prevMonthDay:hover,.flatpickr-day.nextMonthDay:hover,.flatpickr-day:focus,.flatpickr-day.prevMonthDay:focus,.flatpickr-day.nextMonthDay:focus{cursor:pointer;outline:0;background:#e6e6e6;border-color:#e6e6e6}.flatpickr-day.today{border-color:#959ea9}.flatpickr-day.today:hover,.flatpickr-day.today:focus{border-color:#959ea9;background:#959ea9;color:#fff}.flatpickr-day.selected,.flatpickr-day.startRange,.flatpickr-day.endRange,.flatpickr-day.selected.inRange,.flatpickr-day.startRange.inRange,.flatpickr-day.endRange.inRange,.flatpickr-day.selected:focus,.flatpickr-day.startRange:focus,.flatpickr-day.endRange:focus,.flatpickr-day.selected:hover,.flatpickr-day.startRange:hover,.flatpickr-day.endRange:hover,.flatpickr-day.selected.prevMonthDay,.flatpickr-day.startRange.prevMonthDay,.flatpickr-day.endRange.prevMonthDay,.flatpickr-day.selected.nextMonthDay,.flatpickr-day.startRange.nextMonthDay,.flatpickr-day.endRange.nextMonthDay{background:#569ff7;-webkit-box-shadow:none;box-shadow:none;color:#fff;border-color:#569ff7}.flatpickr-day.selected.startRange,.flatpickr-day.startRange.startRange,.flatpickr-day.endRange.startRange{border-radius:50px 0 0 50px}.flatpickr-day.selected.endRange,.flatpickr-day.startRange.endRange,.flatpickr-day.endRange.endRange{border-radius:0 50px 50px 0}.flatpickr-day.selected.startRange+.endRange:not(:nth-child(7n+1)),.flatpickr-day.startRange.startRange+.endRange:not(:nth-child(7n+1)),.flatpickr-day.endRange.startRange+.endRange:not(:nth-child(7n+1)){-webkit-box-shadow:-10px 0 0 #569ff7;box-shadow:-10px 0 #569ff7}.flatpickr-day.selected.startRange.endRange,.flatpickr-day.startRange.startRange.endRange,.flatpickr-day.endRange.startRange.endRange{border-radius:50px}.flatpickr-day.inRange{border-radius:0;-webkit-box-shadow:-5px 0 0 #e6e6e6,5px 0 0 #e6e6e6;box-shadow:-5px 0 #e6e6e6,5px 0 #e6e6e6}.flatpickr-day.flatpickr-disabled,.flatpickr-day.flatpickr-disabled:hover,.flatpickr-day.prevMonthDay,.flatpickr-day.nextMonthDay,.flatpickr-day.notAllowed,.flatpickr-day.notAllowed.prevMonthDay,.flatpickr-day.notAllowed.nextMonthDay{color:#3939394d;background:transparent;border-color:transparent;cursor:default}.flatpickr-day.flatpickr-disabled,.flatpickr-day.flatpickr-disabled:hover{cursor:not-allowed;color:#3939391a}.flatpickr-day.week.selected{border-radius:0;-webkit-box-shadow:-5px 0 0 #569ff7,5px 0 0 #569ff7;box-shadow:-5px 0 #569ff7,5px 0 #569ff7}.flatpickr-day.hidden{visibility:hidden}.rangeMode .flatpickr-day{margin-top:1px}.flatpickr-weekwrapper{float:left}.flatpickr-weekwrapper .flatpickr-weeks{padding:0 12px;-webkit-box-shadow:1px 0 0 #e6e6e6;box-shadow:1px 0 #e6e6e6}.flatpickr-weekwrapper .flatpickr-weekday{float:none;width:100%;line-height:28px}.flatpickr-weekwrapper span.flatpickr-day,.flatpickr-weekwrapper span.flatpickr-day:hover{display:block;width:100%;max-width:none;color:#3939394d;background:transparent;cursor:default;border:none}.flatpickr-innerContainer{display:block;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-sizing:border-box;box-sizing:border-box;overflow:hidden}.flatpickr-rContainer{display:inline-block;padding:0;-webkit-box-sizing:border-box;box-sizing:border-box}.flatpickr-time{text-align:center;outline:0;display:block;height:0;line-height:40px;max-height:40px;-webkit-box-sizing:border-box;box-sizing:border-box;overflow:hidden;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.flatpickr-time:after{content:"";display:table;clear:both}.flatpickr-time .numInputWrapper{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;width:40%;height:40px;float:left}.flatpickr-time .numInputWrapper span.arrowUp:after{border-bottom-color:#393939}.flatpickr-time .numInputWrapper span.arrowDown:after{border-top-color:#393939}.flatpickr-time.hasSeconds .numInputWrapper{width:26%}.flatpickr-time.time24hr .numInputWrapper{width:49%}.flatpickr-time input{background:transparent;-webkit-box-shadow:none;box-shadow:none;border:0;border-radius:0;text-align:center;margin:0;padding:0;height:inherit;line-height:inherit;color:#393939;font-size:14px;position:relative;-webkit-box-sizing:border-box;box-sizing:border-box;-webkit-appearance:textfield;-moz-appearance:textfield;appearance:textfield}.flatpickr-time input.flatpickr-hour{font-weight:700}.flatpickr-time input.flatpickr-minute,.flatpickr-time input.flatpickr-second{font-weight:400}.flatpickr-time input:focus{outline:0;border:0}.flatpickr-time .flatpickr-time-separator,.flatpickr-time .flatpickr-am-pm{height:inherit;float:left;line-height:inherit;color:#393939;font-weight:700;width:2%;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-align-self:center;-ms-flex-item-align:center;align-self:center}.flatpickr-time .flatpickr-am-pm{outline:0;width:18%;cursor:pointer;text-align:center;font-weight:400}.flatpickr-time input:hover,.flatpickr-time .flatpickr-am-pm:hover,.flatpickr-time input:focus,.flatpickr-time .flatpickr-am-pm:focus{background:#eee}.flatpickr-input[readonly]{cursor:pointer}@-webkit-keyframes fpFadeInDown{0%{opacity:0;-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0)}to{opacity:1;-webkit-transform:translate3d(0,0,0);transform:translateZ(0)}}@keyframes fpFadeInDown{0%{opacity:0;-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0)}to{opacity:1;-webkit-transform:translate3d(0,0,0);transform:translateZ(0)}}.vuecal__weekdays-headings{border-bottom:1px solid #ddd;margin-bottom:-1px}.vuecal--week-numbers .vuecal__weekdays-headings,.vuecal--view-with-time .vuecal__weekdays-headings{padding-left:3em}.vuecal--view-with-time.vuecal--twelve-hour .vuecal__weekdays-headings{font-size:.9em;padding-left:4em}.vuecal--overflow-x.vuecal--view-with-time .vuecal__weekdays-headings{padding-left:0}.vuecal__heading{width:100%;height:2.8em;font-weight:400;justify-content:center;text-align:center;align-items:center;position:relative;overflow:hidden}.vuecal__heading>.vuecal__flex{width:100%;height:100%;align-items:initial!important}.vuecal--sticky-split-labels .vuecal__heading{height:3.4em}.vuecal--month-view .vuecal__heading,.vuecal--week-view .vuecal__heading,.vuecal--day-view .vuecal__heading{width:14.2857%}.vuecal--hide-weekends.vuecal--month-view .vuecal__heading,.vuecal--hide-weekends.vuecal--week-view .vuecal__heading,.vuecal--hide-weekends.vuecal--day-view .vuecal__heading,.vuecal--years-view .vuecal__heading{width:20%}.vuecal--year-view .vuecal__heading{width:33.33%}.vuecal__heading .weekday-label{flex-shrink:0;display:flex;justify-content:center;align-items:center}.vuecal--small .vuecal__heading .small,.vuecal--xsmall .vuecal__heading .xsmall{display:block}.vuecal__heading .small,.vuecal__heading .xsmall,.vuecal--small .vuecal__heading .full,.vuecal--small .vuecal__heading .xsmall,.vuecal--xsmall .vuecal__heading .full,.vuecal--xsmall .vuecal__heading .small{display:none}.vuecal .vuecal__split-days-headers{align-items:center}@media screen and (max-width: 550px){.vuecal__heading{line-height:1.2}.vuecal__heading .small,.vuecal--small .vuecal__heading .small,.vuecal--xsmall .vuecal__heading .xsmall{display:block}.vuecal__heading .full,.vuecal__heading .xsmall,.vuecal--small .vuecal__heading .full,.vuecal--small .vuecal__heading .xsmall,.vuecal--xsmall .vuecal__heading .full,.vuecal--xsmall .vuecal__heading .small{display:none}.vuecal--overflow-x .vuecal__heading .full,.vuecal--small.vuecal--overflow-x .vuecal__heading .small,.vuecal--xsmall.vuecal--overflow-x .vuecal__heading .xsmall{display:block}.vuecal--overflow-x .vuecal__heading .small,.vuecal--overflow-x .vuecal__heading .xsmall,.vuecal--small.vuecal--overflow-x .vuecal__heading .full,.vuecal--small.vuecal--overflow-x .vuecal__heading .xsmall,.vuecal--xsmall.vuecal--overflow-x .vuecal__heading .full,.vuecal--xsmall.vuecal--overflow-x .vuecal__heading .small{display:none}}@media screen and (max-width: 450px){.vuecal__heading .xsmall,.vuecal--small .vuecal__heading .xsmall,.vuecal--xsmall .vuecal__heading .xsmall{display:block}.vuecal__heading .full,.vuecal__heading .small,.vuecal--small .vuecal__heading .full,.vuecal--small .vuecal__heading .small,.vuecal--xsmall .vuecal__heading .full,.vuecal--xsmall .vuecal__heading .small{display:none}.vuecal--small.vuecal--overflow-x .vuecal__heading .small,.vuecal--xsmall.vuecal--overflow-x .vuecal__heading .xsmall{display:block}.vuecal--small.vuecal--overflow-x .vuecal__heading .full,.vuecal--small.vuecal--overflow-x .vuecal__heading .xsmall,.vuecal--xsmall.vuecal--overflow-x .vuecal__heading .full,.vuecal--xsmall.vuecal--overflow-x .vuecal__heading .small{display:none}}.vuecal__header button{outline:none;font-family:inherit}.vuecal__menu{padding:0;margin:0;list-style-type:none;justify-content:center;background-color:#00000005}.vuecal__view-btn{background:none;border:none;padding:.3em 1em;height:2.2em;font-size:1.3em;border-bottom:0 solid currentColor;cursor:pointer;color:inherit;box-sizing:border-box;transition:.2s}.vuecal__view-btn--active{border-bottom-width:2px;background:#ffffff26}.vuecal__title-bar{background-color:#0000001a;display:flex;align-items:center;text-align:center;justify-content:space-between;font-size:1.4em;line-height:1.3;min-height:2em}.vuecal--xsmall .vuecal__title-bar{font-size:1.3em}.vuecal__title{position:relative;justify-content:center}.vuecal__title button{cursor:pointer;background:none;border:none}.vuecal__title button.slide-fade--left-leave-active,.vuecal__title button.slide-fade--right-leave-active{width:100%}.vuecal__today-btn{position:relative;align-items:center;display:flex;font-size:.8em;background:none;border:none}.vuecal__today-btn span.default{font-size:.8em;padding:3px 6px;text-transform:uppercase;cursor:pointer}.vuecal__arrow{cursor:pointer;position:relative;z-index:1;background:none;border:none;white-space:nowrap}.vuecal__arrow--prev{margin-left:.6em}.vuecal__arrow--next{margin-right:.6em}.vuecal__arrow i.angle{display:inline-block;border:solid currentColor;border-width:0 2px 2px 0;padding:.25em;transform:rotate(-45deg)}.vuecal__arrow--prev i.angle{border-width:2px 0 0 2px}.vuecal__arrow--highlighted,.vuecal__today-btn--highlighted,.vuecal__view-btn--highlighted{position:relative;background-color:#0000000a}.vuecal__arrow--highlighted *,.vuecal__today-btn--highlighted *,.vuecal__view-btn--highlighted *{pointer-events:none}.vuecal__arrow--highlighted:before,.vuecal__arrow--highlighted:after,.vuecal__today-btn--highlighted:before,.vuecal__today-btn--highlighted:after,.vuecal__view-btn--highlighted:before,.vuecal__view-btn--highlighted:after{content:"";background-color:inherit;animation:sonar .8s infinite ease-out;position:absolute;top:50%;left:50%;pointer-events:none}.vuecal__arrow--highlighted:before,.vuecal__today-btn--highlighted:before,.vuecal__view-btn--highlighted:before{width:3em;height:3em;border-radius:3em;margin-top:-1.5em;margin-left:-1.5em}.vuecal__arrow--highlighted:after,.vuecal__today-btn--highlighted:after,.vuecal__view-btn--highlighted:after{animation-duration:1.5s;animation-delay:.1s;width:2.6em;height:2.6em;border-radius:2.6em;margin-top:-1.3em;margin-left:-1.3em}@keyframes sonar{0%,20%{opacity:1}to{transform:scale(2.5);opacity:0}}@media screen and (max-width: 450px){.vuecal__title{font-size:.9em}.vuecal__view-btn{padding-left:.6em;padding-right:.6em}}@media screen and (max-width: 350px){.vuecal__view-btn{font-size:1.1em}}.vuecal__event{color:#666;background-color:#f8f8f8cc;position:relative;box-sizing:border-box;left:0;width:100%;z-index:1;transition:box-shadow .3s,left .3s,width .3s;overflow:hidden}.vuecal--no-time .vuecal__event{min-height:8px}.vuecal:not(.vuecal--dragging-event) .vuecal__event:hover{z-index:2}.vuecal__cell .vuecal__event *{-webkit-user-select:text;-moz-user-select:text;user-select:text}.vuecal--view-with-time .vuecal__event:not(.vuecal__event--all-day){position:absolute}.vuecal--view-with-time .vuecal__bg .vuecal__event--all-day{position:absolute;top:0;bottom:0;z-index:0;opacity:.6;width:auto;right:0}.vuecal--view-with-time .vuecal__all-day .vuecal__event--all-day{position:relative;left:0}.vuecal__event--background{z-index:0}.vuecal__event--focus,.vuecal__event:focus{box-shadow:1px 1px 6px #0003;z-index:3;outline:none}.vuecal__event.vuecal__event--dragging{opacity:.7}.vuecal__event.vuecal__event--static{opacity:0;transition:opacity .1s}@-moz-document url-prefix(){.vuecal__event.vuecal__event--dragging{opacity:1}}.vuecal__event-resize-handle{position:absolute;bottom:0;left:0;right:0;height:1em;background-color:#ffffff4d;opacity:0;transform:translateY(110%);transition:.3s;cursor:ns-resize}.vuecal__event:hover .vuecal__event-resize-handle,.vuecal__event:focus .vuecal__event-resize-handle,.vuecal__event--focus .vuecal__event-resize-handle,.vuecal__event--resizing .vuecal__event-resize-handle{opacity:1;transform:translateY(0)}.vuecal__event--dragging .vuecal__event-resize-handle{display:none}.vuecal__event-delete{position:absolute;top:0;left:0;right:0;display:flex;flex-direction:column;align-items:center;justify-content:center;height:1.4em;line-height:1.4em;background-color:#dd3333d9;color:#fff;z-index:0;cursor:pointer;transform:translateY(-110%);transition:.3s}.vuecal__event .vuecal__event-delete{-webkit-user-select:none;-moz-user-select:none;user-select:none}.vuecal--full-height-delete .vuecal__event-delete{height:auto;bottom:0}.vuecal--full-height-delete .vuecal__event-delete:before{content:"";width:1.7em;height:1.8em;display:block;background-image:url('data:image/svg+xml;utf8,')}.vuecal__event--deletable .vuecal__event-delete{transform:translateY(0);z-index:1}.vuecal__event--deletable.vuecal__event--dragging .vuecal__event-delete{opacity:0;transition:none}.vuecal--month-view .vuecal__event-title{font-size:.85em}.vuecal--short-events .vuecal__event-title{text-align:left;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;padding:0 3px}.vuecal__event-title,.vuecal__event-content{-webkit-hyphens:auto;hyphens:auto}.vuecal__event-title--edit{border-bottom:1px solid transparent;text-align:center;transition:.3s;color:inherit;background-image:url('data:image/svg+xml;utf8,');background-repeat:no-repeat;background-position:120% .15em;background-size:.4em;outline:none;width:100%}.vuecal__event-title--edit:hover,.vuecal__event-title--edit:focus{border-color:#0006;background-position:99% .15em;background-size:1.2em}.vuecal__cell{position:relative;width:100%;display:flex;justify-content:center;align-items:center;text-align:center;transition:.15s ease-in-out background-color}.vuecal__cells.month-view .vuecal__cell,.vuecal__cells.week-view .vuecal__cell{width:14.2857%}.vuecal--hide-weekends .vuecal__cells.month-view .vuecal__cell,.vuecal--hide-weekends .vuecal__cells.week-view .vuecal__cell,.vuecal__cells.years-view .vuecal__cell{width:20%}.vuecal__cells.year-view .vuecal__cell{width:33.33%}.vuecal__cells.day-view .vuecal__cell{flex:1}.vuecal--overflow-x.vuecal--day-view .vuecal__cell{width:auto}.vuecal--click-to-navigate .vuecal__cell:not(.vuecal__cell--disabled){cursor:pointer}.vuecal--view-with-time .vuecal__cell,.vuecal--week-view.vuecal--no-time .vuecal__cell:not(.vuecal__cell--has-splits),.vuecal--day-view.vuecal--no-time .vuecal__cell:not(.vuecal__cell--has-splits){display:block}.vuecal__cell.vuecal__cell--has-splits{flex-direction:row;display:flex}.vuecal__cell:before{content:"";position:absolute;z-index:0;top:0;left:0;right:-1px;bottom:-1px;border:1px solid rgba(196,196,196,.25)}.vuecal--overflow-x.vuecal--day-view .vuecal__cell:before{bottom:0}.vuecal__cell--today,.vuecal__cell--current{background-color:#f0f0ff66;z-index:1}.vuecal__cell--selected{background-color:#ebfff566;z-index:2}.vuecal--day-view .vuecal__cell--selected{background:none}.vuecal__cell--out-of-scope{color:#00000040}.vuecal__cell--disabled{color:#00000040;cursor:not-allowed}.vuecal__cell--highlighted:not(.vuecal__cell--has-splits),.vuecal__cell-split.vuecal__cell-split--highlighted{background-color:#0000000a;transition-duration:5ms}.vuecal__cell-content{position:relative;width:100%;height:100%;outline:none}.vuecal--years-view .vuecal__cell-content,.vuecal--year-view .vuecal__cell-content,.vuecal--month-view .vuecal__cell-content{justify-content:center}.vuecal__cell .cell-time-labels{position:absolute;top:0;left:0;right:0;bottom:0;display:flex;flex-direction:column}.vuecal__cell .cell-time-label{flex-grow:1;font-size:.8em;opacity:.3;line-height:1.7}.vuecal__cell-split{display:flex;flex-grow:1;flex-direction:column;height:100%;position:relative;transition:.15s ease-in-out background-color}.vuecal__cell-events{width:100%}.vuecal__cell-events-count{position:absolute;left:50%;top:65%;transform:translate(-50%);min-width:12px;height:12px;line-height:12px;padding:0 3px;background:#999;color:#fff;border-radius:12px;font-size:10px;box-sizing:border-box}.vuecal__cell .vuecal__special-hours{position:absolute;left:0;right:0;box-sizing:border-box}.vuecal--overflow-x.vuecal--week-view .vuecal__cell,.vuecal__cell-split{overflow:hidden}.vuecal__no-event{padding-top:1em;color:#aaa;justify-self:flex-start;margin-bottom:auto}.vuecal__all-day .vuecal__no-event{display:none}.vuecal__now-line{position:absolute;left:0;width:100%;height:0;color:red;border-top:1px solid currentColor;opacity:.6;z-index:1}.vuecal__now-line:before{content:"";position:absolute;top:-6px;left:0;border:5px solid transparent;border-left-color:currentColor}.vuecal{height:100%;box-shadow:0 0 0 1px inset #00000014}.vuecal *{-webkit-user-select:none;-moz-user-select:none;user-select:none}.vuecal--has-touch *:not(.vuecal__event-title--edit){-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;user-select:none}.vuecal .clickable{cursor:pointer}.vuecal--resizing-event,.vuecal--drag-creating-event{cursor:ns-resize}.vuecal--dragging-event{cursor:move;cursor:grabbing}.vuecal .dragging-helper{position:absolute;width:60px;height:40px;background:#8abee6cc;border:1px solid #61a9e0;z-index:10}.vuecal--xsmall{font-size:.9em}.vuecal__flex{display:flex;flex-direction:row}.vuecal__flex[column]{flex-direction:column;flex:1 1 auto}.vuecal__flex[grow]{flex:1 1 auto;width:100%}.vuecal__flex[wrap]{flex-wrap:wrap}.vuecal__split-days-headers.slide-fade--right-leave-active{display:none}.vuecal--week-numbers.vuecal--month-view .vuecal__split-days-headers{margin-left:3em}.vuecal--day-view:not(.vuecal--overflow-x) .vuecal__split-days-headers{margin-left:3em;height:2.2em}.vuecal--day-view.vuecal--twelve-hour:not(.vuecal--overflow-x) .vuecal__split-days-headers{margin-left:4em}.vuecal__split-days-headers .day-split-header{display:flex;flex-grow:1;flex-basis:0;justify-content:center;align-items:center;height:100%}.vuecal__split-days-headers .vuecal--day-view.vuecal--overflow-x.vuecal--sticky-split-labels .day-split-header{height:1.5em}.vuecal__body{position:relative;overflow:hidden}.vuecal__all-day{min-height:1.7em;margin-bottom:-1px;flex-shrink:0}.vuecal__all-day-text{width:3em;box-sizing:border-box;color:#999;padding-right:2px;display:flex;flex-shrink:0;align-items:center;justify-content:flex-end;border-bottom:1px solid #ddd;-webkit-hyphens:auto;hyphens:auto}.vuecal__all-day-text span{font-size:.85em;text-align:right;line-height:1.1}.vuecal--twelve-hour .vuecal__all-day>span{width:4em}.vuecal__bg{overflow:auto;overflow-x:hidden;-webkit-overflow-scrolling:touch;min-height:60px;position:relative;width:100%}.vuecal--no-time .vuecal__bg{display:flex;flex:1 1 auto;overflow:auto}.vuecal__week-numbers{width:3em;flex-shrink:0!important}.vuecal__week-numbers .vuecal__week-number-cell{opacity:.4;font-size:.9em;align-items:center;justify-items:center;justify-content:center}.vuecal__scrollbar-check{position:absolute;top:0;left:0;right:0;bottom:0;overflow:scroll;visibility:hidden;z-index:-1}.vuecal__scrollbar-check div{height:120%}.vuecal__time-column{width:3em;height:100%;flex-shrink:0}.vuecal--twelve-hour .vuecal__time-column{width:4em;font-size:.9em}.vuecal--overflow-x.vuecal--week-view .vuecal__time-column{margin-top:2.8em;box-shadow:0 1px 1px #0000004d}.vuecal--overflow-x.vuecal--week-view.vuecal--sticky-split-labels .vuecal__time-column{margin-top:3.4em}.vuecal--overflow-x.vuecal--day-view.vuecal--sticky-split-labels .vuecal__time-column{margin-top:1.5em}.vuecal__time-column .vuecal__time-cell{color:#999;text-align:right;padding-right:2px;font-size:.9em}.vuecal__time-column .vuecal__time-cell-line:before{content:"";position:absolute;left:0;right:0;border-top:1px solid rgba(196,196,196,.3)}.vuecal__cells{margin:0 1px 1px 0}.vuecal--overflow-x.vuecal--day-view .vuecal__cells{margin:0}.vuecal--events-on-month-view.vuecal--short-events .vuecal__cells{width:99.9%}.vuecal--overflow-x.vuecal--day-view .vuecal__cells,.vuecal--overflow-x.vuecal--week-view .vuecal__cells{flex-wrap:nowrap;overflow:auto}.slide-fade--left-enter-active,.slide-fade--left-leave-active,.slide-fade--right-enter-active,.slide-fade--right-leave-active{transition:.25s ease-out}.slide-fade--left-enter-from,.slide-fade--right-leave-to{transform:translate(-15px);opacity:0}.slide-fade--left-leave-to,.slide-fade--right-enter-from{transform:translate(15px);opacity:0}.slide-fade--left-leave-active,.slide-fade--right-leave-active{position:absolute!important;height:100%}.vuecal__title-bar .slide-fade--left-leave-active,.vuecal__title-bar .slide-fade--right-leave-active{left:0;right:0;height:auto}.vuecal__heading .slide-fade--left-leave-active,.vuecal__heading .slide-fade--right-leave-active{display:flex;align-items:center}.vuecal--green-theme .vuecal__menu,.vuecal--green-theme .vuecal__cell-events-count{background-color:#42b983;color:#fff}.vuecal--green-theme .vuecal__title-bar{background-color:#e4f5ef}.vuecal--green-theme .vuecal__cell--today,.vuecal--green-theme .vuecal__cell--current{background-color:#f0f0ff66}.vuecal--green-theme:not(.vuecal--day-view) .vuecal__cell--selected{background-color:#ebfff566}.vuecal--green-theme .vuecal__cell--selected:before{border-color:#42b98380}.vuecal--green-theme .vuecal__cell--highlighted:not(.vuecal__cell--has-splits),.vuecal--green-theme .vuecal__cell-split--highlighted{background-color:#c3ffe180}.vuecal--green-theme .vuecal__arrow--highlighted,.vuecal--green-theme .vuecal__today-btn--highlighted,.vuecal--green-theme .vuecal__view-btn--highlighted{background-color:#88ecbf40}.vuecal--blue-theme .vuecal__menu,.vuecal--blue-theme .vuecal__cell-events-count{background-color:#42a3b9cc;color:#fff}.vuecal--blue-theme .vuecal__title-bar{background-color:#00a5bc4d}.vuecal--blue-theme .vuecal__cell--today,.vuecal--blue-theme .vuecal__cell--current{background-color:#f0f0ff66}.vuecal--blue-theme:not(.vuecal--day-view) .vuecal__cell--selected{background-color:#ebfdff66}.vuecal--blue-theme .vuecal__cell--selected:before{border-color:#73bfcc80}.vuecal--blue-theme .vuecal__cell--highlighted:not(.vuecal__cell--has-splits),.vuecal--blue-theme .vuecal__cell-split--highlighted{background-color:#00a5bc0f}.vuecal--blue-theme .vuecal__arrow--highlighted,.vuecal--blue-theme .vuecal__today-btn--highlighted,.vuecal--blue-theme .vuecal__view-btn--highlighted{background-color:#42a3b933}.vuecal--rounded-theme .vuecal__weekdays-headings{border:none}.vuecal--rounded-theme .vuecal__cell,.vuecal--rounded-theme .vuecal__cell:before{background:none;border:none}.vuecal--rounded-theme .vuecal__cell--out-of-scope{opacity:.4}.vuecal--rounded-theme .vuecal__cell-content{width:30px;height:30px;flex-grow:0;border:1px solid transparent;border-radius:30px;color:#333}.vuecal--rounded-theme.vuecal--day-view .vuecal__cell-content{width:auto;background:none}.vuecal--rounded-theme.vuecal--year-view .vuecal__cell{width:33.33%}.vuecal--rounded-theme.vuecal--year-view .vuecal__cell-content{width:85px}.vuecal--rounded-theme.vuecal--years-view .vuecal__cell-content{width:52px}.vuecal--rounded-theme .vuecal__cell{background-color:transparent!important}.vuecal--rounded-theme.vuecal--green-theme:not(.vuecal--day-view) .vuecal__cell-content{background-color:#f1faf7}.vuecal--rounded-theme.vuecal--green-theme:not(.vuecal--day-view) .vuecal__cell--today .vuecal__cell-content{background-color:#42b983;color:#fff}.vuecal--rounded-theme.vuecal--green-theme .vuecal--day-view .vuecal__cell--today:before{background-color:#42b9830d}.vuecal--rounded-theme.vuecal--green-theme:not(.vuecal--day-view) .vuecal__cell--selected .vuecal__cell-content{border-color:#42b983}.vuecal--rounded-theme.vuecal--green-theme .vuecal__cell--highlighted:not(.vuecal__cell--has-splits),.vuecal--rounded-theme.vuecal--green-theme .vuecal__cell-split--highlighted{background-color:#c3ffe180}.vuecal--rounded-theme.vuecal--blue-theme:not(.vuecal--day-view) .vuecal__cell-content{background-color:#64b6ff33}.vuecal--rounded-theme.vuecal--blue-theme:not(.vuecal--day-view) .vuecal__cell--today .vuecal__cell-content{background-color:#8fb7e4;color:#fff}.vuecal--rounded-theme.vuecal--blue-theme .vuecal--day-view .vuecal__cell--today:before{background-color:#8fb7e41a}.vuecal--rounded-theme.vuecal--blue-theme:not(.vuecal--day-view) .vuecal__cell--selected .vuecal__cell-content{border-color:#61a9e0}.vuecal--rounded-theme.vuecal--blue-theme .vuecal__cell--highlighted:not(.vuecal__cell--has-splits),.vuecal--rounded-theme.vuecal--blue-theme .vuecal__cell-split--highlighted{background-color:#00a5bc0f}.vuecal--date-picker .vuecal__title-bar{font-size:1.2em}.vuecal--date-picker .vuecal__heading{height:2.2em;font-weight:500;opacity:.4}.vuecal--date-picker .vuecal__weekdays-headings{border:none}.vuecal--date-picker .vuecal__body{margin-left:1px}.vuecal--date-picker .vuecal__cell,.vuecal--date-picker .vuecal__cell:before{background:none;border:none}.vuecal--date-picker .vuecal__cell-content{height:26px;flex-grow:0;border:1px solid transparent;border-radius:25px;transition:background-color .2s cubic-bezier(.39,.58,.57,1)}.vuecal--date-picker.vuecal--years-view .vuecal__cell-content{flex:0;padding:0 4px;height:24px}.vuecal--date-picker.vuecal--year-view .vuecal__cell-content{flex:0;padding:0 15px}.vuecal--date-picker.vuecal--month-view .vuecal__cell-content{width:26px}.vuecal--date-picker:not(.vuecal--day-view) .vuecal__cell-content:hover{background-color:#0000001a}.vuecal--date-picker:not(.vuecal--day-view) .vuecal__cell--selected .vuecal__cell-content{background-color:#42b982;color:#fff}.vuecal--date-picker:not(.vuecal--day-view) .vuecal__cell--current .vuecal__cell-content,.vuecal--date-picker:not(.vuecal--day-view) .vuecal__cell--today .vuecal__cell-content{border-color:#42b982} diff --git a/public/admin/build/assets/app-Dz7u1TwN.js b/public/admin/build/assets/app-Dz7u1TwN.js new file mode 100644 index 0000000..6793a0b --- /dev/null +++ b/public/admin/build/assets/app-Dz7u1TwN.js @@ -0,0 +1,76 @@ +const WE="modulepreload",YE=function(e,t){return new URL(e,t).href},Bd={},Ue=function(t,n,r){let i=Promise.resolve();if(n&&n.length>0){const o=document.getElementsByTagName("link"),a=document.querySelector("meta[property=csp-nonce]"),l=(a==null?void 0:a.nonce)||(a==null?void 0:a.getAttribute("nonce"));i=Promise.allSettled(n.map(c=>{if(c=YE(c,r),c in Bd)return;Bd[c]=!0;const u=c.endsWith(".css"),f=u?'[rel="stylesheet"]':"";if(!!r)for(let p=o.length-1;p>=0;p--){const g=o[p];if(g.href===c&&(!u||g.rel==="stylesheet"))return}else if(document.querySelector(`link[href="${c}"]${f}`))return;const m=document.createElement("link");if(m.rel=u?"stylesheet":WE,u||(m.as="script"),m.crossOrigin="",m.href=c,l&&m.setAttribute("nonce",l),document.head.appendChild(m),u)return new Promise((p,g)=>{m.addEventListener("load",p),m.addEventListener("error",()=>g(new Error(`Unable to preload CSS for ${c}`)))})}))}function s(o){const a=new Event("vite:preloadError",{cancelable:!0});if(a.payload=o,window.dispatchEvent(a),!a.defaultPrevented)throw o}return i.then(o=>{for(const a of o||[])a.status==="rejected"&&s(a.reason);return t().catch(s)})};/** +* @vue/shared v3.5.25 +* (c) 2018-present Yuxi (Evan) You and Vue contributors +* @license MIT +**/function Wt(e){const t=Object.create(null);for(const n of e.split(","))t[n]=1;return n=>n in t}const et={},wi=[],Bt=()=>{},Ei=()=>!1,ci=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&(e.charCodeAt(2)>122||e.charCodeAt(2)<97),Vl=e=>e.startsWith("onUpdate:"),Je=Object.assign,Bl=(e,t)=>{const n=e.indexOf(t);n>-1&&e.splice(n,1)},zE=Object.prototype.hasOwnProperty,ot=(e,t)=>zE.call(e,t),be=Array.isArray,Di=e=>Hi(e)==="[object Map]",ui=e=>Hi(e)==="[object Set]",Tu=e=>Hi(e)==="[object Date]",om=e=>Hi(e)==="[object RegExp]",Le=e=>typeof e=="function",Be=e=>typeof e=="string",En=e=>typeof e=="symbol",at=e=>e!==null&&typeof e=="object",jl=e=>(at(e)||Le(e))&&Le(e.then)&&Le(e.catch),mf=Object.prototype.toString,Hi=e=>mf.call(e),am=e=>Hi(e).slice(8,-1),Ro=e=>Hi(e)==="[object Object]",Po=e=>Be(e)&&e!=="NaN"&&e[0]!=="-"&&""+parseInt(e,10)===e,Pr=Wt(",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted"),lm=Wt("bind,cloak,else-if,else,for,html,if,model,on,once,pre,show,slot,text,memo"),Hl=e=>{const t=Object.create(null);return n=>t[n]||(t[n]=e(n))},KE=/-\w/g,mt=Hl(e=>e.replace(KE,t=>t.slice(1).toUpperCase())),GE=/\B([A-Z])/g,on=Hl(e=>e.replace(GE,"-$1").toLowerCase()),fi=Hl(e=>e.charAt(0).toUpperCase()+e.slice(1)),Ci=Hl(e=>e?`on${fi(e)}`:""),rn=(e,t)=>!Object.is(e,t),Oi=(e,...t)=>{for(let n=0;n{Object.defineProperty(e,t,{configurable:!0,enumerable:!1,writable:r,value:n})},Lo=e=>{const t=parseFloat(e);return isNaN(t)?e:t},po=e=>{const t=Be(e)?Number(e):NaN;return isNaN(t)?e:t};let jd;const ko=()=>jd||(jd=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:typeof global<"u"?global:{}),XE=/^[_$a-zA-Z\xA0-\uFFFF][_$a-zA-Z0-9\xA0-\uFFFF]*$/;function JE(e){return XE.test(e)?`__props.${e}`:`__props[${JSON.stringify(e)}]`}function cm(e,t){return e+JSON.stringify(t,(n,r)=>typeof r=="function"?r.toString():r)}const ZE={TEXT:1,1:"TEXT",CLASS:2,2:"CLASS",STYLE:4,4:"STYLE",PROPS:8,8:"PROPS",FULL_PROPS:16,16:"FULL_PROPS",NEED_HYDRATION:32,32:"NEED_HYDRATION",STABLE_FRAGMENT:64,64:"STABLE_FRAGMENT",KEYED_FRAGMENT:128,128:"KEYED_FRAGMENT",UNKEYED_FRAGMENT:256,256:"UNKEYED_FRAGMENT",NEED_PATCH:512,512:"NEED_PATCH",DYNAMIC_SLOTS:1024,1024:"DYNAMIC_SLOTS",DEV_ROOT_FRAGMENT:2048,2048:"DEV_ROOT_FRAGMENT",CACHED:-1,"-1":"CACHED",BAIL:-2,"-2":"BAIL"},QE={1:"TEXT",2:"CLASS",4:"STYLE",8:"PROPS",16:"FULL_PROPS",32:"NEED_HYDRATION",64:"STABLE_FRAGMENT",128:"KEYED_FRAGMENT",256:"UNKEYED_FRAGMENT",512:"NEED_PATCH",1024:"DYNAMIC_SLOTS",2048:"DEV_ROOT_FRAGMENT",[-1]:"CACHED",[-2]:"BAIL"},qE={ELEMENT:1,1:"ELEMENT",FUNCTIONAL_COMPONENT:2,2:"FUNCTIONAL_COMPONENT",STATEFUL_COMPONENT:4,4:"STATEFUL_COMPONENT",TEXT_CHILDREN:8,8:"TEXT_CHILDREN",ARRAY_CHILDREN:16,16:"ARRAY_CHILDREN",SLOTS_CHILDREN:32,32:"SLOTS_CHILDREN",TELEPORT:64,64:"TELEPORT",SUSPENSE:128,128:"SUSPENSE",COMPONENT_SHOULD_KEEP_ALIVE:256,256:"COMPONENT_SHOULD_KEEP_ALIVE",COMPONENT_KEPT_ALIVE:512,512:"COMPONENT_KEPT_ALIVE",COMPONENT:6,6:"COMPONENT"},eb={STABLE:1,1:"STABLE",DYNAMIC:2,2:"DYNAMIC",FORWARDED:3,3:"FORWARDED"},tb={1:"STABLE",2:"DYNAMIC",3:"FORWARDED"},nb="Infinity,undefined,NaN,isFinite,isNaN,parseFloat,parseInt,decodeURI,decodeURIComponent,encodeURI,encodeURIComponent,Math,Number,Date,Array,Object,Boolean,String,RegExp,Map,Set,JSON,Intl,BigInt,console,Error,Symbol",vf=Wt(nb),rb=vf,Hd=2;function um(e,t=0,n=e.length){if(t=Math.max(0,Math.min(t,e.length)),n=Math.max(0,Math.min(n,e.length)),t>n)return"";let r=e.split(/(\r?\n)/);const i=r.filter((a,l)=>l%2===1);r=r.filter((a,l)=>l%2===0);let s=0;const o=[];for(let a=0;a=t){for(let l=a-Hd;l<=a+Hd||n>s;l++){if(l<0||l>=r.length)continue;const c=l+1;o.push(`${c}${" ".repeat(Math.max(3-String(c).length,0))}| ${r[l]}`);const u=r[l].length,f=i[l]&&i[l].length||0;if(l===a){const d=t-(s-(u+f)),m=Math.max(1,n>s?u-d:n-t);o.push(" | "+" ".repeat(d)+"^".repeat(m))}else if(l>a){if(n>s){const d=Math.max(Math.min(n-s,u),1);o.push(" | "+"^".repeat(d))}s+=u+f}}break}return o.join(` +`)}function ws(e){if(be(e)){const t={};for(let n=0;n{if(n){const r=n.split(sb);r.length>1&&(t[r[0].trim()]=r[1].trim())}}),t}function ab(e){if(!e)return"";if(Be(e))return e;let t="";for(const n in e){const r=e[n];if(Be(r)||typeof r=="number"){const i=n.startsWith("--")?n:on(n);t+=`${i}:${r};`}}return t}function Ds(e){let t="";if(Be(e))t=e;else if(be(e))for(let n=0;n/="'\u0009\u000a\u000c\u0020]/,Rc={};function pb(e){if(Rc.hasOwnProperty(e))return Rc[e];const t=hb.test(e);return t&&console.error(`unsafe attribute name: ${e}`),Rc[e]=!t}const mb={acceptCharset:"accept-charset",className:"class",htmlFor:"for",httpEquiv:"http-equiv"},gb=Wt("accept,accept-charset,accesskey,action,align,allow,alt,async,autocapitalize,autocomplete,autofocus,autoplay,background,bgcolor,border,buffered,capture,challenge,charset,checked,cite,class,code,codebase,color,cols,colspan,content,contenteditable,contextmenu,controls,coords,crossorigin,csp,data,datetime,decoding,default,defer,dir,dirname,disabled,download,draggable,dropzone,enctype,enterkeyhint,for,form,formaction,formenctype,formmethod,formnovalidate,formtarget,headers,height,hidden,high,href,hreflang,http-equiv,icon,id,importance,inert,integrity,ismap,itemprop,keytype,kind,label,lang,language,loading,list,loop,low,manifest,max,maxlength,minlength,media,min,multiple,muted,name,novalidate,open,optimum,pattern,ping,placeholder,poster,preload,radiogroup,readonly,referrerpolicy,rel,required,reversed,rows,rowspan,sandbox,scope,scoped,selected,shape,size,sizes,slot,span,spellcheck,src,srcdoc,srclang,srcset,start,step,style,summary,tabindex,target,title,translate,type,usemap,value,width,wrap"),vb=Wt("xmlns,accent-height,accumulate,additive,alignment-baseline,alphabetic,amplitude,arabic-form,ascent,attributeName,attributeType,azimuth,baseFrequency,baseline-shift,baseProfile,bbox,begin,bias,by,calcMode,cap-height,class,clip,clipPathUnits,clip-path,clip-rule,color,color-interpolation,color-interpolation-filters,color-profile,color-rendering,contentScriptType,contentStyleType,crossorigin,cursor,cx,cy,d,decelerate,descent,diffuseConstant,direction,display,divisor,dominant-baseline,dur,dx,dy,edgeMode,elevation,enable-background,end,exponent,fill,fill-opacity,fill-rule,filter,filterRes,filterUnits,flood-color,flood-opacity,font-family,font-size,font-size-adjust,font-stretch,font-style,font-variant,font-weight,format,from,fr,fx,fy,g1,g2,glyph-name,glyph-orientation-horizontal,glyph-orientation-vertical,glyphRef,gradientTransform,gradientUnits,hanging,height,href,hreflang,horiz-adv-x,horiz-origin-x,id,ideographic,image-rendering,in,in2,intercept,k,k1,k2,k3,k4,kernelMatrix,kernelUnitLength,kerning,keyPoints,keySplines,keyTimes,lang,lengthAdjust,letter-spacing,lighting-color,limitingConeAngle,local,marker-end,marker-mid,marker-start,markerHeight,markerUnits,markerWidth,mask,maskContentUnits,maskUnits,mathematical,max,media,method,min,mode,name,numOctaves,offset,opacity,operator,order,orient,orientation,origin,overflow,overline-position,overline-thickness,panose-1,paint-order,path,pathLength,patternContentUnits,patternTransform,patternUnits,ping,pointer-events,points,pointsAtX,pointsAtY,pointsAtZ,preserveAlpha,preserveAspectRatio,primitiveUnits,r,radius,referrerPolicy,refX,refY,rel,rendering-intent,repeatCount,repeatDur,requiredExtensions,requiredFeatures,restart,result,rotate,rx,ry,scale,seed,shape-rendering,slope,spacing,specularConstant,specularExponent,speed,spreadMethod,startOffset,stdDeviation,stemh,stemv,stitchTiles,stop-color,stop-opacity,strikethrough-position,strikethrough-thickness,string,stroke,stroke-dasharray,stroke-dashoffset,stroke-linecap,stroke-linejoin,stroke-miterlimit,stroke-opacity,stroke-width,style,surfaceScale,systemLanguage,tabindex,tableValues,target,targetX,targetY,text-anchor,text-decoration,text-rendering,textLength,to,transform,transform-origin,type,u1,u2,underline-position,underline-thickness,unicode,unicode-bidi,unicode-range,units-per-em,v-alphabetic,v-hanging,v-ideographic,v-mathematical,values,vector-effect,version,vert-adv-y,vert-origin-x,vert-origin-y,viewBox,viewTarget,visibility,width,widths,word-spacing,writing-mode,x,x-height,x1,x2,xChannelSelector,xlink:actuate,xlink:arcrole,xlink:href,xlink:role,xlink:show,xlink:title,xlink:type,xmlns:xlink,xml:base,xml:lang,xml:space,y,y1,y2,yChannelSelector,z,zoomAndPan"),yb=Wt("accent,accentunder,actiontype,align,alignmentscope,altimg,altimg-height,altimg-valign,altimg-width,alttext,bevelled,close,columnsalign,columnlines,columnspan,denomalign,depth,dir,display,displaystyle,encoding,equalcolumns,equalrows,fence,fontstyle,fontweight,form,frame,framespacing,groupalign,height,href,id,indentalign,indentalignfirst,indentalignlast,indentshift,indentshiftfirst,indentshiftlast,indextype,justify,largetop,largeop,lquote,lspace,mathbackground,mathcolor,mathsize,mathvariant,maxsize,minlabelspacing,mode,other,overflow,position,rowalign,rowlines,rowspan,rquote,rspace,scriptlevel,scriptminsize,scriptsizemultiplier,selection,separator,separators,shift,side,src,stackalign,stretchy,subscriptshift,superscriptshift,symmetric,voffset,width,widths,xlink:href,xlink:show,xlink:type,xmlns");function Eb(e){if(e==null)return!1;const t=typeof e;return t==="string"||t==="number"||t==="boolean"}const bb=/["'&<>]/;function Sb(e){const t=""+e,n=bb.exec(t);if(!n)return t;let r="",i,s,o=0;for(s=n.index;s||--!>|?@[\\\]^`{|}~]/g;function Db(e,t){return e.replace(ym,n=>t?n==='"'?'\\\\\\"':`\\\\${n}`:`\\${n}`)}function Cb(e,t){if(e.length!==t.length)return!1;let n=!0;for(let r=0;n&&rBr(n,t))}const Em=e=>!!(e&&e.__v_isRef===!0),bf=e=>Be(e)?e:e==null?"":be(e)||at(e)&&(e.toString===mf||!Le(e.toString))?Em(e)?bf(e.value):JSON.stringify(e,bm,2):String(e),bm=(e,t)=>Em(t)?bm(e,t.value):Di(t)?{[`Map(${t.size})`]:[...t.entries()].reduce((n,[r,i],s)=>(n[Pc(r,s)+" =>"]=i,n),{})}:ui(t)?{[`Set(${t.size})`]:[...t.values()].map(n=>Pc(n))}:En(t)?Pc(t):at(t)&&!be(t)&&!Ro(t)?String(t):t,Pc=(e,t="")=>{var n;return En(e)?`Symbol(${(n=e.description)!=null?n:t})`:e};function Sm(e){return e==null?"initial":typeof e=="string"?e===""?" ":e:String(e)}const Ob=Object.freeze(Object.defineProperty({__proto__:null,EMPTY_ARR:wi,EMPTY_OBJ:et,NO:Ei,NOOP:Bt,PatchFlagNames:QE,PatchFlags:ZE,ShapeFlags:qE,SlotFlags:eb,camelize:mt,capitalize:fi,cssVarNameEscapeSymbolsRE:ym,def:gf,escapeHtml:Sb,escapeHtmlComment:wb,extend:Je,genCacheKey:cm,genPropsAccessExp:JE,generateCodeFrame:um,getEscapedCssVarName:Db,getGlobalThis:ko,hasChanged:rn,hasOwn:ot,hyphenate:on,includeBooleanAttr:Ef,invokeArrayFns:Oi,isArray:be,isBooleanAttr:db,isBuiltInDirective:lm,isDate:Tu,isFunction:Le,isGloballyAllowed:vf,isGloballyWhitelisted:rb,isHTMLTag:dm,isIntegerKey:Po,isKnownHtmlAttr:gb,isKnownMathMLAttr:yb,isKnownSvgAttr:vb,isMap:Di,isMathMLTag:pm,isModelListener:Vl,isObject:at,isOn:ci,isPlainObject:Ro,isPromise:jl,isRegExp:om,isRenderableAttrValue:Eb,isReservedProp:Pr,isSSRSafeAttrName:pb,isSVGTag:hm,isSet:ui,isSpecialBooleanAttr:vm,isString:Be,isSymbol:En,isVoidTag:mm,looseEqual:Br,looseIndexOf:Fo,looseToNumber:Lo,makeMap:Wt,normalizeClass:Ds,normalizeCssVarValue:Sm,normalizeProps:fm,normalizeStyle:ws,objectToString:mf,parseStringStyle:yf,propsToAttrMap:mb,remove:Bl,slotFlagsText:tb,stringifyStyle:ab,toDisplayString:bf,toHandlerKey:Ci,toNumber:po,toRawType:am,toTypeString:Hi},Symbol.toStringTag,{value:"Module"}));/** +* @vue/reactivity v3.5.25 +* (c) 2018-present Yuxi (Evan) You and Vue contributors +* @license MIT +**/let en;class Sf{constructor(t=!1){this.detached=t,this._active=!0,this._on=0,this.effects=[],this.cleanups=[],this._isPaused=!1,this.parent=en,!t&&en&&(this.index=(en.scopes||(en.scopes=[])).push(this)-1)}get active(){return this._active}pause(){if(this._active){this._isPaused=!0;let t,n;if(this.scopes)for(t=0,n=this.scopes.length;t0&&--this._on===0&&(en=this.prevScope,this.prevScope=void 0)}stop(t){if(this._active){this._active=!1;let n,r;for(n=0,r=this.effects.length;n0)return;if(eo){let t=eo;for(eo=void 0;t;){const n=t.next;t.next=void 0,t.flags&=-9,t=n}}let e;for(;qs;){let t=qs;for(qs=void 0;t;){const n=t.next;if(t.next=void 0,t.flags&=-9,t.flags&1)try{t.trigger()}catch(r){e||(e=r)}t=n}}if(e)throw e}function Cm(e){for(let t=e.deps;t;t=t.nextDep)t.version=-1,t.prevActiveLink=t.dep.activeLink,t.dep.activeLink=t}function Om(e){let t,n=e.depsTail,r=n;for(;r;){const i=r.prevDep;r.version===-1?(r===n&&(n=i),Df(r),Mb(r)):t=r,r.dep.activeLink=r.prevActiveLink,r.prevActiveLink=void 0,r=i}e.deps=t,e.depsTail=n}function wu(e){for(let t=e.deps;t;t=t.nextDep)if(t.dep.version!==t.version||t.dep.computed&&(Am(t.dep.computed)||t.dep.version!==t.version))return!0;return!!e._dirty}function Am(e){if(e.flags&4&&!(e.flags&16)||(e.flags&=-17,e.globalVersion===go)||(e.globalVersion=go,!e.isSSR&&e.flags&128&&(!e.deps&&!e._dirty||!wu(e))))return;e.flags|=2;const t=e.dep,n=pt,r=ar;pt=e,ar=!0;try{Cm(e);const i=e.fn(e._value);(t.version===0||rn(i,e._value))&&(e.flags|=128,e._value=i,t.version++)}catch(i){throw t.version++,i}finally{pt=n,ar=r,Om(e),e.flags&=-3}}function Df(e,t=!1){const{dep:n,prevSub:r,nextSub:i}=e;if(r&&(r.nextSub=i,e.prevSub=void 0),i&&(i.prevSub=r,e.nextSub=void 0),n.subs===e&&(n.subs=r,!r&&n.computed)){n.computed.flags&=-5;for(let s=n.computed.deps;s;s=s.nextDep)Df(s,!0)}!t&&!--n.sc&&n.map&&n.map.delete(n.key)}function Mb(e){const{prevDep:t,nextDep:n}=e;t&&(t.nextDep=n,e.prevDep=void 0),n&&(n.prevDep=t,e.nextDep=void 0)}function xb(e,t){e.effect instanceof mo&&(e=e.effect.fn);const n=new mo(e);t&&Je(n,t);try{n.run()}catch(i){throw n.stop(),i}const r=n.run.bind(n);return r.effect=n,r}function Nb(e){e.effect.stop()}let ar=!0;const _m=[];function jr(){_m.push(ar),ar=!1}function Hr(){const e=_m.pop();ar=e===void 0?!0:e}function Ud(e){const{cleanup:t}=e;if(e.cleanup=void 0,t){const n=pt;pt=void 0;try{t()}finally{pt=n}}}let go=0;class Ib{constructor(t,n){this.sub=t,this.dep=n,this.version=n.version,this.nextDep=this.prevDep=this.nextSub=this.prevSub=this.prevActiveLink=void 0}}class Ul{constructor(t){this.computed=t,this.version=0,this.activeLink=void 0,this.subs=void 0,this.map=void 0,this.key=void 0,this.sc=0,this.__v_skip=!0}track(t){if(!pt||!ar||pt===this.computed)return;let n=this.activeLink;if(n===void 0||n.sub!==pt)n=this.activeLink=new Ib(pt,this),pt.deps?(n.prevDep=pt.depsTail,pt.depsTail.nextDep=n,pt.depsTail=n):pt.deps=pt.depsTail=n,Mm(n);else if(n.version===-1&&(n.version=this.version,n.nextDep)){const r=n.nextDep;r.prevDep=n.prevDep,n.prevDep&&(n.prevDep.nextDep=r),n.prevDep=pt.depsTail,n.nextDep=void 0,pt.depsTail.nextDep=n,pt.depsTail=n,pt.deps===n&&(pt.deps=r)}return n}trigger(t){this.version++,go++,this.notify(t)}notify(t){Tf();try{for(let n=this.subs;n;n=n.prevSub)n.sub.notify()&&n.sub.dep.notify()}finally{wf()}}}function Mm(e){if(e.dep.sc++,e.sub.flags&4){const t=e.dep.computed;if(t&&!e.dep.subs){t.flags|=20;for(let r=t.deps;r;r=r.nextDep)Mm(r)}const n=e.dep.subs;n!==e&&(e.prevSub=n,n&&(n.nextSub=e)),e.dep.subs=e}}const il=new WeakMap,Ai=Symbol(""),Du=Symbol(""),vo=Symbol("");function sn(e,t,n){if(ar&&pt){let r=il.get(e);r||il.set(e,r=new Map);let i=r.get(n);i||(r.set(n,i=new Ul),i.map=r,i.key=n),i.track()}}function xr(e,t,n,r,i,s){const o=il.get(e);if(!o){go++;return}const a=l=>{l&&l.trigger()};if(Tf(),t==="clear")o.forEach(a);else{const l=be(e),c=l&&Po(n);if(l&&n==="length"){const u=Number(r);o.forEach((f,d)=>{(d==="length"||d===vo||!En(d)&&d>=u)&&a(f)})}else switch((n!==void 0||o.has(void 0))&&a(o.get(n)),c&&a(o.get(vo)),t){case"add":l?c&&a(o.get("length")):(a(o.get(Ai)),Di(e)&&a(o.get(Du)));break;case"delete":l||(a(o.get(Ai)),Di(e)&&a(o.get(Du)));break;case"set":Di(e)&&a(o.get(Ai));break}}wf()}function Rb(e,t){const n=il.get(e);return n&&n.get(t)}function Yi(e){const t=it(e);return t===e?t:(sn(t,"iterate",vo),Nn(e)?t:t.map(lr))}function $l(e){return sn(e=it(e),"iterate",vo),e}function Xr(e,t){return vr(e)?Lr(e)?us(lr(t)):us(t):lr(t)}const Pb={__proto__:null,[Symbol.iterator](){return kc(this,Symbol.iterator,e=>Xr(this,e))},concat(...e){return Yi(this).concat(...e.map(t=>be(t)?Yi(t):t))},entries(){return kc(this,"entries",e=>(e[1]=Xr(this,e[1]),e))},every(e,t){return wr(this,"every",e,t,void 0,arguments)},filter(e,t){return wr(this,"filter",e,t,n=>n.map(r=>Xr(this,r)),arguments)},find(e,t){return wr(this,"find",e,t,n=>Xr(this,n),arguments)},findIndex(e,t){return wr(this,"findIndex",e,t,void 0,arguments)},findLast(e,t){return wr(this,"findLast",e,t,n=>Xr(this,n),arguments)},findLastIndex(e,t){return wr(this,"findLastIndex",e,t,void 0,arguments)},forEach(e,t){return wr(this,"forEach",e,t,void 0,arguments)},includes(...e){return Fc(this,"includes",e)},indexOf(...e){return Fc(this,"indexOf",e)},join(e){return Yi(this).join(e)},lastIndexOf(...e){return Fc(this,"lastIndexOf",e)},map(e,t){return wr(this,"map",e,t,void 0,arguments)},pop(){return Ns(this,"pop")},push(...e){return Ns(this,"push",e)},reduce(e,...t){return $d(this,"reduce",e,t)},reduceRight(e,...t){return $d(this,"reduceRight",e,t)},shift(){return Ns(this,"shift")},some(e,t){return wr(this,"some",e,t,void 0,arguments)},splice(...e){return Ns(this,"splice",e)},toReversed(){return Yi(this).toReversed()},toSorted(e){return Yi(this).toSorted(e)},toSpliced(...e){return Yi(this).toSpliced(...e)},unshift(...e){return Ns(this,"unshift",e)},values(){return kc(this,"values",e=>Xr(this,e))}};function kc(e,t,n){const r=$l(e),i=r[t]();return r!==e&&!Nn(e)&&(i._next=i.next,i.next=()=>{const s=i._next();return s.done||(s.value=n(s.value)),s}),i}const Lb=Array.prototype;function wr(e,t,n,r,i,s){const o=$l(e),a=o!==e&&!Nn(e),l=o[t];if(l!==Lb[t]){const f=l.apply(e,s);return a?lr(f):f}let c=n;o!==e&&(a?c=function(f,d){return n.call(this,Xr(e,f),d,e)}:n.length>2&&(c=function(f,d){return n.call(this,f,d,e)}));const u=l.call(o,c,r);return a&&i?i(u):u}function $d(e,t,n,r){const i=$l(e);let s=n;return i!==e&&(Nn(e)?n.length>3&&(s=function(o,a,l){return n.call(this,o,a,l,e)}):s=function(o,a,l){return n.call(this,o,Xr(e,a),l,e)}),i[t](s,...r)}function Fc(e,t,n){const r=it(e);sn(r,"iterate",vo);const i=r[t](...n);return(i===-1||i===!1)&&Vo(n[0])?(n[0]=it(n[0]),r[t](...n)):i}function Ns(e,t,n=[]){jr(),Tf();const r=it(e)[t].apply(e,n);return wf(),Hr(),r}const kb=Wt("__proto__,__v_isRef,__isVue"),xm=new Set(Object.getOwnPropertyNames(Symbol).filter(e=>e!=="arguments"&&e!=="caller").map(e=>Symbol[e]).filter(En));function Fb(e){En(e)||(e=String(e));const t=it(this);return sn(t,"has",e),t.hasOwnProperty(e)}class Nm{constructor(t=!1,n=!1){this._isReadonly=t,this._isShallow=n}get(t,n,r){if(n==="__v_skip")return t.__v_skip;const i=this._isReadonly,s=this._isShallow;if(n==="__v_isReactive")return!i;if(n==="__v_isReadonly")return i;if(n==="__v_isShallow")return s;if(n==="__v_raw")return r===(i?s?Fm:km:s?Lm:Pm).get(t)||Object.getPrototypeOf(t)===Object.getPrototypeOf(r)?t:void 0;const o=be(t);if(!i){let l;if(o&&(l=Pb[n]))return l;if(n==="hasOwnProperty")return Fb}const a=Reflect.get(t,n,jt(t)?t:r);if((En(n)?xm.has(n):kb(n))||(i||sn(t,"get",n),s))return a;if(jt(a)){const l=o&&Po(n)?a:a.value;return i&&at(l)?sl(l):l}return at(a)?i?sl(a):Yl(a):a}}class Im extends Nm{constructor(t=!1){super(!1,t)}set(t,n,r,i){let s=t[n];const o=be(t)&&Po(n);if(!this._isShallow){const c=vr(s);if(!Nn(r)&&!vr(r)&&(s=it(s),r=it(r)),!o&&jt(s)&&!jt(r))return c||(s.value=r),!0}const a=o?Number(n)e,oa=e=>Reflect.getPrototypeOf(e);function Ub(e,t,n){return function(...r){const i=this.__v_raw,s=it(i),o=Di(s),a=e==="entries"||e===Symbol.iterator&&o,l=e==="keys"&&o,c=i[e](...r),u=n?Cu:t?us:lr;return!t&&sn(s,"iterate",l?Du:Ai),{next(){const{value:f,done:d}=c.next();return d?{value:f,done:d}:{value:a?[u(f[0]),u(f[1])]:u(f),done:d}},[Symbol.iterator](){return this}}}}function aa(e){return function(...t){return e==="delete"?!1:e==="clear"?void 0:this}}function $b(e,t){const n={get(i){const s=this.__v_raw,o=it(s),a=it(i);e||(rn(i,a)&&sn(o,"get",i),sn(o,"get",a));const{has:l}=oa(o),c=t?Cu:e?us:lr;if(l.call(o,i))return c(s.get(i));if(l.call(o,a))return c(s.get(a));s!==o&&s.get(i)},get size(){const i=this.__v_raw;return!e&&sn(it(i),"iterate",Ai),i.size},has(i){const s=this.__v_raw,o=it(s),a=it(i);return e||(rn(i,a)&&sn(o,"has",i),sn(o,"has",a)),i===a?s.has(i):s.has(i)||s.has(a)},forEach(i,s){const o=this,a=o.__v_raw,l=it(a),c=t?Cu:e?us:lr;return!e&&sn(l,"iterate",Ai),a.forEach((u,f)=>i.call(s,c(u),c(f),o))}};return Je(n,e?{add:aa("add"),set:aa("set"),delete:aa("delete"),clear:aa("clear")}:{add(i){!t&&!Nn(i)&&!vr(i)&&(i=it(i));const s=it(this);return oa(s).has.call(s,i)||(s.add(i),xr(s,"add",i,i)),this},set(i,s){!t&&!Nn(s)&&!vr(s)&&(s=it(s));const o=it(this),{has:a,get:l}=oa(o);let c=a.call(o,i);c||(i=it(i),c=a.call(o,i));const u=l.call(o,i);return o.set(i,s),c?rn(s,u)&&xr(o,"set",i,s):xr(o,"add",i,s),this},delete(i){const s=it(this),{has:o,get:a}=oa(s);let l=o.call(s,i);l||(i=it(i),l=o.call(s,i)),a&&a.call(s,i);const c=s.delete(i);return l&&xr(s,"delete",i,void 0),c},clear(){const i=it(this),s=i.size!==0,o=i.clear();return s&&xr(i,"clear",void 0,void 0),o}}),["keys","values","entries",Symbol.iterator].forEach(i=>{n[i]=Ub(i,e,t)}),n}function Wl(e,t){const n=$b(e,t);return(r,i,s)=>i==="__v_isReactive"?!e:i==="__v_isReadonly"?e:i==="__v_raw"?r:Reflect.get(ot(n,i)&&i in r?n:r,i,s)}const Wb={get:Wl(!1,!1)},Yb={get:Wl(!1,!0)},zb={get:Wl(!0,!1)},Kb={get:Wl(!0,!0)},Pm=new WeakMap,Lm=new WeakMap,km=new WeakMap,Fm=new WeakMap;function Gb(e){switch(e){case"Object":case"Array":return 1;case"Map":case"Set":case"WeakMap":case"WeakSet":return 2;default:return 0}}function Xb(e){return e.__v_skip||!Object.isExtensible(e)?0:Gb(am(e))}function Yl(e){return vr(e)?e:zl(e,!1,Vb,Wb,Pm)}function Vm(e){return zl(e,!1,jb,Yb,Lm)}function sl(e){return zl(e,!0,Bb,zb,km)}function Jb(e){return zl(e,!0,Hb,Kb,Fm)}function zl(e,t,n,r,i){if(!at(e)||e.__v_raw&&!(t&&e.__v_isReactive))return e;const s=Xb(e);if(s===0)return e;const o=i.get(e);if(o)return o;const a=new Proxy(e,s===2?r:n);return i.set(e,a),a}function Lr(e){return vr(e)?Lr(e.__v_raw):!!(e&&e.__v_isReactive)}function vr(e){return!!(e&&e.__v_isReadonly)}function Nn(e){return!!(e&&e.__v_isShallow)}function Vo(e){return e?!!e.__v_raw:!1}function it(e){const t=e&&e.__v_raw;return t?it(t):e}function Bm(e){return!ot(e,"__v_skip")&&Object.isExtensible(e)&&gf(e,"__v_skip",!0),e}const lr=e=>at(e)?Yl(e):e,us=e=>at(e)?sl(e):e;function jt(e){return e?e.__v_isRef===!0:!1}function to(e){return Hm(e,!1)}function jm(e){return Hm(e,!0)}function Hm(e,t){return jt(e)?e:new Zb(e,t)}class Zb{constructor(t,n){this.dep=new Ul,this.__v_isRef=!0,this.__v_isShallow=!1,this._rawValue=n?t:it(t),this._value=n?t:lr(t),this.__v_isShallow=n}get value(){return this.dep.track(),this._value}set value(t){const n=this._rawValue,r=this.__v_isShallow||Nn(t)||vr(t);t=r?t:it(t),rn(t,n)&&(this._rawValue=t,this._value=r?t:lr(t),this.dep.trigger())}}function Qb(e){e.dep&&e.dep.trigger()}function Bo(e){return jt(e)?e.value:e}function qb(e){return Le(e)?e():Bo(e)}const eS={get:(e,t,n)=>t==="__v_raw"?e:Bo(Reflect.get(e,t,n)),set:(e,t,n,r)=>{const i=e[t];return jt(i)&&!jt(n)?(i.value=n,!0):Reflect.set(e,t,n,r)}};function Cf(e){return Lr(e)?e:new Proxy(e,eS)}class tS{constructor(t){this.__v_isRef=!0,this._value=void 0;const n=this.dep=new Ul,{get:r,set:i}=t(n.track.bind(n),n.trigger.bind(n));this._get=r,this._set=i}get value(){return this._value=this._get()}set value(t){this._set(t)}}function Um(e){return new tS(e)}function nS(e){const t=be(e)?new Array(e.length):{};for(const n in e)t[n]=$m(e,n);return t}class rS{constructor(t,n,r){this._object=t,this._key=n,this._defaultValue=r,this.__v_isRef=!0,this._value=void 0,this._raw=it(t);let i=!0,s=t;if(!be(t)||!Po(String(n)))do i=!Vo(s)||Nn(s);while(i&&(s=s.__v_raw));this._shallow=i}get value(){let t=this._object[this._key];return this._shallow&&(t=Bo(t)),this._value=t===void 0?this._defaultValue:t}set value(t){if(this._shallow&&jt(this._raw[this._key])){const n=this._object[this._key];if(jt(n)){n.value=t;return}}this._object[this._key]=t}get dep(){return Rb(this._raw,this._key)}}class iS{constructor(t){this._getter=t,this.__v_isRef=!0,this.__v_isReadonly=!0,this._value=void 0}get value(){return this._value=this._getter()}}function sS(e,t,n){return jt(e)?e:Le(e)?new iS(e):at(e)&&arguments.length>1?$m(e,t,n):to(e)}function $m(e,t,n){return new rS(e,t,n)}class oS{constructor(t,n,r){this.fn=t,this.setter=n,this._value=void 0,this.dep=new Ul(this),this.__v_isRef=!0,this.deps=void 0,this.depsTail=void 0,this.flags=16,this.globalVersion=go-1,this.next=void 0,this.effect=this,this.__v_isReadonly=!n,this.isSSR=r}notify(){if(this.flags|=16,!(this.flags&8)&&pt!==this)return Dm(this,!0),!0}get value(){const t=this.dep.track();return Am(this),t&&(t.version=this.dep.version),this._value}set value(t){this.setter&&this.setter(t)}}function aS(e,t,n=!1){let r,i;return Le(e)?r=e:(r=e.get,i=e.set),new oS(r,i,n)}const lS={GET:"get",HAS:"has",ITERATE:"iterate"},cS={SET:"set",ADD:"add",DELETE:"delete",CLEAR:"clear"},la={},ol=new WeakMap;let Jr;function uS(){return Jr}function Wm(e,t=!1,n=Jr){if(n){let r=ol.get(n);r||ol.set(n,r=[]),r.push(e)}}function fS(e,t,n=et){const{immediate:r,deep:i,once:s,scheduler:o,augmentJob:a,call:l}=n,c=y=>i?y:Nn(y)||i===!1||i===0?Nr(y,1):Nr(y);let u,f,d,m,p=!1,g=!1;if(jt(e)?(f=()=>e.value,p=Nn(e)):Lr(e)?(f=()=>c(e),p=!0):be(e)?(g=!0,p=e.some(y=>Lr(y)||Nn(y)),f=()=>e.map(y=>{if(jt(y))return y.value;if(Lr(y))return c(y);if(Le(y))return l?l(y,2):y()})):Le(e)?t?f=l?()=>l(e,2):e:f=()=>{if(d){jr();try{d()}finally{Hr()}}const y=Jr;Jr=u;try{return l?l(e,3,[m]):e(m)}finally{Jr=y}}:f=Bt,t&&i){const y=f,O=i===!0?1/0:i;f=()=>Nr(y(),O)}const v=Tm(),T=()=>{u.stop(),v&&v.active&&Bl(v.effects,u)};if(s&&t){const y=t;t=(...O)=>{y(...O),T()}}let S=g?new Array(e.length).fill(la):la;const E=y=>{if(!(!(u.flags&1)||!u.dirty&&!y))if(t){const O=u.run();if(i||p||(g?O.some((M,V)=>rn(M,S[V])):rn(O,S))){d&&d();const M=Jr;Jr=u;try{const V=[O,S===la?void 0:g&&S[0]===la?[]:S,m];S=O,l?l(t,3,V):t(...V)}finally{Jr=M}}}else u.run()};return a&&a(E),u=new mo(f),u.scheduler=o?()=>o(E,!1):E,m=y=>Wm(y,!1,u),d=u.onStop=()=>{const y=ol.get(u);if(y){if(l)l(y,4);else for(const O of y)O();ol.delete(u)}},t?r?E(!0):S=u.run():o?o(E.bind(null,!0),!0):u.run(),T.pause=u.pause.bind(u),T.resume=u.resume.bind(u),T.stop=T,T}function Nr(e,t=1/0,n){if(t<=0||!at(e)||e.__v_skip||(n=n||new Map,(n.get(e)||0)>=t))return e;if(n.set(e,t),t--,jt(e))Nr(e.value,t,n);else if(be(e))for(let r=0;r{Nr(r,t,n)});else if(Ro(e)){for(const r in e)Nr(e[r],t,n);for(const r of Object.getOwnPropertySymbols(e))Object.prototype.propertyIsEnumerable.call(e,r)&&Nr(e[r],t,n)}return e}/** +* @vue/runtime-core v3.5.25 +* (c) 2018-present Yuxi (Evan) You and Vue contributors +* @license MIT +**/const Ym=[];function dS(e){Ym.push(e)}function hS(){Ym.pop()}function pS(e,t){}const mS={SETUP_FUNCTION:0,0:"SETUP_FUNCTION",RENDER_FUNCTION:1,1:"RENDER_FUNCTION",NATIVE_EVENT_HANDLER:5,5:"NATIVE_EVENT_HANDLER",COMPONENT_EVENT_HANDLER:6,6:"COMPONENT_EVENT_HANDLER",VNODE_HOOK:7,7:"VNODE_HOOK",DIRECTIVE_HOOK:8,8:"DIRECTIVE_HOOK",TRANSITION_HOOK:9,9:"TRANSITION_HOOK",APP_ERROR_HANDLER:10,10:"APP_ERROR_HANDLER",APP_WARN_HANDLER:11,11:"APP_WARN_HANDLER",FUNCTION_REF:12,12:"FUNCTION_REF",ASYNC_COMPONENT_LOADER:13,13:"ASYNC_COMPONENT_LOADER",SCHEDULER:14,14:"SCHEDULER",COMPONENT_UPDATE:15,15:"COMPONENT_UPDATE",APP_UNMOUNT_CLEANUP:16,16:"APP_UNMOUNT_CLEANUP"},gS={sp:"serverPrefetch hook",bc:"beforeCreate hook",c:"created hook",bm:"beforeMount hook",m:"mounted hook",bu:"beforeUpdate hook",u:"updated",bum:"beforeUnmount hook",um:"unmounted hook",a:"activated hook",da:"deactivated hook",ec:"errorCaptured hook",rtc:"renderTracked hook",rtg:"renderTriggered hook",0:"setup function",1:"render function",2:"watcher getter",3:"watcher callback",4:"watcher cleanup function",5:"native event handler",6:"component event handler",7:"vnode hook",8:"directive hook",9:"transition hook",10:"app errorHandler",11:"app warnHandler",12:"ref function",13:"async component loader",14:"scheduler flush",15:"component update",16:"app unmount cleanup function"};function Cs(e,t,n,r){try{return r?e(...r):e()}catch(i){Ui(i,t,n)}}function Xn(e,t,n,r){if(Le(e)){const i=Cs(e,t,n,r);return i&&jl(i)&&i.catch(s=>{Ui(s,t,n)}),i}if(be(e)){const i=[];for(let s=0;s>>1,i=mn[r],s=Eo(i);s=Eo(n)?mn.push(e):mn.splice(yS(t),0,e),e.flags|=1,Km()}}function Km(){al||(al=zm.then(Gm))}function yo(e){be(e)?rs.push(...e):Zr&&e.id===-1?Zr.splice(Qi+1,0,e):e.flags&1||(rs.push(e),e.flags|=1),Km()}function Wd(e,t,n=hr+1){for(;nEo(n)-Eo(r));if(rs.length=0,Zr){Zr.push(...t);return}for(Zr=t,Qi=0;Qie.id==null?e.flags&2?-1:1/0:e.id;function Gm(e){try{for(hr=0;hrqi.emit(i,...s)),ca=[]):typeof window<"u"&&window.HTMLElement&&!((r=(n=window.navigator)==null?void 0:n.userAgent)!=null&&r.includes("jsdom"))?((t.__VUE_DEVTOOLS_HOOK_REPLAY__=t.__VUE_DEVTOOLS_HOOK_REPLAY__||[]).push(s=>{Xm(s,t)}),setTimeout(()=>{qi||(t.__VUE_DEVTOOLS_HOOK_REPLAY__=null,ca=[])},3e3)):ca=[]}let Xt=null,Gl=null;function bo(e){const t=Xt;return Xt=e,Gl=e&&e.type.__scopeId||null,t}function ES(e){Gl=e}function bS(){Gl=null}const SS=e=>Af;function Af(e,t=Xt,n){if(!t||e._n)return e;const r=(...i)=>{r._d&&Do(-1);const s=bo(t);let o;try{o=e(...i)}finally{bo(s),r._d&&Do(1)}return o};return r._n=!0,r._c=!0,r._d=!0,r}function TS(e,t){if(Xt===null)return e;const n=$o(Xt),r=e.dirs||(e.dirs=[]);for(let i=0;ie.__isTeleport,no=e=>e&&(e.disabled||e.disabled===""),Yd=e=>e&&(e.defer||e.defer===""),zd=e=>typeof SVGElement<"u"&&e instanceof SVGElement,Kd=e=>typeof MathMLElement=="function"&&e instanceof MathMLElement,Ou=(e,t)=>{const n=e&&e.to;return Be(n)?t?t(n):null:n},Qm={name:"Teleport",__isTeleport:!0,process(e,t,n,r,i,s,o,a,l,c){const{mc:u,pc:f,pbc:d,o:{insert:m,querySelector:p,createText:g,createComment:v}}=c,T=no(t.props);let{shapeFlag:S,children:E,dynamicChildren:y}=t;if(e==null){const O=t.el=g(""),M=t.anchor=g("");m(O,n,r),m(M,n,r);const V=(D,x)=>{S&16&&u(E,D,x,i,s,o,a,l)},j=()=>{const D=t.target=Ou(t.props,p),x=qm(D,t,g,m);D&&(o!=="svg"&&zd(D)?o="svg":o!=="mathml"&&Kd(D)&&(o="mathml"),i&&i.isCE&&(i.ce._teleportTargets||(i.ce._teleportTargets=new Set)).add(D),T||(V(D,x),Fa(t,!1)))};T&&(V(n,M),Fa(t,!0)),Yd(t.props)?(t.el.__isMounted=!1,kt(()=>{j(),delete t.el.__isMounted},s)):j()}else{if(Yd(t.props)&&e.el.__isMounted===!1){kt(()=>{Qm.process(e,t,n,r,i,s,o,a,l,c)},s);return}t.el=e.el,t.targetStart=e.targetStart;const O=t.anchor=e.anchor,M=t.target=e.target,V=t.targetAnchor=e.targetAnchor,j=no(e.props),D=j?n:M,x=j?O:V;if(o==="svg"||zd(M)?o="svg":(o==="mathml"||Kd(M))&&(o="mathml"),y?(d(e.dynamicChildren,y,D,i,s,o,a),Bf(e,t,!0)):l||f(e,t,D,x,i,s,o,a,!1),T)j?t.props&&e.props&&t.props.to!==e.props.to&&(t.props.to=e.props.to):ua(t,n,O,c,1);else if((t.props&&t.props.to)!==(e.props&&e.props.to)){const L=t.target=Ou(t.props,p);L&&ua(t,L,null,c,0)}else j&&ua(t,M,V,c,1);Fa(t,T)}},remove(e,t,n,{um:r,o:{remove:i}},s){const{shapeFlag:o,children:a,anchor:l,targetStart:c,targetAnchor:u,target:f,props:d}=e;if(f&&(i(c),i(u)),s&&i(l),o&16){const m=s||!no(d);for(let p=0;p{e.isMounted=!0}),Ql(()=>{e.isUnmounting=!0}),e}const $n=[Function,Array],Mf={mode:String,appear:Boolean,persisted:Boolean,onBeforeEnter:$n,onEnter:$n,onAfterEnter:$n,onEnterCancelled:$n,onBeforeLeave:$n,onLeave:$n,onAfterLeave:$n,onLeaveCancelled:$n,onBeforeAppear:$n,onAppear:$n,onAfterAppear:$n,onAppearCancelled:$n},eg=e=>{const t=e.subTree;return t.component?eg(t.component):t},CS={name:"BaseTransition",props:Mf,setup(e,{slots:t}){const n=Pn(),r=_f();return()=>{const i=t.default&&Xl(t.default(),!0);if(!i||!i.length)return;const s=tg(i),o=it(e),{mode:a}=o;if(r.isLeaving)return Vc(s);const l=Gd(s);if(!l)return Vc(s);let c=fs(l,o,r,n,f=>c=f);l.type!==It&&Ur(l,c);let u=n.subTree&&Gd(n.subTree);if(u&&u.type!==It&&!sr(u,l)&&eg(n).type!==It){let f=fs(u,o,r,n);if(Ur(u,f),a==="out-in"&&l.type!==It)return r.isLeaving=!0,f.afterLeave=()=>{r.isLeaving=!1,n.job.flags&8||n.update(),delete f.afterLeave,u=void 0},Vc(s);a==="in-out"&&l.type!==It?f.delayLeave=(d,m,p)=>{const g=rg(r,u);g[String(u.key)]=u,d[Mr]=()=>{m(),d[Mr]=void 0,delete c.delayedLeave,u=void 0},c.delayedLeave=()=>{p(),delete c.delayedLeave,u=void 0}}:u=void 0}else u&&(u=void 0);return s}}};function tg(e){let t=e[0];if(e.length>1){for(const n of e)if(n.type!==It){t=n;break}}return t}const ng=CS;function rg(e,t){const{leavingVNodes:n}=e;let r=n.get(t.type);return r||(r=Object.create(null),n.set(t.type,r)),r}function fs(e,t,n,r,i){const{appear:s,mode:o,persisted:a=!1,onBeforeEnter:l,onEnter:c,onAfterEnter:u,onEnterCancelled:f,onBeforeLeave:d,onLeave:m,onAfterLeave:p,onLeaveCancelled:g,onBeforeAppear:v,onAppear:T,onAfterAppear:S,onAppearCancelled:E}=t,y=String(e.key),O=rg(n,e),M=(D,x)=>{D&&Xn(D,r,9,x)},V=(D,x)=>{const L=x[1];M(D,x),be(D)?D.every(P=>P.length<=1)&&L():D.length<=1&&L()},j={mode:o,persisted:a,beforeEnter(D){let x=l;if(!n.isMounted)if(s)x=v||l;else return;D[Mr]&&D[Mr](!0);const L=O[y];L&&sr(e,L)&&L.el[Mr]&&L.el[Mr](),M(x,[D])},enter(D){let x=c,L=u,P=f;if(!n.isMounted)if(s)x=T||c,L=S||u,P=E||f;else return;let k=!1;const $=D[fa]=q=>{k||(k=!0,q?M(P,[D]):M(L,[D]),j.delayedLeave&&j.delayedLeave(),D[fa]=void 0)};x?V(x,[D,$]):$()},leave(D,x){const L=String(e.key);if(D[fa]&&D[fa](!0),n.isUnmounting)return x();M(d,[D]);let P=!1;const k=D[Mr]=$=>{P||(P=!0,x(),$?M(g,[D]):M(p,[D]),D[Mr]=void 0,O[L]===e&&delete O[L])};O[L]=e,m?V(m,[D,k]):k()},clone(D){const x=fs(D,t,n,r,i);return i&&i(x),x}};return j}function Vc(e){if(jo(e))return e=yr(e),e.children=null,e}function Gd(e){if(!jo(e))return Zm(e.type)&&e.children?tg(e.children):e;if(e.component)return e.component.subTree;const{shapeFlag:t,children:n}=e;if(n){if(t&16)return n[0];if(t&32&&Le(n.default))return n.default()}}function Ur(e,t){e.shapeFlag&6&&e.component?(e.transition=t,Ur(e.component.subTree,t)):e.shapeFlag&128?(e.ssContent.transition=t.clone(e.ssContent),e.ssFallback.transition=t.clone(e.ssFallback)):e.transition=t}function Xl(e,t=!1,n){let r=[],i=0;for(let s=0;s1)for(let s=0;sn.value,set:s=>n.value=s})}return n}const cl=new WeakMap;function is(e,t,n,r,i=!1){if(be(e)){e.forEach((p,g)=>is(p,t&&(be(t)?t[g]:t),n,r,i));return}if(ii(r)&&!i){r.shapeFlag&512&&r.type.__asyncResolved&&r.component.subTree.component&&is(e,t,n,r.component.subTree);return}const s=r.shapeFlag&4?$o(r.component):r.el,o=i?null:s,{i:a,r:l}=e,c=t&&t.r,u=a.refs===et?a.refs={}:a.refs,f=a.setupState,d=it(f),m=f===et?Ei:p=>ot(d,p);if(c!=null&&c!==l){if(Xd(t),Be(c))u[c]=null,m(c)&&(f[c]=null);else if(jt(c)){c.value=null;const p=t;p.k&&(u[p.k]=null)}}if(Le(l))Cs(l,a,12,[o,u]);else{const p=Be(l),g=jt(l);if(p||g){const v=()=>{if(e.f){const T=p?m(l)?f[l]:u[l]:l.value;if(i)be(T)&&Bl(T,s);else if(be(T))T.includes(s)||T.push(s);else if(p)u[l]=[s],m(l)&&(f[l]=u[l]);else{const S=[s];l.value=S,e.k&&(u[e.k]=S)}}else p?(u[l]=o,m(l)&&(f[l]=o)):g&&(l.value=o,e.k&&(u[e.k]=o))};if(o){const T=()=>{v(),cl.delete(e)};T.id=-1,cl.set(e,T),kt(T,n)}else Xd(e),v()}}}function Xd(e){const t=cl.get(e);t&&(t.flags|=8,cl.delete(e))}let Jd=!1;const zi=()=>{Jd||(console.error("Hydration completed but contains mismatches."),Jd=!0)},_S=e=>e.namespaceURI.includes("svg")&&e.tagName!=="foreignObject",MS=e=>e.namespaceURI.includes("MathML"),da=e=>{if(e.nodeType===1){if(_S(e))return"svg";if(MS(e))return"mathml"}},ts=e=>e.nodeType===8;function xS(e){const{mt:t,p:n,o:{patchProp:r,createText:i,nextSibling:s,parentNode:o,remove:a,insert:l,createComment:c}}=e,u=(E,y)=>{if(!y.hasChildNodes()){n(null,E,y),ll(),y._vnode=E;return}f(y.firstChild,E,null,null,null),ll(),y._vnode=E},f=(E,y,O,M,V,j=!1)=>{j=j||!!y.dynamicChildren;const D=ts(E)&&E.data==="[",x=()=>g(E,y,O,M,V,D),{type:L,ref:P,shapeFlag:k,patchFlag:$}=y;let q=E.nodeType;y.el=E,$===-2&&(j=!1,y.dynamicChildren=null);let U=null;switch(L){case si:q!==3?y.children===""?(l(y.el=i(""),o(E),E),U=E):U=x():(E.data!==y.children&&(zi(),E.data=y.children),U=s(E));break;case It:S(E)?(U=s(E),T(y.el=E.content.firstChild,E,O)):q!==8||D?U=x():U=s(E);break;case Mi:if(D&&(E=s(E),q=E.nodeType),q===1||q===3){U=E;const W=!y.children.length;for(let J=0;J{j=j||!!y.dynamicChildren;const{type:D,props:x,patchFlag:L,shapeFlag:P,dirs:k,transition:$}=y,q=D==="input"||D==="option";if(q||L!==-1){k&&pr(y,null,O,"created");let U=!1;if(S(E)){U=Lg(null,$)&&O&&O.vnode.props&&O.vnode.props.appear;const J=E.content.firstChild;if(U){const Se=J.getAttribute("class");Se&&(J.$cls=Se),$.beforeEnter(J)}T(J,E,O),y.el=E=J}if(P&16&&!(x&&(x.innerHTML||x.textContent))){let J=m(E.firstChild,y,E,O,M,V,j);for(;J;){ha(E,1)||zi();const Se=J;J=J.nextSibling,a(Se)}}else if(P&8){let J=y.children;J[0]===` +`&&(E.tagName==="PRE"||E.tagName==="TEXTAREA")&&(J=J.slice(1));const{textContent:Se}=E;Se!==J&&Se!==J.replace(/\r\n|\r/g,` +`)&&(ha(E,0)||zi(),E.textContent=y.children)}if(x){if(q||!j||L&48){const J=E.tagName.includes("-");for(const Se in x)(q&&(Se.endsWith("value")||Se==="indeterminate")||ci(Se)&&!Pr(Se)||Se[0]==="."||J)&&r(E,Se,null,x[Se],void 0,O)}else if(x.onClick)r(E,"onClick",null,x.onClick,void 0,O);else if(L&4&&Lr(x.style))for(const J in x.style)x.style[J]}let W;(W=x&&x.onVnodeBeforeMount)&&On(W,O,y),k&&pr(y,null,O,"beforeMount"),((W=x&&x.onVnodeMounted)||k||U)&&Vg(()=>{W&&On(W,O,y),U&&$.enter(E),k&&pr(y,null,O,"mounted")},M)}return E.nextSibling},m=(E,y,O,M,V,j,D)=>{D=D||!!y.dynamicChildren;const x=y.children,L=x.length;for(let P=0;P{const{slotScopeIds:D}=y;D&&(V=V?V.concat(D):D);const x=o(E),L=m(s(E),y,x,O,M,V,j);return L&&ts(L)&&L.data==="]"?s(y.anchor=L):(zi(),l(y.anchor=c("]"),x,L),L)},g=(E,y,O,M,V,j)=>{if(ha(E.parentElement,1)||zi(),y.el=null,j){const L=v(E);for(;;){const P=s(E);if(P&&P!==L)a(P);else break}}const D=s(E),x=o(E);return a(E),n(null,y,x,D,O,M,da(x),V),O&&(O.vnode.el=y.el,tc(O,y.el)),D},v=(E,y="[",O="]")=>{let M=0;for(;E;)if(E=s(E),E&&ts(E)&&(E.data===y&&M++,E.data===O)){if(M===0)return s(E);M--}return E},T=(E,y,O)=>{const M=y.parentNode;M&&M.replaceChild(E,y);let V=O;for(;V;)V.vnode.el===y&&(V.vnode.el=V.subTree.el=E),V=V.parent},S=E=>E.nodeType===1&&E.tagName==="TEMPLATE";return[u,f]}const Zd="data-allow-mismatch",NS={0:"text",1:"children",2:"class",3:"style",4:"attribute"};function ha(e,t){if(t===0||t===1)for(;e&&!e.hasAttribute(Zd);)e=e.parentElement;const n=e&&e.getAttribute(Zd);if(n==null)return!1;if(n==="")return!0;{const r=n.split(",");return t===0&&r.includes("children")?!0:r.includes(NS[t])}}const IS=ko().requestIdleCallback||(e=>setTimeout(e,1)),RS=ko().cancelIdleCallback||(e=>clearTimeout(e)),PS=(e=1e4)=>t=>{const n=IS(t,{timeout:e});return()=>RS(n)};function LS(e){const{top:t,left:n,bottom:r,right:i}=e.getBoundingClientRect(),{innerHeight:s,innerWidth:o}=window;return(t>0&&t0&&r0&&n0&&i(t,n)=>{const r=new IntersectionObserver(i=>{for(const s of i)if(s.isIntersecting){r.disconnect(),t();break}},e);return n(i=>{if(i instanceof Element){if(LS(i))return t(),r.disconnect(),!1;r.observe(i)}}),()=>r.disconnect()},FS=e=>t=>{if(e){const n=matchMedia(e);if(n.matches)t();else return n.addEventListener("change",t,{once:!0}),()=>n.removeEventListener("change",t)}},VS=(e=[])=>(t,n)=>{Be(e)&&(e=[e]);let r=!1;const i=o=>{r||(r=!0,s(),t(),o.target.dispatchEvent(new o.constructor(o.type,o)))},s=()=>{n(o=>{for(const a of e)o.removeEventListener(a,i)})};return n(o=>{for(const a of e)o.addEventListener(a,i,{once:!0})}),s};function BS(e,t){if(ts(e)&&e.data==="["){let n=1,r=e.nextSibling;for(;r;){if(r.nodeType===1){if(t(r)===!1)break}else if(ts(r))if(r.data==="]"){if(--n===0)break}else r.data==="["&&n++;r=r.nextSibling}}else t(e)}const ii=e=>!!e.type.__asyncLoader;function jS(e){Le(e)&&(e={loader:e});const{loader:t,loadingComponent:n,errorComponent:r,delay:i=200,hydrate:s,timeout:o,suspensible:a=!0,onError:l}=e;let c=null,u,f=0;const d=()=>(f++,c=null,m()),m=()=>{let p;return c||(p=c=t().catch(g=>{if(g=g instanceof Error?g:new Error(String(g)),l)return new Promise((v,T)=>{l(g,()=>v(d()),()=>T(g),f+1)});throw g}).then(g=>p!==c&&c?c:(g&&(g.__esModule||g[Symbol.toStringTag]==="Module")&&(g=g.default),u=g,g)))};return xf({name:"AsyncComponentWrapper",__asyncLoader:m,__asyncHydrate(p,g,v){let T=!1;(g.bu||(g.bu=[])).push(()=>T=!0);const S=()=>{T||v()},E=s?()=>{const y=s(S,O=>BS(p,O));y&&(g.bum||(g.bum=[])).push(y)}:S;u?E():m().then(()=>!g.isUnmounted&&E())},get __asyncResolved(){return u},setup(){const p=Gt;if(Nf(p),u)return()=>pa(u,p);const g=E=>{c=null,Ui(E,p,13,!r)};if(a&&p.suspense||ds)return m().then(E=>()=>pa(E,p)).catch(E=>(g(E),()=>r?St(r,{error:E}):null));const v=to(!1),T=to(),S=to(!!i);return i&&setTimeout(()=>{S.value=!1},i),o!=null&&setTimeout(()=>{if(!v.value&&!T.value){const E=new Error(`Async component timed out after ${o}ms.`);g(E),T.value=E}},o),m().then(()=>{v.value=!0,p.parent&&jo(p.parent.vnode)&&p.parent.update()}).catch(E=>{g(E),T.value=E}),()=>{if(v.value&&u)return pa(u,p);if(T.value&&r)return St(r,{error:T.value});if(n&&!S.value)return pa(n,p)}}})}function pa(e,t){const{ref:n,props:r,children:i,ce:s}=t.vnode,o=St(e,r,i);return o.ref=n,o.ce=s,delete t.vnode.ce,o}const jo=e=>e.type.__isKeepAlive,HS={name:"KeepAlive",__isKeepAlive:!0,props:{include:[String,RegExp,Array],exclude:[String,RegExp,Array],max:[String,Number]},setup(e,{slots:t}){const n=Pn(),r=n.ctx;if(!r.renderer)return()=>{const S=t.default&&t.default();return S&&S.length===1?S[0]:S};const i=new Map,s=new Set;let o=null;const a=n.suspense,{renderer:{p:l,m:c,um:u,o:{createElement:f}}}=r,d=f("div");r.activate=(S,E,y,O,M)=>{const V=S.component;c(S,E,y,0,a),l(V.vnode,S,E,y,V,a,O,S.slotScopeIds,M),kt(()=>{V.isDeactivated=!1,V.a&&Oi(V.a);const j=S.props&&S.props.onVnodeMounted;j&&On(j,V.parent,S)},a)},r.deactivate=S=>{const E=S.component;fl(E.m),fl(E.a),c(S,d,null,1,a),kt(()=>{E.da&&Oi(E.da);const y=S.props&&S.props.onVnodeUnmounted;y&&On(y,E.parent,S),E.isDeactivated=!0},a)};function m(S){Bc(S),u(S,n,a,!0)}function p(S){i.forEach((E,y)=>{const O=Fu(E.type);O&&!S(O)&&g(y)})}function g(S){const E=i.get(S);E&&(!o||!sr(E,o))?m(E):o&&Bc(o),i.delete(S),s.delete(S)}ss(()=>[e.include,e.exclude],([S,E])=>{S&&p(y=>zs(S,y)),E&&p(y=>!zs(E,y))},{flush:"post",deep:!0});let v=null;const T=()=>{v!=null&&(dl(n.subTree.type)?kt(()=>{i.set(v,ma(n.subTree))},n.subTree.suspense):i.set(v,ma(n.subTree)))};return Ho(T),Zl(T),Ql(()=>{i.forEach(S=>{const{subTree:E,suspense:y}=n,O=ma(E);if(S.type===O.type&&S.key===O.key){Bc(O);const M=O.component.da;M&&kt(M,y);return}m(S)})}),()=>{if(v=null,!t.default)return o=null;const S=t.default(),E=S[0];if(S.length>1)return o=null,S;if(!$r(E)||!(E.shapeFlag&4)&&!(E.shapeFlag&128))return o=null,E;let y=ma(E);if(y.type===It)return o=null,y;const O=y.type,M=Fu(ii(y)?y.type.__asyncResolved||{}:O),{include:V,exclude:j,max:D}=e;if(V&&(!M||!zs(V,M))||j&&M&&zs(j,M))return y.shapeFlag&=-257,o=y,E;const x=y.key==null?O:y.key,L=i.get(x);return y.el&&(y=yr(y),E.shapeFlag&128&&(E.ssContent=y)),v=x,L?(y.el=L.el,y.component=L.component,y.transition&&Ur(y,y.transition),y.shapeFlag|=512,s.delete(x),s.add(x)):(s.add(x),D&&s.size>parseInt(D,10)&&g(s.values().next().value)),y.shapeFlag|=256,o=y,dl(E.type)?E:y}}},US=HS;function zs(e,t){return be(e)?e.some(n=>zs(n,t)):Be(e)?e.split(",").includes(t):om(e)?(e.lastIndex=0,e.test(t)):!1}function ig(e,t){og(e,"a",t)}function sg(e,t){og(e,"da",t)}function og(e,t,n=Gt){const r=e.__wdc||(e.__wdc=()=>{let i=n;for(;i;){if(i.isDeactivated)return;i=i.parent}return e()});if(Jl(t,r,n),n){let i=n.parent;for(;i&&i.parent;)jo(i.parent.vnode)&&$S(r,t,n,i),i=i.parent}}function $S(e,t,n,r){const i=Jl(t,e,r,!0);ql(()=>{Bl(r[t],i)},n)}function Bc(e){e.shapeFlag&=-257,e.shapeFlag&=-513}function ma(e){return e.shapeFlag&128?e.ssContent:e}function Jl(e,t,n=Gt,r=!1){if(n){const i=n[e]||(n[e]=[]),s=t.__weh||(t.__weh=(...o)=>{jr();const a=Pi(n),l=Xn(t,n,e,o);return a(),Hr(),l});return r?i.unshift(s):i.push(s),s}}const Wr=e=>(t,n=Gt)=>{(!ds||e==="sp")&&Jl(e,(...r)=>t(...r),n)},ag=Wr("bm"),Ho=Wr("m"),If=Wr("bu"),Zl=Wr("u"),Ql=Wr("bum"),ql=Wr("um"),lg=Wr("sp"),cg=Wr("rtg"),ug=Wr("rtc");function fg(e,t=Gt){Jl("ec",e,t)}const Rf="components",WS="directives";function dg(e,t){return Pf(Rf,e,!0,t)||e}const hg=Symbol.for("v-ndc");function YS(e){return Be(e)?Pf(Rf,e,!1)||e:e||hg}function zS(e){return Pf(WS,e)}function Pf(e,t,n=!0,r=!1){const i=Xt||Gt;if(i){const s=i.type;if(e===Rf){const a=Fu(s,!1);if(a&&(a===t||a===mt(t)||a===fi(mt(t))))return s}const o=Qd(i[e]||s[e],t)||Qd(i.appContext[e],t);return!o&&r?s:o}}function Qd(e,t){return e&&(e[t]||e[mt(t)]||e[fi(mt(t))])}function KS(e,t,n,r){let i;const s=n&&n[r],o=be(e);if(o||Be(e)){const a=o&&Lr(e);let l=!1,c=!1;a&&(l=!Nn(e),c=vr(e),e=$l(e)),i=new Array(e.length);for(let u=0,f=e.length;ut(a,l,void 0,s&&s[l]));else{const a=Object.keys(e);i=new Array(a.length);for(let l=0,c=a.length;l{const s=r.fn(...i);return s&&(s.key=r.key),s}:r.fn)}return e}function XS(e,t,n={},r,i){if(Xt.ce||Xt.parent&&ii(Xt.parent)&&Xt.parent.ce){const c=Object.keys(n).length>0;return t!=="default"&&(n.name=t),wo(),hl(Ut,null,[St("slot",n,r&&r())],c?-2:64)}let s=e[t];s&&s._c&&(s._d=!1),wo();const o=s&&Lf(s(n)),a=n.key||o&&o.key,l=hl(Ut,{key:(a&&!En(a)?a:`_${t}`)+(!o&&r?"_fb":"")},o||(r?r():[]),o&&e._===1?64:-2);return!i&&l.scopeId&&(l.slotScopeIds=[l.scopeId+"-s"]),s&&s._c&&(s._d=!0),l}function Lf(e){return e.some(t=>$r(t)?!(t.type===It||t.type===Ut&&!Lf(t.children)):!0)?e:null}function JS(e,t){const n={};for(const r in e)n[t&&/[A-Z]/.test(r)?`on:${r}`:Ci(r)]=e[r];return n}const Au=e=>e?Yg(e)?$o(e):Au(e.parent):null,ro=Je(Object.create(null),{$:e=>e,$el:e=>e.vnode.el,$data:e=>e.data,$props:e=>e.props,$attrs:e=>e.attrs,$slots:e=>e.slots,$refs:e=>e.refs,$parent:e=>Au(e.parent),$root:e=>Au(e.root),$host:e=>e.ce,$emit:e=>e.emit,$options:e=>kf(e),$forceUpdate:e=>e.f||(e.f=()=>{Of(e.update)}),$nextTick:e=>e.n||(e.n=Kl.bind(e.proxy)),$watch:e=>S0.bind(e)}),jc=(e,t)=>e!==et&&!e.__isScriptSetup&&ot(e,t),_u={get({_:e},t){if(t==="__v_skip")return!0;const{ctx:n,setupState:r,data:i,props:s,accessCache:o,type:a,appContext:l}=e;if(t[0]!=="$"){const d=o[t];if(d!==void 0)switch(d){case 1:return r[t];case 2:return i[t];case 4:return n[t];case 3:return s[t]}else{if(jc(r,t))return o[t]=1,r[t];if(i!==et&&ot(i,t))return o[t]=2,i[t];if(ot(s,t))return o[t]=3,s[t];if(n!==et&&ot(n,t))return o[t]=4,n[t];Mu&&(o[t]=0)}}const c=ro[t];let u,f;if(c)return t==="$attrs"&&sn(e.attrs,"get",""),c(e);if((u=a.__cssModules)&&(u=u[t]))return u;if(n!==et&&ot(n,t))return o[t]=4,n[t];if(f=l.config.globalProperties,ot(f,t))return f[t]},set({_:e},t,n){const{data:r,setupState:i,ctx:s}=e;return jc(i,t)?(i[t]=n,!0):r!==et&&ot(r,t)?(r[t]=n,!0):ot(e.props,t)||t[0]==="$"&&t.slice(1)in e?!1:(s[t]=n,!0)},has({_:{data:e,setupState:t,accessCache:n,ctx:r,appContext:i,props:s,type:o}},a){let l;return!!(n[a]||e!==et&&a[0]!=="$"&&ot(e,a)||jc(t,a)||ot(s,a)||ot(r,a)||ot(ro,a)||ot(i.config.globalProperties,a)||(l=o.__cssModules)&&l[a])},defineProperty(e,t,n){return n.get!=null?e._.accessCache[t]=0:ot(n,"value")&&this.set(e,t,n.value,null),Reflect.defineProperty(e,t,n)}},ZS=Je({},_u,{get(e,t){if(t!==Symbol.unscopables)return _u.get(e,t,e)},has(e,t){return t[0]!=="_"&&!vf(t)}});function QS(){return null}function qS(){return null}function e0(e){}function t0(e){}function n0(){return null}function r0(){}function i0(e,t){return null}function s0(){return pg().slots}function o0(){return pg().attrs}function pg(e){const t=Pn();return t.setupContext||(t.setupContext=Xg(t))}function So(e){return be(e)?e.reduce((t,n)=>(t[n]=null,t),{}):e}function a0(e,t){const n=So(e);for(const r in t){if(r.startsWith("__skip"))continue;let i=n[r];i?be(i)||Le(i)?i=n[r]={type:i,default:t[r]}:i.default=t[r]:i===null&&(i=n[r]={default:t[r]}),i&&t[`__skip_${r}`]&&(i.skipFactory=!0)}return n}function l0(e,t){return!e||!t?e||t:be(e)&&be(t)?e.concat(t):Je({},So(e),So(t))}function c0(e,t){const n={};for(const r in e)t.includes(r)||Object.defineProperty(n,r,{enumerable:!0,get:()=>e[r]});return n}function u0(e){const t=Pn();let n=e();return Pu(),jl(n)&&(n=n.catch(r=>{throw Pi(t),r})),[n,()=>Pi(t)]}let Mu=!0;function f0(e){const t=kf(e),n=e.proxy,r=e.ctx;Mu=!1,t.beforeCreate&&qd(t.beforeCreate,e,"bc");const{data:i,computed:s,methods:o,watch:a,provide:l,inject:c,created:u,beforeMount:f,mounted:d,beforeUpdate:m,updated:p,activated:g,deactivated:v,beforeDestroy:T,beforeUnmount:S,destroyed:E,unmounted:y,render:O,renderTracked:M,renderTriggered:V,errorCaptured:j,serverPrefetch:D,expose:x,inheritAttrs:L,components:P,directives:k,filters:$}=t;if(c&&d0(c,r,null),o)for(const W in o){const J=o[W];Le(J)&&(r[W]=J.bind(n))}if(i){const W=i.call(n,n);at(W)&&(e.data=Yl(W))}if(Mu=!0,s)for(const W in s){const J=s[W],Se=Le(J)?J.bind(n,n):Le(J.get)?J.get.bind(n,n):Bt,Ye=!Le(J)&&Le(J.set)?J.set.bind(n):Bt,Ee=Jg({get:Se,set:Ye});Object.defineProperty(r,W,{enumerable:!0,configurable:!0,get:()=>Ee.value,set:ke=>Ee.value=ke})}if(a)for(const W in a)mg(a[W],r,n,W);if(l){const W=Le(l)?l.call(n):l;Reflect.ownKeys(W).forEach(J=>{vg(J,W[J])})}u&&qd(u,e,"c");function U(W,J){be(J)?J.forEach(Se=>W(Se.bind(n))):J&&W(J.bind(n))}if(U(ag,f),U(Ho,d),U(If,m),U(Zl,p),U(ig,g),U(sg,v),U(fg,j),U(ug,M),U(cg,V),U(Ql,S),U(ql,y),U(lg,D),be(x))if(x.length){const W=e.exposed||(e.exposed={});x.forEach(J=>{Object.defineProperty(W,J,{get:()=>n[J],set:Se=>n[J]=Se,enumerable:!0})})}else e.exposed||(e.exposed={});O&&e.render===Bt&&(e.render=O),L!=null&&(e.inheritAttrs=L),P&&(e.components=P),k&&(e.directives=k),D&&Nf(e)}function d0(e,t,n=Bt){be(e)&&(e=xu(e));for(const r in e){const i=e[r];let s;at(i)?"default"in i?s=io(i.from||r,i.default,!0):s=io(i.from||r):s=io(i),jt(s)?Object.defineProperty(t,r,{enumerable:!0,configurable:!0,get:()=>s.value,set:o=>s.value=o}):t[r]=s}}function qd(e,t,n){Xn(be(e)?e.map(r=>r.bind(t.proxy)):e.bind(t.proxy),t,n)}function mg(e,t,n,r){let i=r.includes(".")?Sg(n,r):()=>n[r];if(Be(e)){const s=t[e];Le(s)&&ss(i,s)}else if(Le(e))ss(i,e.bind(n));else if(at(e))if(be(e))e.forEach(s=>mg(s,t,n,r));else{const s=Le(e.handler)?e.handler.bind(n):t[e.handler];Le(s)&&ss(i,s,e)}}function kf(e){const t=e.type,{mixins:n,extends:r}=t,{mixins:i,optionsCache:s,config:{optionMergeStrategies:o}}=e.appContext,a=s.get(t);let l;return a?l=a:!i.length&&!n&&!r?l=t:(l={},i.length&&i.forEach(c=>ul(l,c,o,!0)),ul(l,t,o)),at(t)&&s.set(t,l),l}function ul(e,t,n,r=!1){const{mixins:i,extends:s}=t;s&&ul(e,s,n,!0),i&&i.forEach(o=>ul(e,o,n,!0));for(const o in t)if(!(r&&o==="expose")){const a=h0[o]||n&&n[o];e[o]=a?a(e[o],t[o]):t[o]}return e}const h0={data:eh,props:th,emits:th,methods:Ks,computed:Ks,beforeCreate:hn,created:hn,beforeMount:hn,mounted:hn,beforeUpdate:hn,updated:hn,beforeDestroy:hn,beforeUnmount:hn,destroyed:hn,unmounted:hn,activated:hn,deactivated:hn,errorCaptured:hn,serverPrefetch:hn,components:Ks,directives:Ks,watch:m0,provide:eh,inject:p0};function eh(e,t){return t?e?function(){return Je(Le(e)?e.call(this,this):e,Le(t)?t.call(this,this):t)}:t:e}function p0(e,t){return Ks(xu(e),xu(t))}function xu(e){if(be(e)){const t={};for(let n=0;n1)return n&&Le(t)?t.call(r&&r.proxy):t}}function y0(){return!!(Pn()||_i)}const yg=Symbol.for("v-scx"),Eg=()=>io(yg);function E0(e,t){return Uo(e,null,t)}function b0(e,t){return Uo(e,null,{flush:"post"})}function bg(e,t){return Uo(e,null,{flush:"sync"})}function ss(e,t,n){return Uo(e,t,n)}function Uo(e,t,n=et){const{immediate:r,deep:i,flush:s,once:o}=n,a=Je({},n),l=t&&r||!t&&s!=="post";let c;if(ds){if(s==="sync"){const m=Eg();c=m.__watcherHandles||(m.__watcherHandles=[])}else if(!l){const m=()=>{};return m.stop=Bt,m.resume=Bt,m.pause=Bt,m}}const u=Gt;a.call=(m,p,g)=>Xn(m,u,p,g);let f=!1;s==="post"?a.scheduler=m=>{kt(m,u&&u.suspense)}:s!=="sync"&&(f=!0,a.scheduler=(m,p)=>{p?m():Of(m)}),a.augmentJob=m=>{t&&(m.flags|=4),f&&(m.flags|=2,u&&(m.id=u.uid,m.i=u))};const d=fS(e,t,a);return ds&&(c?c.push(d):l&&d()),d}function S0(e,t,n){const r=this.proxy,i=Be(e)?e.includes(".")?Sg(r,e):()=>r[e]:e.bind(r,r);let s;Le(t)?s=t:(s=t.handler,n=t);const o=Pi(this),a=Uo(i,s.bind(r),n);return o(),a}function Sg(e,t){const n=t.split(".");return()=>{let r=e;for(let i=0;i{let u,f=et,d;return bg(()=>{const m=e[i];rn(u,m)&&(u=m,c())}),{get(){return l(),n.get?n.get(u):u},set(m){const p=n.set?n.set(m):m;if(!rn(p,u)&&!(f!==et&&rn(m,f)))return;const g=r.vnode.props;g&&(t in g||i in g||s in g)&&(`onUpdate:${t}`in g||`onUpdate:${i}`in g||`onUpdate:${s}`in g)||(u=m,c()),r.emit(`update:${t}`,p),rn(m,p)&&rn(m,f)&&!rn(p,d)&&c(),f=m,d=p}}});return a[Symbol.iterator]=()=>{let l=0;return{next(){return l<2?{value:l++?o||et:a,done:!1}:{done:!0}}}},a}const Tg=(e,t)=>t==="modelValue"||t==="model-value"?e.modelModifiers:e[`${t}Modifiers`]||e[`${mt(t)}Modifiers`]||e[`${on(t)}Modifiers`];function w0(e,t,...n){if(e.isUnmounted)return;const r=e.vnode.props||et;let i=n;const s=t.startsWith("update:"),o=s&&Tg(r,t.slice(7));o&&(o.trim&&(i=n.map(u=>Be(u)?u.trim():u)),o.number&&(i=n.map(Lo)));let a,l=r[a=Ci(t)]||r[a=Ci(mt(t))];!l&&s&&(l=r[a=Ci(on(t))]),l&&Xn(l,e,6,i);const c=r[a+"Once"];if(c){if(!e.emitted)e.emitted={};else if(e.emitted[a])return;e.emitted[a]=!0,Xn(c,e,6,i)}}const D0=new WeakMap;function wg(e,t,n=!1){const r=n?D0:t.emitsCache,i=r.get(e);if(i!==void 0)return i;const s=e.emits;let o={},a=!1;if(!Le(e)){const l=c=>{const u=wg(c,t,!0);u&&(a=!0,Je(o,u))};!n&&t.mixins.length&&t.mixins.forEach(l),e.extends&&l(e.extends),e.mixins&&e.mixins.forEach(l)}return!s&&!a?(at(e)&&r.set(e,null),null):(be(s)?s.forEach(l=>o[l]=null):Je(o,s),at(e)&&r.set(e,o),o)}function ec(e,t){return!e||!ci(t)?!1:(t=t.slice(2).replace(/Once$/,""),ot(e,t[0].toLowerCase()+t.slice(1))||ot(e,on(t))||ot(e,t))}function Va(e){const{type:t,vnode:n,proxy:r,withProxy:i,propsOptions:[s],slots:o,attrs:a,emit:l,render:c,renderCache:u,props:f,data:d,setupState:m,ctx:p,inheritAttrs:g}=e,v=bo(e);let T,S;try{if(n.shapeFlag&4){const y=i||r,O=y;T=_n(c.call(O,y,u,f,m,d,p)),S=a}else{const y=t;T=_n(y.length>1?y(f,{attrs:a,slots:o,emit:l}):y(f,null)),S=t.props?a:O0(a)}}catch(y){so.length=0,Ui(y,e,1),T=St(It)}let E=T;if(S&&g!==!1){const y=Object.keys(S),{shapeFlag:O}=E;y.length&&O&7&&(s&&y.some(Vl)&&(S=A0(S,s)),E=yr(E,S,!1,!0))}return n.dirs&&(E=yr(E,null,!1,!0),E.dirs=E.dirs?E.dirs.concat(n.dirs):n.dirs),n.transition&&Ur(E,n.transition),T=E,bo(v),T}function C0(e,t=!0){let n;for(let r=0;r{let t;for(const n in e)(n==="class"||n==="style"||ci(n))&&((t||(t={}))[n]=e[n]);return t},A0=(e,t)=>{const n={};for(const r in e)(!Vl(r)||!(r.slice(9)in t))&&(n[r]=e[r]);return n};function _0(e,t,n){const{props:r,children:i,component:s}=e,{props:o,children:a,patchFlag:l}=t,c=s.emitsOptions;if(t.dirs||t.transition)return!0;if(n&&l>=0){if(l&1024)return!0;if(l&16)return r?nh(r,o,c):!!o;if(l&8){const u=t.dynamicProps;for(let f=0;fObject.create(Dg),Og=e=>Object.getPrototypeOf(e)===Dg;function M0(e,t,n,r=!1){const i={},s=Cg();e.propsDefaults=Object.create(null),Ag(e,t,i,s);for(const o in e.propsOptions[0])o in i||(i[o]=void 0);n?e.props=r?i:Vm(i):e.type.props?e.props=i:e.props=s,e.attrs=s}function x0(e,t,n,r){const{props:i,attrs:s,vnode:{patchFlag:o}}=e,a=it(i),[l]=e.propsOptions;let c=!1;if((r||o>0)&&!(o&16)){if(o&8){const u=e.vnode.dynamicProps;for(let f=0;f{l=!0;const[d,m]=_g(f,t,!0);Je(o,d),m&&a.push(...m)};!n&&t.mixins.length&&t.mixins.forEach(u),e.extends&&u(e.extends),e.mixins&&e.mixins.forEach(u)}if(!s&&!l)return at(e)&&r.set(e,wi),wi;if(be(s))for(let u=0;ue==="_"||e==="_ctx"||e==="$stable",Vf=e=>be(e)?e.map(_n):[_n(e)],I0=(e,t,n)=>{if(t._n)return t;const r=Af((...i)=>Vf(t(...i)),n);return r._c=!1,r},Mg=(e,t,n)=>{const r=e._ctx;for(const i in e){if(Ff(i))continue;const s=e[i];if(Le(s))t[i]=I0(i,s,r);else if(s!=null){const o=Vf(s);t[i]=()=>o}}},xg=(e,t)=>{const n=Vf(t);e.slots.default=()=>n},Ng=(e,t,n)=>{for(const r in t)(n||!Ff(r))&&(e[r]=t[r])},R0=(e,t,n)=>{const r=e.slots=Cg();if(e.vnode.shapeFlag&32){const i=t._;i?(Ng(r,t,n),n&&gf(r,"_",i,!0)):Mg(t,r)}else t&&xg(e,t)},P0=(e,t,n)=>{const{vnode:r,slots:i}=e;let s=!0,o=et;if(r.shapeFlag&32){const a=t._;a?n&&a===1?s=!1:Ng(i,t,n):(s=!t.$stable,Mg(t,i)),o=t}else t&&(xg(e,t),o={default:1});if(s)for(const a in i)!Ff(a)&&o[a]==null&&delete i[a]},kt=Vg;function Ig(e){return Pg(e)}function Rg(e){return Pg(e,xS)}function Pg(e,t){const n=ko();n.__VUE__=!0;const{insert:r,remove:i,patchProp:s,createElement:o,createText:a,createComment:l,setText:c,setElementText:u,parentNode:f,nextSibling:d,setScopeId:m=Bt,insertStaticContent:p}=e,g=(_,N,Y,ee=null,Z=null,Q=null,oe=void 0,ne=null,ie=!!N.dynamicChildren)=>{if(_===N)return;_&&!sr(_,N)&&(ee=pe(_),ke(_,Z,Q,!0),_=null),N.patchFlag===-2&&(ie=!1,N.dynamicChildren=null);const{type:te,ref:Te,shapeFlag:fe}=N;switch(te){case si:v(_,N,Y,ee);break;case It:T(_,N,Y,ee);break;case Mi:_==null&&S(N,Y,ee,oe);break;case Ut:P(_,N,Y,ee,Z,Q,oe,ne,ie);break;default:fe&1?O(_,N,Y,ee,Z,Q,oe,ne,ie):fe&6?k(_,N,Y,ee,Z,Q,oe,ne,ie):(fe&64||fe&128)&&te.process(_,N,Y,ee,Z,Q,oe,ne,ie,lt)}Te!=null&&Z?is(Te,_&&_.ref,Q,N||_,!N):Te==null&&_&&_.ref!=null&&is(_.ref,null,Q,_,!0)},v=(_,N,Y,ee)=>{if(_==null)r(N.el=a(N.children),Y,ee);else{const Z=N.el=_.el;N.children!==_.children&&c(Z,N.children)}},T=(_,N,Y,ee)=>{_==null?r(N.el=l(N.children||""),Y,ee):N.el=_.el},S=(_,N,Y,ee)=>{[_.el,_.anchor]=p(_.children,N,Y,ee,_.el,_.anchor)},E=({el:_,anchor:N},Y,ee)=>{let Z;for(;_&&_!==N;)Z=d(_),r(_,Y,ee),_=Z;r(N,Y,ee)},y=({el:_,anchor:N})=>{let Y;for(;_&&_!==N;)Y=d(_),i(_),_=Y;i(N)},O=(_,N,Y,ee,Z,Q,oe,ne,ie)=>{if(N.type==="svg"?oe="svg":N.type==="math"&&(oe="mathml"),_==null)M(N,Y,ee,Z,Q,oe,ne,ie);else{const te=_.el&&_.el._isVueCE?_.el:null;try{te&&te._beginPatch(),D(_,N,Z,Q,oe,ne,ie)}finally{te&&te._endPatch()}}},M=(_,N,Y,ee,Z,Q,oe,ne)=>{let ie,te;const{props:Te,shapeFlag:fe,transition:ye,dirs:we}=_;if(ie=_.el=o(_.type,Q,Te&&Te.is,Te),fe&8?u(ie,_.children):fe&16&&j(_.children,ie,null,ee,Z,Hc(_,Q),oe,ne),we&&pr(_,null,ee,"created"),V(ie,_,_.scopeId,oe,ee),Te){for(const Xe in Te)Xe!=="value"&&!Pr(Xe)&&s(ie,Xe,null,Te[Xe],Q,ee);"value"in Te&&s(ie,"value",null,Te.value,Q),(te=Te.onVnodeBeforeMount)&&On(te,ee,_)}we&&pr(_,null,ee,"beforeMount");const Pe=Lg(Z,ye);Pe&&ye.beforeEnter(ie),r(ie,N,Y),((te=Te&&Te.onVnodeMounted)||Pe||we)&&kt(()=>{te&&On(te,ee,_),Pe&&ye.enter(ie),we&&pr(_,null,ee,"mounted")},Z)},V=(_,N,Y,ee,Z)=>{if(Y&&m(_,Y),ee)for(let Q=0;Q{for(let te=ie;te<_.length;te++){const Te=_[te]=ne?Qr(_[te]):_n(_[te]);g(null,Te,N,Y,ee,Z,Q,oe,ne)}},D=(_,N,Y,ee,Z,Q,oe)=>{const ne=N.el=_.el;let{patchFlag:ie,dynamicChildren:te,dirs:Te}=N;ie|=_.patchFlag&16;const fe=_.props||et,ye=N.props||et;let we;if(Y&&di(Y,!1),(we=ye.onVnodeBeforeUpdate)&&On(we,Y,N,_),Te&&pr(N,_,Y,"beforeUpdate"),Y&&di(Y,!0),(fe.innerHTML&&ye.innerHTML==null||fe.textContent&&ye.textContent==null)&&u(ne,""),te?x(_.dynamicChildren,te,ne,Y,ee,Hc(N,Z),Q):oe||J(_,N,ne,null,Y,ee,Hc(N,Z),Q,!1),ie>0){if(ie&16)L(ne,fe,ye,Y,Z);else if(ie&2&&fe.class!==ye.class&&s(ne,"class",null,ye.class,Z),ie&4&&s(ne,"style",fe.style,ye.style,Z),ie&8){const Pe=N.dynamicProps;for(let Xe=0;Xe{we&&On(we,Y,N,_),Te&&pr(N,_,Y,"updated")},ee)},x=(_,N,Y,ee,Z,Q,oe)=>{for(let ne=0;ne{if(N!==Y){if(N!==et)for(const Q in N)!Pr(Q)&&!(Q in Y)&&s(_,Q,N[Q],null,Z,ee);for(const Q in Y){if(Pr(Q))continue;const oe=Y[Q],ne=N[Q];oe!==ne&&Q!=="value"&&s(_,Q,ne,oe,Z,ee)}"value"in Y&&s(_,"value",N.value,Y.value,Z)}},P=(_,N,Y,ee,Z,Q,oe,ne,ie)=>{const te=N.el=_?_.el:a(""),Te=N.anchor=_?_.anchor:a("");let{patchFlag:fe,dynamicChildren:ye,slotScopeIds:we}=N;we&&(ne=ne?ne.concat(we):we),_==null?(r(te,Y,ee),r(Te,Y,ee),j(N.children||[],Y,Te,Z,Q,oe,ne,ie)):fe>0&&fe&64&&ye&&_.dynamicChildren?(x(_.dynamicChildren,ye,Y,Z,Q,oe,ne),(N.key!=null||Z&&N===Z.subTree)&&Bf(_,N,!0)):J(_,N,Y,Te,Z,Q,oe,ne,ie)},k=(_,N,Y,ee,Z,Q,oe,ne,ie)=>{N.slotScopeIds=ne,_==null?N.shapeFlag&512?Z.ctx.activate(N,Y,ee,oe,ie):$(N,Y,ee,Z,Q,oe,ie):q(_,N,ie)},$=(_,N,Y,ee,Z,Q,oe)=>{const ne=_.component=Wg(_,ee,Z);if(jo(_)&&(ne.ctx.renderer=lt),zg(ne,!1,oe),ne.asyncDep){if(Z&&Z.registerDep(ne,U,oe),!_.el){const ie=ne.subTree=St(It);T(null,ie,N,Y),_.placeholder=ie.el}}else U(ne,_,N,Y,Z,Q,oe)},q=(_,N,Y)=>{const ee=N.component=_.component;if(_0(_,N,Y))if(ee.asyncDep&&!ee.asyncResolved){W(ee,N,Y);return}else ee.next=N,ee.update();else N.el=_.el,ee.vnode=N},U=(_,N,Y,ee,Z,Q,oe)=>{const ne=()=>{if(_.isMounted){let{next:fe,bu:ye,u:we,parent:Pe,vnode:Xe}=_;{const B=kg(_);if(B){fe&&(fe.el=Xe.el,W(_,fe,oe)),B.asyncDep.then(()=>{_.isUnmounted||ne()});return}}let F=fe,H;di(_,!1),fe?(fe.el=Xe.el,W(_,fe,oe)):fe=Xe,ye&&Oi(ye),(H=fe.props&&fe.props.onVnodeBeforeUpdate)&&On(H,Pe,fe,Xe),di(_,!0);const w=Va(_),A=_.subTree;_.subTree=w,g(A,w,f(A.el),pe(A),_,Z,Q),fe.el=w.el,F===null&&tc(_,w.el),we&&kt(we,Z),(H=fe.props&&fe.props.onVnodeUpdated)&&kt(()=>On(H,Pe,fe,Xe),Z)}else{let fe;const{el:ye,props:we}=N,{bm:Pe,m:Xe,parent:F,root:H,type:w}=_,A=ii(N);if(di(_,!1),Pe&&Oi(Pe),!A&&(fe=we&&we.onVnodeBeforeMount)&&On(fe,F,N),di(_,!0),ye&&st){const B=()=>{_.subTree=Va(_),st(ye,_.subTree,_,Z,null)};A&&w.__asyncHydrate?w.__asyncHydrate(ye,_,B):B()}else{H.ce&&H.ce._def.shadowRoot!==!1&&H.ce._injectChildStyle(w);const B=_.subTree=Va(_);g(null,B,Y,ee,_,Z,Q),N.el=B.el}if(Xe&&kt(Xe,Z),!A&&(fe=we&&we.onVnodeMounted)){const B=N;kt(()=>On(fe,F,B),Z)}(N.shapeFlag&256||F&&ii(F.vnode)&&F.vnode.shapeFlag&256)&&_.a&&kt(_.a,Z),_.isMounted=!0,N=Y=ee=null}};_.scope.on();const ie=_.effect=new mo(ne);_.scope.off();const te=_.update=ie.run.bind(ie),Te=_.job=ie.runIfDirty.bind(ie);Te.i=_,Te.id=_.uid,ie.scheduler=()=>Of(Te),di(_,!0),te()},W=(_,N,Y)=>{N.component=_;const ee=_.vnode.props;_.vnode=N,_.next=null,x0(_,N.props,ee,Y),P0(_,N.children,Y),jr(),Wd(_),Hr()},J=(_,N,Y,ee,Z,Q,oe,ne,ie=!1)=>{const te=_&&_.children,Te=_?_.shapeFlag:0,fe=N.children,{patchFlag:ye,shapeFlag:we}=N;if(ye>0){if(ye&128){Ye(te,fe,Y,ee,Z,Q,oe,ne,ie);return}else if(ye&256){Se(te,fe,Y,ee,Z,Q,oe,ne,ie);return}}we&8?(Te&16&&re(te,Z,Q),fe!==te&&u(Y,fe)):Te&16?we&16?Ye(te,fe,Y,ee,Z,Q,oe,ne,ie):re(te,Z,Q,!0):(Te&8&&u(Y,""),we&16&&j(fe,Y,ee,Z,Q,oe,ne,ie))},Se=(_,N,Y,ee,Z,Q,oe,ne,ie)=>{_=_||wi,N=N||wi;const te=_.length,Te=N.length,fe=Math.min(te,Te);let ye;for(ye=0;yeTe?re(_,Z,Q,!0,!1,fe):j(N,Y,ee,Z,Q,oe,ne,ie,fe)},Ye=(_,N,Y,ee,Z,Q,oe,ne,ie)=>{let te=0;const Te=N.length;let fe=_.length-1,ye=Te-1;for(;te<=fe&&te<=ye;){const we=_[te],Pe=N[te]=ie?Qr(N[te]):_n(N[te]);if(sr(we,Pe))g(we,Pe,Y,null,Z,Q,oe,ne,ie);else break;te++}for(;te<=fe&&te<=ye;){const we=_[fe],Pe=N[ye]=ie?Qr(N[ye]):_n(N[ye]);if(sr(we,Pe))g(we,Pe,Y,null,Z,Q,oe,ne,ie);else break;fe--,ye--}if(te>fe){if(te<=ye){const we=ye+1,Pe=weye)for(;te<=fe;)ke(_[te],Z,Q,!0),te++;else{const we=te,Pe=te,Xe=new Map;for(te=Pe;te<=ye;te++){const se=N[te]=ie?Qr(N[te]):_n(N[te]);se.key!=null&&Xe.set(se.key,te)}let F,H=0;const w=ye-Pe+1;let A=!1,B=0;const G=new Array(w);for(te=0;te=w){ke(se,Z,Q,!0);continue}let le;if(se.key!=null)le=Xe.get(se.key);else for(F=Pe;F<=ye;F++)if(G[F-Pe]===0&&sr(se,N[F])){le=F;break}le===void 0?ke(se,Z,Q,!0):(G[le-Pe]=te+1,le>=B?B=le:A=!0,g(se,N[le],Y,null,Z,Q,oe,ne,ie),H++)}const X=A?L0(G):wi;for(F=X.length-1,te=w-1;te>=0;te--){const se=Pe+te,le=N[se],he=N[se+1],ce=se+1{const{el:Q,type:oe,transition:ne,children:ie,shapeFlag:te}=_;if(te&6){Ee(_.component.subTree,N,Y,ee);return}if(te&128){_.suspense.move(N,Y,ee);return}if(te&64){oe.move(_,N,Y,lt);return}if(oe===Ut){r(Q,N,Y);for(let fe=0;fene.enter(Q),Z);else{const{leave:fe,delayLeave:ye,afterLeave:we}=ne,Pe=()=>{_.ctx.isUnmounted?i(Q):r(Q,N,Y)},Xe=()=>{Q._isLeaving&&Q[Mr](!0),fe(Q,()=>{Pe(),we&&we()})};ye?ye(Q,Pe,Xe):Xe()}else r(Q,N,Y)},ke=(_,N,Y,ee=!1,Z=!1)=>{const{type:Q,props:oe,ref:ne,children:ie,dynamicChildren:te,shapeFlag:Te,patchFlag:fe,dirs:ye,cacheIndex:we}=_;if(fe===-2&&(Z=!1),ne!=null&&(jr(),is(ne,null,Y,_,!0),Hr()),we!=null&&(N.renderCache[we]=void 0),Te&256){N.ctx.deactivate(_);return}const Pe=Te&1&&ye,Xe=!ii(_);let F;if(Xe&&(F=oe&&oe.onVnodeBeforeUnmount)&&On(F,N,_),Te&6)xe(_.component,Y,ee);else{if(Te&128){_.suspense.unmount(Y,ee);return}Pe&&pr(_,null,N,"beforeUnmount"),Te&64?_.type.remove(_,N,Y,lt,ee):te&&!te.hasOnce&&(Q!==Ut||fe>0&&fe&64)?re(te,N,Y,!1,!0):(Q===Ut&&fe&384||!Z&&Te&16)&&re(ie,N,Y),ee&&Fe(_)}(Xe&&(F=oe&&oe.onVnodeUnmounted)||Pe)&&kt(()=>{F&&On(F,N,_),Pe&&pr(_,null,N,"unmounted")},Y)},Fe=_=>{const{type:N,el:Y,anchor:ee,transition:Z}=_;if(N===Ut){je(Y,ee);return}if(N===Mi){y(_);return}const Q=()=>{i(Y),Z&&!Z.persisted&&Z.afterLeave&&Z.afterLeave()};if(_.shapeFlag&1&&Z&&!Z.persisted){const{leave:oe,delayLeave:ne}=Z,ie=()=>oe(Y,Q);ne?ne(_.el,Q,ie):ie()}else Q()},je=(_,N)=>{let Y;for(;_!==N;)Y=d(_),i(_),_=Y;i(N)},xe=(_,N,Y)=>{const{bum:ee,scope:Z,job:Q,subTree:oe,um:ne,m:ie,a:te}=_;fl(ie),fl(te),ee&&Oi(ee),Z.stop(),Q&&(Q.flags|=8,ke(oe,_,N,Y)),ne&&kt(ne,N),kt(()=>{_.isUnmounted=!0},N)},re=(_,N,Y,ee=!1,Z=!1,Q=0)=>{for(let oe=Q;oe<_.length;oe++)ke(_[oe],N,Y,ee,Z)},pe=_=>{if(_.shapeFlag&6)return pe(_.component.subTree);if(_.shapeFlag&128)return _.suspense.next();const N=d(_.anchor||_.el),Y=N&&N[Jm];return Y?d(Y):N};let _e=!1;const Ie=(_,N,Y)=>{_==null?N._vnode&&ke(N._vnode,null,null,!0):g(N._vnode||null,_,N,null,null,null,Y),N._vnode=_,_e||(_e=!0,Wd(),ll(),_e=!1)},lt={p:g,um:ke,m:Ee,r:Fe,mt:$,mc:j,pc:J,pbc:x,n:pe,o:e};let dt,st;return t&&([dt,st]=t(lt)),{render:Ie,hydrate:dt,createApp:v0(Ie,dt)}}function Hc({type:e,props:t},n){return n==="svg"&&e==="foreignObject"||n==="mathml"&&e==="annotation-xml"&&t&&t.encoding&&t.encoding.includes("html")?void 0:n}function di({effect:e,job:t},n){n?(e.flags|=32,t.flags|=4):(e.flags&=-33,t.flags&=-5)}function Lg(e,t){return(!e||e&&!e.pendingBranch)&&t&&!t.persisted}function Bf(e,t,n=!1){const r=e.children,i=t.children;if(be(r)&&be(i))for(let s=0;s>1,e[n[a]]0&&(t[r]=n[s-1]),n[s]=r)}}for(s=n.length,o=n[s-1];s-- >0;)n[s]=o,o=t[o];return n}function kg(e){const t=e.subTree.component;if(t)return t.asyncDep&&!t.asyncResolved?t:kg(t)}function fl(e){if(e)for(let t=0;te.__isSuspense;let Iu=0;const k0={name:"Suspense",__isSuspense:!0,process(e,t,n,r,i,s,o,a,l,c){if(e==null)V0(t,n,r,i,s,o,a,l,c);else{if(s&&s.deps>0&&!e.suspense.isInFallback){t.suspense=e.suspense,t.suspense.vnode=t,t.el=e.el;return}B0(e,t,n,r,i,o,a,l,c)}},hydrate:j0,normalize:H0},F0=k0;function To(e,t){const n=e.props&&e.props[t];Le(n)&&n()}function V0(e,t,n,r,i,s,o,a,l){const{p:c,o:{createElement:u}}=l,f=u("div"),d=e.suspense=Fg(e,i,r,t,f,n,s,o,a,l);c(null,d.pendingBranch=e.ssContent,f,null,r,d,s,o),d.deps>0?(To(e,"onPending"),To(e,"onFallback"),c(null,e.ssFallback,t,n,r,null,s,o),os(d,e.ssFallback)):d.resolve(!1,!0)}function B0(e,t,n,r,i,s,o,a,{p:l,um:c,o:{createElement:u}}){const f=t.suspense=e.suspense;f.vnode=t,t.el=e.el;const d=t.ssContent,m=t.ssFallback,{activeBranch:p,pendingBranch:g,isInFallback:v,isHydrating:T}=f;if(g)f.pendingBranch=d,sr(g,d)?(l(g,d,f.hiddenContainer,null,i,f,s,o,a),f.deps<=0?f.resolve():v&&(T||(l(p,m,n,r,i,null,s,o,a),os(f,m)))):(f.pendingId=Iu++,T?(f.isHydrating=!1,f.activeBranch=g):c(g,i,f),f.deps=0,f.effects.length=0,f.hiddenContainer=u("div"),v?(l(null,d,f.hiddenContainer,null,i,f,s,o,a),f.deps<=0?f.resolve():(l(p,m,n,r,i,null,s,o,a),os(f,m))):p&&sr(p,d)?(l(p,d,n,r,i,f,s,o,a),f.resolve(!0)):(l(null,d,f.hiddenContainer,null,i,f,s,o,a),f.deps<=0&&f.resolve()));else if(p&&sr(p,d))l(p,d,n,r,i,f,s,o,a),os(f,d);else if(To(t,"onPending"),f.pendingBranch=d,d.shapeFlag&512?f.pendingId=d.component.suspenseId:f.pendingId=Iu++,l(null,d,f.hiddenContainer,null,i,f,s,o,a),f.deps<=0)f.resolve();else{const{timeout:S,pendingId:E}=f;S>0?setTimeout(()=>{f.pendingId===E&&f.fallback(m)},S):S===0&&f.fallback(m)}}function Fg(e,t,n,r,i,s,o,a,l,c,u=!1){const{p:f,m:d,um:m,n:p,o:{parentNode:g,remove:v}}=c;let T;const S=U0(e);S&&t&&t.pendingBranch&&(T=t.pendingId,t.deps++);const E=e.props?po(e.props.timeout):void 0,y=s,O={vnode:e,parent:t,parentComponent:n,namespace:o,container:r,hiddenContainer:i,deps:0,pendingId:Iu++,timeout:typeof E=="number"?E:-1,activeBranch:null,pendingBranch:null,isInFallback:!u,isHydrating:u,isUnmounted:!1,effects:[],resolve(M=!1,V=!1){const{vnode:j,activeBranch:D,pendingBranch:x,pendingId:L,effects:P,parentComponent:k,container:$,isInFallback:q}=O;let U=!1;O.isHydrating?O.isHydrating=!1:M||(U=D&&x.transition&&x.transition.mode==="out-in",U&&(D.transition.afterLeave=()=>{L===O.pendingId&&(d(x,$,s===y?p(D):s,0),yo(P),q&&j.ssFallback&&(j.ssFallback.el=null))}),D&&(g(D.el)===$&&(s=p(D)),m(D,k,O,!0),!U&&q&&j.ssFallback&&kt(()=>j.ssFallback.el=null,O)),U||d(x,$,s,0)),os(O,x),O.pendingBranch=null,O.isInFallback=!1;let W=O.parent,J=!1;for(;W;){if(W.pendingBranch){W.effects.push(...P),J=!0;break}W=W.parent}!J&&!U&&yo(P),O.effects=[],S&&t&&t.pendingBranch&&T===t.pendingId&&(t.deps--,t.deps===0&&!V&&t.resolve()),To(j,"onResolve")},fallback(M){if(!O.pendingBranch)return;const{vnode:V,activeBranch:j,parentComponent:D,container:x,namespace:L}=O;To(V,"onFallback");const P=p(j),k=()=>{O.isInFallback&&(f(null,M,x,P,D,null,L,a,l),os(O,M))},$=M.transition&&M.transition.mode==="out-in";$&&(j.transition.afterLeave=k),O.isInFallback=!0,m(j,D,null,!0),$||k()},move(M,V,j){O.activeBranch&&d(O.activeBranch,M,V,j),O.container=M},next(){return O.activeBranch&&p(O.activeBranch)},registerDep(M,V,j){const D=!!O.pendingBranch;D&&O.deps++;const x=M.vnode.el;M.asyncDep.catch(L=>{Ui(L,M,0)}).then(L=>{if(M.isUnmounted||O.isUnmounted||O.pendingId!==M.suspenseId)return;M.asyncResolved=!0;const{vnode:P}=M;Lu(M,L,!1),x&&(P.el=x);const k=!x&&M.subTree.el;V(M,P,g(x||M.subTree.el),x?null:p(M.subTree),O,o,j),k&&(P.placeholder=null,v(k)),tc(M,P.el),D&&--O.deps===0&&O.resolve()})},unmount(M,V){O.isUnmounted=!0,O.activeBranch&&m(O.activeBranch,n,M,V),O.pendingBranch&&m(O.pendingBranch,n,M,V)}};return O}function j0(e,t,n,r,i,s,o,a,l){const c=t.suspense=Fg(t,r,n,e.parentNode,document.createElement("div"),null,i,s,o,a,!0),u=l(e,c.pendingBranch=t.ssContent,n,c,s,o);return c.deps===0&&c.resolve(!1,!0),u}function H0(e){const{shapeFlag:t,children:n}=e,r=t&32;e.ssContent=ih(r?n.default:n),e.ssFallback=r?ih(n.fallback):St(It)}function ih(e){let t;if(Le(e)){const n=Ri&&e._c;n&&(e._d=!1,wo()),e=e(),n&&(e._d=!0,t=cn,Bg())}return be(e)&&(e=C0(e)),e=_n(e),t&&!e.dynamicChildren&&(e.dynamicChildren=t.filter(n=>n!==e)),e}function Vg(e,t){t&&t.pendingBranch?be(e)?t.effects.push(...e):t.effects.push(e):yo(e)}function os(e,t){e.activeBranch=t;const{vnode:n,parentComponent:r}=e;let i=t.el;for(;!i&&t.component;)t=t.component.subTree,i=t.el;n.el=i,r&&r.subTree===n&&(r.vnode.el=i,tc(r,i))}function U0(e){const t=e.props&&e.props.suspensible;return t!=null&&t!==!1}const Ut=Symbol.for("v-fgt"),si=Symbol.for("v-txt"),It=Symbol.for("v-cmt"),Mi=Symbol.for("v-stc"),so=[];let cn=null;function wo(e=!1){so.push(cn=e?null:[])}function Bg(){so.pop(),cn=so[so.length-1]||null}let Ri=1;function Do(e,t=!1){Ri+=e,e<0&&cn&&t&&(cn.hasOnce=!0)}function jg(e){return e.dynamicChildren=Ri>0?cn||wi:null,Bg(),Ri>0&&cn&&cn.push(e),e}function $0(e,t,n,r,i,s){return jg(jf(e,t,n,r,i,s,!0))}function hl(e,t,n,r,i){return jg(St(e,t,n,r,i,!0))}function $r(e){return e?e.__v_isVNode===!0:!1}function sr(e,t){return e.type===t.type&&e.key===t.key}function W0(e){}const Hg=({key:e})=>e??null,Ba=({ref:e,ref_key:t,ref_for:n})=>(typeof e=="number"&&(e=""+e),e!=null?Be(e)||jt(e)||Le(e)?{i:Xt,r:e,k:t,f:!!n}:e:null);function jf(e,t=null,n=null,r=0,i=null,s=e===Ut?0:1,o=!1,a=!1){const l={__v_isVNode:!0,__v_skip:!0,type:e,props:t,key:t&&Hg(t),ref:t&&Ba(t),scopeId:Gl,slotScopeIds:null,children:n,component:null,suspense:null,ssContent:null,ssFallback:null,dirs:null,transition:null,el:null,anchor:null,target:null,targetStart:null,targetAnchor:null,staticCount:0,shapeFlag:s,patchFlag:r,dynamicProps:i,dynamicChildren:null,appContext:null,ctx:Xt};return a?(Uf(l,n),s&128&&e.normalize(l)):n&&(l.shapeFlag|=Be(n)?8:16),Ri>0&&!o&&cn&&(l.patchFlag>0||s&6)&&l.patchFlag!==32&&cn.push(l),l}const St=Y0;function Y0(e,t=null,n=null,r=0,i=null,s=!1){if((!e||e===hg)&&(e=It),$r(e)){const a=yr(e,t,!0);return n&&Uf(a,n),Ri>0&&!s&&cn&&(a.shapeFlag&6?cn[cn.indexOf(e)]=a:cn.push(a)),a.patchFlag=-2,a}if(q0(e)&&(e=e.__vccOpts),t){t=Ug(t);let{class:a,style:l}=t;a&&!Be(a)&&(t.class=Ds(a)),at(l)&&(Vo(l)&&!be(l)&&(l=Je({},l)),t.style=ws(l))}const o=Be(e)?1:dl(e)?128:Zm(e)?64:at(e)?4:Le(e)?2:0;return jf(e,t,n,r,i,o,s,!0)}function Ug(e){return e?Vo(e)||Og(e)?Je({},e):e:null}function yr(e,t,n=!1,r=!1){const{props:i,ref:s,patchFlag:o,children:a,transition:l}=e,c=t?$g(i||{},t):i,u={__v_isVNode:!0,__v_skip:!0,type:e.type,props:c,key:c&&Hg(c),ref:t&&t.ref?n&&s?be(s)?s.concat(Ba(t)):[s,Ba(t)]:Ba(t):s,scopeId:e.scopeId,slotScopeIds:e.slotScopeIds,children:a,target:e.target,targetStart:e.targetStart,targetAnchor:e.targetAnchor,staticCount:e.staticCount,shapeFlag:e.shapeFlag,patchFlag:t&&e.type!==Ut?o===-1?16:o|16:o,dynamicProps:e.dynamicProps,dynamicChildren:e.dynamicChildren,appContext:e.appContext,dirs:e.dirs,transition:l,component:e.component,suspense:e.suspense,ssContent:e.ssContent&&yr(e.ssContent),ssFallback:e.ssFallback&&yr(e.ssFallback),placeholder:e.placeholder,el:e.el,anchor:e.anchor,ctx:e.ctx,ce:e.ce};return l&&r&&Ur(u,l.clone(u)),u}function Hf(e=" ",t=0){return St(si,null,e,t)}function z0(e,t){const n=St(Mi,null,e);return n.staticCount=t,n}function K0(e="",t=!1){return t?(wo(),hl(It,null,e)):St(It,null,e)}function _n(e){return e==null||typeof e=="boolean"?St(It):be(e)?St(Ut,null,e.slice()):$r(e)?Qr(e):St(si,null,String(e))}function Qr(e){return e.el===null&&e.patchFlag!==-1||e.memo?e:yr(e)}function Uf(e,t){let n=0;const{shapeFlag:r}=e;if(t==null)t=null;else if(be(t))n=16;else if(typeof t=="object")if(r&65){const i=t.default;i&&(i._c&&(i._d=!1),Uf(e,i()),i._c&&(i._d=!0));return}else{n=32;const i=t._;!i&&!Og(t)?t._ctx=Xt:i===3&&Xt&&(Xt.slots._===1?t._=1:(t._=2,e.patchFlag|=1024))}else Le(t)?(t={default:t,_ctx:Xt},n=32):(t=String(t),r&64?(n=16,t=[Hf(t)]):n=8);e.children=t,e.shapeFlag|=n}function $g(...e){const t={};for(let n=0;nGt||Xt;let pl,Ru;{const e=ko(),t=(n,r)=>{let i;return(i=e[n])||(i=e[n]=[]),i.push(r),s=>{i.length>1?i.forEach(o=>o(s)):i[0](s)}};pl=t("__VUE_INSTANCE_SETTERS__",n=>Gt=n),Ru=t("__VUE_SSR_SETTERS__",n=>ds=n)}const Pi=e=>{const t=Gt;return pl(e),e.scope.on(),()=>{e.scope.off(),pl(t)}},Pu=()=>{Gt&&Gt.scope.off(),pl(null)};function Yg(e){return e.vnode.shapeFlag&4}let ds=!1;function zg(e,t=!1,n=!1){t&&Ru(t);const{props:r,children:i}=e.vnode,s=Yg(e);M0(e,r,s,t),R0(e,i,n||t);const o=s?J0(e,t):void 0;return t&&Ru(!1),o}function J0(e,t){const n=e.type;e.accessCache=Object.create(null),e.proxy=new Proxy(e.ctx,_u);const{setup:r}=n;if(r){jr();const i=e.setupContext=r.length>1?Xg(e):null,s=Pi(e),o=Cs(r,e,0,[e.props,i]),a=jl(o);if(Hr(),s(),(a||e.sp)&&!ii(e)&&Nf(e),a){if(o.then(Pu,Pu),t)return o.then(l=>{Lu(e,l,t)}).catch(l=>{Ui(l,e,0)});e.asyncDep=o}else Lu(e,o,t)}else Gg(e,t)}function Lu(e,t,n){Le(t)?e.type.__ssrInlineRender?e.ssrRender=t:e.render=t:at(t)&&(e.setupState=Cf(t)),Gg(e,n)}let ml,ku;function Kg(e){ml=e,ku=t=>{t.render._rc&&(t.withProxy=new Proxy(t.ctx,ZS))}}const Z0=()=>!ml;function Gg(e,t,n){const r=e.type;if(!e.render){if(!t&&ml&&!r.render){const i=r.template||kf(e).template;if(i){const{isCustomElement:s,compilerOptions:o}=e.appContext.config,{delimiters:a,compilerOptions:l}=r,c=Je(Je({isCustomElement:s,delimiters:a},o),l);r.render=ml(i,c)}}e.render=r.render||Bt,ku&&ku(e)}{const i=Pi(e);jr();try{f0(e)}finally{Hr(),i()}}}const Q0={get(e,t){return sn(e,"get",""),e[t]}};function Xg(e){const t=n=>{e.exposed=n||{}};return{attrs:new Proxy(e.attrs,Q0),slots:e.slots,emit:e.emit,expose:t}}function $o(e){return e.exposed?e.exposeProxy||(e.exposeProxy=new Proxy(Cf(Bm(e.exposed)),{get(t,n){if(n in t)return t[n];if(n in ro)return ro[n](e)},has(t,n){return n in t||n in ro}})):e.proxy}function Fu(e,t=!0){return Le(e)?e.displayName||e.name:e.name||t&&e.__name}function q0(e){return Le(e)&&"__vccOpts"in e}const Jg=(e,t)=>aS(e,t,ds);function $f(e,t,n){try{Do(-1);const r=arguments.length;return r===2?at(t)&&!be(t)?$r(t)?St(e,null,[t]):St(e,t):St(e,null,t):(r>3?n=Array.prototype.slice.call(arguments,2):r===3&&$r(n)&&(n=[n]),St(e,t,n))}finally{Do(1)}}function eT(){}function tT(e,t,n,r){const i=n[r];if(i&&Zg(i,e))return i;const s=t();return s.memo=e.slice(),s.cacheIndex=r,n[r]=s}function Zg(e,t){const n=e.memo;if(n.length!=t.length)return!1;for(let r=0;r0&&cn&&cn.push(e),!0}const Qg="3.5.25",nT=Bt,rT=gS,iT=qi,sT=Xm,oT={createComponentInstance:Wg,setupComponent:zg,renderComponentRoot:Va,setCurrentRenderingInstance:bo,isVNode:$r,normalizeVNode:_n,getComponentPublicInstance:$o,ensureValidVNode:Lf,pushWarningContext:dS,popWarningContext:hS},aT=oT,lT=null,cT=null,uT=null;/** +* @vue/runtime-dom v3.5.25 +* (c) 2018-present Yuxi (Evan) You and Vue contributors +* @license MIT +**/let Vu;const sh=typeof window<"u"&&window.trustedTypes;if(sh)try{Vu=sh.createPolicy("vue",{createHTML:e=>e})}catch{}const qg=Vu?e=>Vu.createHTML(e):e=>e,fT="http://www.w3.org/2000/svg",dT="http://www.w3.org/1998/Math/MathML",_r=typeof document<"u"?document:null,oh=_r&&_r.createElement("template"),ev={insert:(e,t,n)=>{t.insertBefore(e,n||null)},remove:e=>{const t=e.parentNode;t&&t.removeChild(e)},createElement:(e,t,n,r)=>{const i=t==="svg"?_r.createElementNS(fT,e):t==="mathml"?_r.createElementNS(dT,e):n?_r.createElement(e,{is:n}):_r.createElement(e);return e==="select"&&r&&r.multiple!=null&&i.setAttribute("multiple",r.multiple),i},createText:e=>_r.createTextNode(e),createComment:e=>_r.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>_r.querySelector(e),setScopeId(e,t){e.setAttribute(t,"")},insertStaticContent(e,t,n,r,i,s){const o=n?n.previousSibling:t.lastChild;if(i&&(i===s||i.nextSibling))for(;t.insertBefore(i.cloneNode(!0),n),!(i===s||!(i=i.nextSibling)););else{oh.innerHTML=qg(r==="svg"?`${e}`:r==="mathml"?`${e}`:e);const a=oh.content;if(r==="svg"||r==="mathml"){const l=a.firstChild;for(;l.firstChild;)a.appendChild(l.firstChild);a.removeChild(l)}t.insertBefore(a,n)}return[o?o.nextSibling:t.firstChild,n?n.previousSibling:t.lastChild]}},zr="transition",Is="animation",hs=Symbol("_vtc"),tv={name:String,type:String,css:{type:Boolean,default:!0},duration:[String,Number,Object],enterFromClass:String,enterActiveClass:String,enterToClass:String,appearFromClass:String,appearActiveClass:String,appearToClass:String,leaveFromClass:String,leaveActiveClass:String,leaveToClass:String},nv=Je({},Mf,tv),hT=e=>(e.displayName="Transition",e.props=nv,e),pT=hT((e,{slots:t})=>$f(ng,rv(e),t)),hi=(e,t=[])=>{be(e)?e.forEach(n=>n(...t)):e&&e(...t)},ah=e=>e?be(e)?e.some(t=>t.length>1):e.length>1:!1;function rv(e){const t={};for(const P in e)P in tv||(t[P]=e[P]);if(e.css===!1)return t;const{name:n="v",type:r,duration:i,enterFromClass:s=`${n}-enter-from`,enterActiveClass:o=`${n}-enter-active`,enterToClass:a=`${n}-enter-to`,appearFromClass:l=s,appearActiveClass:c=o,appearToClass:u=a,leaveFromClass:f=`${n}-leave-from`,leaveActiveClass:d=`${n}-leave-active`,leaveToClass:m=`${n}-leave-to`}=e,p=mT(i),g=p&&p[0],v=p&&p[1],{onBeforeEnter:T,onEnter:S,onEnterCancelled:E,onLeave:y,onLeaveCancelled:O,onBeforeAppear:M=T,onAppear:V=S,onAppearCancelled:j=E}=t,D=(P,k,$,q)=>{P._enterCancelled=q,Gr(P,k?u:a),Gr(P,k?c:o),$&&$()},x=(P,k)=>{P._isLeaving=!1,Gr(P,f),Gr(P,m),Gr(P,d),k&&k()},L=P=>(k,$)=>{const q=P?V:S,U=()=>D(k,P,$);hi(q,[k,U]),lh(()=>{Gr(k,P?l:s),fr(k,P?u:a),ah(q)||ch(k,r,g,U)})};return Je(t,{onBeforeEnter(P){hi(T,[P]),fr(P,s),fr(P,o)},onBeforeAppear(P){hi(M,[P]),fr(P,l),fr(P,c)},onEnter:L(!1),onAppear:L(!0),onLeave(P,k){P._isLeaving=!0;const $=()=>x(P,k);fr(P,f),P._enterCancelled?(fr(P,d),Bu(P)):(Bu(P),fr(P,d)),lh(()=>{P._isLeaving&&(Gr(P,f),fr(P,m),ah(y)||ch(P,r,v,$))}),hi(y,[P,$])},onEnterCancelled(P){D(P,!1,void 0,!0),hi(E,[P])},onAppearCancelled(P){D(P,!0,void 0,!0),hi(j,[P])},onLeaveCancelled(P){x(P),hi(O,[P])}})}function mT(e){if(e==null)return null;if(at(e))return[Uc(e.enter),Uc(e.leave)];{const t=Uc(e);return[t,t]}}function Uc(e){return po(e)}function fr(e,t){t.split(/\s+/).forEach(n=>n&&e.classList.add(n)),(e[hs]||(e[hs]=new Set)).add(t)}function Gr(e,t){t.split(/\s+/).forEach(r=>r&&e.classList.remove(r));const n=e[hs];n&&(n.delete(t),n.size||(e[hs]=void 0))}function lh(e){requestAnimationFrame(()=>{requestAnimationFrame(e)})}let gT=0;function ch(e,t,n,r){const i=e._endId=++gT,s=()=>{i===e._endId&&r()};if(n!=null)return setTimeout(s,n);const{type:o,timeout:a,propCount:l}=iv(e,t);if(!o)return r();const c=o+"end";let u=0;const f=()=>{e.removeEventListener(c,d),s()},d=m=>{m.target===e&&++u>=l&&f()};setTimeout(()=>{u(n[p]||"").split(", "),i=r(`${zr}Delay`),s=r(`${zr}Duration`),o=uh(i,s),a=r(`${Is}Delay`),l=r(`${Is}Duration`),c=uh(a,l);let u=null,f=0,d=0;t===zr?o>0&&(u=zr,f=o,d=s.length):t===Is?c>0&&(u=Is,f=c,d=l.length):(f=Math.max(o,c),u=f>0?o>c?zr:Is:null,d=u?u===zr?s.length:l.length:0);const m=u===zr&&/\b(?:transform|all)(?:,|$)/.test(r(`${zr}Property`).toString());return{type:u,timeout:f,propCount:d,hasTransform:m}}function uh(e,t){for(;e.lengthfh(n)+fh(e[r])))}function fh(e){return e==="auto"?0:Number(e.slice(0,-1).replace(",","."))*1e3}function Bu(e){return(e?e.ownerDocument:document).body.offsetHeight}function vT(e,t,n){const r=e[hs];r&&(t=(t?[t,...r]:[...r]).join(" ")),t==null?e.removeAttribute("class"):n?e.setAttribute("class",t):e.className=t}const gl=Symbol("_vod"),sv=Symbol("_vsh"),ov={name:"show",beforeMount(e,{value:t},{transition:n}){e[gl]=e.style.display==="none"?"":e.style.display,n&&t?n.beforeEnter(e):Rs(e,t)},mounted(e,{value:t},{transition:n}){n&&t&&n.enter(e)},updated(e,{value:t,oldValue:n},{transition:r}){!t!=!n&&(r?t?(r.beforeEnter(e),Rs(e,!0),r.enter(e)):r.leave(e,()=>{Rs(e,!1)}):Rs(e,t))},beforeUnmount(e,{value:t}){Rs(e,t)}};function Rs(e,t){e.style.display=t?e[gl]:"none",e[sv]=!t}function yT(){ov.getSSRProps=({value:e})=>{if(!e)return{style:{display:"none"}}}}const av=Symbol("");function ET(e){const t=Pn();if(!t)return;const n=t.ut=(i=e(t.proxy))=>{Array.from(document.querySelectorAll(`[data-v-owner="${t.uid}"]`)).forEach(s=>vl(s,i))},r=()=>{const i=e(t.proxy);t.ce?vl(t.ce,i):ju(t.subTree,i),n(i)};If(()=>{yo(r)}),Ho(()=>{ss(r,Bt,{flush:"post"});const i=new MutationObserver(r);i.observe(t.subTree.el.parentNode,{childList:!0}),ql(()=>i.disconnect())})}function ju(e,t){if(e.shapeFlag&128){const n=e.suspense;e=n.activeBranch,n.pendingBranch&&!n.isHydrating&&n.effects.push(()=>{ju(n.activeBranch,t)})}for(;e.component;)e=e.component.subTree;if(e.shapeFlag&1&&e.el)vl(e.el,t);else if(e.type===Ut)e.children.forEach(n=>ju(n,t));else if(e.type===Mi){let{el:n,anchor:r}=e;for(;n&&(vl(n,t),n!==r);)n=n.nextSibling}}function vl(e,t){if(e.nodeType===1){const n=e.style;let r="";for(const i in t){const s=Sm(t[i]);n.setProperty(`--${i}`,s),r+=`--${i}: ${s};`}n[av]=r}}const bT=/(?:^|;)\s*display\s*:/;function ST(e,t,n){const r=e.style,i=Be(n);let s=!1;if(n&&!i){if(t)if(Be(t))for(const o of t.split(";")){const a=o.slice(0,o.indexOf(":")).trim();n[a]==null&&ja(r,a,"")}else for(const o in t)n[o]==null&&ja(r,o,"");for(const o in n)o==="display"&&(s=!0),ja(r,o,n[o])}else if(i){if(t!==n){const o=r[av];o&&(n+=";"+o),r.cssText=n,s=bT.test(n)}}else t&&e.removeAttribute("style");gl in e&&(e[gl]=s?r.display:"",e[sv]&&(r.display="none"))}const dh=/\s*!important$/;function ja(e,t,n){if(be(n))n.forEach(r=>ja(e,t,r));else if(n==null&&(n=""),t.startsWith("--"))e.setProperty(t,n);else{const r=TT(e,t);dh.test(n)?e.setProperty(on(r),n.replace(dh,""),"important"):e[r]=n}}const hh=["Webkit","Moz","ms"],$c={};function TT(e,t){const n=$c[t];if(n)return n;let r=mt(t);if(r!=="filter"&&r in e)return $c[t]=r;r=fi(r);for(let i=0;iWc||(OT.then(()=>Wc=0),Wc=Date.now());function _T(e,t){const n=r=>{if(!r._vts)r._vts=Date.now();else if(r._vts<=n.attached)return;Xn(MT(r,n.value),t,5,[r])};return n.value=e,n.attached=AT(),n}function MT(e,t){if(be(t)){const n=e.stopImmediatePropagation;return e.stopImmediatePropagation=()=>{n.call(e),e._stopped=!0},t.map(r=>i=>!i._stopped&&r&&r(i))}else return t}const Eh=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&e.charCodeAt(2)>96&&e.charCodeAt(2)<123,lv=(e,t,n,r,i,s)=>{const o=i==="svg";t==="class"?vT(e,r,o):t==="style"?ST(e,n,r):ci(t)?Vl(t)||DT(e,t,n,r,s):(t[0]==="."?(t=t.slice(1),!0):t[0]==="^"?(t=t.slice(1),!1):xT(e,t,r,o))?(gh(e,t,r),!e.tagName.includes("-")&&(t==="value"||t==="checked"||t==="selected")&&mh(e,t,r,o,s,t!=="value")):e._isVueCE&&(/[A-Z]/.test(t)||!Be(r))?gh(e,mt(t),r,s,t):(t==="true-value"?e._trueValue=r:t==="false-value"&&(e._falseValue=r),mh(e,t,r,o))};function xT(e,t,n,r){if(r)return!!(t==="innerHTML"||t==="textContent"||t in e&&Eh(t)&&Le(n));if(t==="spellcheck"||t==="draggable"||t==="translate"||t==="autocorrect"||t==="sandbox"&&e.tagName==="IFRAME"||t==="form"||t==="list"&&e.tagName==="INPUT"||t==="type"&&e.tagName==="TEXTAREA")return!1;if(t==="width"||t==="height"){const i=e.tagName;if(i==="IMG"||i==="VIDEO"||i==="CANVAS"||i==="SOURCE")return!1}return Eh(t)&&Be(n)?!1:t in e}const bh={};function cv(e,t,n){let r=xf(e,t);Ro(r)&&(r=Je({},r,t));class i extends nc{constructor(o){super(r,o,n)}}return i.def=r,i}const NT=(e,t)=>cv(e,t,Sv),IT=typeof HTMLElement<"u"?HTMLElement:class{};class nc extends IT{constructor(t,n={},r=bl){super(),this._def=t,this._props=n,this._createApp=r,this._isVueCE=!0,this._instance=null,this._app=null,this._nonce=this._def.nonce,this._connected=!1,this._resolved=!1,this._patching=!1,this._dirty=!1,this._numberProps=null,this._styleChildren=new WeakSet,this._ob=null,this.shadowRoot&&r!==bl?this._root=this.shadowRoot:t.shadowRoot!==!1?(this.attachShadow(Je({},t.shadowRootOptions,{mode:"open"})),this._root=this.shadowRoot):this._root=this}connectedCallback(){if(!this.isConnected)return;!this.shadowRoot&&!this._resolved&&this._parseSlots(),this._connected=!0;let t=this;for(;t=t&&(t.parentNode||t.host);)if(t instanceof nc){this._parent=t;break}this._instance||(this._resolved?this._mount(this._def):t&&t._pendingResolve?this._pendingResolve=t._pendingResolve.then(()=>{this._pendingResolve=void 0,this._resolveDef()}):this._resolveDef())}_setParent(t=this._parent){t&&(this._instance.parent=t._instance,this._inheritParentContext(t))}_inheritParentContext(t=this._parent){t&&this._app&&Object.setPrototypeOf(this._app._context.provides,t._instance.provides)}disconnectedCallback(){this._connected=!1,Kl(()=>{this._connected||(this._ob&&(this._ob.disconnect(),this._ob=null),this._app&&this._app.unmount(),this._instance&&(this._instance.ce=void 0),this._app=this._instance=null,this._teleportTargets&&(this._teleportTargets.clear(),this._teleportTargets=void 0))})}_processMutations(t){for(const n of t)this._setAttr(n.attributeName)}_resolveDef(){if(this._pendingResolve)return;for(let r=0;r{this._resolved=!0,this._pendingResolve=void 0;const{props:s,styles:o}=r;let a;if(s&&!be(s))for(const l in s){const c=s[l];(c===Number||c&&c.type===Number)&&(l in this._props&&(this._props[l]=po(this._props[l])),(a||(a=Object.create(null)))[mt(l)]=!0)}this._numberProps=a,this._resolveProps(r),this.shadowRoot&&this._applyStyles(o),this._mount(r)},n=this._def.__asyncLoader;n?this._pendingResolve=n().then(r=>{r.configureApp=this._def.configureApp,t(this._def=r,!0)}):t(this._def)}_mount(t){this._app=this._createApp(t),this._inheritParentContext(),t.configureApp&&t.configureApp(this._app),this._app._ceVNode=this._createVNode(),this._app.mount(this._root);const n=this._instance&&this._instance.exposed;if(n)for(const r in n)ot(this,r)||Object.defineProperty(this,r,{get:()=>Bo(n[r])})}_resolveProps(t){const{props:n}=t,r=be(n)?n:Object.keys(n||{});for(const i of Object.keys(this))i[0]!=="_"&&r.includes(i)&&this._setProp(i,this[i]);for(const i of r.map(mt))Object.defineProperty(this,i,{get(){return this._getProp(i)},set(s){this._setProp(i,s,!0,!this._patching)}})}_setAttr(t){if(t.startsWith("data-v-"))return;const n=this.hasAttribute(t);let r=n?this.getAttribute(t):bh;const i=mt(t);n&&this._numberProps&&this._numberProps[i]&&(r=po(r)),this._setProp(i,r,!1,!0)}_getProp(t){return this._props[t]}_setProp(t,n,r=!0,i=!1){if(n!==this._props[t]&&(this._dirty=!0,n===bh?delete this._props[t]:(this._props[t]=n,t==="key"&&this._app&&(this._app._ceVNode.key=n)),i&&this._instance&&this._update(),r)){const s=this._ob;s&&(this._processMutations(s.takeRecords()),s.disconnect()),n===!0?this.setAttribute(on(t),""):typeof n=="string"||typeof n=="number"?this.setAttribute(on(t),n+""):n||this.removeAttribute(on(t)),s&&s.observe(this,{attributes:!0})}}_update(){const t=this._createVNode();this._app&&(t.appContext=this._app._context),bv(t,this._root)}_createVNode(){const t={};this.shadowRoot||(t.onVnodeMounted=t.onVnodeUpdated=this._renderSlots.bind(this));const n=St(this._def,Je(t,this._props));return this._instance||(n.ce=r=>{this._instance=r,r.ce=this,r.isCE=!0;const i=(s,o)=>{this.dispatchEvent(new CustomEvent(s,Ro(o[0])?Je({detail:o},o[0]):{detail:o}))};r.emit=(s,...o)=>{i(s,o),on(s)!==s&&i(on(s),o)},this._setParent()}),n}_applyStyles(t,n){if(!t)return;if(n){if(n===this._def||this._styleChildren.has(n))return;this._styleChildren.add(n)}const r=this._nonce;for(let i=t.length-1;i>=0;i--){const s=document.createElement("style");r&&s.setAttribute("nonce",r),s.textContent=t[i],this.shadowRoot.prepend(s)}}_parseSlots(){const t=this._slots={};let n;for(;n=this.firstChild;){const r=n.nodeType===1&&n.getAttribute("slot")||"default";(t[r]||(t[r]=[])).push(n),this.removeChild(n)}}_renderSlots(){const t=this._getSlots(),n=this._instance.type.__scopeId;for(let r=0;r(delete e.props.mode,e),kT=LT({name:"TransitionGroup",props:Je({},nv,{tag:String,moveClass:String}),setup(e,{slots:t}){const n=Pn(),r=_f();let i,s;return Zl(()=>{if(!i.length)return;const o=e.moveClass||`${e.name||"v"}-move`;if(!HT(i[0].el,n.vnode.el,o)){i=[];return}i.forEach(VT),i.forEach(BT);const a=i.filter(jT);Bu(n.vnode.el),a.forEach(l=>{const c=l.el,u=c.style;fr(c,o),u.transform=u.webkitTransform=u.transitionDuration="";const f=c[yl]=d=>{d&&d.target!==c||(!d||d.propertyName.endsWith("transform"))&&(c.removeEventListener("transitionend",f),c[yl]=null,Gr(c,o))};c.addEventListener("transitionend",f)}),i=[]}),()=>{const o=it(e),a=rv(o);let l=o.tag||Ut;if(i=[],s)for(let c=0;c{a.split(/\s+/).forEach(l=>l&&r.classList.remove(l))}),n.split(/\s+/).forEach(a=>a&&r.classList.add(a)),r.style.display="none";const s=t.nodeType===1?t:t.parentNode;s.appendChild(r);const{hasTransform:o}=iv(r);return s.removeChild(r),o}const ai=e=>{const t=e.props["onUpdate:modelValue"]||!1;return be(t)?n=>Oi(t,n):t};function UT(e){e.target.composing=!0}function Th(e){const t=e.target;t.composing&&(t.composing=!1,t.dispatchEvent(new Event("input")))}const Kn=Symbol("_assign");function wh(e,t,n){return t&&(e=e.trim()),n&&(e=Lo(e)),e}const El={created(e,{modifiers:{lazy:t,trim:n,number:r}},i){e[Kn]=ai(i);const s=r||i.props&&i.props.type==="number";Ir(e,t?"change":"input",o=>{o.target.composing||e[Kn](wh(e.value,n,s))}),(n||s)&&Ir(e,"change",()=>{e.value=wh(e.value,n,s)}),t||(Ir(e,"compositionstart",UT),Ir(e,"compositionend",Th),Ir(e,"change",Th))},mounted(e,{value:t}){e.value=t??""},beforeUpdate(e,{value:t,oldValue:n,modifiers:{lazy:r,trim:i,number:s}},o){if(e[Kn]=ai(o),e.composing)return;const a=(s||e.type==="number")&&!/^0\d/.test(e.value)?Lo(e.value):e.value,l=t??"";a!==l&&(document.activeElement===e&&e.type!=="range"&&(r&&t===n||i&&e.value.trim()===l)||(e.value=l))}},Wf={deep:!0,created(e,t,n){e[Kn]=ai(n),Ir(e,"change",()=>{const r=e._modelValue,i=ps(e),s=e.checked,o=e[Kn];if(be(r)){const a=Fo(r,i),l=a!==-1;if(s&&!l)o(r.concat(i));else if(!s&&l){const c=[...r];c.splice(a,1),o(c)}}else if(ui(r)){const a=new Set(r);s?a.add(i):a.delete(i),o(a)}else o(pv(e,s))})},mounted:Dh,beforeUpdate(e,t,n){e[Kn]=ai(n),Dh(e,t,n)}};function Dh(e,{value:t,oldValue:n},r){e._modelValue=t;let i;if(be(t))i=Fo(t,r.props.value)>-1;else if(ui(t))i=t.has(r.props.value);else{if(t===n)return;i=Br(t,pv(e,!0))}e.checked!==i&&(e.checked=i)}const Yf={created(e,{value:t},n){e.checked=Br(t,n.props.value),e[Kn]=ai(n),Ir(e,"change",()=>{e[Kn](ps(e))})},beforeUpdate(e,{value:t,oldValue:n},r){e[Kn]=ai(r),t!==n&&(e.checked=Br(t,r.props.value))}},hv={deep:!0,created(e,{value:t,modifiers:{number:n}},r){const i=ui(t);Ir(e,"change",()=>{const s=Array.prototype.filter.call(e.options,o=>o.selected).map(o=>n?Lo(ps(o)):ps(o));e[Kn](e.multiple?i?new Set(s):s:s[0]),e._assigning=!0,Kl(()=>{e._assigning=!1})}),e[Kn]=ai(r)},mounted(e,{value:t}){Ch(e,t)},beforeUpdate(e,t,n){e[Kn]=ai(n)},updated(e,{value:t}){e._assigning||Ch(e,t)}};function Ch(e,t){const n=e.multiple,r=be(t);if(!(n&&!r&&!ui(t))){for(let i=0,s=e.options.length;iString(c)===String(a)):o.selected=Fo(t,a)>-1}else o.selected=t.has(a);else if(Br(ps(o),t)){e.selectedIndex!==i&&(e.selectedIndex=i);return}}!n&&e.selectedIndex!==-1&&(e.selectedIndex=-1)}}function ps(e){return"_value"in e?e._value:e.value}function pv(e,t){const n=t?"_trueValue":"_falseValue";return n in e?e[n]:t}const mv={created(e,t,n){ga(e,t,n,null,"created")},mounted(e,t,n){ga(e,t,n,null,"mounted")},beforeUpdate(e,t,n,r){ga(e,t,n,r,"beforeUpdate")},updated(e,t,n,r){ga(e,t,n,r,"updated")}};function gv(e,t){switch(e){case"SELECT":return hv;case"TEXTAREA":return El;default:switch(t){case"checkbox":return Wf;case"radio":return Yf;default:return El}}}function ga(e,t,n,r,i){const o=gv(e.tagName,n.props&&n.props.type)[i];o&&o(e,t,n,r)}function $T(){El.getSSRProps=({value:e})=>({value:e}),Yf.getSSRProps=({value:e},t)=>{if(t.props&&Br(t.props.value,e))return{checked:!0}},Wf.getSSRProps=({value:e},t)=>{if(be(e)){if(t.props&&Fo(e,t.props.value)>-1)return{checked:!0}}else if(ui(e)){if(t.props&&e.has(t.props.value))return{checked:!0}}else if(e)return{checked:!0}},mv.getSSRProps=(e,t)=>{if(typeof t.type!="string")return;const n=gv(t.type.toUpperCase(),t.props&&t.props.type);if(n.getSSRProps)return n.getSSRProps(e,t)}}const WT=["ctrl","shift","alt","meta"],YT={stop:e=>e.stopPropagation(),prevent:e=>e.preventDefault(),self:e=>e.target!==e.currentTarget,ctrl:e=>!e.ctrlKey,shift:e=>!e.shiftKey,alt:e=>!e.altKey,meta:e=>!e.metaKey,left:e=>"button"in e&&e.button!==0,middle:e=>"button"in e&&e.button!==1,right:e=>"button"in e&&e.button!==2,exact:(e,t)=>WT.some(n=>e[`${n}Key`]&&!t.includes(n))},zT=(e,t)=>{const n=e._withMods||(e._withMods={}),r=t.join(".");return n[r]||(n[r]=(i,...s)=>{for(let o=0;o{const n=e._withKeys||(e._withKeys={}),r=t.join(".");return n[r]||(n[r]=i=>{if(!("key"in i))return;const s=on(i.key);if(t.some(o=>o===s||KT[o]===s))return e(i)})},vv=Je({patchProp:lv},ev);let oo,Oh=!1;function yv(){return oo||(oo=Ig(vv))}function Ev(){return oo=Oh?oo:Rg(vv),Oh=!0,oo}const bv=(...e)=>{yv().render(...e)},XT=(...e)=>{Ev().hydrate(...e)},bl=(...e)=>{const t=yv().createApp(...e),{mount:n}=t;return t.mount=r=>{const i=wv(r);if(!i)return;const s=t._component;!Le(s)&&!s.render&&!s.template&&(s.template=i.innerHTML),i.nodeType===1&&(i.textContent="");const o=n(i,!1,Tv(i));return i instanceof Element&&(i.removeAttribute("v-cloak"),i.setAttribute("data-v-app","")),o},t},Sv=(...e)=>{const t=Ev().createApp(...e),{mount:n}=t;return t.mount=r=>{const i=wv(r);if(i)return n(i,!0,Tv(i))},t};function Tv(e){if(e instanceof SVGElement)return"svg";if(typeof MathMLElement=="function"&&e instanceof MathMLElement)return"mathml"}function wv(e){return Be(e)?document.querySelector(e):e}let Ah=!1;const JT=()=>{Ah||(Ah=!0,$T(),yT())},Dv=Object.freeze(Object.defineProperty({__proto__:null,BaseTransition:ng,BaseTransitionPropsValidators:Mf,Comment:It,DeprecationTypes:uT,EffectScope:Sf,ErrorCodes:mS,ErrorTypeStrings:rT,Fragment:Ut,KeepAlive:US,ReactiveEffect:mo,Static:Mi,Suspense:F0,Teleport:DS,Text:si,TrackOpTypes:lS,Transition:pT,TransitionGroup:FT,TriggerOpTypes:cS,VueElement:nc,assertNumber:pS,callWithAsyncErrorHandling:Xn,callWithErrorHandling:Cs,camelize:mt,capitalize:fi,cloneVNode:yr,compatUtils:cT,computed:Jg,createApp:bl,createBlock:hl,createCommentVNode:K0,createElementBlock:$0,createElementVNode:jf,createHydrationRenderer:Rg,createPropsRestProxy:c0,createRenderer:Ig,createSSRApp:Sv,createSlots:GS,createStaticVNode:z0,createTextVNode:Hf,createVNode:St,customRef:Um,defineAsyncComponent:jS,defineComponent:xf,defineCustomElement:cv,defineEmits:qS,defineExpose:e0,defineModel:r0,defineOptions:t0,defineProps:QS,defineSSRCustomElement:NT,defineSlots:n0,devtools:iT,effect:xb,effectScope:Ab,getCurrentInstance:Pn,getCurrentScope:Tm,getCurrentWatcher:uS,getTransitionRawChildren:Xl,guardReactiveProps:Ug,h:$f,handleError:Ui,hasInjectionContext:y0,hydrate:XT,hydrateOnIdle:PS,hydrateOnInteraction:VS,hydrateOnMediaQuery:FS,hydrateOnVisible:kS,initCustomFormatter:eT,initDirectivesForSSR:JT,inject:io,isMemoSame:Zg,isProxy:Vo,isReactive:Lr,isReadonly:vr,isRef:jt,isRuntimeOnly:Z0,isShallow:Nn,isVNode:$r,markRaw:Bm,mergeDefaults:a0,mergeModels:l0,mergeProps:$g,nextTick:Kl,nodeOps:ev,normalizeClass:Ds,normalizeProps:fm,normalizeStyle:ws,onActivated:ig,onBeforeMount:ag,onBeforeUnmount:Ql,onBeforeUpdate:If,onDeactivated:sg,onErrorCaptured:fg,onMounted:Ho,onRenderTracked:ug,onRenderTriggered:cg,onScopeDispose:_b,onServerPrefetch:lg,onUnmounted:ql,onUpdated:Zl,onWatcherCleanup:Wm,openBlock:wo,patchProp:lv,popScopeId:bS,provide:vg,proxyRefs:Cf,pushScopeId:ES,queuePostFlushCb:yo,reactive:Yl,readonly:sl,ref:to,registerRuntimeCompiler:Kg,render:bv,renderList:KS,renderSlot:XS,resolveComponent:dg,resolveDirective:zS,resolveDynamicComponent:YS,resolveFilter:lT,resolveTransitionHooks:fs,setBlockTracking:Do,setDevtoolsHook:sT,setTransitionHooks:Ur,shallowReactive:Vm,shallowReadonly:Jb,shallowRef:jm,ssrContextKey:yg,ssrUtils:aT,stop:Nb,toDisplayString:bf,toHandlerKey:Ci,toHandlers:JS,toRaw:it,toRef:sS,toRefs:nS,toValue:qb,transformVNodeArgs:W0,triggerRef:Qb,unref:Bo,useAttrs:o0,useCssModule:PT,useCssVars:ET,useHost:uv,useId:OS,useModel:T0,useSSRContext:Eg,useShadowRoot:RT,useSlots:s0,useTemplateRef:AS,useTransitionState:_f,vModelCheckbox:Wf,vModelDynamic:mv,vModelRadio:Yf,vModelSelect:hv,vModelText:El,vShow:ov,version:Qg,warn:nT,watch:ss,watchEffect:E0,watchPostEffect:b0,watchSyncEffect:bg,withAsyncContext:u0,withCtx:Af,withDefaults:i0,withDirectives:TS,withKeys:GT,withMemo:tT,withModifiers:zT,withScopeId:SS},Symbol.toStringTag,{value:"Module"}));/** +* @vue/compiler-core v3.5.25 +* (c) 2018-present Yuxi (Evan) You and Vue contributors +* @license MIT +**/const ms=Symbol(""),as=Symbol(""),rc=Symbol(""),Co=Symbol(""),zf=Symbol(""),li=Symbol(""),Kf=Symbol(""),Gf=Symbol(""),ic=Symbol(""),sc=Symbol(""),Os=Symbol(""),oc=Symbol(""),Xf=Symbol(""),ac=Symbol(""),lc=Symbol(""),cc=Symbol(""),uc=Symbol(""),fc=Symbol(""),dc=Symbol(""),Jf=Symbol(""),Zf=Symbol(""),Wo=Symbol(""),Oo=Symbol(""),hc=Symbol(""),pc=Symbol(""),gs=Symbol(""),As=Symbol(""),mc=Symbol(""),Sl=Symbol(""),Cv=Symbol(""),Tl=Symbol(""),Ao=Symbol(""),Ov=Symbol(""),Av=Symbol(""),gc=Symbol(""),_v=Symbol(""),Mv=Symbol(""),vc=Symbol(""),Qf=Symbol(""),Li={[ms]:"Fragment",[as]:"Teleport",[rc]:"Suspense",[Co]:"KeepAlive",[zf]:"BaseTransition",[li]:"openBlock",[Kf]:"createBlock",[Gf]:"createElementBlock",[ic]:"createVNode",[sc]:"createElementVNode",[Os]:"createCommentVNode",[oc]:"createTextVNode",[Xf]:"createStaticVNode",[ac]:"resolveComponent",[lc]:"resolveDynamicComponent",[cc]:"resolveDirective",[uc]:"resolveFilter",[fc]:"withDirectives",[dc]:"renderList",[Jf]:"renderSlot",[Zf]:"createSlots",[Wo]:"toDisplayString",[Oo]:"mergeProps",[hc]:"normalizeClass",[pc]:"normalizeStyle",[gs]:"normalizeProps",[As]:"guardReactiveProps",[mc]:"toHandlers",[Sl]:"camelize",[Cv]:"capitalize",[Tl]:"toHandlerKey",[Ao]:"setBlockTracking",[Ov]:"pushScopeId",[Av]:"popScopeId",[gc]:"withCtx",[_v]:"unref",[Mv]:"isRef",[vc]:"withMemo",[Qf]:"isMemoSame"};function xv(e){Object.getOwnPropertySymbols(e).forEach(t=>{Li[t]=e[t]})}const ZT={HTML:0,0:"HTML",SVG:1,1:"SVG",MATH_ML:2,2:"MATH_ML"},QT={ROOT:0,0:"ROOT",ELEMENT:1,1:"ELEMENT",TEXT:2,2:"TEXT",COMMENT:3,3:"COMMENT",SIMPLE_EXPRESSION:4,4:"SIMPLE_EXPRESSION",INTERPOLATION:5,5:"INTERPOLATION",ATTRIBUTE:6,6:"ATTRIBUTE",DIRECTIVE:7,7:"DIRECTIVE",COMPOUND_EXPRESSION:8,8:"COMPOUND_EXPRESSION",IF:9,9:"IF",IF_BRANCH:10,10:"IF_BRANCH",FOR:11,11:"FOR",TEXT_CALL:12,12:"TEXT_CALL",VNODE_CALL:13,13:"VNODE_CALL",JS_CALL_EXPRESSION:14,14:"JS_CALL_EXPRESSION",JS_OBJECT_EXPRESSION:15,15:"JS_OBJECT_EXPRESSION",JS_PROPERTY:16,16:"JS_PROPERTY",JS_ARRAY_EXPRESSION:17,17:"JS_ARRAY_EXPRESSION",JS_FUNCTION_EXPRESSION:18,18:"JS_FUNCTION_EXPRESSION",JS_CONDITIONAL_EXPRESSION:19,19:"JS_CONDITIONAL_EXPRESSION",JS_CACHE_EXPRESSION:20,20:"JS_CACHE_EXPRESSION",JS_BLOCK_STATEMENT:21,21:"JS_BLOCK_STATEMENT",JS_TEMPLATE_LITERAL:22,22:"JS_TEMPLATE_LITERAL",JS_IF_STATEMENT:23,23:"JS_IF_STATEMENT",JS_ASSIGNMENT_EXPRESSION:24,24:"JS_ASSIGNMENT_EXPRESSION",JS_SEQUENCE_EXPRESSION:25,25:"JS_SEQUENCE_EXPRESSION",JS_RETURN_STATEMENT:26,26:"JS_RETURN_STATEMENT"},qT={ELEMENT:0,0:"ELEMENT",COMPONENT:1,1:"COMPONENT",SLOT:2,2:"SLOT",TEMPLATE:3,3:"TEMPLATE"},ew={NOT_CONSTANT:0,0:"NOT_CONSTANT",CAN_SKIP_PATCH:1,1:"CAN_SKIP_PATCH",CAN_CACHE:2,2:"CAN_CACHE",CAN_STRINGIFY:3,3:"CAN_STRINGIFY"},Ht={start:{line:1,column:1,offset:0},end:{line:1,column:1,offset:0},source:""};function Nv(e,t=""){return{type:0,source:t,children:e,helpers:new Set,components:[],directives:[],hoists:[],imports:[],cached:[],temps:0,codegenNode:void 0,loc:Ht}}function vs(e,t,n,r,i,s,o,a=!1,l=!1,c=!1,u=Ht){return e&&(a?(e.helper(li),e.helper(Vi(e.inSSR,c))):e.helper(Fi(e.inSSR,c)),o&&e.helper(fc)),{type:13,tag:t,props:n,children:r,patchFlag:i,dynamicProps:s,directives:o,isBlock:a,disableTracking:l,isComponent:c,loc:u}}function oi(e,t=Ht){return{type:17,loc:t,elements:e}}function Un(e,t=Ht){return{type:15,loc:t,properties:e}}function Rt(e,t){return{type:16,loc:Ht,key:Be(e)?We(e,!0):e,value:t}}function We(e,t=!1,n=Ht,r=0){return{type:4,loc:n,content:e,isStatic:t,constType:t?3:r}}function tw(e,t){return{type:5,loc:t,content:Be(e)?We(e,!1,t):e}}function Gn(e,t=Ht){return{type:8,loc:t,children:e}}function Vt(e,t=[],n=Ht){return{type:14,loc:n,callee:e,arguments:t}}function ki(e,t=void 0,n=!1,r=!1,i=Ht){return{type:18,params:e,returns:t,newline:n,isSlot:r,loc:i}}function wl(e,t,n,r=!0){return{type:19,test:e,consequent:t,alternate:n,newline:r,loc:Ht}}function Iv(e,t,n=!1,r=!1){return{type:20,index:e,value:t,needPauseTracking:n,inVOnce:r,needArraySpread:!1,loc:Ht}}function Rv(e){return{type:21,body:e,loc:Ht}}function nw(e){return{type:22,elements:e,loc:Ht}}function rw(e,t,n){return{type:23,test:e,consequent:t,alternate:n,loc:Ht}}function iw(e,t){return{type:24,left:e,right:t,loc:Ht}}function sw(e){return{type:25,expressions:e,loc:Ht}}function ow(e){return{type:26,returns:e,loc:Ht}}function Fi(e,t){return e||t?ic:sc}function Vi(e,t){return e||t?Kf:Gf}function yc(e,{helper:t,removeHelper:n,inSSR:r}){e.isBlock||(e.isBlock=!0,n(Fi(r,e.isComponent)),t(li),t(Vi(r,e.isComponent)))}const _h=new Uint8Array([123,123]),Mh=new Uint8Array([125,125]);function xh(e){return e>=97&&e<=122||e>=65&&e<=90}function Hn(e){return e===32||e===10||e===9||e===12||e===13}function Kr(e){return e===47||e===62||Hn(e)}function Dl(e){const t=new Uint8Array(e.length);for(let n=0;n=0;i--){const s=this.newlines[i];if(t>s){n=i+2,r=t-s;break}}return{column:r,line:n,offset:t}}peek(){return this.buffer.charCodeAt(this.index+1)}stateText(t){t===60?(this.index>this.sectionStart&&this.cbs.ontext(this.sectionStart,this.index),this.state=5,this.sectionStart=this.index):!this.inVPre&&t===this.delimiterOpen[0]&&(this.state=2,this.delimiterIndex=0,this.stateInterpolationOpen(t))}stateInterpolationOpen(t){if(t===this.delimiterOpen[this.delimiterIndex])if(this.delimiterIndex===this.delimiterOpen.length-1){const n=this.index+1-this.delimiterOpen.length;n>this.sectionStart&&this.cbs.ontext(this.sectionStart,n),this.state=3,this.sectionStart=n}else this.delimiterIndex++;else this.inRCDATA?(this.state=32,this.stateInRCDATA(t)):(this.state=1,this.stateText(t))}stateInterpolation(t){t===this.delimiterClose[0]&&(this.state=4,this.delimiterIndex=0,this.stateInterpolationClose(t))}stateInterpolationClose(t){t===this.delimiterClose[this.delimiterIndex]?this.delimiterIndex===this.delimiterClose.length-1?(this.cbs.oninterpolation(this.sectionStart,this.index+1),this.inRCDATA?this.state=32:this.state=1,this.sectionStart=this.index+1):this.delimiterIndex++:(this.state=3,this.stateInterpolation(t))}stateSpecialStartSequence(t){const n=this.sequenceIndex===this.currentSequence.length;if(!(n?Kr(t):(t|32)===this.currentSequence[this.sequenceIndex]))this.inRCDATA=!1;else if(!n){this.sequenceIndex++;return}this.sequenceIndex=0,this.state=6,this.stateInTagName(t)}stateInRCDATA(t){if(this.sequenceIndex===this.currentSequence.length){if(t===62||Hn(t)){const n=this.index-this.currentSequence.length;if(this.sectionStart=t||(this.state===28?this.currentSequence===Qt.CdataEnd?this.cbs.oncdata(this.sectionStart,t):this.cbs.oncomment(this.sectionStart,t):this.state===6||this.state===11||this.state===18||this.state===17||this.state===12||this.state===13||this.state===14||this.state===15||this.state===16||this.state===20||this.state===19||this.state===21||this.state===9||this.cbs.ontext(this.sectionStart,t))}emitCodePoint(t,n){}}const lw={COMPILER_IS_ON_ELEMENT:"COMPILER_IS_ON_ELEMENT",COMPILER_V_BIND_SYNC:"COMPILER_V_BIND_SYNC",COMPILER_V_BIND_OBJECT_ORDER:"COMPILER_V_BIND_OBJECT_ORDER",COMPILER_V_ON_NATIVE:"COMPILER_V_ON_NATIVE",COMPILER_V_IF_V_FOR_PRECEDENCE:"COMPILER_V_IF_V_FOR_PRECEDENCE",COMPILER_NATIVE_TEMPLATE:"COMPILER_NATIVE_TEMPLATE",COMPILER_INLINE_TEMPLATE:"COMPILER_INLINE_TEMPLATE",COMPILER_FILTERS:"COMPILER_FILTERS"},cw={COMPILER_IS_ON_ELEMENT:{message:'Platform-native elements with "is" prop will no longer be treated as components in Vue 3 unless the "is" value is explicitly prefixed with "vue:".',link:"https://v3-migration.vuejs.org/breaking-changes/custom-elements-interop.html"},COMPILER_V_BIND_SYNC:{message:e=>`.sync modifier for v-bind has been removed. Use v-model with argument instead. \`v-bind:${e}.sync\` should be changed to \`v-model:${e}\`.`,link:"https://v3-migration.vuejs.org/breaking-changes/v-model.html"},COMPILER_V_BIND_OBJECT_ORDER:{message:'v-bind="obj" usage is now order sensitive and behaves like JavaScript object spread: it will now overwrite an existing non-mergeable attribute that appears before v-bind in the case of conflict. To retain 2.x behavior, move v-bind to make it the first attribute. You can also suppress this warning if the usage is intended.',link:"https://v3-migration.vuejs.org/breaking-changes/v-bind.html"},COMPILER_V_ON_NATIVE:{message:".native modifier for v-on has been removed as is no longer necessary.",link:"https://v3-migration.vuejs.org/breaking-changes/v-on-native-modifier-removed.html"},COMPILER_V_IF_V_FOR_PRECEDENCE:{message:"v-if / v-for precedence when used on the same element has changed in Vue 3: v-if now takes higher precedence and will no longer have access to v-for scope variables. It is best to avoid the ambiguity with +
    + + + +
    + + + + + + + + + + stopPush(); endif; ?> + + hasRenderedOnce('b8d4a7f4-dd1d-4990-a38b-0acd9fb5c6ca')): $__env->markAsRenderedOnce('b8d4a7f4-dd1d-4990-a38b-0acd9fb5c6ca'); +$__env->startPush('styles'); ?> + + stopPush(); endif; ?> + renderComponent(); ?> + + + + + + + + + + \ No newline at end of file diff --git a/storage/framework/views/5931db70af1cddda7346ccc0f7cc9a7f.php b/storage/framework/views/5931db70af1cddda7346ccc0f7cc9a7f.php new file mode 100755 index 0000000..913316e --- /dev/null +++ b/storage/framework/views/5931db70af1cddda7346ccc0f7cc9a7f.php @@ -0,0 +1,30 @@ +isEmpty())): ?> + + + \ No newline at end of file diff --git a/storage/framework/views/5953494c629bb665f26aa6b07777aa87.php b/storage/framework/views/5953494c629bb665f26aa6b07777aa87.php new file mode 100755 index 0000000..85d2b88 --- /dev/null +++ b/storage/framework/views/5953494c629bb665f26aa6b07777aa87.php @@ -0,0 +1,21 @@ +
    +
    +
    +
    + +
    +
    + +
    +
    +
    +
    +
    + +
    +
    +
    +
    +
    +
    +
    \ No newline at end of file diff --git a/storage/framework/views/5a4cf762ce54bc823dbc2a8be5808bca.php b/storage/framework/views/5a4cf762ce54bc823dbc2a8be5808bca.php new file mode 100755 index 0000000..1aaf907 --- /dev/null +++ b/storage/framework/views/5a4cf762ce54bc823dbc2a8be5808bca.php @@ -0,0 +1,18 @@ +isEmpty())): ?> + + + \ No newline at end of file diff --git a/storage/framework/views/5b1d7562a1e69a71ca4d5fd7543b436c.php b/storage/framework/views/5b1d7562a1e69a71ca4d5fd7543b436c.php new file mode 100755 index 0000000..f27f3f7 --- /dev/null +++ b/storage/framework/views/5b1d7562a1e69a71ca4d5fd7543b436c.php @@ -0,0 +1,21 @@ + + + 'admin::components.form.control-group.controls.inline.datetime','data' => [':name' => '\''.e($attribute->code).'\'',':value' => '\''.e($value).'\'','rules' => 'required','position' => 'left','label' => $attribute->name,':errors' => 'errors','placeholder' => $attribute->name,'url' => $url,'allowEdit' => $allowEdit]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.controls.inline.datetime'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([':name' => '\''.e($attribute->code).'\'',':value' => '\''.e($value).'\'','rules' => 'required','position' => 'left','label' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($attribute->name),':errors' => 'errors','placeholder' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($attribute->name),'url' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($url),'allow-edit' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($allowEdit)]); ?> +renderComponent(); ?> + + + + + + + + + + \ No newline at end of file diff --git a/storage/framework/views/5b5bd30afeabd8a4a991c7754401bbb9.php b/storage/framework/views/5b5bd30afeabd8a4a991c7754401bbb9.php new file mode 100755 index 0000000..4370e3d --- /dev/null +++ b/storage/framework/views/5b5bd30afeabd8a4a991c7754401bbb9.php @@ -0,0 +1,387 @@ + +onlyProps([ + 'attribute' => '', + 'value' => '', + 'validations' => '', +]) as $__key => $__value) { + $$__key = $$__key ?? $__value; +} ?> +exceptProps([ + 'attribute' => '', + 'value' => '', + 'validations' => '', +]); ?> + '', + 'value' => '', + 'validations' => '', +]), 'is_string', ARRAY_FILTER_USE_KEY) as $__key => $__value) { + $$__key = $$__key ?? $__value; +} ?> + + $__value) { + if (array_key_exists($__key, $__defined_vars)) unset($$__key); +} ?> + + +type): + case ('text'): ?> + + + 'admin::components.attributes.edit.text','data' => ['attribute' => $attribute,'value' => $value,'validations' => $validations]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::attributes.edit.text'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['attribute' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($attribute),'value' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($value),'validations' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($validations)]); ?> +renderComponent(); ?> + + + + + + + + + + + + + + + + 'admin::components.attributes.edit.email','data' => ['attribute' => $attribute,'value' => $value,'validations' => $validations]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::attributes.edit.email'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['attribute' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($attribute),'value' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($value),'validations' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($validations)]); ?> +renderComponent(); ?> + + + + + + + + + + + + + + + + 'admin::components.attributes.edit.phone','data' => ['attribute' => $attribute,'value' => $value,'validations' => $validations]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::attributes.edit.phone'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['attribute' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($attribute),'value' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($value),'validations' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($validations)]); ?> +renderComponent(); ?> + + + + + + + + + + + + + + + + 'admin::components.attributes.edit.lookup','data' => ['attribute' => $attribute,'value' => $value,'validations' => $validations,'canAddNew' => 'true']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::attributes.edit.lookup'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['attribute' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($attribute),'value' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($value),'validations' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($validations),'can-add-new' => 'true']); ?> +renderComponent(); ?> + + + + + + + + + + + + + + + + 'admin::components.attributes.edit.select','data' => ['attribute' => $attribute,'value' => $value,'validations' => $validations]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::attributes.edit.select'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['attribute' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($attribute),'value' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($value),'validations' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($validations)]); ?> +renderComponent(); ?> + + + + + + + + + + + + + + + + 'admin::components.attributes.edit.multiselect','data' => ['attribute' => $attribute,'value' => $value,'validations' => $validations]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::attributes.edit.multiselect'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['attribute' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($attribute),'value' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($value),'validations' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($validations)]); ?> +renderComponent(); ?> + + + + + + + + + + + + + + + + 'admin::components.attributes.edit.price','data' => ['attribute' => $attribute,'value' => $value,'validations' => $validations]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::attributes.edit.price'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['attribute' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($attribute),'value' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($value),'validations' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($validations)]); ?> +renderComponent(); ?> + + + + + + + + + + + + + + + + 'admin::components.attributes.edit.image','data' => ['attribute' => $attribute,'value' => $value,'validations' => $validations]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::attributes.edit.image'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['attribute' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($attribute),'value' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($value),'validations' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($validations)]); ?> +renderComponent(); ?> + + + + + + + + + + + + + + + + 'admin::components.attributes.edit.file','data' => ['attribute' => $attribute,'value' => $value,'validations' => $validations]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::attributes.edit.file'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['attribute' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($attribute),'value' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($value),'validations' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($validations)]); ?> +renderComponent(); ?> + + + + + + + + + + + + + + + + 'admin::components.attributes.edit.textarea','data' => ['attribute' => $attribute,'value' => $value,'validations' => $validations]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::attributes.edit.textarea'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['attribute' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($attribute),'value' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($value),'validations' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($validations)]); ?> +renderComponent(); ?> + + + + + + + + + + + + + + + + 'admin::components.attributes.edit.address','data' => ['attribute' => $attribute,'value' => $value,'validations' => $validations]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::attributes.edit.address'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['attribute' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($attribute),'value' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($value),'validations' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($validations)]); ?> +renderComponent(); ?> + + + + + + + + + + + + + + + + 'admin::components.attributes.edit.date','data' => ['attribute' => $attribute,'value' => $value,'validations' => $validations]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::attributes.edit.date'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['attribute' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($attribute),'value' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($value),'validations' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($validations)]); ?> +renderComponent(); ?> + + + + + + + + + + + + + + + + 'admin::components.attributes.edit.datetime','data' => ['attribute' => $attribute,'value' => $value,'validations' => $validations]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::attributes.edit.datetime'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['attribute' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($attribute),'value' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($value),'validations' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($validations)]); ?> +renderComponent(); ?> + + + + + + + + + + + + + + + + 'admin::components.attributes.edit.boolean','data' => ['attribute' => $attribute,'value' => $value,'validations' => $validations]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::attributes.edit.boolean'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['attribute' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($attribute),'value' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($value),'validations' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($validations)]); ?> +renderComponent(); ?> + + + + + + + + + + + + + + + + 'admin::components.attributes.edit.checkbox','data' => ['attribute' => $attribute,'value' => $value,'validations' => $validations]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::attributes.edit.checkbox'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['attribute' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($attribute),'value' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($value),'validations' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($validations)]); ?> +renderComponent(); ?> + + + + + + + + + + + + \ No newline at end of file diff --git a/storage/framework/views/5c2001e939204ec0b7ec56c9a9f31d3d.php b/storage/framework/views/5c2001e939204ec0b7ec56c9a9f31d3d.php new file mode 100644 index 0000000..9d90871 --- /dev/null +++ b/storage/framework/views/5c2001e939204ec0b7ec56c9a9f31d3d.php @@ -0,0 +1,5 @@ +startSection('title', __('Page Expired')); ?> +startSection('code', '419'); ?> +startSection('message', __('Page Expired')); ?> + +make('errors::minimal', \Illuminate\Support\Arr::except(get_defined_vars(), ['__data', '__path']))->render(); ?> \ No newline at end of file diff --git a/storage/framework/views/5c4dbb25213fcc1592166fa8594fe465.php b/storage/framework/views/5c4dbb25213fcc1592166fa8594fe465.php new file mode 100755 index 0000000..1885e99 --- /dev/null +++ b/storage/framework/views/5c4dbb25213fcc1592166fa8594fe465.php @@ -0,0 +1,21 @@ + + + 'admin::components.form.control-group.controls.inline.image','data' => [':name' => '\''.e($attribute->code).'\'',':value' => '\''.e(route('admin.settings.attributes.download', ['path' => $value])).'\'','rules' => 'required|mimes:jpeg,jpg,png,gif','position' => 'left','label' => $attribute->name,':errors' => 'errors','placeholder' => $attribute->name,'url' => $url,'allowEdit' => $allowEdit]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.controls.inline.image'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([':name' => '\''.e($attribute->code).'\'',':value' => '\''.e(route('admin.settings.attributes.download', ['path' => $value])).'\'','rules' => 'required|mimes:jpeg,jpg,png,gif','position' => 'left','label' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($attribute->name),':errors' => 'errors','placeholder' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($attribute->name),'url' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($url),'allow-edit' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($allowEdit)]); ?> +renderComponent(); ?> + + + + + + + + + + \ No newline at end of file diff --git a/storage/framework/views/5c69291b8becda40307a38b846104d1e.php b/storage/framework/views/5c69291b8becda40307a38b846104d1e.php new file mode 100755 index 0000000..1c271ab --- /dev/null +++ b/storage/framework/views/5c69291b8becda40307a38b846104d1e.php @@ -0,0 +1,5 @@ +
    merge(['class' => 'mb-2.5'])); ?>> + + +
    + \ No newline at end of file diff --git a/storage/framework/views/5cc12c0ae8298cca78ee87beeb85fd1a.php b/storage/framework/views/5cc12c0ae8298cca78ee87beeb85fd1a.php new file mode 100755 index 0000000..465fee8 --- /dev/null +++ b/storage/framework/views/5cc12c0ae8298cca78ee87beeb85fd1a.php @@ -0,0 +1,657 @@ + + + 'admin::components.layouts.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::layouts'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> + + slot('title', null, []); ?> + get('admin::app.settings.groups.index.title'); ?> + endSlot(); ?> + +
    + +
    +
    + + + + + + + 'admin::components.breadcrumbs.index','data' => ['name' => 'settings.groups']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::breadcrumbs'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['name' => 'settings.groups']); ?> +renderComponent(); ?> + + + + + + + + + + + + + +
    + get('admin::app.settings.groups.index.title'); ?> +
    +
    + +
    + +
    + + + + hasPermission('settings.user.groups.create')): ?> + + + + + +
    +
    +
    + + + + + + 'admin::components.shimmer.datagrid.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::shimmer.datagrid'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> +renderComponent(); ?> + + + + + + + + + + +
    + + hasRenderedOnce('d3a19fbf-dbcd-4511-9fa7-8ef8c46612dd')): $__env->markAsRenderedOnce('d3a19fbf-dbcd-4511-9fa7-8ef8c46612dd'); +$__env->startPush('scripts'); ?> + + + + stopPush(); endif; ?> + renderComponent(); ?> + + + + + + + + + + \ No newline at end of file diff --git a/storage/framework/views/5cd7fc7afc1451da8e7f5d36c56c5a84.php b/storage/framework/views/5cd7fc7afc1451da8e7f5d36c56c5a84.php new file mode 100755 index 0000000..b21b211 --- /dev/null +++ b/storage/framework/views/5cd7fc7afc1451da8e7f5d36c56c5a84.php @@ -0,0 +1,37 @@ +
    +
    + + + + + 'admin::components.shimmer.charts.bar','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::shimmer.charts.bar'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> +renderComponent(); ?> + + + + + + + + + + +
    +
    +
    +
    +
    + +
    +
    +
    +
    +
    +
    \ No newline at end of file diff --git a/storage/framework/views/5d2dafabab6d773fcd75ee6e0d9cdff2.php b/storage/framework/views/5d2dafabab6d773fcd75ee6e0d9cdff2.php new file mode 100755 index 0000000..6e3f743 --- /dev/null +++ b/storage/framework/views/5d2dafabab6d773fcd75ee6e0d9cdff2.php @@ -0,0 +1,429 @@ + + + 'admin::components.layouts.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::layouts'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> + + slot('title', null, []); ?> + get('admin::app.leads.edit.title'); ?> + endSlot(); ?> + + $lead]); ?> + + + + + + 'admin::components.form.index','data' => ['action' => route('admin.leads.update', $lead->id),'method' => 'PUT']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['action' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(route('admin.leads.update', $lead->id)),'method' => 'PUT']); ?> +
    +
    +
    + + + 'admin::components.breadcrumbs.index','data' => ['name' => 'leads.edit','entity' => $lead]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::breadcrumbs'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['name' => 'leads.edit','entity' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($lead)]); ?> +renderComponent(); ?> + + + + + + + + + + +
    + get('admin::app.leads.edit.title'); ?> +
    +
    + +
    + $lead]); ?> + + + +
    + + + + + + + +
    + + $lead]); ?> + +
    +
    + + + + + + + + 'admin::components.shimmer.leads.datagrid','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::shimmer.leads.datagrid'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> +renderComponent(); ?> + + + + + + + + + + +
    + renderComponent(); ?> + + + + + + + + + + + $lead]); ?> + + + hasRenderedOnce('aa104d92-1436-4701-9706-d64d96cabc30')): $__env->markAsRenderedOnce('aa104d92-1436-4701-9706-d64d96cabc30'); +$__env->startPush('scripts'); ?> + + + + stopPush(); endif; ?> + + hasRenderedOnce('835a142b-0ca7-457b-882e-3a86e710f8e7')): $__env->markAsRenderedOnce('835a142b-0ca7-457b-882e-3a86e710f8e7'); +$__env->startPush('styles'); ?> + + stopPush(); endif; ?> + renderComponent(); ?> + + + + + + + + + \ No newline at end of file diff --git a/storage/framework/views/5d80da38c76349f24e95b9aea7bec760.php b/storage/framework/views/5d80da38c76349f24e95b9aea7bec760.php new file mode 100755 index 0000000..4eab5c1 --- /dev/null +++ b/storage/framework/views/5d80da38c76349f24e95b9aea7bec760.php @@ -0,0 +1,309 @@ + +onlyProps([ + 'allowEdit' => true, +]) as $__key => $__value) { + $$__key = $$__key ?? $__value; +} ?> +exceptProps([ + 'allowEdit' => true, +]); ?> + true, +]), 'is_string', ARRAY_FILTER_USE_KEY) as $__key => $__value) { + $$__key = $$__key ?? $__value; +} ?> + + $__value) { + if (array_key_exists($__key, $__defined_vars)) unset($$__key); +} ?> + + +except('options')); ?> + + :allow-edit="" +> +
    +
    +
    +
    +
    +
    + +hasRenderedOnce('db8287ba-3965-4a99-83ee-ec690a14dad5')): $__env->markAsRenderedOnce('db8287ba-3965-4a99-83ee-ec690a14dad5'); +$__env->startPush('scripts'); ?> + + + +stopPush(); endif; ?> \ No newline at end of file diff --git a/storage/framework/views/5e843da415e20346a427dc270b5d0294.php b/storage/framework/views/5e843da415e20346a427dc270b5d0294.php new file mode 100755 index 0000000..6fc7161 --- /dev/null +++ b/storage/framework/views/5e843da415e20346a427dc270b5d0294.php @@ -0,0 +1,142 @@ + + + + + + <?php echo e($title ?? ''); ?> + + + + + + + + + + + yieldPushContent('meta'); ?> + + set(['src/Resources/assets/css/app.css', 'src/Resources/assets/js/app.js'], 'webform')); ?> + + + + + + + getConfigData('general.design.admin_logo.favicon')): ?> + + + + + + yieldPushContent('styles'); ?> + + + + + + + + + + + +
    + + + + 'web_form::components.flash-group.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('web_form::flash-group'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> +renderComponent(); ?> + + + + + + + + + + + + + + + + + + + +
    + + + + + yieldPushContent('scripts'); ?> + + + + + + + + + + + + + + \ No newline at end of file diff --git a/storage/framework/views/5f29a9e0bea8869d6d23a7fdafef86e1.php b/storage/framework/views/5f29a9e0bea8869d6d23a7fdafef86e1.php new file mode 100755 index 0000000..a4879b8 --- /dev/null +++ b/storage/framework/views/5f29a9e0bea8869d6d23a7fdafef86e1.php @@ -0,0 +1,324 @@ + + getLookUpEntity($attribute->lookup_type, old($attribute->code) ?: $value); + ?> + + +
    + +
    + get('admin::app.components.attributes.lookup.click-to-add'); ?> + + +
    + + +
    +
    +
    +
    + + +hasRenderedOnce('5dfd2d10-29b2-48a8-87fa-8ad6afdc149c')): $__env->markAsRenderedOnce('5dfd2d10-29b2-48a8-87fa-8ad6afdc149c'); +$__env->startPush('scripts'); ?> + + + +stopPush(); endif; ?> + \ No newline at end of file diff --git a/storage/framework/views/5fee729c5c99ff4c2d07fe314dfc6111.php b/storage/framework/views/5fee729c5c99ff4c2d07fe314dfc6111.php new file mode 100755 index 0000000..ca5b111 --- /dev/null +++ b/storage/framework/views/5fee729c5c99ff4c2d07fe314dfc6111.php @@ -0,0 +1,14 @@ +isEmpty())): ?> +
      + addLoop($__currentLoopData); foreach($__currentLoopData as $breadcrumb): $__env->incrementLoopIndices(); $loop = $__env->getLastLoop(); ?> + last): ?> +
    • title); ?>
    • + url): ?> +
    • title); ?>
    • + +
    • title); ?>
    • + + popLoop(); $loop = $__env->getLastLoop(); ?> +
    + + \ No newline at end of file diff --git a/storage/framework/views/605b124922e9cee59c768f18ecb2a1f8.php b/storage/framework/views/605b124922e9cee59c768f18ecb2a1f8.php new file mode 100755 index 0000000..5963364 --- /dev/null +++ b/storage/framework/views/605b124922e9cee59c768f18ecb2a1f8.php @@ -0,0 +1,12 @@ + +
    + +
    + +
    +

    +

    +
    +
    +
    + \ No newline at end of file diff --git a/storage/framework/views/60afd578ec2561a00b3ba5488bfda498.php b/storage/framework/views/60afd578ec2561a00b3ba5488bfda498.php new file mode 100755 index 0000000..02aa5fb --- /dev/null +++ b/storage/framework/views/60afd578ec2561a00b3ba5488bfda498.php @@ -0,0 +1,387 @@ + +onlyProps([ + 'attribute' => '', + 'value' => '', + 'validations' => '', +]) as $__key => $__value) { + $$__key = $$__key ?? $__value; +} ?> +exceptProps([ + 'attribute' => '', + 'value' => '', + 'validations' => '', +]); ?> + '', + 'value' => '', + 'validations' => '', +]), 'is_string', ARRAY_FILTER_USE_KEY) as $__key => $__value) { + $$__key = $$__key ?? $__value; +} ?> + + $__value) { + if (array_key_exists($__key, $__defined_vars)) unset($$__key); +} ?> + + +type): + case ('text'): ?> + + + 'admin::components.attributes.edit.text','data' => ['attribute' => $attribute,'value' => $value,'validations' => $validations]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::attributes.edit.text'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['attribute' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($attribute),'value' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($value),'validations' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($validations)]); ?> +renderComponent(); ?> + + + + + + + + + + + + + + + + 'admin::components.attributes.edit.email','data' => ['attribute' => $attribute,'value' => $value,'validations' => $validations]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::attributes.edit.email'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['attribute' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($attribute),'value' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($value),'validations' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($validations)]); ?> +renderComponent(); ?> + + + + + + + + + + + + + + + + 'admin::components.attributes.edit.phone','data' => ['attribute' => $attribute,'value' => $value,'validations' => $validations]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::attributes.edit.phone'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['attribute' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($attribute),'value' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($value),'validations' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($validations)]); ?> +renderComponent(); ?> + + + + + + + + + + + + + + + + 'admin::components.attributes.edit.lookup','data' => ['attribute' => $attribute,'value' => $value,'validations' => $validations,'canAddNew' => 'true']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::attributes.edit.lookup'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['attribute' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($attribute),'value' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($value),'validations' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($validations),'can-add-new' => 'true']); ?> +renderComponent(); ?> + + + + + + + + + + + + + + + + 'admin::components.attributes.edit.select','data' => ['attribute' => $attribute,'value' => $value,'validations' => $validations]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::attributes.edit.select'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['attribute' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($attribute),'value' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($value),'validations' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($validations)]); ?> +renderComponent(); ?> + + + + + + + + + + + + + + + + 'admin::components.attributes.edit.multiselect','data' => ['attribute' => $attribute,'value' => $value,'validations' => $validations]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::attributes.edit.multiselect'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['attribute' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($attribute),'value' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($value),'validations' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($validations)]); ?> +renderComponent(); ?> + + + + + + + + + + + + + + + + 'admin::components.attributes.edit.price','data' => ['attribute' => $attribute,'value' => $value,'validations' => $validations]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::attributes.edit.price'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['attribute' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($attribute),'value' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($value),'validations' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($validations)]); ?> +renderComponent(); ?> + + + + + + + + + + + + + + + + 'admin::components.attributes.edit.image','data' => ['attribute' => $attribute,'value' => $value,'validations' => $validations]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::attributes.edit.image'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['attribute' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($attribute),'value' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($value),'validations' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($validations)]); ?> +renderComponent(); ?> + + + + + + + + + + + + + + + + 'admin::components.attributes.edit.file','data' => ['attribute' => $attribute,'value' => $value,'validations' => $validations]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::attributes.edit.file'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['attribute' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($attribute),'value' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($value),'validations' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($validations)]); ?> +renderComponent(); ?> + + + + + + + + + + + + + + + + 'admin::components.attributes.edit.textarea','data' => ['attribute' => $attribute,'value' => $value,'validations' => $validations]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::attributes.edit.textarea'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['attribute' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($attribute),'value' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($value),'validations' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($validations)]); ?> +renderComponent(); ?> + + + + + + + + + + + + + + + + 'admin::components.attributes.edit.address','data' => ['attribute' => $attribute,'value' => $value,'validations' => $validations]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::attributes.edit.address'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['attribute' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($attribute),'value' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($value),'validations' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($validations)]); ?> +renderComponent(); ?> + + + + + + + + + + + + + + + + 'admin::components.attributes.edit.date','data' => ['attribute' => $attribute,'value' => $value,'validations' => $validations]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::attributes.edit.date'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['attribute' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($attribute),'value' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($value),'validations' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($validations)]); ?> +renderComponent(); ?> + + + + + + + + + + + + + + + + 'admin::components.attributes.edit.datetime','data' => ['attribute' => $attribute,'value' => $value,'validations' => $validations]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::attributes.edit.datetime'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['attribute' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($attribute),'value' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($value),'validations' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($validations)]); ?> +renderComponent(); ?> + + + + + + + + + + + + + + + + 'admin::components.attributes.edit.boolean','data' => ['attribute' => $attribute,'value' => $value,'validations' => $validations]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::attributes.edit.boolean'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['attribute' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($attribute),'value' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($value),'validations' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($validations)]); ?> +renderComponent(); ?> + + + + + + + + + + + + + + + + 'admin::components.attributes.edit.checkbox','data' => ['attribute' => $attribute,'value' => $value,'validations' => $validations]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::attributes.edit.checkbox'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['attribute' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($attribute),'value' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($value),'validations' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($validations)]); ?> +renderComponent(); ?> + + + + + + + + + + + + \ No newline at end of file diff --git a/storage/framework/views/6196735aba6c22cc64b61dfd6a574bf8.php b/storage/framework/views/6196735aba6c22cc64b61dfd6a574bf8.php new file mode 100755 index 0000000..cf9d694 --- /dev/null +++ b/storage/framework/views/6196735aba6c22cc64b61dfd6a574bf8.php @@ -0,0 +1,79 @@ + + + 'admin::components.shimmer.leads.index.kanban.toolbar','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::shimmer.leads.index.kanban.toolbar'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> +renderComponent(); ?> + + + + + + + + + + +
    + + +
    + +
    +
    +
    +
    +
    + +
    +
    +
    +
    +
    + + +
    + + +
    + +
    +
    + +
    + + +
    +
    +
    +
    +
    + + +
    +
    + + +
    +
    +
    +
    + + +
    +
    +
    +
    +
    +
    +
    + +
    +
    + +
    \ No newline at end of file diff --git a/storage/framework/views/622acc512af7c1ed3719802780a93697.php b/storage/framework/views/622acc512af7c1ed3719802780a93697.php new file mode 100755 index 0000000..41472c5 --- /dev/null +++ b/storage/framework/views/622acc512af7c1ed3719802780a93697.php @@ -0,0 +1,84 @@ + + +hasRenderedOnce('eb3e055c-bb13-4e7d-92d4-188dcc478366')): $__env->markAsRenderedOnce('eb3e055c-bb13-4e7d-92d4-188dcc478366'); +$__env->startPush('scripts'); ?> + + + +stopPush(); endif; ?> \ No newline at end of file diff --git a/storage/framework/views/643c43a91b2568b91ae66692762e507e.php b/storage/framework/views/643c43a91b2568b91ae66692762e507e.php new file mode 100755 index 0000000..b7907dc --- /dev/null +++ b/storage/framework/views/643c43a91b2568b91ae66692762e507e.php @@ -0,0 +1,100 @@ + +onlyProps(['position' => 'left']) as $__key => $__value) { + $$__key = $$__key ?? $__value; +} ?> +exceptProps(['position' => 'left']); ?> + 'left']), 'is_string', ARRAY_FILTER_USE_KEY) as $__key => $__value) { + $$__key = $$__key ?? $__value; +} ?> + + $__value) { + if (array_key_exists($__key, $__defined_vars)) unset($$__key); +} ?> + + + + +> + + + 'admin::components.shimmer.tabs.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::shimmer.tabs'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> +renderComponent(); ?> + + + + + + + + + + + +hasRenderedOnce('f74f4975-d7f7-42c9-9055-4a2cdfffa81a')): $__env->markAsRenderedOnce('f74f4975-d7f7-42c9-9055-4a2cdfffa81a'); +$__env->startPush('scripts'); ?> + + + +stopPush(); endif; ?> + \ No newline at end of file diff --git a/storage/framework/views/645b117505eaf328b063b457f0a7e171.php b/storage/framework/views/645b117505eaf328b063b457f0a7e171.php new file mode 100755 index 0000000..b674e5a --- /dev/null +++ b/storage/framework/views/645b117505eaf328b063b457f0a7e171.php @@ -0,0 +1,241 @@ + + + 'admin::components.layouts.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::layouts'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> + + slot('title', null, []); ?> + get('admin::app.contacts.persons.create.title'); ?> + endSlot(); ?> + + + + + + + + 'admin::components.form.index','data' => ['action' => route('admin.contacts.persons.store'),'enctype' => 'multipart/form-data']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['action' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(route('admin.contacts.persons.store')),'enctype' => 'multipart/form-data']); ?> +
    + +
    +
    + + + + + + + 'admin::components.breadcrumbs.index','data' => ['name' => 'contacts.persons.create']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::breadcrumbs'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['name' => 'contacts.persons.create']); ?> +renderComponent(); ?> + + + + + + + + + + + + + +
    + get('admin::app.contacts.persons.create.title'); ?> +
    +
    + +
    +
    + + + + + + + + +
    +
    +
    + + +
    + + + + + + 'admin::components.attributes.index','data' => ['customAttributes' => app('Webkul\Attribute\Repositories\AttributeRepository')->findWhere([ + ['code', 'NOTIN', ['organization_id']], + 'entity_type' => 'persons', + ]),'customValidations' => [ + 'name' => [ + 'min:2', + 'max:100', + ], + 'job_title' => [ + 'max:100', + ], + ]]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::attributes'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['custom-attributes' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(app('Webkul\Attribute\Repositories\AttributeRepository')->findWhere([ + ['code', 'NOTIN', ['organization_id']], + 'entity_type' => 'persons', + ])),'custom-validations' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute([ + 'name' => [ + 'min:2', + 'max:100', + ], + 'job_title' => [ + 'max:100', + ], + ])]); ?> +renderComponent(); ?> + + + + + + + + + + + + + + +
    +
    + renderComponent(); ?> + + + + + + + + + + + + + + hasRenderedOnce('c1883912-f03d-4f17-9897-888de4ff14a5')): $__env->markAsRenderedOnce('c1883912-f03d-4f17-9897-888de4ff14a5'); +$__env->startPush('scripts'); ?> + + + + stopPush(); endif; ?> + renderComponent(); ?> + + + + + + + + + + \ No newline at end of file diff --git a/storage/framework/views/662fc54fc0def05c1b259622e811803c.php b/storage/framework/views/662fc54fc0def05c1b259622e811803c.php new file mode 100755 index 0000000..4f0e59a --- /dev/null +++ b/storage/framework/views/662fc54fc0def05c1b259622e811803c.php @@ -0,0 +1,71 @@ +
    + + + 'admin::components.shimmer.datagrid.toolbar','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::shimmer.datagrid.toolbar'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> +renderComponent(); ?> + + + + + + + + + + +
    +
    +
    + + + 'admin::components.shimmer.mail.datagrid.table.head','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::shimmer.mail.datagrid.table.head'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> +renderComponent(); ?> + + + + + + + + + + + + + 'admin::components.shimmer.mail.datagrid.table.body','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::shimmer.mail.datagrid.table.body'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> +renderComponent(); ?> + + + + + + + + + +
    +
    +
    +
    + \ No newline at end of file diff --git a/storage/framework/views/66efbdfac607c4462bb2298a98d6faac.php b/storage/framework/views/66efbdfac607c4462bb2298a98d6faac.php new file mode 100755 index 0000000..c882d1d --- /dev/null +++ b/storage/framework/views/66efbdfac607c4462bb2298a98d6faac.php @@ -0,0 +1,783 @@ + + + 'admin::components.layouts.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::layouts'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> + + slot('title', null, []); ?> + get('admin::app.settings.data-transfer.imports.create.title'); ?> + endSlot(); ?> + + + + + + + 'admin::components.form.index','data' => ['action' => route('admin.settings.data_transfer.imports.store'),'enctype' => 'multipart/form-data']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['action' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(route('admin.settings.data_transfer.imports.store')),'enctype' => 'multipart/form-data']); ?> + + + + +
    +
    + + + + + + + 'admin::components.breadcrumbs.index','data' => ['name' => 'settings.data_transfers.create']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::breadcrumbs'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['name' => 'settings.data_transfers.create']); ?> +renderComponent(); ?> + + + + + + + + + + + + + +
    + get('admin::app.settings.data-transfer.imports.create.title'); ?> +
    +
    + +
    + +
    + + + + hasPermission('settings.data_transfer.imports.create')): ?> + + + + + + +
    +
    +
    + + +
    + +
    + + + + +
    +

    + get('admin::app.settings.data-transfer.imports.create.general'); ?> +

    + + + + + 'admin::components.form.control-group.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> + + + 'admin::components.form.control-group.label','data' => ['class' => 'required']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.label'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['class' => 'required']); ?> + get('admin::app.settings.data-transfer.imports.create.type'); ?> + renderComponent(); ?> + + + + + + + + + + + + + 'admin::components.form.control-group.control','data' => ['type' => 'select','name' => 'type','id' => 'import-type','value' => old('type') ?? 'persons','ref' => 'importType','rules' => 'required','label' => trans('admin::app.settings.data-transfer.imports.create.type')]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.control'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['type' => 'select','name' => 'type','id' => 'import-type','value' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(old('type') ?? 'persons'),'ref' => 'importType','rules' => 'required','label' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(trans('admin::app.settings.data-transfer.imports.create.type'))]); ?> + addLoop($__currentLoopData); foreach($__currentLoopData as $code => $importer): $__env->incrementLoopIndices(); $loop = $__env->getLastLoop(); ?> + + popLoop(); $loop = $__env->getLastLoop(); ?> + renderComponent(); ?> + + + + + + + + + + + + + get('admin::app.settings.data-transfer.imports.create.download-sample'); ?> + + + + + 'admin::components.form.control-group.error','data' => ['controlName' => 'type']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.error'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['control-name' => 'type']); ?> +renderComponent(); ?> + + + + + + + + + + renderComponent(); ?> + + + + + + + + + + + + + + 'admin::components.form.control-group.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> + + + 'admin::components.form.control-group.label','data' => ['class' => 'required']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.label'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['class' => 'required']); ?> + get('admin::app.settings.data-transfer.imports.create.file'); ?> + renderComponent(); ?> + + + + + + + + + + + + + 'admin::components.form.control-group.control','data' => ['type' => 'file','name' => 'file','rules' => 'required','label' => trans('admin::app.settings.data-transfer.imports.create.file')]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.control'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['type' => 'file','name' => 'file','rules' => 'required','label' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(trans('admin::app.settings.data-transfer.imports.create.file'))]); ?> +renderComponent(); ?> + + + + + + + + + + + + + 'admin::components.form.control-group.error','data' => ['controlName' => 'file']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.error'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['control-name' => 'file']); ?> +renderComponent(); ?> + + + + + + + + + + renderComponent(); ?> + + + + + + + + + +
    + + + +
    + + +
    + + + + + + + 'admin::components.accordion.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::accordion'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> + slot('header', null, []); ?> +
    +

    + get('admin::app.settings.data-transfer.imports.create.settings'); ?> +

    +
    + endSlot(); ?> + + slot('content', null, []); ?> + + + + 'admin::components.form.control-group.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> + + + 'admin::components.form.control-group.label','data' => ['class' => 'required']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.label'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['class' => 'required']); ?> + get('admin::app.settings.data-transfer.imports.create.action'); ?> + renderComponent(); ?> + + + + + + + + + + + + + 'admin::components.form.control-group.control','data' => ['type' => 'select','name' => 'action','id' => 'action','value' => old('action') ?? 'append','rules' => 'required','label' => trans('admin::app.settings.data-transfer.imports.create.action')]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.control'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['type' => 'select','name' => 'action','id' => 'action','value' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(old('action') ?? 'append'),'rules' => 'required','label' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(trans('admin::app.settings.data-transfer.imports.create.action'))]); ?> + + + renderComponent(); ?> + + + + + + + + + + + + + 'admin::components.form.control-group.error','data' => ['controlName' => 'action']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.error'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['control-name' => 'action']); ?> +renderComponent(); ?> + + + + + + + + + + renderComponent(); ?> + + + + + + + + + + + + + + 'admin::components.form.control-group.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> + + + 'admin::components.form.control-group.label','data' => ['class' => 'required']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.label'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['class' => 'required']); ?> + get('admin::app.settings.data-transfer.imports.create.validation-strategy'); ?> + renderComponent(); ?> + + + + + + + + + + + + + 'admin::components.form.control-group.control','data' => ['type' => 'select','name' => 'validation_strategy','id' => 'validation_strategy','value' => old('validation_strategy') ?? 'stop-on-errors','rules' => 'required','label' => trans('admin::app.settings.data-transfer.imports.create.validation-strategy')]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.control'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['type' => 'select','name' => 'validation_strategy','id' => 'validation_strategy','value' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(old('validation_strategy') ?? 'stop-on-errors'),'rules' => 'required','label' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(trans('admin::app.settings.data-transfer.imports.create.validation-strategy'))]); ?> + + + renderComponent(); ?> + + + + + + + + + + + + + 'admin::components.form.control-group.error','data' => ['controlName' => 'validation_strategy']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.error'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['control-name' => 'validation_strategy']); ?> +renderComponent(); ?> + + + + + + + + + + renderComponent(); ?> + + + + + + + + + + + + + + 'admin::components.form.control-group.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> + + + 'admin::components.form.control-group.label','data' => ['class' => 'required']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.label'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['class' => 'required']); ?> + get('admin::app.settings.data-transfer.imports.create.allowed-errors'); ?> + renderComponent(); ?> + + + + + + + + + + + + + 'admin::components.form.control-group.control','data' => ['type' => 'text','name' => 'allowed_errors','value' => old('allowed_errors') ?? 10,'rules' => 'required','label' => trans('admin::app.settings.data-transfer.imports.create.allowed-errors'),'placeholder' => trans('admin::app.settings.data-transfer.imports.create.allowed-errors')]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.control'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['type' => 'text','name' => 'allowed_errors','value' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(old('allowed_errors') ?? 10),'rules' => 'required','label' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(trans('admin::app.settings.data-transfer.imports.create.allowed-errors')),'placeholder' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(trans('admin::app.settings.data-transfer.imports.create.allowed-errors'))]); ?> +renderComponent(); ?> + + + + + + + + + + + + + 'admin::components.form.control-group.error','data' => ['controlName' => 'allowed_errors']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.error'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['control-name' => 'allowed_errors']); ?> +renderComponent(); ?> + + + + + + + + + + renderComponent(); ?> + + + + + + + + + + + + + + 'admin::components.form.control-group.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> + + + 'admin::components.form.control-group.label','data' => ['class' => 'required']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.label'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['class' => 'required']); ?> + get('admin::app.settings.data-transfer.imports.create.field-separator'); ?> + renderComponent(); ?> + + + + + + + + + + + + + 'admin::components.form.control-group.control','data' => ['type' => 'text','name' => 'field_separator','value' => old('field_separator') ?? ',','rules' => 'required','label' => trans('admin::app.settings.data-transfer.imports.create.field-separator'),'placeholder' => trans('admin::app.settings.data-transfer.imports.create.field-separator')]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.control'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['type' => 'text','name' => 'field_separator','value' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(old('field_separator') ?? ','),'rules' => 'required','label' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(trans('admin::app.settings.data-transfer.imports.create.field-separator')),'placeholder' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(trans('admin::app.settings.data-transfer.imports.create.field-separator'))]); ?> +renderComponent(); ?> + + + + + + + + + + + + + 'admin::components.form.control-group.error','data' => ['controlName' => 'field_separator']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.error'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['control-name' => 'field_separator']); ?> +renderComponent(); ?> + + + + + + + + + + renderComponent(); ?> + + + + + + + + + + + + + + 'admin::components.form.control-group.index','data' => ['class' => '!mb-0']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['class' => '!mb-0']); ?> + + + 'admin::components.form.control-group.label','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.label'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> + get('admin::app.settings.data-transfer.imports.create.process-in-queue'); ?> + renderComponent(); ?> + + + + + + + + + + + + + 'admin::components.form.control-group.control','data' => ['type' => 'switch','name' => 'process_in_queue','id' => 'maintenance-mode-status','checked' => false]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.control'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['type' => 'switch','name' => 'process_in_queue','id' => 'maintenance-mode-status','checked' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(false)]); ?> +renderComponent(); ?> + + + + + + + + + + + + + 'admin::components.form.control-group.error','data' => ['controlName' => 'process_in_queue']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.error'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['control-name' => 'process_in_queue']); ?> +renderComponent(); ?> + + + + + + + + + + renderComponent(); ?> + + + + + + + + + + endSlot(); ?> + renderComponent(); ?> + + + + + + + + + + + + +
    +
    + + + + renderComponent(); ?> + + + + + + + + + + renderComponent(); ?> + + + + + + + + + + \ No newline at end of file diff --git a/storage/framework/views/6855d2e33205b91888dcc7a02816a39b.php b/storage/framework/views/6855d2e33205b91888dcc7a02816a39b.php new file mode 100755 index 0000000..adeb020 --- /dev/null +++ b/storage/framework/views/6855d2e33205b91888dcc7a02816a39b.php @@ -0,0 +1,241 @@ + + + + + +hasRenderedOnce('30c199c8-5279-4b1e-95f8-ca7a1fc2afcc')): $__env->markAsRenderedOnce('30c199c8-5279-4b1e-95f8-ca7a1fc2afcc'); +$__env->startPush('scripts'); ?> + + + +stopPush(); endif; ?> + \ No newline at end of file diff --git a/storage/framework/views/689347dc050fe533aed0a037aa9c5cdd.php b/storage/framework/views/689347dc050fe533aed0a037aa9c5cdd.php new file mode 100755 index 0000000..40336c8 --- /dev/null +++ b/storage/framework/views/689347dc050fe533aed0a037aa9c5cdd.php @@ -0,0 +1,5 @@ +
    merge(['class' => 'mb-4'])); ?>> + + +
    + \ No newline at end of file diff --git a/storage/framework/views/692fa9c7f895fcb4e21a1f1731a60406.php b/storage/framework/views/692fa9c7f895fcb4e21a1f1731a60406.php new file mode 100755 index 0000000..6316feb --- /dev/null +++ b/storage/framework/views/692fa9c7f895fcb4e21a1f1731a60406.php @@ -0,0 +1,22 @@ +getCurrentActiveMenu('admin')?->getChildren(); +?> + +isNotEmpty() +): ?> +
    +
    + addLoop($__currentLoopData); foreach($__currentLoopData as $tab): $__env->incrementLoopIndices(); $loop = $__env->getLastLoop(); ?> + +
    pb-3.5 px-2.5 text-base font-medium text-gray-600 dark:text-gray-300 cursor-pointer"> + getName()); ?> + +
    +
    + popLoop(); $loop = $__env->getLastLoop(); ?> +
    +
    + + \ No newline at end of file diff --git a/storage/framework/views/696327619b02356f19b3adf2c3bf704f.php b/storage/framework/views/696327619b02356f19b3adf2c3bf704f.php new file mode 100755 index 0000000..53fc246 --- /dev/null +++ b/storage/framework/views/696327619b02356f19b3adf2c3bf704f.php @@ -0,0 +1,32 @@ +lookup_type + ? app('Webkul\Attribute\Repositories\AttributeRepository')->getLookUpOptions($attribute->lookup_type) + : $attribute->options()->orderBy('sort_order')->get(); +?> + + + + 'admin::components.form.control-group.control','data' => ['type' => 'select','id' => ''.e($attribute->code).'','name' => ''.e($attribute->code).'','rules' => ''.e($validations).'','label' => $attribute->name,'placeholder' => $attribute->name,'value' => old($attribute->code) ?? $value]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.control'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['type' => 'select','id' => ''.e($attribute->code).'','name' => ''.e($attribute->code).'','rules' => ''.e($validations).'','label' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($attribute->name),'placeholder' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($attribute->name),'value' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(old($attribute->code) ?? $value)]); ?> + addLoop($__currentLoopData); foreach($__currentLoopData as $option): $__env->incrementLoopIndices(); $loop = $__env->getLastLoop(); ?> + + popLoop(); $loop = $__env->getLastLoop(); ?> + renderComponent(); ?> + + + + + + + + + \ No newline at end of file diff --git a/storage/framework/views/6be40a9fac33782099171d0d80e025cf.php b/storage/framework/views/6be40a9fac33782099171d0d80e025cf.php new file mode 100755 index 0000000..6ed2572 --- /dev/null +++ b/storage/framework/views/6be40a9fac33782099171d0d80e025cf.php @@ -0,0 +1,272 @@ + + + + + + + + + 'admin::components.shimmer.dashboard.index.over-all','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::shimmer.dashboard.index.over-all'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> +renderComponent(); ?> + + + + + + + + + + + + + + +hasRenderedOnce('84a07157-2082-477b-aea6-b06e93592a9b')): $__env->markAsRenderedOnce('84a07157-2082-477b-aea6-b06e93592a9b'); +$__env->startPush('scripts'); ?> + + + +stopPush(); endif; ?> \ No newline at end of file diff --git a/storage/framework/views/6ce34c8fbee2f19577a6005fe418d650.php b/storage/framework/views/6ce34c8fbee2f19577a6005fe418d650.php new file mode 100755 index 0000000..12d5770 --- /dev/null +++ b/storage/framework/views/6ce34c8fbee2f19577a6005fe418d650.php @@ -0,0 +1,17 @@ + +
    + +
    + +
    +

    +

    +
    +
    + + +
    +

    +
    +
    + \ No newline at end of file diff --git a/storage/framework/views/6d2001f86aa58fedf8ebfbcfb16c5b76.php b/storage/framework/views/6d2001f86aa58fedf8ebfbcfb16c5b76.php new file mode 100755 index 0000000..01f324f --- /dev/null +++ b/storage/framework/views/6d2001f86aa58fedf8ebfbcfb16c5b76.php @@ -0,0 +1,1922 @@ + + + 'admin::components.layouts.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::layouts'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> + slot('title', null, []); ?> + get('admin::app.settings.workflows.edit.title'); ?> + endSlot(); ?> + + + + + + + 'admin::components.form.index','data' => ['action' => route('admin.settings.workflows.update', $workflow->id),'method' => 'PUT']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['action' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(route('admin.settings.workflows.update', $workflow->id)),'method' => 'PUT']); ?> +
    +
    +
    + $workflow]); ?> + + + + + 'admin::components.breadcrumbs.index','data' => ['name' => 'settings.workflows.edit','entity' => $workflow]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::breadcrumbs'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['name' => 'settings.workflows.edit','entity' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($workflow)]); ?> +renderComponent(); ?> + + + + + + + + + + + $workflow]); ?> + + +
    + get('admin::app.settings.workflows.edit.title'); ?> +
    +
    + +
    +
    + $workflow]); ?> + + + + + + $workflow]); ?> + +
    +
    +
    + + + + + + + 'admin::components.attributes.edit.lookup','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::attributes.edit.lookup'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> +renderComponent(); ?> + + + + + + + + + +
    + renderComponent(); ?> + + + + + + + + + + + hasRenderedOnce('836d3ec8-7ae5-42e6-ab1a-c29de06af475')): $__env->markAsRenderedOnce('836d3ec8-7ae5-42e6-ab1a-c29de06af475'); +$__env->startPush('scripts'); ?> + + + + + + + + + + + + stopPush(); endif; ?> + + hasRenderedOnce('543abf3c-6a48-422a-aabe-01c68eace57c')): $__env->markAsRenderedOnce('543abf3c-6a48-422a-aabe-01c68eace57c'); +$__env->startPush('styles'); ?> + + stopPush(); endif; ?> + renderComponent(); ?> + + + + + + + + + + \ No newline at end of file diff --git a/storage/framework/views/6de5c8c28cb29acce8a2bd9af36344a8.php b/storage/framework/views/6de5c8c28cb29acce8a2bd9af36344a8.php new file mode 100755 index 0000000..cbdd168 --- /dev/null +++ b/storage/framework/views/6de5c8c28cb29acce8a2bd9af36344a8.php @@ -0,0 +1,227 @@ + +onlyProps([ + 'isActive' => false, + 'position' => 'right', + 'width' => '500px', +]) as $__key => $__value) { + $$__key = $$__key ?? $__value; +} ?> +exceptProps([ + 'isActive' => false, + 'position' => 'right', + 'width' => '500px', +]); ?> + false, + 'position' => 'right', + 'width' => '500px', +]), 'is_string', ARRAY_FILTER_USE_KEY) as $__key => $__value) { + $$__key = $$__key ?? $__value; +} ?> + + $__value) { + if (array_key_exists($__key, $__defined_vars)) unset($$__key); +} ?> + + + + + is-active="" + position="" + width="" +> + + + + + + + + + + + + + + + + + +hasRenderedOnce('656890cc-63ee-41ca-b747-ad71e98ec95e')): $__env->markAsRenderedOnce('656890cc-63ee-41ca-b747-ad71e98ec95e'); +$__env->startPush('scripts'); ?> + + + +stopPush(); endif; ?> \ No newline at end of file diff --git a/storage/framework/views/6e12219585f1d10655b79c1a5e0b6718.php b/storage/framework/views/6e12219585f1d10655b79c1a5e0b6718.php new file mode 100755 index 0000000..3c82c65 --- /dev/null +++ b/storage/framework/views/6e12219585f1d10655b79c1a5e0b6718.php @@ -0,0 +1,60 @@ +> + +hasRenderedOnce('cc52e6d6-61d7-437c-b4af-99867ac5f29d')): $__env->markAsRenderedOnce('cc52e6d6-61d7-437c-b4af-99867ac5f29d'); +$__env->startPush('scripts'); ?> + + + +stopPush(); endif; ?> \ No newline at end of file diff --git a/storage/framework/views/6fb6d9feeb93e6fdb9c5e671249d0b02.php b/storage/framework/views/6fb6d9feeb93e6fdb9c5e671249d0b02.php new file mode 100755 index 0000000..08117bf --- /dev/null +++ b/storage/framework/views/6fb6d9feeb93e6fdb9c5e671249d0b02.php @@ -0,0 +1,46 @@ +> +
    merge(['class' => 'shimmer bg-neutral-100'])); ?>>
    +
    + +hasRenderedOnce('64e34f58-e15e-4d49-a238-e25b825c841d')): $__env->markAsRenderedOnce('64e34f58-e15e-4d49-a238-e25b825c841d'); +$__env->startPush('scripts'); ?> + + + +stopPush(); endif; ?> + \ No newline at end of file diff --git a/storage/framework/views/705ba4a03b5ebcb6854888da30ba37f8.php b/storage/framework/views/705ba4a03b5ebcb6854888da30ba37f8.php new file mode 100755 index 0000000..851af8d --- /dev/null +++ b/storage/framework/views/705ba4a03b5ebcb6854888da30ba37f8.php @@ -0,0 +1,141 @@ + + +hasRenderedOnce('64791307-ca65-4511-88fe-04712ca5c720')): $__env->markAsRenderedOnce('64791307-ca65-4511-88fe-04712ca5c720'); +$__env->startPush('scripts'); ?> + + + +stopPush(); endif; ?> \ No newline at end of file diff --git a/storage/framework/views/718638775cf4f89c56d3240e2a076acb.php b/storage/framework/views/718638775cf4f89c56d3240e2a076acb.php new file mode 100755 index 0000000..a41c111 --- /dev/null +++ b/storage/framework/views/718638775cf4f89c56d3240e2a076acb.php @@ -0,0 +1,1279 @@ + + + 'admin::components.layouts.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::layouts'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> + slot('title', null, []); ?> + get('admin::app.mail.index.' . request('route')); ?> + endSlot(); ?> + +
    +
    +
    + + + + + + + 'admin::components.breadcrumbs.index','data' => ['name' => 'mail.route','entity' => request('route')]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::breadcrumbs'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['name' => 'mail.route','entity' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(request('route'))]); ?> +renderComponent(); ?> + + + + + + + + + + + + + +
    + + get('admin::app.mail.index.' . request('route')); ?> +
    +
    + +
    +
    + + + + + hasPermission('mail.compose')): ?> + + + + + +
    +
    +
    + + + + + + + 'admin::components.shimmer.mail.datagrid.index','data' => ['isMultiRow' => true]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::shimmer.mail.datagrid'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['is-multi-row' => true]); ?> +renderComponent(); ?> + + + + + + + + + + +
    + + hasRenderedOnce('023ade48-dd7d-439f-abcf-39a13bcbd4a7')): $__env->markAsRenderedOnce('023ade48-dd7d-439f-abcf-39a13bcbd4a7'); +$__env->startPush('scripts'); ?> + + + + stopPush(); endif; ?> + renderComponent(); ?> + + + + + + + + + + \ No newline at end of file diff --git a/storage/framework/views/722922ee7af664e6e83dc93040da9fbc.php b/storage/framework/views/722922ee7af664e6e83dc93040da9fbc.php new file mode 100755 index 0000000..8dfc3d7 --- /dev/null +++ b/storage/framework/views/722922ee7af664e6e83dc93040da9fbc.php @@ -0,0 +1,59 @@ + +has('as')): ?> + > + + + + + + + +onlyProps([ + 'method' => 'POST', + ]) as $__key => $__value) { + $$__key = $$__key ?? $__value; +} ?> +exceptProps([ + 'method' => 'POST', + ]); ?> + 'POST', + ]), 'is_string', ARRAY_FILTER_USE_KEY) as $__key => $__value) { + $$__key = $$__key ?? $__value; +} ?> + + $__value) { + if (array_key_exists($__key, $__defined_vars)) unset($$__key); +} ?> + + + + + + + > + + + + + + + + + + + + \ No newline at end of file diff --git a/storage/framework/views/727e484febeccf10f8c1e01e91fb2f18.php b/storage/framework/views/727e484febeccf10f8c1e01e91fb2f18.php new file mode 100755 index 0000000..31d10ad --- /dev/null +++ b/storage/framework/views/727e484febeccf10f8c1e01e91fb2f18.php @@ -0,0 +1,9 @@ +
    + + + + + + + +
    \ No newline at end of file diff --git a/storage/framework/views/7338f0eab0650fe45e0cbc7b97dfdf31.php b/storage/framework/views/7338f0eab0650fe45e0cbc7b97dfdf31.php new file mode 100755 index 0000000..9df0bdb --- /dev/null +++ b/storage/framework/views/7338f0eab0650fe45e0cbc7b97dfdf31.php @@ -0,0 +1,133 @@ + + + 'admin::components.layouts.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::layouts'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> + + slot('title', null, []); ?> + get('admin::app.settings.pipelines.index.title'); ?> + endSlot(); ?> + +
    +
    +
    + + + + + + + 'admin::components.breadcrumbs.index','data' => ['name' => 'settings.pipelines']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::breadcrumbs'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['name' => 'settings.pipelines']); ?> +renderComponent(); ?> + + + + + + + + + + + + + +
    + + get('admin::app.settings.pipelines.index.title'); ?> +
    +
    + +
    +
    + + + + hasPermission('settings.lead.pipelines.create')): ?> + + + get('admin::app.settings.pipelines.index.create-btn'); ?> + + + + + +
    +
    +
    + + + + + + + + 'admin::components.datagrid.index','data' => ['src' => route('admin.settings.pipelines.index')]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::datagrid'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['src' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(route('admin.settings.pipelines.index'))]); ?> + + + + 'admin::components.shimmer.datagrid.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::shimmer.datagrid'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> +renderComponent(); ?> + + + + + + + + + + renderComponent(); ?> + + + + + + + + + + + + +
    + renderComponent(); ?> + + + + + + + + + + \ No newline at end of file diff --git a/storage/framework/views/73d0f687bf3f179b75a519792a6a0190.php b/storage/framework/views/73d0f687bf3f179b75a519792a6a0190.php new file mode 100755 index 0000000..68d5956 --- /dev/null +++ b/storage/framework/views/73d0f687bf3f179b75a519792a6a0190.php @@ -0,0 +1,131 @@ + + + 'admin::components.layouts.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::layouts'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> + + slot('title', null, []); ?> + get('admin::app.settings.workflows.index.title'); ?> + endSlot(); ?> + +
    +
    +
    + + + + + + + 'admin::components.breadcrumbs.index','data' => ['name' => 'settings.workflows']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::breadcrumbs'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['name' => 'settings.workflows']); ?> +renderComponent(); ?> + + + + + + + + + + + + + +
    + get('admin::app.settings.workflows.index.title'); ?> +
    +
    + +
    + +
    + + + + hasPermission('settings.automation.workflows.create')): ?> + + get('admin::app.settings.workflows.index.create-btn'); ?> + + + + + +
    +
    +
    + + + + + + + 'admin::components.datagrid.index','data' => ['src' => route('admin.settings.workflows.index')]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::datagrid'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['src' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(route('admin.settings.workflows.index'))]); ?> + + + + 'admin::components.shimmer.datagrid.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::shimmer.datagrid'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> +renderComponent(); ?> + + + + + + + + + + renderComponent(); ?> + + + + + + + + + + + + +
    + renderComponent(); ?> + + + + + + + + + + \ No newline at end of file diff --git a/storage/framework/views/73f6108386de9d6b9dd8e8f4d6aafcdf.php b/storage/framework/views/73f6108386de9d6b9dd8e8f4d6aafcdf.php new file mode 100755 index 0000000..089f59d --- /dev/null +++ b/storage/framework/views/73f6108386de9d6b9dd8e8f4d6aafcdf.php @@ -0,0 +1,85 @@ + +onlyProps(['isMultiRow' => false]) as $__key => $__value) { + $$__key = $$__key ?? $__value; +} ?> +exceptProps(['isMultiRow' => false]); ?> + false]), 'is_string', ARRAY_FILTER_USE_KEY) as $__key => $__value) { + $$__key = $$__key ?? $__value; +} ?> + + $__value) { + if (array_key_exists($__key, $__defined_vars)) unset($$__key); +} ?> + + +
    + + + 'admin::components.shimmer.datagrid.toolbar','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::shimmer.datagrid.toolbar'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> +renderComponent(); ?> + + + + + + + + + + +
    +
    +
    + + + 'admin::components.shimmer.datagrid.table.head','data' => ['isMultiRow' => $isMultiRow]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::shimmer.datagrid.table.head'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['isMultiRow' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($isMultiRow)]); ?> +renderComponent(); ?> + + + + + + + + + + + + + 'admin::components.shimmer.datagrid.table.body','data' => ['isMultiRow' => $isMultiRow]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::shimmer.datagrid.table.body'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['isMultiRow' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($isMultiRow)]); ?> +renderComponent(); ?> + + + + + + + + + +
    +
    +
    +
    + \ No newline at end of file diff --git a/storage/framework/views/74349877583591de964288672b6047a7.php b/storage/framework/views/74349877583591de964288672b6047a7.php new file mode 100755 index 0000000..543a8f6 --- /dev/null +++ b/storage/framework/views/74349877583591de964288672b6047a7.php @@ -0,0 +1,12 @@ + + +addLoop($__currentLoopData); foreach($__currentLoopData as $bgColor): $__env->incrementLoopIndices(); $loop = $__env->getLastLoop(); ?> +
    +popLoop(); $loop = $__env->getLastLoop(); ?> + +addLoop($__currentLoopData); foreach($__currentLoopData as $textColor): $__env->incrementLoopIndices(); $loop = $__env->getLastLoop(); ?> +
    +popLoop(); $loop = $__env->getLastLoop(); ?> \ No newline at end of file diff --git a/storage/framework/views/74d0fe6129f6d2d2751bf1d6c1c5e6be.php b/storage/framework/views/74d0fe6129f6d2d2751bf1d6c1c5e6be.php new file mode 100755 index 0000000..e358832 --- /dev/null +++ b/storage/framework/views/74d0fe6129f6d2d2751bf1d6c1c5e6be.php @@ -0,0 +1,14 @@ + \ No newline at end of file diff --git a/storage/framework/views/7545453b31afffb888d933c90f187db5.php b/storage/framework/views/7545453b31afffb888d933c90f187db5.php new file mode 100755 index 0000000..e4982f2 --- /dev/null +++ b/storage/framework/views/7545453b31afffb888d933c90f187db5.php @@ -0,0 +1,40 @@ + + +onlyProps(['color' => 'currentColor']) as $__key => $__value) { + $$__key = $$__key ?? $__value; +} ?> +exceptProps(['color' => 'currentColor']); ?> + 'currentColor']), 'is_string', ARRAY_FILTER_USE_KEY) as $__key => $__value) { + $$__key = $$__key ?? $__value; +} ?> + + $__value) { + if (array_key_exists($__key, $__defined_vars)) unset($$__key); +} ?> + + + \ No newline at end of file diff --git a/storage/framework/views/763aa3438a725492f52411b7c5af8cac.php b/storage/framework/views/763aa3438a725492f52411b7c5af8cac.php new file mode 100755 index 0000000..8c8fa3c --- /dev/null +++ b/storage/framework/views/763aa3438a725492f52411b7c5af8cac.php @@ -0,0 +1,201 @@ + + + v-bind="$attrs" +> + +hasRenderedOnce('fb8bf576-5c34-4f79-a551-d9ab89c1d6cd')): $__env->markAsRenderedOnce('fb8bf576-5c34-4f79-a551-d9ab89c1d6cd'); +$__env->startPush('scripts'); ?> + + + +stopPush(); endif; ?> + \ No newline at end of file diff --git a/storage/framework/views/76580b75925f708c1a37f6afa9029bb9.php b/storage/framework/views/76580b75925f708c1a37f6afa9029bb9.php new file mode 100755 index 0000000..7dcbbf6 --- /dev/null +++ b/storage/framework/views/76580b75925f708c1a37f6afa9029bb9.php @@ -0,0 +1,338 @@ + +onlyProps([ + 'allowEdit' => true, +]) as $__key => $__value) { + $$__key = $$__key ?? $__value; +} ?> +exceptProps([ + 'allowEdit' => true, +]); ?> + true, +]), 'is_string', ARRAY_FILTER_USE_KEY) as $__key => $__value) { + $$__key = $$__key ?? $__value; +} ?> + + $__value) { + if (array_key_exists($__key, $__defined_vars)) unset($$__key); +} ?> + + + + + :allow-edit="" +> +
    +
    +
    +
    +
    +
    + +hasRenderedOnce('4aa8b015-9fe7-47da-9303-a7771f80a4dd')): $__env->markAsRenderedOnce('4aa8b015-9fe7-47da-9303-a7771f80a4dd'); +$__env->startPush('scripts'); ?> + + + +stopPush(); endif; ?> + \ No newline at end of file diff --git a/storage/framework/views/78de902192b1714ac039398d9f4426d8.php b/storage/framework/views/78de902192b1714ac039398d9f4426d8.php new file mode 100755 index 0000000..4ad3cc5 --- /dev/null +++ b/storage/framework/views/78de902192b1714ac039398d9f4426d8.php @@ -0,0 +1,96 @@ +> + +hasRenderedOnce('5dcbdcea-f6f4-435b-ae76-dd8aacd7f7fb')): $__env->markAsRenderedOnce('5dcbdcea-f6f4-435b-ae76-dd8aacd7f7fb'); +$__env->startPush('scripts'); ?> + + + + +stopPush(); endif; ?> \ No newline at end of file diff --git a/storage/framework/views/79e8e90194be1d8195f6f37c97738d0e.php b/storage/framework/views/79e8e90194be1d8195f6f37c97738d0e.php new file mode 100755 index 0000000..22ce0db --- /dev/null +++ b/storage/framework/views/79e8e90194be1d8195f6f37c97738d0e.php @@ -0,0 +1,5 @@ +merge(['scope' => 'col', 'class' => 'whitespace-nowrap px-6 py-4 font-semibold'])); ?>> + + + + \ No newline at end of file diff --git a/storage/framework/views/7a1d92179836214dd1888bc3bb83cc42.php b/storage/framework/views/7a1d92179836214dd1888bc3bb83cc42.php new file mode 100755 index 0000000..81290a5 --- /dev/null +++ b/storage/framework/views/7a1d92179836214dd1888bc3bb83cc42.php @@ -0,0 +1,57 @@ +hasRenderedOnce('16db1fbc-07cb-4131-b013-19bf621731ec')): $__env->markAsRenderedOnce('16db1fbc-07cb-4131-b013-19bf621731ec'); +$__env->startPush('scripts'); ?> + + + +stopPush(); endif; ?> + \ No newline at end of file diff --git a/storage/framework/views/7a87d246bb7b408660a5fb294f811956.php b/storage/framework/views/7a87d246bb7b408660a5fb294f811956.php new file mode 100755 index 0000000..b7b38a9 --- /dev/null +++ b/storage/framework/views/7a87d246bb7b408660a5fb294f811956.php @@ -0,0 +1,13 @@ + +
    + +
    + +
    +

    +

    +
    +
    +
    + + \ No newline at end of file diff --git a/storage/framework/views/7afe19b7ca789b437f936aa7a33665d6.php b/storage/framework/views/7afe19b7ca789b437f936aa7a33665d6.php new file mode 100755 index 0000000..d7cd94b --- /dev/null +++ b/storage/framework/views/7afe19b7ca789b437f936aa7a33665d6.php @@ -0,0 +1,362 @@ +> + +hasRenderedOnce('2e9c24c1-27dd-4c68-8c49-99530649d48d')): $__env->markAsRenderedOnce('2e9c24c1-27dd-4c68-8c49-99530649d48d'); +$__env->startPush('scripts'); ?> + + + +stopPush(); endif; ?> + \ No newline at end of file diff --git a/storage/framework/views/7c39c87d70316fd50ddef81471da8c68.php b/storage/framework/views/7c39c87d70316fd50ddef81471da8c68.php new file mode 100755 index 0000000..ef7419d --- /dev/null +++ b/storage/framework/views/7c39c87d70316fd50ddef81471da8c68.php @@ -0,0 +1,42 @@ + +onlyProps(['isMultiRow' => false]) as $__key => $__value) { + $$__key = $$__key ?? $__value; +} ?> +exceptProps(['isMultiRow' => false]); ?> + false]), 'is_string', ARRAY_FILTER_USE_KEY) as $__key => $__value) { + $$__key = $$__key ?? $__value; +} ?> + + $__value) { + if (array_key_exists($__key, $__defined_vars)) unset($$__key); +} ?> + + + +
    +
    + +
    + +
    + +
    + +
    + +
    +
    + +
    +
    +
    + +
    +
    + +
    + +
    +
    + + \ No newline at end of file diff --git a/storage/framework/views/7d32429f498c45b7a16b838740c1f803.php b/storage/framework/views/7d32429f498c45b7a16b838740c1f803.php new file mode 100755 index 0000000..6ef9937 --- /dev/null +++ b/storage/framework/views/7d32429f498c45b7a16b838740c1f803.php @@ -0,0 +1,21 @@ +
    +
    +
    +
    + +
    +
    + +
    +
    +
    +
    +
    + +
    +
    +
    +
    +
    +
    +
    \ No newline at end of file diff --git a/storage/framework/views/7dd35949e06fe81b098af5553fa6a342.php b/storage/framework/views/7dd35949e06fe81b098af5553fa6a342.php new file mode 100755 index 0000000..e86ad21 --- /dev/null +++ b/storage/framework/views/7dd35949e06fe81b098af5553fa6a342.php @@ -0,0 +1,126 @@ + + + +
    + + + 'admin::components.dropdown.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::dropdown'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> + slot('toggle', null, []); ?> + + + + + + + + endSlot(); ?> + + slot('content', null, ['class' => '!p-0']); ?> + + + + +
    + + get('admin::app.leads.index.view-switcher.all-pipelines'); ?> + +
    + + + + + + all(); $__env->addLoop($__currentLoopData); foreach($__currentLoopData as $tempPipeline): $__env->incrementLoopIndices(); $loop = $__env->getLastLoop(); ?> + $tempPipeline]); ?> + + + + name); ?> + + + + $tempPipeline]); ?> + + popLoop(); $loop = $__env->getLastLoop(); ?> + + + + + + + + get('admin::app.leads.index.view-switcher.create-new-pipeline'); ?> + + + + + + endSlot(); ?> + renderComponent(); ?> + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + +
    +
    + + \ No newline at end of file diff --git a/storage/framework/views/7df9fc296534d20b4c1d0a6636050ffb.php b/storage/framework/views/7df9fc296534d20b4c1d0a6636050ffb.php new file mode 100755 index 0000000..8a9e563 --- /dev/null +++ b/storage/framework/views/7df9fc296534d20b4c1d0a6636050ffb.php @@ -0,0 +1,1247 @@ +getEmailTemplatePlaceholders()); ?> + + + + 'admin::components.layouts.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::layouts'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> + + slot('title', null, []); ?> + get('admin::app.settings.webhooks.create.title'); ?> + endSlot(); ?> + + + + + + + 'admin::components.form.index','data' => ['action' => route('admin.settings.webhooks.store')]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['action' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(route('admin.settings.webhooks.store'))]); ?> +
    +
    +
    + + + + + + + 'admin::components.breadcrumbs.index','data' => ['name' => 'settings.webhooks.create']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::breadcrumbs'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['name' => 'settings.webhooks.create']); ?> +renderComponent(); ?> + + + + + + + + + + + + + +
    + get('admin::app.settings.webhooks.create.title'); ?> +
    +
    + +
    +
    + + + + + + + + +
    +
    +
    + + +
    + renderComponent(); ?> + + + + + + + + + + + + + + hasRenderedOnce('ccfefab4-5792-4aa6-9780-7aac970b9e06')): $__env->markAsRenderedOnce('ccfefab4-5792-4aa6-9780-7aac970b9e06'); +$__env->startPush('scripts'); ?> + + + + + + + + + + + + + stopPush(); endif; ?> + + hasRenderedOnce('6c1be1ed-40ce-468c-9c98-90851cdae499')): $__env->markAsRenderedOnce('6c1be1ed-40ce-468c-9c98-90851cdae499'); +$__env->startPush('styles'); ?> + + + + + + stopPush(); endif; ?> + renderComponent(); ?> + + + + + + + + + + \ No newline at end of file diff --git a/storage/framework/views/80328a3d8d637cac7f3cd1dcaf8ba595.php b/storage/framework/views/80328a3d8d637cac7f3cd1dcaf8ba595.php new file mode 100755 index 0000000..07f906d --- /dev/null +++ b/storage/framework/views/80328a3d8d637cac7f3cd1dcaf8ba595.php @@ -0,0 +1,71 @@ +
    + + + 'admin::components.shimmer.datagrid.toolbar','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::shimmer.datagrid.toolbar'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> +renderComponent(); ?> + + + + + + + + + + +
    +
    +
    + + + 'admin::components.shimmer.mail.datagrid.table.head','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::shimmer.mail.datagrid.table.head'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> +renderComponent(); ?> + + + + + + + + + + + + + 'admin::components.shimmer.mail.datagrid.table.body','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::shimmer.mail.datagrid.table.body'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> +renderComponent(); ?> + + + + + + + + + +
    +
    +
    +
    + \ No newline at end of file diff --git a/storage/framework/views/8045eecedb3d7e156af551095e06d541.php b/storage/framework/views/8045eecedb3d7e156af551095e06d541.php new file mode 100755 index 0000000..346df83 --- /dev/null +++ b/storage/framework/views/8045eecedb3d7e156af551095e06d541.php @@ -0,0 +1,4 @@ +merge(['scope' => 'row', 'class' => 'border-b border-gray-200 last:border-b-0 dark:border-gray-800'])); ?>> + + + \ No newline at end of file diff --git a/storage/framework/views/81832cbe8b1dc51181dd4444cc2b75ac.php b/storage/framework/views/81832cbe8b1dc51181dd4444cc2b75ac.php new file mode 100755 index 0000000..b1feff0 --- /dev/null +++ b/storage/framework/views/81832cbe8b1dc51181dd4444cc2b75ac.php @@ -0,0 +1,20 @@ + + + 'admin::components.form.control-group.control','data' => ['type' => 'text','id' => $attribute->code,'name' => $attribute->code,'value' => old($attribute->code) ?? $value,'rules' => $validations,'label' => $attribute->name]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.control'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['type' => 'text','id' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($attribute->code),'name' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($attribute->code),'value' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(old($attribute->code) ?? $value),'rules' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($validations),'label' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($attribute->name)]); ?> +renderComponent(); ?> + + + + + + + + + \ No newline at end of file diff --git a/storage/framework/views/81aa4767a1c1fd106645581a82b3d039.php b/storage/framework/views/81aa4767a1c1fd106645581a82b3d039.php new file mode 100755 index 0000000..c21c2bd --- /dev/null +++ b/storage/framework/views/81aa4767a1c1fd106645581a82b3d039.php @@ -0,0 +1,7 @@ +
    +
    + +
    + +
    +
    \ No newline at end of file diff --git a/storage/framework/views/82d6f8989f545ac1df2a6907421f2bda.php b/storage/framework/views/82d6f8989f545ac1df2a6907421f2bda.php new file mode 100755 index 0000000..cdde560 --- /dev/null +++ b/storage/framework/views/82d6f8989f545ac1df2a6907421f2bda.php @@ -0,0 +1,84 @@ + + +hasRenderedOnce('a886c6a6-c632-4b50-a1b1-3fab092be852')): $__env->markAsRenderedOnce('a886c6a6-c632-4b50-a1b1-3fab092be852'); +$__env->startPush('scripts'); ?> + + + +stopPush(); endif; ?> \ No newline at end of file diff --git a/storage/framework/views/8384b9be9a053dd08ab203ee1264ea99.php b/storage/framework/views/8384b9be9a053dd08ab203ee1264ea99.php new file mode 100755 index 0000000..bd8abbc --- /dev/null +++ b/storage/framework/views/8384b9be9a053dd08ab203ee1264ea99.php @@ -0,0 +1,70 @@ +> +
    +
    + +hasRenderedOnce('517d5197-765d-4d63-9af8-4392c7d1101d')): $__env->markAsRenderedOnce('517d5197-765d-4d63-9af8-4392c7d1101d'); +$__env->startPush('scripts'); ?> + + + +stopPush(); endif; ?> \ No newline at end of file diff --git a/storage/framework/views/83c4e4975e1dc8e11aaba8b00b2637e1.php b/storage/framework/views/83c4e4975e1dc8e11aaba8b00b2637e1.php new file mode 100755 index 0000000..46493bf --- /dev/null +++ b/storage/framework/views/83c4e4975e1dc8e11aaba8b00b2637e1.php @@ -0,0 +1,86 @@ +> + + + + +hasRenderedOnce('ecdc8b63-ca36-4250-9ca6-0fea9fbeca37')): $__env->markAsRenderedOnce('ecdc8b63-ca36-4250-9ca6-0fea9fbeca37'); +$__env->startPush('scripts'); ?> + + + +stopPush(); endif; ?> + \ No newline at end of file diff --git a/storage/framework/views/84ca5927186a61d96c9aa979ed9d32c3.php b/storage/framework/views/84ca5927186a61d96c9aa979ed9d32c3.php new file mode 100755 index 0000000..7d288cd --- /dev/null +++ b/storage/framework/views/84ca5927186a61d96c9aa979ed9d32c3.php @@ -0,0 +1,227 @@ + +onlyProps([ + 'isActive' => false, + 'position' => 'right', + 'width' => '500px', +]) as $__key => $__value) { + $$__key = $$__key ?? $__value; +} ?> +exceptProps([ + 'isActive' => false, + 'position' => 'right', + 'width' => '500px', +]); ?> + false, + 'position' => 'right', + 'width' => '500px', +]), 'is_string', ARRAY_FILTER_USE_KEY) as $__key => $__value) { + $$__key = $$__key ?? $__value; +} ?> + + $__value) { + if (array_key_exists($__key, $__defined_vars)) unset($$__key); +} ?> + + + + + is-active="" + position="" + width="" +> + + + + + + + + + + + + + + + + + +hasRenderedOnce('b0260640-5431-4558-b3ea-15bbaacad0de')): $__env->markAsRenderedOnce('b0260640-5431-4558-b3ea-15bbaacad0de'); +$__env->startPush('scripts'); ?> + + + +stopPush(); endif; ?> \ No newline at end of file diff --git a/storage/framework/views/854e22ee1ae052a7b502f2086fdd520c.php b/storage/framework/views/854e22ee1ae052a7b502f2086fdd520c.php new file mode 100755 index 0000000..010028c --- /dev/null +++ b/storage/framework/views/854e22ee1ae052a7b502f2086fdd520c.php @@ -0,0 +1,21 @@ +
    +
    +
    +
    + +
    +
    + +
    +
    +
    +
    +
    + +
    +
    +
    +
    +
    +
    +
    \ No newline at end of file diff --git a/storage/framework/views/857502e84b2e3d811ca62093f06a83ef.php b/storage/framework/views/857502e84b2e3d811ca62093f06a83ef.php new file mode 100755 index 0000000..e75b441 --- /dev/null +++ b/storage/framework/views/857502e84b2e3d811ca62093f06a83ef.php @@ -0,0 +1,49 @@ + +has('as')): ?> + > + + + + + + + +onlyProps(['method' => 'POST']) as $__key => $__value) { + $$__key = $$__key ?? $__value; +} ?> +exceptProps(['method' => 'POST']); ?> + 'POST']), 'is_string', ARRAY_FILTER_USE_KEY) as $__key => $__value) { + $$__key = $$__key ?? $__value; +} ?> + + $__value) { + if (array_key_exists($__key, $__defined_vars)) unset($$__key); +} ?> + + + + + + + > + + + + + + + + + + + + \ No newline at end of file diff --git a/storage/framework/views/869b8c53bbaa41f201693cd8ac233e18.php b/storage/framework/views/869b8c53bbaa41f201693cd8ac233e18.php new file mode 100755 index 0000000..328b31f --- /dev/null +++ b/storage/framework/views/869b8c53bbaa41f201693cd8ac233e18.php @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/storage/framework/views/86e7ad99a2f60c181ff6221e8a463026.php b/storage/framework/views/86e7ad99a2f60c181ff6221e8a463026.php new file mode 100755 index 0000000..f5725b2 --- /dev/null +++ b/storage/framework/views/86e7ad99a2f60c181ff6221e8a463026.php @@ -0,0 +1,30 @@ +isEmpty())): ?> + + + \ No newline at end of file diff --git a/storage/framework/views/8702e7e94dc56cac392789fa6382a77b.php b/storage/framework/views/8702e7e94dc56cac392789fa6382a77b.php new file mode 100755 index 0000000..0929d49 --- /dev/null +++ b/storage/framework/views/8702e7e94dc56cac392789fa6382a77b.php @@ -0,0 +1,13 @@ +
    +
    +
    + +
    +
    + +
    +
    + +
    +
    +
    \ No newline at end of file diff --git a/storage/framework/views/88072a664aaf8108f0f58cda06c46095.php b/storage/framework/views/88072a664aaf8108f0f58cda06c46095.php new file mode 100755 index 0000000..2acddfa --- /dev/null +++ b/storage/framework/views/88072a664aaf8108f0f58cda06c46095.php @@ -0,0 +1,22 @@ +code) ?: $value ?> + + + + + \ No newline at end of file diff --git a/storage/framework/views/884cada878fc61b9e4a4d0ca41058011.php b/storage/framework/views/884cada878fc61b9e4a4d0ca41058011.php new file mode 100755 index 0000000..5b603f9 --- /dev/null +++ b/storage/framework/views/884cada878fc61b9e4a4d0ca41058011.php @@ -0,0 +1,426 @@ + +onlyProps([ + 'allowEdit' => true, +]) as $__key => $__value) { + $$__key = $$__key ?? $__value; +} ?> +exceptProps([ + 'allowEdit' => true, +]); ?> + true, +]), 'is_string', ARRAY_FILTER_USE_KEY) as $__key => $__value) { + $$__key = $$__key ?? $__value; +} ?> + + $__value) { + if (array_key_exists($__key, $__defined_vars)) unset($$__key); +} ?> + + +except('value')); ?> + + :value=get('value'))); ?> + + :allow-edit="" +> +
    +
    +
    +
    +
    +
    + +hasRenderedOnce('33cb2245-d0e7-43c4-96d4-f4a9d2a57fb3')): $__env->markAsRenderedOnce('33cb2245-d0e7-43c4-96d4-f4a9d2a57fb3'); +$__env->startPush('scripts'); ?> + + + +stopPush(); endif; ?> \ No newline at end of file diff --git a/storage/framework/views/88b14aed5dac5bd92d7147188398c84b.php b/storage/framework/views/88b14aed5dac5bd92d7147188398c84b.php new file mode 100755 index 0000000..9ddd9bb --- /dev/null +++ b/storage/framework/views/88b14aed5dac5bd92d7147188398c84b.php @@ -0,0 +1,287 @@ + + + 'admin::components.layouts.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::layouts'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> + slot('title', null, []); ?> + get('admin::app.leads.view.title', ['title' => $lead->title]); ?> + endSlot(); ?> + + +
    + + $lead]); ?> + + +
    + +
    + +
    + + + 'admin::components.breadcrumbs.index','data' => ['name' => 'leads.view','entity' => $lead]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::breadcrumbs'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['name' => 'leads.view','entity' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($lead)]); ?> +renderComponent(); ?> + + + + + + + + + +
    + +
    + rotten_days) > 0): ?> + tags->prepend([ + 'name' => '' . trans('admin::app.leads.view.rotten-days', ['days' => $days]), + 'color' => '#FEE2E2' + ]); + ?> + + + $lead]); ?> + + + + + + 'admin::components.tags.index','data' => ['attachEndpoint' => route('admin.leads.tags.attach', $lead->id),'detachEndpoint' => route('admin.leads.tags.detach', $lead->id),'addedTags' => $lead->tags]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::tags'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['attach-endpoint' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(route('admin.leads.tags.attach', $lead->id)),'detach-endpoint' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(route('admin.leads.tags.detach', $lead->id)),'added-tags' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($lead->tags)]); ?> +renderComponent(); ?> + + + + + + + + + + + $lead]); ?> + +
    + + + $lead]); ?> + + + +

    + title); ?> + +

    + + $lead]); ?> + + + +
    + $lead]); ?> + + + hasPermission('mail.compose')): ?> + + + + 'admin::components.activities.actions.mail','data' => ['entity' => $lead,'entityControlName' => 'lead_id']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::activities.actions.mail'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['entity' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($lead),'entity-control-name' => 'lead_id']); ?> +renderComponent(); ?> + + + + + + + + + + + + hasPermission('activities.create')): ?> + + + + 'admin::components.activities.actions.file','data' => ['entity' => $lead,'entityControlName' => 'lead_id']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::activities.actions.file'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['entity' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($lead),'entity-control-name' => 'lead_id']); ?> +renderComponent(); ?> + + + + + + + + + + + + + + 'admin::components.activities.actions.note','data' => ['entity' => $lead,'entityControlName' => 'lead_id']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::activities.actions.note'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['entity' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($lead),'entity-control-name' => 'lead_id']); ?> +renderComponent(); ?> + + + + + + + + + + + + + + 'admin::components.activities.actions.activity','data' => ['entity' => $lead,'entityControlName' => 'lead_id']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::activities.actions.activity'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['entity' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($lead),'entity-control-name' => 'lead_id']); ?> +renderComponent(); ?> + + + + + + + + + + + + $lead]); ?> + +
    +
    + + + make('admin::leads.view.attributes', \Illuminate\Support\Arr::except(get_defined_vars(), ['__data', '__path']))->render(); ?> + + + make('admin::leads.view.person', \Illuminate\Support\Arr::except(get_defined_vars(), ['__data', '__path']))->render(); ?> +
    + + $lead]); ?> + + + $lead]); ?> + + + +
    + + make('admin::leads.view.stages', \Illuminate\Support\Arr::except(get_defined_vars(), ['__data', '__path']))->render(); ?> + + + $lead]); ?> + + + + + 'admin::components.activities.index','data' => ['endpoint' => route('admin.leads.activities.index', $lead->id),'emailDetachEndpoint' => route('admin.leads.emails.detach', $lead->id),'activeType' => request()->query('from') === 'quotes' ? 'quotes' : 'all','extraTypes' => [ + ['name' => 'description', 'label' => trans('admin::app.leads.view.tabs.description')], + ['name' => 'products', 'label' => trans('admin::app.leads.view.tabs.products')], + ['name' => 'quotes', 'label' => trans('admin::app.leads.view.tabs.quotes')], + ]]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::activities'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['endpoint' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(route('admin.leads.activities.index', $lead->id)),'email-detach-endpoint' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(route('admin.leads.emails.detach', $lead->id)),'activeType' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(request()->query('from') === 'quotes' ? 'quotes' : 'all'),'extra-types' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute([ + ['name' => 'description', 'label' => trans('admin::app.leads.view.tabs.description')], + ['name' => 'products', 'label' => trans('admin::app.leads.view.tabs.products')], + ['name' => 'quotes', 'label' => trans('admin::app.leads.view.tabs.quotes')], + ])]); ?> + + slot('products', null, []); ?> + make('admin::leads.view.products', \Illuminate\Support\Arr::except(get_defined_vars(), ['__data', '__path']))->render(); ?> + endSlot(); ?> + + + slot('quotes', null, []); ?> + make('admin::leads.view.quotes', \Illuminate\Support\Arr::except(get_defined_vars(), ['__data', '__path']))->render(); ?> + endSlot(); ?> + + + slot('description', null, []); ?> +
    + description); ?> + +
    + endSlot(); ?> + renderComponent(); ?> + + + + + + + + + + + $lead]); ?> + +
    + + $lead]); ?> + +
    + renderComponent(); ?> + + + + + + + + + + \ No newline at end of file diff --git a/storage/framework/views/88bea98a1376d5d8feaf9cc6532eb4ba.php b/storage/framework/views/88bea98a1376d5d8feaf9cc6532eb4ba.php new file mode 100755 index 0000000..f69fc24 --- /dev/null +++ b/storage/framework/views/88bea98a1376d5d8feaf9cc6532eb4ba.php @@ -0,0 +1,125 @@ + +onlyProps([ + 'isActive' => true, +]) as $__key => $__value) { + $$__key = $$__key ?? $__value; +} ?> +exceptProps([ + 'isActive' => true, +]); ?> + true, +]), 'is_string', ARRAY_FILTER_USE_KEY) as $__key => $__value) { + $$__key = $$__key ?? $__value; +} ?> + + $__value) { + if (array_key_exists($__key, $__defined_vars)) unset($$__key); +} ?> + + +
    merge(['class' => 'box-shadow rounded-lg border border-gray-200 dark:border-gray-800 bg-white dark:bg-gray-900'])); ?>> + + + > + + + 'admin::components.shimmer.accordion.index','data' => ['class' => 'h-[271px] w-[360px]']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::shimmer.accordion'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['class' => 'h-[271px] w-[360px]']); ?> +renderComponent(); ?> + + + + + + + + + + + + + + + + + + +
    + +hasRenderedOnce('704a1804-6644-41df-a496-0d3a431b7b4c')): $__env->markAsRenderedOnce('704a1804-6644-41df-a496-0d3a431b7b4c'); +$__env->startPush('scripts'); ?> + + + +stopPush(); endif; ?> + \ No newline at end of file diff --git a/storage/framework/views/8a17e69ebe882e749209f94a38820f3c.php b/storage/framework/views/8a17e69ebe882e749209f94a38820f3c.php new file mode 100755 index 0000000..e603a50 --- /dev/null +++ b/storage/framework/views/8a17e69ebe882e749209f94a38820f3c.php @@ -0,0 +1,776 @@ +getNameKey()) ?? system_config()->getConfigData($field->getNameKey())); ?> + + + +
    + +
    + +
    +
    +
    + +hasRenderedOnce('f77d7c2d-2a42-4ba0-aac7-b569b0f3d956')): $__env->markAsRenderedOnce('f77d7c2d-2a42-4ba0-aac7-b569b0f3d956'); +$__env->startPush('scripts'); ?> + + + + + + + +stopPush(); endif; ?> \ No newline at end of file diff --git a/storage/framework/views/8a59a466a35144d796c5b814196af89b.php b/storage/framework/views/8a59a466a35144d796c5b814196af89b.php new file mode 100755 index 0000000..d715a2a --- /dev/null +++ b/storage/framework/views/8a59a466a35144d796c5b814196af89b.php @@ -0,0 +1,245 @@ +
    + +
    + + + + 'admin::components.layouts.sidebar.mobile.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::layouts.sidebar.mobile'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> +renderComponent(); ?> + + + + + + + + + + + + getConfigData('general.general.admin_logo.logo_image')): ?> + <?php echo e(config('app.name')); ?> + + <?php echo e(config('app.name')); ?> + + <?php echo e(config('app.name')); ?> + + +
    + +
    + + make('admin::components.layouts.header.desktop.mega-search', \Illuminate\Support\Arr::except(get_defined_vars(), ['__data', '__path']))->render(); ?> + + + make('admin::components.layouts.header.quick-creation', \Illuminate\Support\Arr::except(get_defined_vars(), ['__data', '__path']))->render(); ?> +
    + +
    +
    + + make('admin::components.layouts.header.mobile.mega-search', \Illuminate\Support\Arr::except(get_defined_vars(), ['__data', '__path']))->render(); ?> +
    + + + +
    + +
    +
    + +
    + + make('admin::components.layouts.header.quick-creation', \Illuminate\Support\Arr::except(get_defined_vars(), ['__data', '__path']))->render(); ?> +
    + + + + + 'admin::components.dropdown.index','data' => ['position' => 'bottom-'.e(in_array(app()->getLocale(), ['fa', 'ar']) ? 'left' : 'right').'']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::dropdown'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['position' => 'bottom-'.e(in_array(app()->getLocale(), ['fa', 'ar']) ? 'left' : 'right').'']); ?> + slot('toggle', null, []); ?> + guard('user')->user()); ?> + + image): ?> + + + + + endSlot(); ?> + + + slot('content', null, ['class' => 'mt-2 border-t-0 !p-0']); ?> +
    + + + +

    + get('admin::app.layouts.app-version', ['version' => core()->version()]); ?> +

    +
    + +
    + + get('admin::app.layouts.my-account'); ?> + + + + + + 'admin::components.form.index','data' => ['method' => 'DELETE','action' => ''.e(route('admin.session.destroy')).'','id' => 'adminLogout']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['method' => 'DELETE','action' => ''.e(route('admin.session.destroy')).'','id' => 'adminLogout']); ?> + renderComponent(); ?> + + + + + + + + + + + + get('admin::app.layouts.sign-out'); ?> + +
    + endSlot(); ?> + renderComponent(); ?> + + + + + + + + + +
    +
    + +hasRenderedOnce('517f80af-d0e7-4f1f-b910-f0764e3becdf')): $__env->markAsRenderedOnce('517f80af-d0e7-4f1f-b910-f0764e3becdf'); +$__env->startPush('scripts'); ?> + + + +stopPush(); endif; ?> + \ No newline at end of file diff --git a/storage/framework/views/8bae8d55f9e611db52d14d4cea7aed55.php b/storage/framework/views/8bae8d55f9e611db52d14d4cea7aed55.php new file mode 100755 index 0000000..e0b8a20 --- /dev/null +++ b/storage/framework/views/8bae8d55f9e611db52d14d4cea7aed55.php @@ -0,0 +1,4 @@ +merge(['class' => 'bg-gray-50 dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300'])); ?>> + + + \ No newline at end of file diff --git a/storage/framework/views/8bf5d3a224233878842202702d6fc971.php b/storage/framework/views/8bf5d3a224233878842202702d6fc971.php new file mode 100755 index 0000000..39dd3e9 --- /dev/null +++ b/storage/framework/views/8bf5d3a224233878842202702d6fc971.php @@ -0,0 +1,500 @@ + +onlyProps([ + 'type' => 'text', + 'name' => '', +]) as $__key => $__value) { + $$__key = $$__key ?? $__value; +} ?> +exceptProps([ + 'type' => 'text', + 'name' => '', +]); ?> + 'text', + 'name' => '', +]), 'is_string', ARRAY_FILTER_USE_KEY) as $__key => $__value) { + $$__key = $$__key ?? $__value; +} ?> + + $__value) { + if (array_key_exists($__key, $__defined_vars)) unset($$__key); +} ?> + + + + + + + + only(['name', ':name', 'value', ':value', 'v-model', 'rules', ':rules', 'label', ':label'])); ?> + + name="" + > + except(['value', ':value', 'v-model', 'rules', ':rules', 'label', ':label'])->merge(['class' => 'w-full rounded border border-gray-200 px-2.5 py-2 text-sm font-normal text-gray-800 transition-all hover:border-gray-400 focus:border-gray-400 dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300 dark:hover:border-gray-400 dark:focus:border-gray-400'])); ?> + + /> + + + + + + only(['name', ':name', 'value', ':value', 'v-model', 'rules', ':rules', 'label', ':label'])); ?> + + name="" + > +
    + + attributes->merge(['class' => 'py-2.5 text-gray-500 ltr:pl-4 rtl:pr-4'])); ?>> + + + + + + + + + + + except(['value', ':value', 'v-model', 'rules', ':rules', 'label', ':label'])->merge(['class' => 'w-full p-2.5 text-sm text-gray-600 dark:bg-gray-900 dark:text-gray-300'])); ?> + + /> +
    +
    + + + + + only(['name', ':name', 'value', ':value', 'v-model', 'rules', ':rules', 'label', ':label'])); ?> + + name="" + > + except(['value', ':value', 'v-model', 'rules', ':rules', 'label', ':label'])->merge(['class' => 'w-full dark:file:bg-gray-800 dark:file:dark:text-white rounded border border-gray-200 px-2.5 py-2 text-sm font-normal text-gray-800 transition-all hover:border-gray-400 focus:border-gray-400 dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300 dark:hover:border-gray-400 dark:focus:border-gray-400'])); ?> + + @change="handleChange" + @blur="handleBlur" + /> + + + + + + except('class')); ?> + + > + except(['value'])->merge(['class' => 'w-full appearance-none rounded-md border text-sm text-gray-600 transition-all hover:border-gray-400 dark:text-gray-300 dark:hover:border-gray-400'])); ?> + + > + + + + + only(['name', ':name', 'value', ':value', 'v-model', 'rules', ':rules', 'label', ':label'])); ?> + + name="" + > + 'w-full rounded border border-gray-200 px-2.5 py-2 text-sm font-normal text-gray-800 transition-all hover:border-gray-400 focus:border-gray-400 dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300 dark:hover:border-gray-400 dark:focus:border-gray-400' + ]; + + if ($attributes->get('tinymce', false) || $attributes->get(':tinymce', false)) { + $defaultAttributes['id'] = $attributes->get(':id', 'id'); + } + ?> + + + + get('tinymce', false) || $attributes->get(':tinymce', false)): ?> + + + 'admin::components.tinymce.index','data' => ['selector' => 'textarea#' . ($attributes->get('id') ?? $attributes->get(':id')),':field' => 'field']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::tinymce'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['selector' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute('textarea#' . ($attributes->get('id') ?? $attributes->get(':id'))),':field' => 'field']); ?> +renderComponent(); ?> + + + + + + + + + + + + + + + + only(['name', ':name', 'value', ':value', 'v-model', 'rules', ':rules', 'label', ':label'])->merge(['rules' => 'regex:^\d{4}-\d{2}-\d{2}$'])); ?> + + name="" + > + + + 'admin::components.flat-picker.date','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::flat-picker.date'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> + except(['value', ':value', 'v-model', 'rules', ':rules', 'label', ':label'])->merge(['class' => 'w-full rounded border border-gray-200 px-2.5 py-2 text-sm font-normal text-gray-800 transition-all hover:border-gray-400 focus:border-gray-400 dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300 dark:hover:border-gray-400 dark:focus:border-gray-400'])); ?> + + autocomplete="off" + /> + renderComponent(); ?> + + + + + + + + + + + + + + + only(['name', ':name', 'value', ':value', 'v-model', 'rules', ':rules', 'label', ':label'])->merge(['rules' => 'regex:^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}$'])); ?> + + name="" + > + + + 'admin::components.flat-picker.datetime','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::flat-picker.datetime'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> + except(['value', ':value', 'v-model', 'rules', ':rules', 'label', ':label'])->merge(['class' => 'w-full rounded border border-gray-200 px-2.5 py-2 text-sm font-normal text-gray-800 transition-all hover:border-gray-400 focus:border-gray-400 dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300 dark:hover:border-gray-400 dark:focus:border-gray-400'])); ?> + + autocomplete="off" + > + renderComponent(); ?> + + + + + + + + + + + + + + only(['name', ':name', 'value', ':value', 'v-model', 'rules', ':rules', 'label', ':label'])); ?> + + name="" + > + + + + + + + except([])->merge(['class' => 'flex w-full flex-col rounded-md border bg-white px-3 py-2.5 text-sm font-normal text-gray-600 transition-all hover:border-gray-400 dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300 dark:hover:border-gray-400'])); ?> + + name="" + multiple + > + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 'admin::components.media.images','data' => ['name' => ''.e($name).'',':class' => '[errors && errors[\''.e($name).'\'] ? \'border !border-red-600 hover:border-red-600\' : \'\']','attributes' => $attributes]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::media.images'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['name' => ''.e($name).'',':class' => '[errors && errors[\''.e($name).'\'] ? \'border !border-red-600 hover:border-red-600\' : \'\']','attributes' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($attributes)]); ?> +renderComponent(); ?> + + + + + + + + + + + + + + + + 'admin::components.form.control-group.controls.inline.text','data' => ['attributes' => $attributes]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.controls.inline.text'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['attributes' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($attributes)]); ?> +renderComponent(); ?> + + + + + + + + + + + + + + > + + + + + + + + + + 'admin::components.form.control-group.controls.tags','data' => ['name' => $name,'data' => $attributes->get(':data') ?? $attributes->get('data'),'attributes' => $attributes]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.controls.tags'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['name' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($name),'data' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($attributes->get(':data') ?? $attributes->get('data')),'attributes' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($attributes)]); ?> +renderComponent(); ?> + + + + + + + + + + + + +hasRenderedOnce('f89a5345-d0a9-435c-88eb-c688107d8bc7')): $__env->markAsRenderedOnce('f89a5345-d0a9-435c-88eb-c688107d8bc7'); +$__env->startPush('scripts'); ?> + + + +stopPush(); endif; ?> + \ No newline at end of file diff --git a/storage/framework/views/8c4fb3572583daf48a49a4c3c10aa8f0.php b/storage/framework/views/8c4fb3572583daf48a49a4c3c10aa8f0.php new file mode 100755 index 0000000..10a8435 --- /dev/null +++ b/storage/framework/views/8c4fb3572583daf48a49a4c3c10aa8f0.php @@ -0,0 +1,592 @@ + + + + + + 'admin::components.shimmer.common.address','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::shimmer.common.address'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> +renderComponent(); ?> + + + + + + + + + + + + +hasRenderedOnce('2b90d9f3-9e4d-4972-b820-898c7e8bf0b7')): $__env->markAsRenderedOnce('2b90d9f3-9e4d-4972-b820-898c7e8bf0b7'); +$__env->startPush('scripts'); ?> + + + +stopPush(); endif; ?> \ No newline at end of file diff --git a/storage/framework/views/8cd6f22911eceb78967b172efb7a3e4d.php b/storage/framework/views/8cd6f22911eceb78967b172efb7a3e4d.php new file mode 100755 index 0000000..0e1bd8f --- /dev/null +++ b/storage/framework/views/8cd6f22911eceb78967b172efb7a3e4d.php @@ -0,0 +1,21 @@ + + + 'admin::components.form.control-group.controls.inline.boolean','data' => [':name' => '\''.e($attribute->code).'\'','value' => json_encode($value),'rules' => 'required','position' => 'left','label' => $attribute->name,':errors' => 'errors','placeholder' => $attribute->name,'url' => $url,'allowEdit' => $allowEdit]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.controls.inline.boolean'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([':name' => '\''.e($attribute->code).'\'','value' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(json_encode($value)),'rules' => 'required','position' => 'left','label' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($attribute->name),':errors' => 'errors','placeholder' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($attribute->name),'url' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($url),'allow-edit' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($allowEdit)]); ?> +renderComponent(); ?> + + + + + + + + + + \ No newline at end of file diff --git a/storage/framework/views/8db0fee22081357b08aac61d2811038f.php b/storage/framework/views/8db0fee22081357b08aac61d2811038f.php new file mode 100755 index 0000000..f3b3955 --- /dev/null +++ b/storage/framework/views/8db0fee22081357b08aac61d2811038f.php @@ -0,0 +1,222 @@ + + + 'admin::components.layouts.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::layouts'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> + slot('title', null, []); ?> + get('admin::app.dashboard.index.title'); ?> + endSlot(); ?> + + + + + +
    + + + +
    +

    + get('admin::app.dashboard.index.title'); ?> +

    +
    + + + + + + + + + + +
    +
    +
    +
    +
    + + + +
    + + + + + + + + +
    + + + + +
    + + make('admin::dashboard.index.revenue', \Illuminate\Support\Arr::except(get_defined_vars(), ['__data', '__path']))->render(); ?> + + + make('admin::dashboard.index.over-all', \Illuminate\Support\Arr::except(get_defined_vars(), ['__data', '__path']))->render(); ?> + + + make('admin::dashboard.index.total-leads', \Illuminate\Support\Arr::except(get_defined_vars(), ['__data', '__path']))->render(); ?> + +
    + + make('admin::dashboard.index.top-selling-products', \Illuminate\Support\Arr::except(get_defined_vars(), ['__data', '__path']))->render(); ?> + + + make('admin::dashboard.index.top-persons', \Illuminate\Support\Arr::except(get_defined_vars(), ['__data', '__path']))->render(); ?> +
    +
    + + + + + + + + +
    + + make('admin::dashboard.index.open-leads-by-states', \Illuminate\Support\Arr::except(get_defined_vars(), ['__data', '__path']))->render(); ?> + + + make('admin::dashboard.index.revenue-by-sources', \Illuminate\Support\Arr::except(get_defined_vars(), ['__data', '__path']))->render(); ?> + + + make('admin::dashboard.index.revenue-by-types', \Illuminate\Support\Arr::except(get_defined_vars(), ['__data', '__path']))->render(); ?> +
    + + + +
    + + + + + hasRenderedOnce('6b012e08-1880-4962-91f3-cedcee3c943d')): $__env->markAsRenderedOnce('6b012e08-1880-4962-91f3-cedcee3c943d'); +$__env->startPush('scripts'); ?> + + + + + + + + + stopPush(); endif; ?> + renderComponent(); ?> + + + + + + + + + + \ No newline at end of file diff --git a/storage/framework/views/8e57faf3fdad6d72cd5dae96efb6e32d.php b/storage/framework/views/8e57faf3fdad6d72cd5dae96efb6e32d.php new file mode 100755 index 0000000..3ef28fb --- /dev/null +++ b/storage/framework/views/8e57faf3fdad6d72cd5dae96efb6e32d.php @@ -0,0 +1,29 @@ +startComponent('admin::emails.layout'); ?> +
    +

    + get('admin::app.emails.common.user.forget-password.dear', ['username' => $user_name]); ?>, 👋 +

    + +

    + get('admin::app.emails.common.user.forget-password.info'); ?> +

    + +

    + + get('admin::app.emails.common.user.forget-password.reset-password'); ?> + +

    + +

    + get('admin::app.emails.common.user.forget-password.final-summary'); ?> +

    + +

    + get('admin::app.emails.common.user.forget-password.thanks'); ?> +

    +
    +renderComponent(); ?> + \ No newline at end of file diff --git a/storage/framework/views/8f116a3d8eb219317dd63973388de625.php b/storage/framework/views/8f116a3d8eb219317dd63973388de625.php new file mode 100755 index 0000000..60b7443 --- /dev/null +++ b/storage/framework/views/8f116a3d8eb219317dd63973388de625.php @@ -0,0 +1,38 @@ + + + + + + + + + + + + +
    +
    + +
    + + <?php echo e(config('app.name')); ?> + +
    + + + + + + +

    + get('admin::app.emails.common.cheers', ['app_name' => config('app.name')]); ?> +

    +
    +
    + + + \ No newline at end of file diff --git a/storage/framework/views/9055d5aa6817e1c2a482961ccb336070.php b/storage/framework/views/9055d5aa6817e1c2a482961ccb336070.php new file mode 100755 index 0000000..c1a0b1d --- /dev/null +++ b/storage/framework/views/9055d5aa6817e1c2a482961ccb336070.php @@ -0,0 +1,658 @@ + + + 'admin::components.layouts.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::layouts'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> + + slot('title', null, []); ?> + get('admin::app.settings.tags.index.title'); ?> + endSlot(); ?> + +
    + +
    +
    + + + + + + + 'admin::components.breadcrumbs.index','data' => ['name' => 'settings.tags']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::breadcrumbs'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['name' => 'settings.tags']); ?> +renderComponent(); ?> + + + + + + + + + + + + + +
    + get('admin::app.settings.tags.index.title'); ?> +
    +
    + +
    + + + + + hasPermission('settings.other_settings.tags.create')): ?> +
    + +
    + + + + +
    +
    + + + + + + 'admin::components.shimmer.datagrid.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::shimmer.datagrid'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> +renderComponent(); ?> + + + + + + + + + + +
    + + hasRenderedOnce('aadcc06a-0764-4186-a267-2414a06e95e0')): $__env->markAsRenderedOnce('aadcc06a-0764-4186-a267-2414a06e95e0'); +$__env->startPush('scripts'); ?> + + + + stopPush(); endif; ?> + renderComponent(); ?> + + + + + + + + + + \ No newline at end of file diff --git a/storage/framework/views/909db4de01ae69ca6d8fdb47d48c3ae9.php b/storage/framework/views/909db4de01ae69ca6d8fdb47d48c3ae9.php new file mode 100755 index 0000000..97c0ae9 --- /dev/null +++ b/storage/framework/views/909db4de01ae69ca6d8fdb47d48c3ae9.php @@ -0,0 +1,41 @@ +
    + +
    + +
    +
    +
    + +
    + + +
    + +
    + + +
    + +
    + + +
    +
    +
    + +
    +
    +
    +
    + +
    +
    + + +
    +
    +
    + +
    +
    +
    \ No newline at end of file diff --git a/storage/framework/views/90a5248af06033b8f4dd64a644274070.php b/storage/framework/views/90a5248af06033b8f4dd64a644274070.php new file mode 100755 index 0000000..3982ac1 --- /dev/null +++ b/storage/framework/views/90a5248af06033b8f4dd64a644274070.php @@ -0,0 +1,293 @@ + +onlyProps([ + 'allowEdit' => true, +]) as $__key => $__value) { + $$__key = $$__key ?? $__value; +} ?> +exceptProps([ + 'allowEdit' => true, +]); ?> + true, +]), 'is_string', ARRAY_FILTER_USE_KEY) as $__key => $__value) { + $$__key = $$__key ?? $__value; +} ?> + + $__value) { + if (array_key_exists($__key, $__defined_vars)) unset($$__key); +} ?> + + + + + :allow-edit="" + > +
    +
    +
    +
    +
    +
    + +hasRenderedOnce('3d496ce1-f97b-41af-8b98-5bd7337a28ab')): $__env->markAsRenderedOnce('3d496ce1-f97b-41af-8b98-5bd7337a28ab'); +$__env->startPush('scripts'); ?> + + + +stopPush(); endif; ?> \ No newline at end of file diff --git a/storage/framework/views/90b04458d177c3dada7a3e01eb2c135a.php b/storage/framework/views/90b04458d177c3dada7a3e01eb2c135a.php new file mode 100755 index 0000000..00abd18 --- /dev/null +++ b/storage/framework/views/90b04458d177c3dada7a3e01eb2c135a.php @@ -0,0 +1,171 @@ + + + + + + + + + 'admin::components.shimmer.dashboard.index.top-selling-products','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::shimmer.dashboard.index.top-selling-products'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> +renderComponent(); ?> + + + + + + + + + + + + + + +hasRenderedOnce('bb1c48c5-abdc-41c4-a8d5-89bdafcaef69')): $__env->markAsRenderedOnce('bb1c48c5-abdc-41c4-a8d5-89bdafcaef69'); +$__env->startPush('scripts'); ?> + + + +stopPush(); endif; ?> + \ No newline at end of file diff --git a/storage/framework/views/90deeaf9f2dcac7abfde3cc13e37ffd7.php b/storage/framework/views/90deeaf9f2dcac7abfde3cc13e37ffd7.php new file mode 100755 index 0000000..4a6caec --- /dev/null +++ b/storage/framework/views/90deeaf9f2dcac7abfde3cc13e37ffd7.php @@ -0,0 +1,20 @@ +hasPages()): ?> + + + \ No newline at end of file diff --git a/storage/framework/views/91bc81542d0d8bc6a883e11ba4f0a393.php b/storage/framework/views/91bc81542d0d8bc6a883e11ba4f0a393.php new file mode 100755 index 0000000..04f9781 --- /dev/null +++ b/storage/framework/views/91bc81542d0d8bc6a883e11ba4f0a393.php @@ -0,0 +1,5 @@ +
  • merge(['class' => 'cursor-pointer px-5 py-2 text-sm text-gray-800 hover:bg-gray-100 dark:text-gray-300 dark:hover:bg-gray-950 '])); ?>> + + +
  • + \ No newline at end of file diff --git a/storage/framework/views/925d1237a9e4ca489126a9072aa264d2.php b/storage/framework/views/925d1237a9e4ca489126a9072aa264d2.php new file mode 100755 index 0000000..c2e9f12 --- /dev/null +++ b/storage/framework/views/925d1237a9e4ca489126a9072aa264d2.php @@ -0,0 +1,188 @@ + + + 'admin::components.layouts.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::layouts'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> + slot('title', null, []); ?> + get('admin::app.quotes.index.title'); ?> + endSlot(); ?> + + +
    +
    +
    + + + + 'admin::components.breadcrumbs.index','data' => ['name' => 'quotes']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::breadcrumbs'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['name' => 'quotes']); ?> +renderComponent(); ?> + + + + + + + + + + +
    + get('admin::app.quotes.index.title'); ?> +
    +
    + +
    + +
    + hasPermission('quotes.create')): ?> + + get('admin::app.quotes.index.create-btn'); ?> + + +
    +
    +
    + + + + + 'admin::components.shimmer.datagrid.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::shimmer.datagrid'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> +renderComponent(); ?> + + + + + + + + + +
    +
    + + hasRenderedOnce('00b2a494-37a1-4ec5-801c-c202def1310d')): $__env->markAsRenderedOnce('00b2a494-37a1-4ec5-801c-c202def1310d'); +$__env->startPush('scripts'); ?> + + + + stopPush(); endif; ?> + renderComponent(); ?> + + + + + + + + + + \ No newline at end of file diff --git a/storage/framework/views/92acfd4627deaa2d813e04f81ba29728.php b/storage/framework/views/92acfd4627deaa2d813e04f81ba29728.php new file mode 100755 index 0000000..965a019 --- /dev/null +++ b/storage/framework/views/92acfd4627deaa2d813e04f81ba29728.php @@ -0,0 +1,212 @@ + + + + + + + + + 'admin::components.shimmer.dashboard.index.revenue-by-sources','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::shimmer.dashboard.index.revenue-by-sources'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> +renderComponent(); ?> + + + + + + + + + + + + + + +hasRenderedOnce('f1b98192-fbb0-40b4-bc43-10b01083aae3')): $__env->markAsRenderedOnce('f1b98192-fbb0-40b4-bc43-10b01083aae3'); +$__env->startPush('scripts'); ?> + + + +stopPush(); endif; ?> + \ No newline at end of file diff --git a/storage/framework/views/92b3aade7795023f63125b7bb1702d03.php b/storage/framework/views/92b3aade7795023f63125b7bb1702d03.php new file mode 100755 index 0000000..c9946d8 --- /dev/null +++ b/storage/framework/views/92b3aade7795023f63125b7bb1702d03.php @@ -0,0 +1,639 @@ + +onlyProps([ + 'isMultiRow' => false, + 'toolbarLeftBefore' => null, + 'toolbarLeftAfter' => null, + 'toolbarRightBefore' => null, + 'toolbarRightAfter' => null, +]) as $__key => $__value) { + $$__key = $$__key ?? $__value; +} ?> +exceptProps([ + 'isMultiRow' => false, + 'toolbarLeftBefore' => null, + 'toolbarLeftAfter' => null, + 'toolbarRightBefore' => null, + 'toolbarRightAfter' => null, +]); ?> + false, + 'toolbarLeftBefore' => null, + 'toolbarLeftAfter' => null, + 'toolbarRightBefore' => null, + 'toolbarRightAfter' => null, +]), 'is_string', ARRAY_FILTER_USE_KEY) as $__key => $__value) { + $$__key = $$__key ?? $__value; +} ?> + + $__value) { + if (array_key_exists($__key, $__defined_vars)) unset($$__key); +} ?> + + +> + + + + +hasRenderedOnce('07e471f0-385c-411d-949d-0a0446508e1c')): $__env->markAsRenderedOnce('07e471f0-385c-411d-949d-0a0446508e1c'); +$__env->startPush('scripts'); ?> + + + +stopPush(); endif; ?> + \ No newline at end of file diff --git a/storage/framework/views/92b933031062dd5cad4972c31428fb46.php b/storage/framework/views/92b933031062dd5cad4972c31428fb46.php new file mode 100755 index 0000000..ae63fd6 --- /dev/null +++ b/storage/framework/views/92b933031062dd5cad4972c31428fb46.php @@ -0,0 +1,181 @@ + + + + + + + + + 'admin::components.shimmer.dashboard.index.top-persons','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::shimmer.dashboard.index.top-persons'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> +renderComponent(); ?> + + + + + + + + + + + + + + +hasRenderedOnce('2f5a2c3c-a231-44c0-9903-9c279002594f')): $__env->markAsRenderedOnce('2f5a2c3c-a231-44c0-9903-9c279002594f'); +$__env->startPush('scripts'); ?> + + + +stopPush(); endif; ?> + \ No newline at end of file diff --git a/storage/framework/views/92e13459cd974753921232bbfbf0aeb9.php b/storage/framework/views/92e13459cd974753921232bbfbf0aeb9.php new file mode 100755 index 0000000..d23b956 --- /dev/null +++ b/storage/framework/views/92e13459cd974753921232bbfbf0aeb9.php @@ -0,0 +1,38 @@ + +onlyProps([ + 'name' => '', + 'entity' => null, + 'route' => null, +]) as $__key => $__value) { + $$__key = $$__key ?? $__value; +} ?> +exceptProps([ + 'name' => '', + 'entity' => null, + 'route' => null, +]); ?> + '', + 'entity' => null, + 'route' => null, +]), 'is_string', ARRAY_FILTER_USE_KEY) as $__key => $__value) { + $$__key = $$__key ?? $__value; +} ?> + + $__value) { + if (array_key_exists($__key, $__defined_vars)) unset($$__key); +} ?> + + +
    +
    + + + + + + + +
    +
    + \ No newline at end of file diff --git a/storage/framework/views/9317ecbb458a25699dddb338429ce29a.php b/storage/framework/views/9317ecbb458a25699dddb338429ce29a.php new file mode 100755 index 0000000..aef98a1 --- /dev/null +++ b/storage/framework/views/9317ecbb458a25699dddb338429ce29a.php @@ -0,0 +1,85 @@ + +onlyProps(['isMultiRow' => false]) as $__key => $__value) { + $$__key = $$__key ?? $__value; +} ?> +exceptProps(['isMultiRow' => false]); ?> + false]), 'is_string', ARRAY_FILTER_USE_KEY) as $__key => $__value) { + $$__key = $$__key ?? $__value; +} ?> + + $__value) { + if (array_key_exists($__key, $__defined_vars)) unset($$__key); +} ?> + + +
    + + + 'admin::components.shimmer.datagrid.toolbar','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::shimmer.datagrid.toolbar'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> +renderComponent(); ?> + + + + + + + + + + +
    +
    +
    + + + 'admin::components.shimmer.datagrid.table.head','data' => ['isMultiRow' => $isMultiRow]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::shimmer.datagrid.table.head'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['isMultiRow' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($isMultiRow)]); ?> +renderComponent(); ?> + + + + + + + + + + + + + 'admin::components.shimmer.datagrid.table.body','data' => ['isMultiRow' => $isMultiRow]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::shimmer.datagrid.table.body'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['isMultiRow' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($isMultiRow)]); ?> +renderComponent(); ?> + + + + + + + + + +
    +
    +
    +
    + \ No newline at end of file diff --git a/storage/framework/views/934aab714a4eb851ea4eb219c788782b.php b/storage/framework/views/934aab714a4eb851ea4eb219c788782b.php new file mode 100755 index 0000000..10c6f90 --- /dev/null +++ b/storage/framework/views/934aab714a4eb851ea4eb219c788782b.php @@ -0,0 +1,108 @@ +addLoop($__currentLoopData); foreach($__currentLoopData as $attribute): $__env->incrementLoopIndices(); $loop = $__env->getLastLoop(); ?> + is_required) { + $validations[] = 'required'; + } + + if ($attribute->type == 'price') { + $validations[] = 'decimal'; + } + + $validations[] = $attribute->validation; + + $validations = implode('|', array_filter($validations)); + ?> + + + + 'admin::components.form.control-group.index','data' => ['class' => 'mb-2.5 w-full']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['class' => 'mb-2.5 w-full']); ?> + + + 'admin::components.form.control-group.label','data' => ['for' => ''.e($attribute->code).'','class' => $attribute->is_required ? 'required' : '']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.label'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['for' => ''.e($attribute->code).'','class' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($attribute->is_required ? 'required' : '')]); ?> + name); ?> + + + type == 'price'): ?> + (currencySymbol(config('app.currency'))); ?>) + + renderComponent(); ?> + + + + + + + + + + + + + + 'admin::components.attributes.edit.index','data' => ['attribute' => $attribute,'validations' => $validations,'value' => isset($entity) ? $entity[$attribute->code] : null]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::attributes.edit.index'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['attribute' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($attribute),'validations' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($validations),'value' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(isset($entity) ? $entity[$attribute->code] : null)]); ?> +renderComponent(); ?> + + + + + + + + + + + + + + 'admin::components.form.control-group.error','data' => ['controlName' => $attribute->code]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.error'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['control-name' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($attribute->code)]); ?> +renderComponent(); ?> + + + + + + + + + + renderComponent(); ?> + + + + + + + + + +popLoop(); $loop = $__env->getLastLoop(); ?> \ No newline at end of file diff --git a/storage/framework/views/93aa69ca334eb6628bd9f09efab714ad.php b/storage/framework/views/93aa69ca334eb6628bd9f09efab714ad.php new file mode 100755 index 0000000..65fa5d0 --- /dev/null +++ b/storage/framework/views/93aa69ca334eb6628bd9f09efab714ad.php @@ -0,0 +1,522 @@ + + + + 'admin::components.layouts.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::layouts'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> + + slot('title', null, []); ?> + get('admin::app.settings.email-template.create.title'); ?> + endSlot(); ?> + + + + + + + 'admin::components.form.index','data' => ['action' => route('admin.settings.email_templates.store'),'method' => 'POST']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['action' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(route('admin.settings.email_templates.store')),'method' => 'POST']); ?> +
    +
    +
    + + + + + + + 'admin::components.breadcrumbs.index','data' => ['name' => 'settings.email_templates.create']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::breadcrumbs'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['name' => 'settings.email_templates.create']); ?> +renderComponent(); ?> + + + + + + + + + + + + + +
    + get('admin::app.settings.email-template.create.title'); ?> +
    +
    + +
    + +
    + + + + + + + +
    +
    +
    + + +
    + renderComponent(); ?> + + + + + + + + + + + + + + hasRenderedOnce('50ebe5be-a4b2-46be-879e-cf7c43eab07c')): $__env->markAsRenderedOnce('50ebe5be-a4b2-46be-879e-cf7c43eab07c'); +$__env->startPush('scripts'); ?> + + + + stopPush(); endif; ?> + renderComponent(); ?> + + + + + + + + + + \ No newline at end of file diff --git a/storage/framework/views/9558f9114f97694e92ae6472c02ebf05.php b/storage/framework/views/9558f9114f97694e92ae6472c02ebf05.php new file mode 100755 index 0000000..e638669 --- /dev/null +++ b/storage/framework/views/9558f9114f97694e92ae6472c02ebf05.php @@ -0,0 +1,1740 @@ + + + 'admin::components.layouts.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::layouts'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> + slot('title', null, []); ?> + get('admin::app.settings.attributes.edit.title'); ?> + endSlot(); ?> + + $attribute]); ?> + + + + + + 'admin::components.form.index','data' => ['action' => route('admin.settings.attributes.update', $attribute->id),'encType' => 'multipart/form-data','method' => 'PUT']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['action' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(route('admin.settings.attributes.update', $attribute->id)),'encType' => 'multipart/form-data','method' => 'PUT']); ?> +
    + $attribute]); ?> + + + +
    +
    + $attribute]); ?> + + + + + 'admin::components.breadcrumbs.index','data' => ['name' => 'settings.attributes.edit','entity' => $attribute]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::breadcrumbs'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['name' => 'settings.attributes.edit','entity' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($attribute)]); ?> +renderComponent(); ?> + + + + + + + + + + + $attribute]); ?> + + +
    + $attribute]); ?> + + + get('admin::app.settings.attributes.edit.title'); ?> + + $attribute]); ?> + +
    +
    + +
    + +
    + $attribute]); ?> + + + hasPermission('settings.automation.attributes.edit')): ?> + + + + $attribute]); ?> + +
    +
    +
    + + + + + + + 'admin::components.shimmer.settings.attributes','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::shimmer.settings.attributes'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> +renderComponent(); ?> + + + + + + + + + + + + $attribute]); ?> + +
    + renderComponent(); ?> + + + + + + + + + + + $attribute]); ?> + + + hasRenderedOnce('4f74ad12-e87c-48ab-abe6-068c06dcab69')): $__env->markAsRenderedOnce('4f74ad12-e87c-48ab-abe6-068c06dcab69'); +$__env->startPush('scripts'); ?> + + + + stopPush(); endif; ?> + renderComponent(); ?> + + + + + + + + + + \ No newline at end of file diff --git a/storage/framework/views/95b5c81635c64aea784454aff2257ef7.php b/storage/framework/views/95b5c81635c64aea784454aff2257ef7.php new file mode 100755 index 0000000..2b79c07 --- /dev/null +++ b/storage/framework/views/95b5c81635c64aea784454aff2257ef7.php @@ -0,0 +1,658 @@ + + + 'admin::components.layouts.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::layouts'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> + + slot('title', null, []); ?> + get('admin::app.account.edit.title'); ?> + endSlot(); ?> + + $user]); ?> + + + + + + 'admin::components.form.index','data' => ['action' => route('admin.user.account.update'),'enctype' => 'multipart/form-data','method' => 'PUT']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['action' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(route('admin.user.account.update')),'enctype' => 'multipart/form-data','method' => 'PUT']); ?> +
    +
    + $user]); ?> + + + + + + 'admin::components.breadcrumbs.index','data' => ['name' => 'dashboard.account.edit','entity' => $user]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::breadcrumbs'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['name' => 'dashboard.account.edit','entity' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($user)]); ?> +renderComponent(); ?> + + + + + + + + + + + $user]); ?> + + +
    + $user]); ?> + + + get('admin::app.account.edit.title'); ?> + + $user]); ?> + +
    +
    + +
    + +
    + $user]); ?> + + + + + $user]); ?> + +
    +
    +
    + + +
    + $user]); ?> + + + +
    + +
    +

    + get('admin::app.account.edit.general'); ?> +

    + + + + + 'admin::components.form.control-group.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> + + + 'admin::components.media.images','data' => ['name' => 'image','uploadedImages' => $user->image ? [['id' => 'image', 'url' => $user->image_url]] : []]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::media.images'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['name' => 'image','uploaded-images' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($user->image ? [['id' => 'image', 'url' => $user->image_url]] : [])]); ?> +renderComponent(); ?> + + + + + + + + + + renderComponent(); ?> + + + + + + + + + + +

    + get('admin::app.account.edit.upload-image-info'); ?> +

    + + + + + 'admin::components.form.control-group.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> + + + 'admin::components.form.control-group.label','data' => ['class' => 'required']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.label'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['class' => 'required']); ?> + get('admin::app.account.edit.name'); ?> + renderComponent(); ?> + + + + + + + + + + + + + 'admin::components.form.control-group.control','data' => ['type' => 'text','name' => 'name','rules' => 'required','value' => old('name') ?: $user->name,'label' => trans('admin::app.account.edit.name'),'placeholder' => trans('admin::app.account.edit.name')]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.control'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['type' => 'text','name' => 'name','rules' => 'required','value' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(old('name') ?: $user->name),'label' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(trans('admin::app.account.edit.name')),'placeholder' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(trans('admin::app.account.edit.name'))]); ?> +renderComponent(); ?> + + + + + + + + + + + + + 'admin::components.form.control-group.error','data' => ['controlName' => 'name']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.error'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['control-name' => 'name']); ?> +renderComponent(); ?> + + + + + + + + + + renderComponent(); ?> + + + + + + + + + + + + + + 'admin::components.form.control-group.index','data' => ['class' => '!mb-0']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['class' => '!mb-0']); ?> + + + 'admin::components.form.control-group.label','data' => ['class' => 'required']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.label'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['class' => 'required']); ?> + get('admin::app.account.edit.email'); ?> + renderComponent(); ?> + + + + + + + + + + + + + 'admin::components.form.control-group.control','data' => ['type' => 'email','name' => 'email','id' => 'email','rules' => 'required','value' => old('email') ?: $user->email,'label' => trans('admin::app.account.edit.email')]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.control'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['type' => 'email','name' => 'email','id' => 'email','rules' => 'required','value' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(old('email') ?: $user->email),'label' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(trans('admin::app.account.edit.email'))]); ?> +renderComponent(); ?> + + + + + + + + + + + + + 'admin::components.form.control-group.error','data' => ['controlName' => 'email']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.error'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['control-name' => 'email']); ?> +renderComponent(); ?> + + + + + + + + + + renderComponent(); ?> + + + + + + + + + +
    +
    + + $user]); ?> + + + $user]); ?> + + + +
    + + + 'admin::components.accordion.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::accordion'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> + slot('header', null, []); ?> +

    + get('admin::app.account.edit.change-password'); ?> +

    + endSlot(); ?> + + + slot('content', null, []); ?> + $user]); ?> + + + + + + 'admin::components.form.control-group.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> + + + 'admin::components.form.control-group.label','data' => ['class' => 'required']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.label'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['class' => 'required']); ?> + get('admin::app.account.edit.current-password'); ?> + renderComponent(); ?> + + + + + + + + + + + + + 'admin::components.form.control-group.control','data' => ['type' => 'password','name' => 'current_password','rules' => 'required|min:6','label' => trans('admin::app.account.edit.current-password'),'placeholder' => trans('admin::app.account.edit.current-password')]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.control'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['type' => 'password','name' => 'current_password','rules' => 'required|min:6','label' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(trans('admin::app.account.edit.current-password')),'placeholder' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(trans('admin::app.account.edit.current-password'))]); ?> +renderComponent(); ?> + + + + + + + + + + + + + 'admin::components.form.control-group.error','data' => ['controlName' => 'current_password']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.error'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['control-name' => 'current_password']); ?> +renderComponent(); ?> + + + + + + + + + + renderComponent(); ?> + + + + + + + + + + + $user]); ?> + + + $user]); ?> + + + + + + 'admin::components.form.control-group.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> + + + 'admin::components.form.control-group.label','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.label'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> + get('admin::app.account.edit.password'); ?> + renderComponent(); ?> + + + + + + + + + + + + + 'admin::components.form.control-group.control','data' => ['type' => 'password','name' => 'password','rules' => 'min:6','placeholder' => trans('admin::app.account.edit.password'),'ref' => 'password']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.control'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['type' => 'password','name' => 'password','rules' => 'min:6','placeholder' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(trans('admin::app.account.edit.password')),'ref' => 'password']); ?> +renderComponent(); ?> + + + + + + + + + + + + + 'admin::components.form.control-group.error','data' => ['controlName' => 'password']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.error'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['control-name' => 'password']); ?> +renderComponent(); ?> + + + + + + + + + + renderComponent(); ?> + + + + + + + + + + + $user]); ?> + + + $user]); ?> + + + + + + 'admin::components.form.control-group.index','data' => ['class' => '!mb-0']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['class' => '!mb-0']); ?> + + + 'admin::components.form.control-group.label','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.label'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> + get('admin::app.account.edit.confirm-password'); ?> + renderComponent(); ?> + + + + + + + + + + + + + 'admin::components.form.control-group.control','data' => ['type' => 'password','name' => 'password_confirmation','rules' => 'confirmed:@password','label' => trans('admin::app.account.edit.confirm-password'),'placeholder' => trans('admin::app.account.edit.confirm-password')]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.control'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['type' => 'password','name' => 'password_confirmation','rules' => 'confirmed:@password','label' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(trans('admin::app.account.edit.confirm-password')),'placeholder' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(trans('admin::app.account.edit.confirm-password'))]); ?> +renderComponent(); ?> + + + + + + + + + + + + + 'admin::components.form.control-group.error','data' => ['controlName' => 'password_confirmation']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.error'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['control-name' => 'password_confirmation']); ?> +renderComponent(); ?> + + + + + + + + + + renderComponent(); ?> + + + + + + + + + + + $user]); ?> + + endSlot(); ?> + renderComponent(); ?> + + + + + + + + + +
    + + $user]); ?> + +
    + renderComponent(); ?> + + + + + + + + + + + + + renderComponent(); ?> + + + + + + + + + + \ No newline at end of file diff --git a/storage/framework/views/973ec33cebe14c9893ad5d32ad8c68c9.php b/storage/framework/views/973ec33cebe14c9893ad5d32ad8c68c9.php new file mode 100755 index 0000000..5108953 --- /dev/null +++ b/storage/framework/views/973ec33cebe14c9893ad5d32ad8c68c9.php @@ -0,0 +1,25 @@ +
    +
    +
    +
    + +
    + +
    + +
    + +
    + +
    + +
    + + +
    +
    +
    +
    + +
    +
    \ No newline at end of file diff --git a/storage/framework/views/974fb0b69dbc0076e14acbf808232f09.php b/storage/framework/views/974fb0b69dbc0076e14acbf808232f09.php new file mode 100755 index 0000000..3eaecc5 --- /dev/null +++ b/storage/framework/views/974fb0b69dbc0076e14acbf808232f09.php @@ -0,0 +1,155 @@ + $lead]); ?> + + +person): ?> +
    + + + 'admin::components.accordion.index','data' => ['class' => 'select-none !border-none']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::accordion'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['class' => 'select-none !border-none']); ?> + slot('header', null, ['class' => '!p-0']); ?> +
    +

    get('admin::app.leads.view.persons.title'); ?>

    + + hasPermission('contacts.persons.edit')): ?> + + +
    + endSlot(); ?> + + slot('content', null, ['class' => 'mt-4 !px-0 !pb-0']); ?> +
    + $lead]); ?> + + + + + + 'admin::components.avatar.index','data' => ['name' => $lead->person->name]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::avatar'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['name' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($lead->person->name)]); ?> +renderComponent(); ?> + + + + + + + + + + + $lead]); ?> + + + +
    + $lead]); ?> + + + + person->name); ?> + + + + $lead]); ?> + + + $lead]); ?> + + + person->job_title): ?> + + person->organization): ?> + get('admin::app.leads.view.persons.job-title', [ + 'job_title' => $lead->person->job_title, + 'organization' => $lead->person->organization->name + ]); ?> + + person->job_title); ?> + + + + + + $lead]); ?> + + + $lead]); ?> + + + person->emails; $__env->addLoop($__currentLoopData); foreach($__currentLoopData as $email): $__env->incrementLoopIndices(); $loop = $__env->getLastLoop(); ?> +
    + + + + + + + () + +
    + popLoop(); $loop = $__env->getLastLoop(); ?> + + $lead]); ?> + + + $lead]); ?> + + + person->contact_numbers; $__env->addLoop($__currentLoopData); foreach($__currentLoopData as $contactNumber): $__env->incrementLoopIndices(); $loop = $__env->getLastLoop(); ?> +
    + + + + + + + () + +
    + popLoop(); $loop = $__env->getLastLoop(); ?> + + $lead]); ?> + +
    +
    + endSlot(); ?> + renderComponent(); ?> + + + + + + + + + +
    + + $lead]); ?> \ No newline at end of file diff --git a/storage/framework/views/98072615de1b43056c7a8ff124ef81d0.php b/storage/framework/views/98072615de1b43056c7a8ff124ef81d0.php new file mode 100755 index 0000000..8321dd3 --- /dev/null +++ b/storage/framework/views/98072615de1b43056c7a8ff124ef81d0.php @@ -0,0 +1,50 @@ + + + + + + 'admin::components.datagrid.index','data' => ['src' => route('admin.leads.index')]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::datagrid'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['src' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(route('admin.leads.index'))]); ?> + + + + 'admin::components.shimmer.datagrid.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::shimmer.datagrid'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> +renderComponent(); ?> + + + + + + + + + + + slot('toolbarRightAfter', null, []); ?> + make('admin::leads.index.view-switcher', \Illuminate\Support\Arr::except(get_defined_vars(), ['__data', '__path']))->render(); ?> + endSlot(); ?> + renderComponent(); ?> + + + + + + + + + + + \ No newline at end of file diff --git a/storage/framework/views/99aa974efcee7262d96012bc812fca61.php b/storage/framework/views/99aa974efcee7262d96012bc812fca61.php new file mode 100755 index 0000000..f9274cc --- /dev/null +++ b/storage/framework/views/99aa974efcee7262d96012bc812fca61.php @@ -0,0 +1,18 @@ + +
    + +
    + +
    +

    +

    +
    +
    + + +
    +

    +
    +
    + + \ No newline at end of file diff --git a/storage/framework/views/9ad7840c207a7afc87ee0e1cb234dcfa.php b/storage/framework/views/9ad7840c207a7afc87ee0e1cb234dcfa.php new file mode 100755 index 0000000..5e1dd50 --- /dev/null +++ b/storage/framework/views/9ad7840c207a7afc87ee0e1cb234dcfa.php @@ -0,0 +1,25 @@ +getLookUpEntity($attribute->lookup_type, $value); +?> + + + + 'admin::components.form.control-group.controls.inline.lookup','data' => [':name' => '\''.e($attribute->code).'\'',':value' => '\''.e($lookUpEntity?->name).'\'','attribute' => $attribute,'position' => 'left','label' => $attribute->name,':errors' => 'errors','placeholder' => $attribute->name,'url' => $url,'allowEdit' => $allowEdit,'valueLabel' => $lookUpEntity?->name ?? '--']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.controls.inline.lookup'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([':name' => '\''.e($attribute->code).'\'',':value' => '\''.e($lookUpEntity?->name).'\'','attribute' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($attribute),'position' => 'left','label' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($attribute->name),':errors' => 'errors','placeholder' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($attribute->name),'url' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($url),'allow-edit' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($allowEdit),'value-label' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($lookUpEntity?->name ?? '--')]); ?> +renderComponent(); ?> + + + + + + + + + + \ No newline at end of file diff --git a/storage/framework/views/9b0031b4889c60054d46ba508003d13e.php b/storage/framework/views/9b0031b4889c60054d46ba508003d13e.php new file mode 100755 index 0000000..96df0d1 --- /dev/null +++ b/storage/framework/views/9b0031b4889c60054d46ba508003d13e.php @@ -0,0 +1,116 @@ +
    + +
    +
    +
    +
    +
    + +
    + +
    +
    +
    +
    +
    + +
    + +
    +
    + +
    +
    + + +
    +
    + +
    +
    + + +
    +
    +
    + +
    +
    + +
    +
    + +
    +
    +
    + + +
    +
    +
    + +
    +
    + +
    +
    + +
    +
    +
    +
    +
    + + +
    +
    +
    +
    +
    +
    + +
    + +
    +
    + +
    +
    + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    + +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + + +
    +
    +
    +
    +
    +
    +
    +
    \ No newline at end of file diff --git a/storage/framework/views/9bc5b97a529c41a831f2a790c6b68649.php b/storage/framework/views/9bc5b97a529c41a831f2a790c6b68649.php new file mode 100755 index 0000000..7305f26 --- /dev/null +++ b/storage/framework/views/9bc5b97a529c41a831f2a790c6b68649.php @@ -0,0 +1,4 @@ +merge(['class' => 'bg-white dark:bg-gray-900 dark:text-gray-300 dark:border-gray-800'])); ?>> + + + \ No newline at end of file diff --git a/storage/framework/views/9d29dd05b14ef75e0e09c9fb664383d9.php b/storage/framework/views/9d29dd05b14ef75e0e09c9fb664383d9.php new file mode 100755 index 0000000..e368f28 --- /dev/null +++ b/storage/framework/views/9d29dd05b14ef75e0e09c9fb664383d9.php @@ -0,0 +1,21 @@ + + + 'admin::components.form.control-group.controls.inline.text','data' => ['type' => 'inline',':name' => '\''.e($attribute->code).'\'','value' => $value,'position' => 'left','rules' => 'required','label' => $attribute->name,'placeholder' => $attribute->name,':errors' => 'errors','url' => $url,'allowEdit' => $allowEdit]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.controls.inline.text'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['type' => 'inline',':name' => '\''.e($attribute->code).'\'','value' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($value),'position' => 'left','rules' => 'required','label' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($attribute->name),'placeholder' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($attribute->name),':errors' => 'errors','url' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($url),'allow-edit' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($allowEdit)]); ?> +renderComponent(); ?> + + + + + + + + + + \ No newline at end of file diff --git a/storage/framework/views/9ef6f52bd7cece2edcd3a9f011ce1337.php b/storage/framework/views/9ef6f52bd7cece2edcd3a9f011ce1337.php new file mode 100755 index 0000000..c3ca4bf --- /dev/null +++ b/storage/framework/views/9ef6f52bd7cece2edcd3a9f011ce1337.php @@ -0,0 +1,17 @@ +
    +
    +

    +
    + +
    +
    + +

    + +
    +
    + +
    +
    +
    +
    \ No newline at end of file diff --git a/storage/framework/views/9ef7d91b1c5f09419a9136420111b3a6.php b/storage/framework/views/9ef7d91b1c5f09419a9136420111b3a6.php new file mode 100755 index 0000000..15256e9 --- /dev/null +++ b/storage/framework/views/9ef7d91b1c5f09419a9136420111b3a6.php @@ -0,0 +1,283 @@ + + + + + + + + + 'admin::components.shimmer.dashboard.index.revenue','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::shimmer.dashboard.index.revenue'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> +renderComponent(); ?> + + + + + + + + + + + + + + +hasRenderedOnce('9d233a8c-5991-4d05-bc2b-bbcae094d976')): $__env->markAsRenderedOnce('9d233a8c-5991-4d05-bc2b-bbcae094d976'); +$__env->startPush('scripts'); ?> + + + +stopPush(); endif; ?> + \ No newline at end of file diff --git a/storage/framework/views/9ffcff2286213d3a8fe04af513c7cd88.php b/storage/framework/views/9ffcff2286213d3a8fe04af513c7cd88.php new file mode 100755 index 0000000..fcc01d8 --- /dev/null +++ b/storage/framework/views/9ffcff2286213d3a8fe04af513c7cd88.php @@ -0,0 +1,66 @@ + +onlyProps(['isMultiRow' => false]) as $__key => $__value) { + $$__key = $$__key ?? $__value; +} ?> +exceptProps(['isMultiRow' => false]); ?> + false]), 'is_string', ARRAY_FILTER_USE_KEY) as $__key => $__value) { + $$__key = $$__key ?? $__value; +} ?> + + $__value) { + if (array_key_exists($__key, $__defined_vars)) unset($$__key); +} ?> + + + + +
    +
    + +
    + +
    + +
    + +
    + +
    +
    + +
    +
    +
    + +
    +
    +
    + +
    +
    + +
    + +
    +
    +
    + +
    +
    + +
    + +
    +
    + +
    +
    + +
    + +
    +
    +
    + + + \ No newline at end of file diff --git a/storage/framework/views/a00783c81487f8730c1391b08502d86c.php b/storage/framework/views/a00783c81487f8730c1391b08502d86c.php new file mode 100755 index 0000000..96539f1 --- /dev/null +++ b/storage/framework/views/a00783c81487f8730c1391b08502d86c.php @@ -0,0 +1,45 @@ + + + + + +hasRenderedOnce('8af452bb-343b-45e0-b5d8-ad4fbbc224d5')): $__env->markAsRenderedOnce('8af452bb-343b-45e0-b5d8-ad4fbbc224d5'); +$__env->startPush('scripts'); ?> + + + +stopPush(); endif; ?> \ No newline at end of file diff --git a/storage/framework/views/a0b01cc8d8aa93c4b0106214b50105d3.php b/storage/framework/views/a0b01cc8d8aa93c4b0106214b50105d3.php new file mode 100755 index 0000000..47a6d67 --- /dev/null +++ b/storage/framework/views/a0b01cc8d8aa93c4b0106214b50105d3.php @@ -0,0 +1,556 @@ + + $lead]); ?> + + + + + + + 'admin::components.shimmer.leads.view.stages','data' => ['count' => $lead->pipeline->stages->count() - 1]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::shimmer.leads.view.stages'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['count' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($lead->pipeline->stages->count() - 1)]); ?> +renderComponent(); ?> + + + + + + + + + + + + $lead]); ?> + + +hasRenderedOnce('19468328-c6d0-46ff-9538-e807a2cd3e1c')): $__env->markAsRenderedOnce('19468328-c6d0-46ff-9538-e807a2cd3e1c'); +$__env->startPush('scripts'); ?> + + + +stopPush(); endif; ?> + \ No newline at end of file diff --git a/storage/framework/views/a0b4fa9fb4c26e44c4aa216c07a722a9.php b/storage/framework/views/a0b4fa9fb4c26e44c4aa216c07a722a9.php new file mode 100755 index 0000000..32a7f5e --- /dev/null +++ b/storage/framework/views/a0b4fa9fb4c26e44c4aa216c07a722a9.php @@ -0,0 +1,190 @@ + +onlyProps(['position' => 'bottom-left']) as $__key => $__value) { + $$__key = $$__key ?? $__value; +} ?> +exceptProps(['position' => 'bottom-left']); ?> + 'bottom-left']), 'is_string', ARRAY_FILTER_USE_KEY) as $__key => $__value) { + $$__key = $$__key ?? $__value; +} ?> + + $__value) { + if (array_key_exists($__key, $__defined_vars)) unset($$__key); +} ?> + + +merge(['class' => 'relative'])); ?>> + + + + + + + + + + + + + + + + +hasRenderedOnce('93369625-a76d-4e97-b7bc-d590576f69a5')): $__env->markAsRenderedOnce('93369625-a76d-4e97-b7bc-d590576f69a5'); +$__env->startPush('scripts'); ?> + + + +stopPush(); endif; ?> + \ No newline at end of file diff --git a/storage/framework/views/a15b5670fe81fa7c104d47953f0a0948.php b/storage/framework/views/a15b5670fe81fa7c104d47953f0a0948.php new file mode 100755 index 0000000..de4f9d9 --- /dev/null +++ b/storage/framework/views/a15b5670fe81fa7c104d47953f0a0948.php @@ -0,0 +1,47 @@ +hasPages()): ?> + + + \ No newline at end of file diff --git a/storage/framework/views/a1b6707d7b57bbc79ebb3cfb0642233c.php b/storage/framework/views/a1b6707d7b57bbc79ebb3cfb0642233c.php new file mode 100755 index 0000000..8d03c47 --- /dev/null +++ b/storage/framework/views/a1b6707d7b57bbc79ebb3cfb0642233c.php @@ -0,0 +1,243 @@ + + + + + + + + + + <?php echo e($title ?? ''); ?> + + + + + + + + + + + yieldPushContent('meta'); ?> + + set(['src/Resources/assets/css/app.css', 'src/Resources/assets/js/app.js'])); ?> + + + + + + + getConfigData('general.design.admin_logo.favicon')): ?> + + + + + + getConfigData('general.settings.menu_color.brand_color') ?? '#0E90D9'; + ?> + + yieldPushContent('styles'); ?> + + + + + + + + + + + +
    + + + + 'admin::components.flash-group.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::flash-group'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> +renderComponent(); ?> + + + + + + + + + + + + + + 'admin::components.modal.confirm','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::modal.confirm'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> +renderComponent(); ?> + + + + + + + + + + + + + + + + + 'admin::components.layouts.header.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::layouts.header'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> +renderComponent(); ?> + + + + + + + + + + + + + + +
    + + + + + yieldPushContent('scripts'); ?> + + + + + + + + + + + + \ No newline at end of file diff --git a/storage/framework/views/a1f8639f84aec9a6fcc765cd7fdb91d8.php b/storage/framework/views/a1f8639f84aec9a6fcc765cd7fdb91d8.php new file mode 100755 index 0000000..009be9a --- /dev/null +++ b/storage/framework/views/a1f8639f84aec9a6fcc765cd7fdb91d8.php @@ -0,0 +1,21 @@ + + + 'admin::components.form.control-group.controls.inline.text','data' => ['type' => 'inline',':name' => '\''.e($attribute->code).'\'',':value' => '\''.e($value).'\'','position' => 'left','rules' => 'required','label' => $attribute->name,'placeholder' => $attribute->name,':errors' => 'errors','url' => $url,'allowEdit' => $allowEdit]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.controls.inline.text'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['type' => 'inline',':name' => '\''.e($attribute->code).'\'',':value' => '\''.e($value).'\'','position' => 'left','rules' => 'required','label' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($attribute->name),'placeholder' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($attribute->name),':errors' => 'errors','url' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($url),'allow-edit' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($allowEdit)]); ?> +renderComponent(); ?> + + + + + + + + + + \ No newline at end of file diff --git a/storage/framework/views/a20a7427658b5c91a3f551c4fb22b570.php b/storage/framework/views/a20a7427658b5c91a3f551c4fb22b570.php new file mode 100755 index 0000000..513ddd6 --- /dev/null +++ b/storage/framework/views/a20a7427658b5c91a3f551c4fb22b570.php @@ -0,0 +1,598 @@ + + + 'admin::components.layouts.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::layouts'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> + slot('title', null, []); ?> + get('admin::app.settings.data-transfer.imports.import.title'); ?> + endSlot(); ?> + + +
    +
    + + + + + + + 'admin::components.breadcrumbs.index','data' => ['name' => 'settings.data_transfers.import','entity' => $import]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::breadcrumbs'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['name' => 'settings.data_transfers.import','entity' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($import)]); ?> +renderComponent(); ?> + + + + + + + + + + + + + +
    + get('admin::app.settings.data-transfer.imports.import.title'); ?> +
    +
    + +
    + +
    + + + + + hasPermission('settings.data_transfer.imports.edit')): ?> + + get('admin::app.settings.data-transfer.imports.import.edit-btn'); ?> + + + + + +
    +
    +
    + + + + + hasRenderedOnce('35c4cc68-7a74-4dd7-a899-e2a4f9100e19')): $__env->markAsRenderedOnce('35c4cc68-7a74-4dd7-a899-e2a4f9100e19'); +$__env->startPush('scripts'); ?> + + + + stopPush(); endif; ?> + renderComponent(); ?> + + + + + + + + + + \ No newline at end of file diff --git a/storage/framework/views/a3034fb28815c6737c7f1fe6dc837ca7.php b/storage/framework/views/a3034fb28815c6737c7f1fe6dc837ca7.php new file mode 100755 index 0000000..30294bb --- /dev/null +++ b/storage/framework/views/a3034fb28815c6737c7f1fe6dc837ca7.php @@ -0,0 +1,546 @@ + +onlyProps([ + 'entity' => null, + 'entityControlName' => null, +]) as $__key => $__value) { + $$__key = $$__key ?? $__value; +} ?> +exceptProps([ + 'entity' => null, + 'entityControlName' => null, +]); ?> + null, + 'entityControlName' => null, +]), 'is_string', ARRAY_FILTER_USE_KEY) as $__key => $__value) { + $$__key = $$__key ?? $__value; +} ?> + + $__value) { + if (array_key_exists($__key, $__defined_vars)) unset($$__key); +} ?> + + + +
    + + + + + + + + + + + + + + + + +
    + +hasRenderedOnce('786ceddc-089a-4bbf-9a89-e0ac450796f2')): $__env->markAsRenderedOnce('786ceddc-089a-4bbf-9a89-e0ac450796f2'); +$__env->startPush('scripts'); ?> + + + +stopPush(); endif; ?> \ No newline at end of file diff --git a/storage/framework/views/a37261f10bbbc05300815fb27a6ce63f.php b/storage/framework/views/a37261f10bbbc05300815fb27a6ce63f.php new file mode 100755 index 0000000..7aaf163 --- /dev/null +++ b/storage/framework/views/a37261f10bbbc05300815fb27a6ce63f.php @@ -0,0 +1,512 @@ + + + +hasRenderedOnce('9f78f9ab-144d-4c99-98ca-89a2ac460885')): $__env->markAsRenderedOnce('9f78f9ab-144d-4c99-98ca-89a2ac460885'); +$__env->startPush('scripts'); ?> + + + +stopPush(); endif; ?> + \ No newline at end of file diff --git a/storage/framework/views/a4ffc4ebcff2eba17458b2d181875a11.php b/storage/framework/views/a4ffc4ebcff2eba17458b2d181875a11.php new file mode 100755 index 0000000..b972e6d --- /dev/null +++ b/storage/framework/views/a4ffc4ebcff2eba17458b2d181875a11.php @@ -0,0 +1,4 @@ +merge(['scope' => 'row', 'class' => 'border-b border-gray-200 dark:border-gray-800'])); ?>> + + + \ No newline at end of file diff --git a/storage/framework/views/a52f436cfd938cdb4acb6d87ffec90d8.php b/storage/framework/views/a52f436cfd938cdb4acb6d87ffec90d8.php new file mode 100755 index 0000000..51db60c --- /dev/null +++ b/storage/framework/views/a52f436cfd938cdb4acb6d87ffec90d8.php @@ -0,0 +1,20 @@ + + + 'admin::components.form.control-group.control','data' => ['type' => 'text','id' => $attribute->code,'name' => $attribute->code,'value' => old($attribute->code) ?? $value,'rules' => $validations,'label' => $attribute->name]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.control'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['type' => 'text','id' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($attribute->code),'name' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($attribute->code),'value' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(old($attribute->code) ?? $value),'rules' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($validations),'label' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($attribute->name)]); ?> +renderComponent(); ?> + + + + + + + + + \ No newline at end of file diff --git a/storage/framework/views/a55cad60de14a3e8924ed2c7fafe03d4.php b/storage/framework/views/a55cad60de14a3e8924ed2c7fafe03d4.php new file mode 100755 index 0000000..9ac3b6b --- /dev/null +++ b/storage/framework/views/a55cad60de14a3e8924ed2c7fafe03d4.php @@ -0,0 +1,130 @@ +getActiveConfigurationItem(); +?> + + + + 'admin::components.layouts.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::layouts'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> + slot('title', null, []); ?> + getName()); ?> + + endSlot(); ?> + + + + + + + + 'admin::components.form.index','data' => ['action' => '','enctype' => 'multipart/form-data']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['action' => '','enctype' => 'multipart/form-data']); ?> + +
    +

    + + +

    + + +
    + + + + + + get('admin::app.configuration.index.back'); ?> + + + + + + + + + + + + +
    +
    + +
    + getChildren(); $__env->addLoop($__currentLoopData); foreach($__currentLoopData as $child): $__env->incrementLoopIndices(); $loop = $__env->getLastLoop(); ?> +
    +

    + getName()); ?> + +

    + +

    + getInfo(); ?> + +

    +
    + +
    + + + + getFields(); $__env->addLoop($__currentLoopData); foreach($__currentLoopData as $field): $__env->incrementLoopIndices(); $loop = $__env->getLastLoop(); ?> + getType() == 'blade' + && view()->exists($path = $field->getPath()) + ): ?> + render(); ?> + + + make('admin::configuration.field-type', \Illuminate\Support\Arr::except(get_defined_vars(), ['__data', '__path']))->render(); ?> + + popLoop(); $loop = $__env->getLastLoop(); ?> + + + +
    + popLoop(); $loop = $__env->getLastLoop(); ?> +
    + renderComponent(); ?> + + + + + + + + + + + + + renderComponent(); ?> + + + + + + + + + + \ No newline at end of file diff --git a/storage/framework/views/a615b108a840c54bfeb4d02b8c45acf2.php b/storage/framework/views/a615b108a840c54bfeb4d02b8c45acf2.php new file mode 100755 index 0000000..29c893f --- /dev/null +++ b/storage/framework/views/a615b108a840c54bfeb4d02b8c45acf2.php @@ -0,0 +1,30 @@ +format('Y-m-d'); + } elseif (is_string($value)) { + $value = \Carbon\Carbon::parse($value)->format('Y-m-d'); + } + } +?> + + + + 'admin::components.form.control-group.controls.inline.date','data' => [':name' => '\''.e($attribute->code).'\'',':value' => '\''.e($value).'\'','rules' => 'required','position' => 'left','label' => $attribute->name,':errors' => 'errors','placeholder' => $attribute->name,'url' => $url,'allowEdit' => $allowEdit]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.controls.inline.date'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([':name' => '\''.e($attribute->code).'\'',':value' => '\''.e($value).'\'','rules' => 'required','position' => 'left','label' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($attribute->name),':errors' => 'errors','placeholder' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($attribute->name),'url' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($url),'allow-edit' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($allowEdit)]); ?> +renderComponent(); ?> + + + + + + + + + \ No newline at end of file diff --git a/storage/framework/views/a6fb7309da265defe85e1a1064366648.php b/storage/framework/views/a6fb7309da265defe85e1a1064366648.php new file mode 100755 index 0000000..b387585 --- /dev/null +++ b/storage/framework/views/a6fb7309da265defe85e1a1064366648.php @@ -0,0 +1,21 @@ + + + 'admin::components.form.control-group.control','data' => ['type' => 'datetime','id' => $attribute->code,'name' => $attribute->code,'value' => old($attribute->code) ?? $value,'rules' => $validations.'|regex:^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}$','label' => $attribute->name]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.control'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['type' => 'datetime','id' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($attribute->code),'name' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($attribute->code),'value' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(old($attribute->code) ?? $value),'rules' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($validations.'|regex:^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}$'),'label' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($attribute->name)]); ?> +renderComponent(); ?> + + + + + + + + + + \ No newline at end of file diff --git a/storage/framework/views/a827f213957676a16001cd91dc112549.php b/storage/framework/views/a827f213957676a16001cd91dc112549.php new file mode 100755 index 0000000..8a6ef1a --- /dev/null +++ b/storage/framework/views/a827f213957676a16001cd91dc112549.php @@ -0,0 +1,2467 @@ + + + + <?php echo app('translator')->get('installer::app.installer.index.title'); ?> + + + + + + + yieldPushContent('meta'); ?> + + set(['src/Resources/assets/css/app.css', 'src/Resources/assets/js/app.js'], 'installer')); ?> + + + + + + + + + yieldPushContent('styles'); ?> + + + 'united-arab-emirates-dirham', + 'ARS' => 'argentine-peso', + 'AUD' => 'australian-dollar', + 'BDT' => 'bangladeshi-taka', + 'BRL' => 'brazilian-real', + 'CAD' => 'canadian-dollar', + 'CHF' => 'swiss-franc', + 'CLP' => 'chilean-peso', + 'CNY' => 'chinese-yuan', + 'COP' => 'colombian-peso', + 'CZK' => 'czech-koruna', + 'DKK' => 'danish-krone', + 'DZD' => 'algerian-dinar', + 'EGP' => 'egyptian-pound', + 'EUR' => 'euro', + 'FJD' => 'fijian-dollar', + 'GBP' => 'british-pound-sterling', + 'HKD' => 'hong-kong-dollar', + 'HUF' => 'hungarian-forint', + 'IDR' => 'indonesian-rupiah', + 'ILS' => 'israeli-new-shekel', + 'INR' => 'indian-rupee', + 'JOD' => 'jordanian-dinar', + 'JPY' => 'japanese-yen', + 'KRW' => 'south-korean-won', + 'KWD' => 'kuwaiti-dinar', + 'KZT' => 'kazakhstani-tenge', + 'LBP' => 'lebanese-pound', + 'LKR' => 'sri-lankan-rupee', + 'LYD' => 'libyan-dinar', + 'MAD' => 'moroccan-dirham', + 'MUR' => 'mauritian-rupee', + 'MXN' => 'mexican-peso', + 'MYR' => 'malaysian-ringgit', + 'NGN' => 'nigerian-naira', + 'NOK' => 'norwegian-krone', + 'NPR' => 'nepalese-rupee', + 'NZD' => 'new-zealand-dollar', + 'OMR' => 'omani-rial', + 'PAB' => 'panamanian-balboa', + 'PEN' => 'peruvian-nuevo-sol', + 'PHP' => 'philippine-peso', + 'PKR' => 'pakistani-rupee', + 'PLN' => 'polish-zloty', + 'PYG' => 'paraguayan-guarani', + 'QAR' => 'qatari-rial', + 'RON' => 'romanian-leu', + 'RUB' => 'russian-ruble', + 'SAR' => 'saudi-riyal', + 'SEK' => 'swedish-krona', + 'SGD' => 'singapore-dollar', + 'THB' => 'thai-baht', + 'TND' => 'tunisian-dinar', + 'TRY' => 'turkish-lira', + 'TWD' => 'new-taiwan-dollar', + 'UAH' => 'ukrainian-hryvnia', + 'USD' => 'united-states-dollar', + 'UZS' => 'uzbekistani-som', + 'VEF' => 'venezuelan-bolívar', + 'VND' => 'vietnamese-dong', + 'XAF' => 'cfa-franc-beac', + 'XOF' => 'cfa-franc-bceao', + 'ZAR' => 'south-african-rand', + 'ZMW' => 'zambian-kwacha' + ]; + ?> + + +
    +
    + + +
    +
    + + hasRenderedOnce('ce55ceac-e890-49a4-9ba5-b776f480875a')): $__env->markAsRenderedOnce('ce55ceac-e890-49a4-9ba5-b776f480875a'); +$__env->startPush('scripts'); ?> + + + + stopPush(); endif; ?> + + yieldPushContent('scripts'); ?> + + + \ No newline at end of file diff --git a/storage/framework/views/aa751045bcf62af601caa003cf69f1e5.php b/storage/framework/views/aa751045bcf62af601caa003cf69f1e5.php new file mode 100755 index 0000000..51201b8 --- /dev/null +++ b/storage/framework/views/aa751045bcf62af601caa003cf69f1e5.php @@ -0,0 +1,1693 @@ +getModel(); + + if (isset($lead)) { + $quote->fill([ + 'person_id' => $lead->person_id, + 'user_id' => $lead->user_id, + 'billing_address' => $lead->person->organization ? $lead->person->organization->address : null + ]); + } +?> + + + + 'admin::components.layouts.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::layouts'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> + slot('title', null, []); ?> + get('admin::app.quotes.create.title'); ?> + endSlot(); ?> + + + + + + + 'admin::components.form.index','data' => ['action' => route('admin.quotes.store').'?'.http_build_query(array_merge( + request()->route()->parameters(), + request()->all() + ))]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['action' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(route('admin.quotes.store').'?'.http_build_query(array_merge( + request()->route()->parameters(), + request()->all() + )))]); ?> +
    +
    +
    + + + 'admin::components.breadcrumbs.index','data' => ['name' => 'quotes.create']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::breadcrumbs'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['name' => 'quotes.create']); ?> +renderComponent(); ?> + + + + + + + + + + +
    + get('admin::app.quotes.create.title'); ?> +
    +
    + +
    + +
    + + + + + + + +
    +
    +
    + + + + + 'admin::components.shimmer.quotes.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::shimmer.quotes'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> +renderComponent(); ?> + + + + + + + + + + +
    + renderComponent(); ?> + + + + + + + + + + + + + + hasRenderedOnce('66992a92-aeb7-4044-979f-cc42d2769663')): $__env->markAsRenderedOnce('66992a92-aeb7-4044-979f-cc42d2769663'); +$__env->startPush('scripts'); ?> + + + + + + + + stopPush(); endif; ?> + + hasRenderedOnce('790dc8a5-fcff-46fd-9ee4-5c544839f5cd')): $__env->markAsRenderedOnce('790dc8a5-fcff-46fd-9ee4-5c544839f5cd'); +$__env->startPush('styles'); ?> + + stopPush(); endif; ?> + renderComponent(); ?> + + + + + + + + + + \ No newline at end of file diff --git a/storage/framework/views/aa9b8ba744313423689d8fe2f1840af9.php b/storage/framework/views/aa9b8ba744313423689d8fe2f1840af9.php new file mode 100755 index 0000000..9a9eb0e --- /dev/null +++ b/storage/framework/views/aa9b8ba744313423689d8fe2f1840af9.php @@ -0,0 +1,809 @@ + +onlyProps([ + 'entity' => null, + 'entityControlName' => null, +]) as $__key => $__value) { + $$__key = $$__key ?? $__value; +} ?> +exceptProps([ + 'entity' => null, + 'entityControlName' => null, +]); ?> + null, + 'entityControlName' => null, +]), 'is_string', ARRAY_FILTER_USE_KEY) as $__key => $__value) { + $$__key = $$__key ?? $__value; +} ?> + + $__value) { + if (array_key_exists($__key, $__defined_vars)) unset($$__key); +} ?> + + + +
    + + + + + + + + + + + + + + + + +
    + + +hasRenderedOnce('af2f0a93-2f10-4d5d-9b69-4c1d7a8200ea')): $__env->markAsRenderedOnce('af2f0a93-2f10-4d5d-9b69-4c1d7a8200ea'); +$__env->startPush('scripts'); ?> + + + +stopPush(); endif; ?> \ No newline at end of file diff --git a/storage/framework/views/aba3e368dde555f8dcd51c7aceba4e6b.php b/storage/framework/views/aba3e368dde555f8dcd51c7aceba4e6b.php new file mode 100755 index 0000000..475151a --- /dev/null +++ b/storage/framework/views/aba3e368dde555f8dcd51c7aceba4e6b.php @@ -0,0 +1,190 @@ + +onlyProps(['position' => 'bottom-left']) as $__key => $__value) { + $$__key = $$__key ?? $__value; +} ?> +exceptProps(['position' => 'bottom-left']); ?> + 'bottom-left']), 'is_string', ARRAY_FILTER_USE_KEY) as $__key => $__value) { + $$__key = $$__key ?? $__value; +} ?> + + $__value) { + if (array_key_exists($__key, $__defined_vars)) unset($$__key); +} ?> + + +merge(['class' => 'relative'])); ?>> + + + + + + + + + + + + + + + + +hasRenderedOnce('09a29e44-c54a-449e-b2f3-643c5eb84c8a')): $__env->markAsRenderedOnce('09a29e44-c54a-449e-b2f3-643c5eb84c8a'); +$__env->startPush('scripts'); ?> + + + +stopPush(); endif; ?> + \ No newline at end of file diff --git a/storage/framework/views/abd5fd79a831966c71bb278a11a52c2b.php b/storage/framework/views/abd5fd79a831966c71bb278a11a52c2b.php new file mode 100755 index 0000000..dba78ca --- /dev/null +++ b/storage/framework/views/abd5fd79a831966c71bb278a11a52c2b.php @@ -0,0 +1,29 @@ +lookup_type + ? app('Webkul\Attribute\Repositories\AttributeRepository')->getLookUpOptions($attribute->lookup_type) + : $attribute->options()->orderBy('sort_order')->get(); + + $selectedOption = old($attribute->code) ?: $value; +?> + + + + 'admin::components.form.control-group.controls.inline.multiselect','data' => [':name' => '\''.e($attribute->code).'\'',':value' => '\''.e($selectedOption).'\'','data' => $options,'rules' => 'required','position' => 'left','label' => $attribute->name,':errors' => 'errors','placeholder' => $attribute->name,'url' => $url,'allowEdit' => $allowEdit]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.controls.inline.multiselect'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([':name' => '\''.e($attribute->code).'\'',':value' => '\''.e($selectedOption).'\'','data' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($options),'rules' => 'required','position' => 'left','label' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($attribute->name),':errors' => 'errors','placeholder' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($attribute->name),'url' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($url),'allow-edit' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($allowEdit)]); ?> +renderComponent(); ?> + + + + + + + + + + \ No newline at end of file diff --git a/storage/framework/views/ad12a543aad8643f064247eb30d7680e.php b/storage/framework/views/ad12a543aad8643f064247eb30d7680e.php new file mode 100755 index 0000000..74e1426 --- /dev/null +++ b/storage/framework/views/ad12a543aad8643f064247eb30d7680e.php @@ -0,0 +1,153 @@ + + + + + + <?php echo e($title ?? ''); ?> + + + + + + + + + + + yieldPushContent('meta'); ?> + + set(['src/Resources/assets/css/app.css', 'src/Resources/assets/js/app.js'])); ?> + + + + + + + getConfigData('general.design.admin_logo.favicon')): ?> + + + + + + getConfigData('general.settings.menu_color.brand_color') ?? '#0E90D9'; + ?> + + yieldPushContent('styles'); ?> + + + + + + + + + + + +
    + + + + 'admin::components.flash-group.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::flash-group'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> +renderComponent(); ?> + + + + + + + + + + + + + + + + + + + +
    + + + + + yieldPushContent('scripts'); ?> + + + + + + + + + + + + + + \ No newline at end of file diff --git a/storage/framework/views/ad152e82c2a5ac11df6a67de491a6e0a.php b/storage/framework/views/ad152e82c2a5ac11df6a67de491a6e0a.php new file mode 100755 index 0000000..c801efd --- /dev/null +++ b/storage/framework/views/ad152e82c2a5ac11df6a67de491a6e0a.php @@ -0,0 +1,1827 @@ + + + 'admin::components.layouts.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::layouts'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> + + slot('title', null, []); ?> + get('admin::app.settings.webforms.create.title'); ?> + endSlot(); ?> + + + + 'admin::components.form.index','data' => ['action' => route('admin.settings.web_forms.store')]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['action' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(route('admin.settings.web_forms.store'))]); ?> +
    +
    +
    + + + + + + + 'admin::components.breadcrumbs.index','data' => ['name' => 'settings.web_forms.create']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::breadcrumbs'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['name' => 'settings.web_forms.create']); ?> +renderComponent(); ?> + + + + + + + + + + + + + +
    + get('admin::app.settings.webforms.create.title'); ?> +
    +
    + +
    +
    + + + + + + + + +
    +
    +
    + + +
    + renderComponent(); ?> + + + + + + + + + + + hasRenderedOnce('2b26d422-96c6-45cc-ab3e-c420c2e2d502')): $__env->markAsRenderedOnce('2b26d422-96c6-45cc-ab3e-c420c2e2d502'); +$__env->startPush('scripts'); ?> + + + + + + + + stopPush(); endif; ?> + renderComponent(); ?> + + + + + + + + + + \ No newline at end of file diff --git a/storage/framework/views/ae624372bcce32c8f2b0998c0e654eb2.php b/storage/framework/views/ae624372bcce32c8f2b0998c0e654eb2.php new file mode 100755 index 0000000..e531961 --- /dev/null +++ b/storage/framework/views/ae624372bcce32c8f2b0998c0e654eb2.php @@ -0,0 +1,96 @@ + +onlyProps([ + 'type' => 'text', + 'name' => '', +]) as $__key => $__value) { + $$__key = $$__key ?? $__value; +} ?> +exceptProps([ + 'type' => 'text', + 'name' => '', +]); ?> + 'text', + 'name' => '', +]), 'is_string', ARRAY_FILTER_USE_KEY) as $__key => $__value) { + $$__key = $$__key ?? $__value; +} ?> + + $__value) { + if (array_key_exists($__key, $__defined_vars)) unset($$__key); +} ?> + + + + + + + + only(['value', ':value', 'v-model', 'rules', ':rules', 'label', ':label'])); ?> + + > + except(['value', ':value', 'v-model', 'rules', ':rules', 'label', ':label'])->merge(['class' => 'w-full appearance-none rounded-md border px-3 py-2 text-sm text-gray-600 transition-all hover:border-gray-400'])); ?> + + > + + + + + + only(['value', ':value', 'v-model', 'rules', ':rules', 'label', ':label'])); ?> + + > + + + + + + + + + + + + \ No newline at end of file diff --git a/storage/framework/views/ae6d84192f2b8fbb06da1688efe959ba.php b/storage/framework/views/ae6d84192f2b8fbb06da1688efe959ba.php new file mode 100644 index 0000000..7fa27c6 --- /dev/null +++ b/storage/framework/views/ae6d84192f2b8fbb06da1688efe959ba.php @@ -0,0 +1,55 @@ + + + + Super Admin Login + + + + + + set(['src/Resources/assets/css/app.css', 'src/Resources/assets/js/app.js'])); ?> + + + + + + + + + + +
    + + + 'admin::components.flash-group.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::flash-group'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> +renderComponent(); ?> + + + + + + + + + + + +
    + + + + + \ No newline at end of file diff --git a/storage/framework/views/aea6af283674c4fcb9af8ae7ded8a121.php b/storage/framework/views/aea6af283674c4fcb9af8ae7ded8a121.php new file mode 100755 index 0000000..7c1662a --- /dev/null +++ b/storage/framework/views/aea6af283674c4fcb9af8ae7ded8a121.php @@ -0,0 +1,245 @@ +
    + +
    + + + + 'admin::components.layouts.sidebar.mobile.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::layouts.sidebar.mobile'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> +renderComponent(); ?> + + + + + + + + + + + + getConfigData('general.general.admin_logo.logo_image')): ?> + <?php echo e(config('app.name')); ?> + + <?php echo e(config('app.name')); ?> + + <?php echo e(config('app.name')); ?> + + +
    + +
    + + make('admin::components.layouts.header.desktop.mega-search', \Illuminate\Support\Arr::except(get_defined_vars(), ['__data', '__path']))->render(); ?> + + + make('admin::components.layouts.header.quick-creation', \Illuminate\Support\Arr::except(get_defined_vars(), ['__data', '__path']))->render(); ?> +
    + +
    +
    + + make('admin::components.layouts.header.mobile.mega-search', \Illuminate\Support\Arr::except(get_defined_vars(), ['__data', '__path']))->render(); ?> +
    + + + +
    + +
    +
    + +
    + + make('admin::components.layouts.header.quick-creation', \Illuminate\Support\Arr::except(get_defined_vars(), ['__data', '__path']))->render(); ?> +
    + + + + + 'admin::components.dropdown.index','data' => ['position' => 'bottom-'.e(in_array(app()->getLocale(), ['fa', 'ar']) ? 'left' : 'right').'']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::dropdown'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['position' => 'bottom-'.e(in_array(app()->getLocale(), ['fa', 'ar']) ? 'left' : 'right').'']); ?> + slot('toggle', null, []); ?> + guard('user')->user()); ?> + + image): ?> + + + + + endSlot(); ?> + + + slot('content', null, ['class' => 'mt-2 border-t-0 !p-0']); ?> +
    + + + +

    + get('admin::app.layouts.app-version', ['version' => core()->version()]); ?> +

    +
    + +
    + + get('admin::app.layouts.my-account'); ?> + + + + + + 'admin::components.form.index','data' => ['method' => 'DELETE','action' => ''.e(route('admin.session.destroy')).'','id' => 'adminLogout']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['method' => 'DELETE','action' => ''.e(route('admin.session.destroy')).'','id' => 'adminLogout']); ?> + renderComponent(); ?> + + + + + + + + + + + + get('admin::app.layouts.sign-out'); ?> + +
    + endSlot(); ?> + renderComponent(); ?> + + + + + + + + + +
    +
    + +hasRenderedOnce('a674142b-2f2c-480f-96e8-26d42c61d705')): $__env->markAsRenderedOnce('a674142b-2f2c-480f-96e8-26d42c61d705'); +$__env->startPush('scripts'); ?> + + + +stopPush(); endif; ?> + \ No newline at end of file diff --git a/storage/framework/views/afd0c6897040e2cc8cb829831a78c878.php b/storage/framework/views/afd0c6897040e2cc8cb829831a78c878.php new file mode 100755 index 0000000..c58a644 --- /dev/null +++ b/storage/framework/views/afd0c6897040e2cc8cb829831a78c878.php @@ -0,0 +1,223 @@ + +onlyProps([ + 'name' => 'attachments', + 'validations' => null, + 'uploadedAttachments' => [], + 'allowMultiple' => false, + 'hideButton' => false, +]) as $__key => $__value) { + $$__key = $$__key ?? $__value; +} ?> +exceptProps([ + 'name' => 'attachments', + 'validations' => null, + 'uploadedAttachments' => [], + 'allowMultiple' => false, + 'hideButton' => false, +]); ?> + 'attachments', + 'validations' => null, + 'uploadedAttachments' => [], + 'allowMultiple' => false, + 'hideButton' => false, +]), 'is_string', ARRAY_FILTER_USE_KEY) as $__key => $__value) { + $$__key = $$__key ?? $__value; +} ?> + + $__value) { + if (array_key_exists($__key, $__defined_vars)) unset($$__key); +} ?> + + + + + +hasRenderedOnce('c5ad3b98-3c9a-4e4b-b7f5-db04ec1a5334')): $__env->markAsRenderedOnce('c5ad3b98-3c9a-4e4b-b7f5-db04ec1a5334'); +$__env->startPush('scripts'); ?> + + + + + +stopPush(); endif; ?> \ No newline at end of file diff --git a/storage/framework/views/b0c16e8a003253e493829e3c14194dd2.php b/storage/framework/views/b0c16e8a003253e493829e3c14194dd2.php new file mode 100755 index 0000000..0aef032 --- /dev/null +++ b/storage/framework/views/b0c16e8a003253e493829e3c14194dd2.php @@ -0,0 +1,657 @@ + + + 'admin::components.layouts.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::layouts'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> + + slot('title', null, []); ?> + get('admin::app.settings.groups.index.title'); ?> + endSlot(); ?> + +
    + +
    +
    + + + + + + + 'admin::components.breadcrumbs.index','data' => ['name' => 'settings.groups']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::breadcrumbs'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['name' => 'settings.groups']); ?> +renderComponent(); ?> + + + + + + + + + + + + + +
    + get('admin::app.settings.groups.index.title'); ?> +
    +
    + +
    + +
    + + + + hasPermission('settings.user.groups.create')): ?> + + + + + +
    +
    +
    + + + + + + 'admin::components.shimmer.datagrid.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::shimmer.datagrid'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> +renderComponent(); ?> + + + + + + + + + + +
    + + hasRenderedOnce('a647b4b2-1b82-45b5-846c-cfd0b7fc79ff')): $__env->markAsRenderedOnce('a647b4b2-1b82-45b5-846c-cfd0b7fc79ff'); +$__env->startPush('scripts'); ?> + + + + stopPush(); endif; ?> + renderComponent(); ?> + + + + + + + + + + \ No newline at end of file diff --git a/storage/framework/views/b0d25a274c1687d483793e43b44ae95d.php b/storage/framework/views/b0d25a274c1687d483793e43b44ae95d.php new file mode 100755 index 0000000..6053b2f --- /dev/null +++ b/storage/framework/views/b0d25a274c1687d483793e43b44ae95d.php @@ -0,0 +1,4 @@ +merge(['class' => 'bg-white dark:bg-gray-900 dark:text-gray-300 dark:border-gray-800'])); ?>> + + + \ No newline at end of file diff --git a/storage/framework/views/b1a2cf391c7dc6d3786a1276d45fd47c.php b/storage/framework/views/b1a2cf391c7dc6d3786a1276d45fd47c.php new file mode 100755 index 0000000..a4f2ffc --- /dev/null +++ b/storage/framework/views/b1a2cf391c7dc6d3786a1276d45fd47c.php @@ -0,0 +1,222 @@ + + + 'admin::components.layouts.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::layouts'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> + slot('title', null, []); ?> + get('admin::app.dashboard.index.title'); ?> + endSlot(); ?> + + + + + +
    + + + +
    +

    + get('admin::app.dashboard.index.title'); ?> +

    +
    + + + + + + + + + + +
    +
    +
    +
    +
    + + + +
    + + + + + + + + +
    + + + + +
    + + make('admin::dashboard.index.revenue', \Illuminate\Support\Arr::except(get_defined_vars(), ['__data', '__path']))->render(); ?> + + + make('admin::dashboard.index.over-all', \Illuminate\Support\Arr::except(get_defined_vars(), ['__data', '__path']))->render(); ?> + + + make('admin::dashboard.index.total-leads', \Illuminate\Support\Arr::except(get_defined_vars(), ['__data', '__path']))->render(); ?> + +
    + + make('admin::dashboard.index.top-selling-products', \Illuminate\Support\Arr::except(get_defined_vars(), ['__data', '__path']))->render(); ?> + + + make('admin::dashboard.index.top-persons', \Illuminate\Support\Arr::except(get_defined_vars(), ['__data', '__path']))->render(); ?> +
    +
    + + + + + + + + +
    + + make('admin::dashboard.index.open-leads-by-states', \Illuminate\Support\Arr::except(get_defined_vars(), ['__data', '__path']))->render(); ?> + + + make('admin::dashboard.index.revenue-by-sources', \Illuminate\Support\Arr::except(get_defined_vars(), ['__data', '__path']))->render(); ?> + + + make('admin::dashboard.index.revenue-by-types', \Illuminate\Support\Arr::except(get_defined_vars(), ['__data', '__path']))->render(); ?> +
    + + + +
    + + + + + hasRenderedOnce('69dc282b-1798-4c2e-bb90-09109493e064')): $__env->markAsRenderedOnce('69dc282b-1798-4c2e-bb90-09109493e064'); +$__env->startPush('scripts'); ?> + + + + + + + + + stopPush(); endif; ?> + renderComponent(); ?> + + + + + + + + + + \ No newline at end of file diff --git a/storage/framework/views/b372d51f5500295bc9228d9d664663fb.php b/storage/framework/views/b372d51f5500295bc9228d9d664663fb.php new file mode 100755 index 0000000..e8b2e64 --- /dev/null +++ b/storage/framework/views/b372d51f5500295bc9228d9d664663fb.php @@ -0,0 +1,21 @@ +
    +
    +
    +
    + +
    +
    + +
    +
    +
    +
    +
    + +
    +
    +
    +
    +
    +
    +
    \ No newline at end of file diff --git a/storage/framework/views/b49985407b07abfefd64aaab2382947e.php b/storage/framework/views/b49985407b07abfefd64aaab2382947e.php new file mode 100755 index 0000000..e37b62f --- /dev/null +++ b/storage/framework/views/b49985407b07abfefd64aaab2382947e.php @@ -0,0 +1,17 @@ +
    +
    +

    +
    + +
    +
    + +

    + +
    +
    + +
    +
    +
    +
    \ No newline at end of file diff --git a/storage/framework/views/b49e8f9599a267bde604c4e4eb02960c.php b/storage/framework/views/b49e8f9599a267bde604c4e4eb02960c.php new file mode 100755 index 0000000..05f5a90 --- /dev/null +++ b/storage/framework/views/b49e8f9599a267bde604c4e4eb02960c.php @@ -0,0 +1,1078 @@ + + + + + +
    + + + + 'admin::components.shimmer.leads.index.kanban','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::shimmer.leads.index.kanban'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> +renderComponent(); ?> + + + + + + + + + +
    +
    + + + + +hasRenderedOnce('a79e60a8-8100-4892-9796-438ff66c96d0')): $__env->markAsRenderedOnce('a79e60a8-8100-4892-9796-438ff66c96d0'); +$__env->startPush('scripts'); ?> + + + +stopPush(); endif; ?> + \ No newline at end of file diff --git a/storage/framework/views/b55b5d08250e5310d019e7e3aacd86b4.php b/storage/framework/views/b55b5d08250e5310d019e7e3aacd86b4.php new file mode 100755 index 0000000..127571d --- /dev/null +++ b/storage/framework/views/b55b5d08250e5310d019e7e3aacd86b4.php @@ -0,0 +1,185 @@ + + + + + + + + + 'admin::components.shimmer.dashboard.index.total-leads','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::shimmer.dashboard.index.total-leads'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> +renderComponent(); ?> + + + + + + + + + + + + + + +hasRenderedOnce('845c6d75-4b33-454a-8531-68be4100b2a2')): $__env->markAsRenderedOnce('845c6d75-4b33-454a-8531-68be4100b2a2'); +$__env->startPush('scripts'); ?> + + + +stopPush(); endif; ?> \ No newline at end of file diff --git a/storage/framework/views/b649a86c76252c380b129e4cc338f7be.php b/storage/framework/views/b649a86c76252c380b129e4cc338f7be.php new file mode 100755 index 0000000..2289e5d --- /dev/null +++ b/storage/framework/views/b649a86c76252c380b129e4cc338f7be.php @@ -0,0 +1,324 @@ + + getLookUpEntity($attribute->lookup_type, old($attribute->code) ?: $value); + ?> + + +
    + +
    + get('admin::app.components.attributes.lookup.click-to-add'); ?> + + +
    + + +
    +
    +
    +
    + + +hasRenderedOnce('af4bd289-a6e0-4001-a492-80f3bd118244')): $__env->markAsRenderedOnce('af4bd289-a6e0-4001-a492-80f3bd118244'); +$__env->startPush('scripts'); ?> + + + +stopPush(); endif; ?> + \ No newline at end of file diff --git a/storage/framework/views/b665faddbd4156979a33bd7256a63804.php b/storage/framework/views/b665faddbd4156979a33bd7256a63804.php new file mode 100755 index 0000000..556db5d --- /dev/null +++ b/storage/framework/views/b665faddbd4156979a33bd7256a63804.php @@ -0,0 +1,99 @@ + $product]); ?> + + +
    + + + 'admin::components.accordion.index','data' => ['class' => 'select-none !border-none']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::accordion'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['class' => 'select-none !border-none']); ?> + slot('header', null, ['class' => '!p-0']); ?> +

    + get('admin::app.products.view.attributes.about-product'); ?> +

    + endSlot(); ?> + + slot('content', null, ['class' => 'mt-4 !px-0 !pb-0']); ?> + $product]); ?> + + + +
    + + + + 'admin::components.attributes.view','data' => ['customAttributes' => app('Webkul\Attribute\Repositories\AttributeRepository')->findWhere([ + 'entity_type' => 'products', + ['code', 'IN', ['SKU', 'price', 'quantity', 'status']] + ])->sortBy('sort_order'),'entity' => $product,'url' => route('admin.products.update', $product->id),'allowEdit' => true]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::attributes.view'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['custom-attributes' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(app('Webkul\Attribute\Repositories\AttributeRepository')->findWhere([ + 'entity_type' => 'products', + ['code', 'IN', ['SKU', 'price', 'quantity', 'status']] + ])->sortBy('sort_order')),'entity' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($product),'url' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(route('admin.products.update', $product->id)),'allow-edit' => true]); ?> +renderComponent(); ?> + + + + + + + + + + + + + + 'admin::components.attributes.view','data' => ['customAttributes' => app('Webkul\Attribute\Repositories\AttributeRepository')->findWhere([ + 'entity_type' => 'products', + ['code', 'NOTIN', ['SKU', 'price', 'quantity', 'status']] + ])->sortBy('sort_order'),'entity' => $product,'url' => route('admin.products.update', $product->id),'allowEdit' => true]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::attributes.view'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['custom-attributes' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(app('Webkul\Attribute\Repositories\AttributeRepository')->findWhere([ + 'entity_type' => 'products', + ['code', 'NOTIN', ['SKU', 'price', 'quantity', 'status']] + ])->sortBy('sort_order')),'entity' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($product),'url' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(route('admin.products.update', $product->id)),'allow-edit' => true]); ?> +renderComponent(); ?> + + + + + + + + + +
    + + $product]); ?> + + endSlot(); ?> + renderComponent(); ?> + + + + + + + + + +
    + + $product]); ?> \ No newline at end of file diff --git a/storage/framework/views/b7000ff43eefa965176fcf1bb48f25c9.php b/storage/framework/views/b7000ff43eefa965176fcf1bb48f25c9.php new file mode 100755 index 0000000..fb86df2 --- /dev/null +++ b/storage/framework/views/b7000ff43eefa965176fcf1bb48f25c9.php @@ -0,0 +1,127 @@ + + + 'admin::components.layouts.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::layouts'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> + slot('title', null, []); ?> + get('admin::app.settings.webhooks.index.title'); ?> + endSlot(); ?> + +
    +
    +
    + + + + + + 'admin::components.breadcrumbs.index','data' => ['name' => 'settings.webhooks']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::breadcrumbs'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['name' => 'settings.webhooks']); ?> +renderComponent(); ?> + + + + + + + + + + + + + +
    + get('admin::app.settings.webhooks.index.title'); ?> +
    +
    + + +
    + + + + + + + 'admin::components.datagrid.index','data' => ['src' => route('admin.settings.webhooks.index')]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::datagrid'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['src' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(route('admin.settings.webhooks.index'))]); ?> + + + + 'admin::components.shimmer.datagrid.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::shimmer.datagrid'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> +renderComponent(); ?> + + + + + + + + + + renderComponent(); ?> + + + + + + + + + + + + +
    + renderComponent(); ?> + + + + + + + + + + \ No newline at end of file diff --git a/storage/framework/views/b73c32b3e3eb705eb379b5f68dac5cfb.php b/storage/framework/views/b73c32b3e3eb705eb379b5f68dac5cfb.php new file mode 100755 index 0000000..9952c4a --- /dev/null +++ b/storage/framework/views/b73c32b3e3eb705eb379b5f68dac5cfb.php @@ -0,0 +1,3028 @@ +is_read) { + $email->is_read = true; + + $email->save(); + } +?> + + + + 'admin::components.layouts.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::layouts'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> + slot('title', null, []); ?> + get('admin::app.mail.view.subject', ['subject' => $email->subject]); ?> + endSlot(); ?> + +
    +
    +
    + $email]); ?> + + + + + + 'admin::components.breadcrumbs.index','data' => ['name' => 'mail.route.view','entity' => $email,'route' => request('route')]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::breadcrumbs'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['name' => 'mail.route.view','entity' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($email),'route' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(request('route'))]); ?> +renderComponent(); ?> + + + + + + + + + + + $email]); ?> + + + +
    +
    + get('admin::app.mail.view.title'); ?> +
    + + + + $email]); ?> + + + + + 'admin::components.tags.index','data' => ['attachEndpoint' => route('admin.mail.tags.attach', $email->id),'detachEndpoint' => route('admin.mail.tags.detach', $email->id),'addedTags' => $email->tags]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::tags'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['attach-endpoint' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(route('admin.mail.tags.attach', $email->id)),'detach-endpoint' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(route('admin.mail.tags.detach', $email->id)),'added-tags' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($email->tags)]); ?> +renderComponent(); ?> + + + + + + + + + + + $email]); ?> + +
    +
    +
    + + $email]); ?> + + + + + + + 'admin::components.shimmer.leads.view.mail.index','data' => ['count' => $email->count()]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::shimmer.leads.view.mail'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['count' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($email->count())]); ?> +renderComponent(); ?> + + + + + + + + + + + + $email]); ?> + +
    + + hasRenderedOnce('7a3cbc95-bbf4-4859-b7ce-fc6a93b8e894')): $__env->markAsRenderedOnce('7a3cbc95-bbf4-4859-b7ce-fc6a93b8e894'); +$__env->startPush('scripts'); ?> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + stopPush(); endif; ?> + renderComponent(); ?> + + + + + + + + + + \ No newline at end of file diff --git a/storage/framework/views/b76090b5a4cb58a27d81ee28ceee41ba.php b/storage/framework/views/b76090b5a4cb58a27d81ee28ceee41ba.php new file mode 100755 index 0000000..6ce17eb --- /dev/null +++ b/storage/framework/views/b76090b5a4cb58a27d81ee28ceee41ba.php @@ -0,0 +1,686 @@ + $lead]); ?> + + + + + $lead]); ?> + + +hasRenderedOnce('435f6f23-bda1-4b8e-a2b7-b83d61cb1e35')): $__env->markAsRenderedOnce('435f6f23-bda1-4b8e-a2b7-b83d61cb1e35'); +$__env->startPush('scripts'); ?> + + + + +stopPush(); endif; ?> + \ No newline at end of file diff --git a/storage/framework/views/b8eaf7547e9a9ea023ea2b6a9aba1195.php b/storage/framework/views/b8eaf7547e9a9ea023ea2b6a9aba1195.php new file mode 100755 index 0000000..eff8f46 --- /dev/null +++ b/storage/framework/views/b8eaf7547e9a9ea023ea2b6a9aba1195.php @@ -0,0 +1,333 @@ + +onlyProps([ + 'name' => 'images', + 'allowMultiple' => false, + 'uploadedVideos' => [], + 'width' => '210px', + 'height' => '120px' +]) as $__key => $__value) { + $$__key = $$__key ?? $__value; +} ?> +exceptProps([ + 'name' => 'images', + 'allowMultiple' => false, + 'uploadedVideos' => [], + 'width' => '210px', + 'height' => '120px' +]); ?> + 'images', + 'allowMultiple' => false, + 'uploadedVideos' => [], + 'width' => '210px', + 'height' => '120px' +]), 'is_string', ARRAY_FILTER_USE_KEY) as $__key => $__value) { + $$__key = $$__key ?? $__value; +} ?> + + $__value) { + if (array_key_exists($__key, $__defined_vars)) unset($$__key); +} ?> + + +get('class')); ?> + +> + + +hasRenderedOnce('a3d62c46-9431-47b2-9822-246374bc09e3')): $__env->markAsRenderedOnce('a3d62c46-9431-47b2-9822-246374bc09e3'); +$__env->startPush('scripts'); ?> + + + + + +stopPush(); endif; ?> \ No newline at end of file diff --git a/storage/framework/views/b94d068fd1cfcdbd8dea9170647897f8.php b/storage/framework/views/b94d068fd1cfcdbd8dea9170647897f8.php new file mode 100755 index 0000000..cf4b573 --- /dev/null +++ b/storage/framework/views/b94d068fd1cfcdbd8dea9170647897f8.php @@ -0,0 +1,31 @@ + +
    +
    +
    +
    +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    +
    + +
    +
    +
    +
    + +
    +
    +
    +
    +
    +
    + \ No newline at end of file diff --git a/storage/framework/views/b9a9babe76c8328b3cfd9a0f6be97ac9.php b/storage/framework/views/b9a9babe76c8328b3cfd9a0f6be97ac9.php new file mode 100755 index 0000000..4729e96 --- /dev/null +++ b/storage/framework/views/b9a9babe76c8328b3cfd9a0f6be97ac9.php @@ -0,0 +1,238 @@ + + +
    + + +
    + +
    +
    + + + + + get("admin::app.common.custom-attributes.add-more"); ?> + +
    + + +hasRenderedOnce('afd0579e-88e1-4eca-ac07-92c183b385d4')): $__env->markAsRenderedOnce('afd0579e-88e1-4eca-ac07-92c183b385d4'); +$__env->startPush('scripts'); ?> + + + +stopPush(); endif; ?> + \ No newline at end of file diff --git a/storage/framework/views/b9dba1f802a8f3ef9925ab0f86ada175.php b/storage/framework/views/b9dba1f802a8f3ef9925ab0f86ada175.php new file mode 100755 index 0000000..30e738e --- /dev/null +++ b/storage/framework/views/b9dba1f802a8f3ef9925ab0f86ada175.php @@ -0,0 +1,188 @@ + + + 'admin::components.layouts.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::layouts'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> + slot('title', null, []); ?> + get('admin::app.quotes.index.title'); ?> + endSlot(); ?> + + +
    +
    +
    + + + + 'admin::components.breadcrumbs.index','data' => ['name' => 'quotes']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::breadcrumbs'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['name' => 'quotes']); ?> +renderComponent(); ?> + + + + + + + + + + +
    + get('admin::app.quotes.index.title'); ?> +
    +
    + +
    + +
    + hasPermission('quotes.create')): ?> + + get('admin::app.quotes.index.create-btn'); ?> + + +
    +
    +
    + + + + + 'admin::components.shimmer.datagrid.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::shimmer.datagrid'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> +renderComponent(); ?> + + + + + + + + + +
    +
    + + hasRenderedOnce('76b5cc61-fb17-4c08-b374-1cb6b3ea634c')): $__env->markAsRenderedOnce('76b5cc61-fb17-4c08-b374-1cb6b3ea634c'); +$__env->startPush('scripts'); ?> + + + + stopPush(); endif; ?> + renderComponent(); ?> + + + + + + + + + + \ No newline at end of file diff --git a/storage/framework/views/ba39863401b82f9aae2299c32bce8534.php b/storage/framework/views/ba39863401b82f9aae2299c32bce8534.php new file mode 100755 index 0000000..ed985d5 --- /dev/null +++ b/storage/framework/views/ba39863401b82f9aae2299c32bce8534.php @@ -0,0 +1,21 @@ + + + 'admin::components.form.control-group.controls.inline.file','data' => [':name' => '\''.e($attribute->code).'\'',':value' => '\''.e($value ? route('admin.settings.attributes.download', ['path' => $value]) : '').'\'','rules' => 'required|mimes:jpeg,jpg,png,gif','position' => 'left','label' => $attribute->name,':errors' => 'errors','placeholder' => $attribute->name,'url' => $url,'allowEdit' => $allowEdit]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.controls.inline.file'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([':name' => '\''.e($attribute->code).'\'',':value' => '\''.e($value ? route('admin.settings.attributes.download', ['path' => $value]) : '').'\'','rules' => 'required|mimes:jpeg,jpg,png,gif','position' => 'left','label' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($attribute->name),':errors' => 'errors','placeholder' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($attribute->name),'url' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($url),'allow-edit' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($allowEdit)]); ?> +renderComponent(); ?> + + + + + + + + + + \ No newline at end of file diff --git a/storage/framework/views/bba119bc75cf4ca9d930c7d1aa6518a1.php b/storage/framework/views/bba119bc75cf4ca9d930c7d1aa6518a1.php new file mode 100755 index 0000000..42979e5 --- /dev/null +++ b/storage/framework/views/bba119bc75cf4ca9d930c7d1aa6518a1.php @@ -0,0 +1,1021 @@ + + + 'admin::components.layouts.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::layouts'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> + + slot('title', null, []); ?> + get('admin::app.activities.edit.title'); ?> + endSlot(); ?> + + + + + + + 'admin::components.form.index','data' => ['action' => route('admin.activities.update', $activity->id),'method' => 'PUT']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['action' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(route('admin.activities.update', $activity->id)),'method' => 'PUT']); ?> +
    +
    +
    + + + + 'admin::components.breadcrumbs.index','data' => ['name' => 'activities.edit','entity' => $activity]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::breadcrumbs'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['name' => 'activities.edit','entity' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($activity)]); ?> +renderComponent(); ?> + + + + + + + + + + + +
    + get('admin::app.activities.edit.title'); ?> +
    +
    + +
    + +
    + + + + + + + + +
    +
    +
    + + +
    + +
    + + + + + + + 'admin::components.form.control-group.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> +
    +
    + + + 'admin::components.form.control-group.label','data' => ['class' => 'required']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.label'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['class' => 'required']); ?> + get('admin::app.activities.edit.schedule_from'); ?> + renderComponent(); ?> + + + + + + + + + + + + + 'admin::components.flat-picker.datetime','data' => ['class' => '!w-full',':allowInput' => 'true']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::flat-picker.datetime'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['class' => '!w-full',':allow-input' => 'true']); ?> + + renderComponent(); ?> + + + + + + + + + +
    + +
    + + + 'admin::components.form.control-group.label','data' => ['class' => 'required']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.label'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['class' => 'required']); ?> + get('admin::app.activities.edit.schedule_to'); ?> + renderComponent(); ?> + + + + + + + + + + + + + 'admin::components.flat-picker.datetime','data' => ['class' => '!w-full',':allowInput' => 'true']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::flat-picker.datetime'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['class' => '!w-full',':allow-input' => 'true']); ?> + + renderComponent(); ?> + + + + + + + + + +
    +
    + renderComponent(); ?> + + + + + + + + + + + + + + 'admin::components.form.control-group.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> + + + 'admin::components.form.control-group.label','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.label'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> + get('admin::app.activities.edit.comment'); ?> + renderComponent(); ?> + + + + + + + + + + + + + 'admin::components.form.control-group.control','data' => ['type' => 'textarea','name' => 'comment','id' => 'comment','value' => old('comment') ?? $activity->comment,'label' => trans('admin::app.activities.edit.comment'),'placeholder' => trans('admin::app.activities.edit.comment')]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.control'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['type' => 'textarea','name' => 'comment','id' => 'comment','value' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(old('comment') ?? $activity->comment),'label' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(trans('admin::app.activities.edit.comment')),'placeholder' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(trans('admin::app.activities.edit.comment'))]); ?> +renderComponent(); ?> + + + + + + + + + + + + + 'admin::components.form.control-group.error','data' => ['controlName' => 'comment']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.error'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['control-name' => 'comment']); ?> +renderComponent(); ?> + + + + + + + + + + renderComponent(); ?> + + + + + + + + + + + + + + 'admin::components.form.control-group.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> + + + 'admin::components.form.control-group.label','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.label'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> + get('admin::app.activities.edit.participants'); ?> + renderComponent(); ?> + + + + + + + + + + + + +
    +
      +
    • + +
    • +
    + + +
    +
    + renderComponent(); ?> + + + + + + + + + + + + + + 'admin::components.form.control-group.index','data' => ['class' => '!mb-0']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['class' => '!mb-0']); ?> + + + 'admin::components.form.control-group.label','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.label'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> + get('admin::app.activities.edit.lead'); ?> + renderComponent(); ?> + + + + + + + + + + + + + 'admin::components.attributes.edit.lookup','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::attributes.edit.lookup'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> +renderComponent(); ?> + + + + + + + + + + + + + + + 'admin::components.form.control-group.control','data' => ['type' => 'text','placeholder' => '@lang(\'admin::app.common.start-typing\')']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.control'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['type' => 'text','placeholder' => '@lang(\'admin::app.common.start-typing\')']); ?> +renderComponent(); ?> + + + + + + + + + + + renderComponent(); ?> + + + + + + + + + + + + +
    + + +
    + + + + + + 'admin::components.accordion.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::accordion'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> + slot('header', null, []); ?> +
    +

    + get('admin::app.activities.edit.general'); ?> +

    +
    + endSlot(); ?> + + slot('content', null, []); ?> + + + + 'admin::components.form.control-group.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> + + + 'admin::components.form.control-group.label','data' => ['class' => 'required']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.label'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['class' => 'required']); ?> + get('admin::app.activities.edit.title'); ?> + renderComponent(); ?> + + + + + + + + + + + + + 'admin::components.form.control-group.control','data' => ['type' => 'text','name' => 'title','id' => 'title','rules' => 'required','value' => old('title') ?? $activity->title,'label' => trans('admin::app.activities.edit.title'),'placeholder' => trans('admin::app.activities.edit.title')]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.control'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['type' => 'text','name' => 'title','id' => 'title','rules' => 'required','value' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(old('title') ?? $activity->title),'label' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(trans('admin::app.activities.edit.title')),'placeholder' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(trans('admin::app.activities.edit.title'))]); ?> +renderComponent(); ?> + + + + + + + + + + + + + 'admin::components.form.control-group.error','data' => ['controlName' => 'title']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.error'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['control-name' => 'title']); ?> +renderComponent(); ?> + + + + + + + + + + renderComponent(); ?> + + + + + + + + + + + + + + 'admin::components.form.control-group.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> + + + 'admin::components.form.control-group.label','data' => ['class' => 'required']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.label'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['class' => 'required']); ?> + get('admin::app.activities.edit.type'); ?> + renderComponent(); ?> + + + + + + + + + + + + + 'admin::components.form.control-group.control','data' => ['type' => 'select','name' => 'type','id' => 'type','value' => old('type') ?? $activity->type,'rules' => 'required','label' => trans('admin::app.activities.edit.type'),'placeholder' => trans('admin::app.activities.edit.type')]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.control'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['type' => 'select','name' => 'type','id' => 'type','value' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(old('type') ?? $activity->type),'rules' => 'required','label' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(trans('admin::app.activities.edit.type')),'placeholder' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(trans('admin::app.activities.edit.type'))]); ?> + + + + + + renderComponent(); ?> + + + + + + + + + + + + + 'admin::components.form.control-group.error','data' => ['controlName' => 'type']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.error'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['control-name' => 'type']); ?> +renderComponent(); ?> + + + + + + + + + + renderComponent(); ?> + + + + + + + + + + + + + + 'admin::components.form.control-group.index','data' => ['class' => '!mb-0']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['class' => '!mb-0']); ?> + + + 'admin::components.form.control-group.label','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.label'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> + get('admin::app.activities.edit.location'); ?> + renderComponent(); ?> + + + + + + + + + + + + + 'admin::components.form.control-group.control','data' => ['type' => 'text','name' => 'location','id' => 'location','value' => old('location') ?? $activity->location,'label' => trans('admin::app.activities.edit.location'),'placeholder' => trans('admin::app.activities.edit.location')]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.control'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['type' => 'text','name' => 'location','id' => 'location','value' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(old('location') ?? $activity->location),'label' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(trans('admin::app.activities.edit.location')),'placeholder' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(trans('admin::app.activities.edit.location'))]); ?> +renderComponent(); ?> + + + + + + + + + + + + + 'admin::components.form.control-group.error','data' => ['controlName' => 'location']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.error'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['control-name' => 'location']); ?> +renderComponent(); ?> + + + + + + + + + + renderComponent(); ?> + + + + + + + + + + endSlot(); ?> + renderComponent(); ?> + + + + + + + + + + + + +
    +
    +
    + renderComponent(); ?> + + + + + + + + + + + + + + hasRenderedOnce('07f00342-0485-4acb-af02-09fe978fcac7')): $__env->markAsRenderedOnce('07f00342-0485-4acb-af02-09fe978fcac7'); +$__env->startPush('scripts'); ?> + + + + stopPush(); endif; ?> + renderComponent(); ?> + + + + + + + + + + \ No newline at end of file diff --git a/storage/framework/views/bbdae7896a1f7165054fd9355cae7301.php b/storage/framework/views/bbdae7896a1f7165054fd9355cae7301.php new file mode 100755 index 0000000..5ed89fa --- /dev/null +++ b/storage/framework/views/bbdae7896a1f7165054fd9355cae7301.php @@ -0,0 +1,41 @@ +
    + +
    + +
    +
    +
    + +
    + + +
    + +
    + + +
    + +
    + + +
    +
    +
    + +
    +
    +
    +
    + +
    +
    + + +
    +
    +
    + +
    +
    +
    \ No newline at end of file diff --git a/storage/framework/views/bd5df4af7aa6519e61a16b0135794c6d.php b/storage/framework/views/bd5df4af7aa6519e61a16b0135794c6d.php new file mode 100755 index 0000000..7a37fee --- /dev/null +++ b/storage/framework/views/bd5df4af7aa6519e61a16b0135794c6d.php @@ -0,0 +1,28 @@ +hasPages()): ?> + + + \ No newline at end of file diff --git a/storage/framework/views/bddfc759890f2c4c9b12ae35f48b5c55.php b/storage/framework/views/bddfc759890f2c4c9b12ae35f48b5c55.php new file mode 100755 index 0000000..09a625f --- /dev/null +++ b/storage/framework/views/bddfc759890f2c4c9b12ae35f48b5c55.php @@ -0,0 +1,560 @@ + + + 'admin::components.layouts.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::layouts'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> + + slot('title', null, []); ?> + get('admin::app.settings.roles.edit.title'); ?> + endSlot(); ?> + + $role]); ?> + + + + + 'admin::components.form.index','data' => ['method' => 'PUT','action' => route('admin.settings.roles.update', $role->id)]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['method' => 'PUT','action' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(route('admin.settings.roles.update', $role->id))]); ?> +
    +
    +
    + $role]); ?> + + + + + + 'admin::components.breadcrumbs.index','data' => ['name' => 'settings.roles.edit','entity' => $role]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::breadcrumbs'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['name' => 'settings.roles.edit','entity' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($role)]); ?> +renderComponent(); ?> + + + + + + + + + + + $role]); ?> + + +
    + get('admin::app.settings.roles.edit.title'); ?> +
    +
    + +
    +
    + $role]); ?> + + + hasPermission('settings.user.roles.edit')): ?> + + + + + $role]); ?> + +
    +
    +
    + + $role]); ?> + + + +
    + $role]); ?> + + + +
    +
    +

    + get('admin::app.settings.roles.edit.access-control'); ?> +

    + + + + +
    +
    + +
    +
    + + + + + 'admin::components.shimmer.tree.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::shimmer.tree'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> +renderComponent(); ?> + + + + + + + + + +
    +
    +
    + + $role]); ?> + + + $role]); ?> + + + +
    + $role]); ?> + + + + + 'admin::components.accordion.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::accordion'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> + slot('header', null, []); ?> +
    +

    + get('admin::app.settings.roles.edit.general'); ?> +

    +
    + endSlot(); ?> + + slot('content', null, []); ?> + $role]); ?> + + + + + + 'admin::components.form.control-group.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> + + + 'admin::components.form.control-group.label','data' => ['class' => 'required']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.label'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['class' => 'required']); ?> + get('admin::app.settings.roles.edit.name'); ?> + renderComponent(); ?> + + + + + + + + + + + + + 'admin::components.form.control-group.control','data' => ['type' => 'text','id' => 'name','name' => 'name','rules' => 'required','value' => ''.e(old('name') ?: $role->name).'','label' => trans('admin::app.settings.roles.edit.name'),'placeholder' => trans('admin::app.settings.roles.edit.name')]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.control'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['type' => 'text','id' => 'name','name' => 'name','rules' => 'required','value' => ''.e(old('name') ?: $role->name).'','label' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(trans('admin::app.settings.roles.edit.name')),'placeholder' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(trans('admin::app.settings.roles.edit.name'))]); ?> +renderComponent(); ?> + + + + + + + + + + + + + 'admin::components.form.control-group.error','data' => ['controlName' => 'name']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.error'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['control-name' => 'name']); ?> +renderComponent(); ?> + + + + + + + + + + renderComponent(); ?> + + + + + + + + + + + $role]); ?> + + + $role]); ?> + + + + + + 'admin::components.form.control-group.index','data' => ['class' => '!mb-0']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['class' => '!mb-0']); ?> + + + 'admin::components.form.control-group.label','data' => ['class' => 'required']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.label'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['class' => 'required']); ?> + get('admin::app.settings.roles.edit.description'); ?> + renderComponent(); ?> + + + + + + + + + + + + + 'admin::components.form.control-group.control','data' => ['type' => 'textarea','id' => 'description','name' => 'description','rules' => 'required','value' => ''.e(old('description') ?: $role->description).'','label' => trans('admin::app.settings.roles.edit.description'),'placeholder' => trans('admin::app.settings.roles.edit.description')]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.control'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['type' => 'textarea','id' => 'description','name' => 'description','rules' => 'required','value' => ''.e(old('description') ?: $role->description).'','label' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(trans('admin::app.settings.roles.edit.description')),'placeholder' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(trans('admin::app.settings.roles.edit.description'))]); ?> +renderComponent(); ?> + + + + + + + + + + + + + 'admin::components.form.control-group.error','data' => ['controlName' => 'description']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.error'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['control-name' => 'description']); ?> +renderComponent(); ?> + + + + + + + + + + renderComponent(); ?> + + + + + + + + + + + $role]); ?> + + endSlot(); ?> + renderComponent(); ?> + + + + + + + + + + + $role]); ?> + +
    +
    + + $role]); ?> + +
    + renderComponent(); ?> + + + + + + + + + + + $role]); ?> + + + hasRenderedOnce('d22292fe-290a-497b-8812-326f39962143')): $__env->markAsRenderedOnce('d22292fe-290a-497b-8812-326f39962143'); +$__env->startPush('scripts'); ?> + + + + stopPush(); endif; ?> + renderComponent(); ?> + + + + + + + + + + \ No newline at end of file diff --git a/storage/framework/views/be37ec7b1345fcb3c2f3c4f68700e4f6.php b/storage/framework/views/be37ec7b1345fcb3c2f3c4f68700e4f6.php new file mode 100755 index 0000000..93b6fb4 --- /dev/null +++ b/storage/framework/views/be37ec7b1345fcb3c2f3c4f68700e4f6.php @@ -0,0 +1,13 @@ + +
    + +
    + +
    +

    +

    +
    +
    +
    + + \ No newline at end of file diff --git a/storage/framework/views/be65033c29029eb224ea0eceb6f05545.php b/storage/framework/views/be65033c29029eb224ea0eceb6f05545.php new file mode 100755 index 0000000..37d6cea --- /dev/null +++ b/storage/framework/views/be65033c29029eb224ea0eceb6f05545.php @@ -0,0 +1,500 @@ + +onlyProps([ + 'type' => 'text', + 'name' => '', +]) as $__key => $__value) { + $$__key = $$__key ?? $__value; +} ?> +exceptProps([ + 'type' => 'text', + 'name' => '', +]); ?> + 'text', + 'name' => '', +]), 'is_string', ARRAY_FILTER_USE_KEY) as $__key => $__value) { + $$__key = $$__key ?? $__value; +} ?> + + $__value) { + if (array_key_exists($__key, $__defined_vars)) unset($$__key); +} ?> + + + + + + + + only(['name', ':name', 'value', ':value', 'v-model', 'rules', ':rules', 'label', ':label'])); ?> + + name="" + > + except(['value', ':value', 'v-model', 'rules', ':rules', 'label', ':label'])->merge(['class' => 'w-full rounded border border-gray-200 px-2.5 py-2 text-sm font-normal text-gray-800 transition-all hover:border-gray-400 focus:border-gray-400 dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300 dark:hover:border-gray-400 dark:focus:border-gray-400'])); ?> + + /> + + + + + + only(['name', ':name', 'value', ':value', 'v-model', 'rules', ':rules', 'label', ':label'])); ?> + + name="" + > +
    + + attributes->merge(['class' => 'py-2.5 text-gray-500 ltr:pl-4 rtl:pr-4'])); ?>> + + + + + + + + + + + except(['value', ':value', 'v-model', 'rules', ':rules', 'label', ':label'])->merge(['class' => 'w-full p-2.5 text-sm text-gray-600 dark:bg-gray-900 dark:text-gray-300'])); ?> + + /> +
    +
    + + + + + only(['name', ':name', 'value', ':value', 'v-model', 'rules', ':rules', 'label', ':label'])); ?> + + name="" + > + except(['value', ':value', 'v-model', 'rules', ':rules', 'label', ':label'])->merge(['class' => 'w-full dark:file:bg-gray-800 dark:file:dark:text-white rounded border border-gray-200 px-2.5 py-2 text-sm font-normal text-gray-800 transition-all hover:border-gray-400 focus:border-gray-400 dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300 dark:hover:border-gray-400 dark:focus:border-gray-400'])); ?> + + @change="handleChange" + @blur="handleBlur" + /> + + + + + + except('class')); ?> + + > + except(['value'])->merge(['class' => 'w-full appearance-none rounded-md border text-sm text-gray-600 transition-all hover:border-gray-400 dark:text-gray-300 dark:hover:border-gray-400'])); ?> + + > + + + + + only(['name', ':name', 'value', ':value', 'v-model', 'rules', ':rules', 'label', ':label'])); ?> + + name="" + > + 'w-full rounded border border-gray-200 px-2.5 py-2 text-sm font-normal text-gray-800 transition-all hover:border-gray-400 focus:border-gray-400 dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300 dark:hover:border-gray-400 dark:focus:border-gray-400' + ]; + + if ($attributes->get('tinymce', false) || $attributes->get(':tinymce', false)) { + $defaultAttributes['id'] = $attributes->get(':id', 'id'); + } + ?> + + + + get('tinymce', false) || $attributes->get(':tinymce', false)): ?> + + + 'admin::components.tinymce.index','data' => ['selector' => 'textarea#' . ($attributes->get('id') ?? $attributes->get(':id')),':field' => 'field']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::tinymce'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['selector' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute('textarea#' . ($attributes->get('id') ?? $attributes->get(':id'))),':field' => 'field']); ?> +renderComponent(); ?> + + + + + + + + + + + + + + + + only(['name', ':name', 'value', ':value', 'v-model', 'rules', ':rules', 'label', ':label'])->merge(['rules' => 'regex:^\d{4}-\d{2}-\d{2}$'])); ?> + + name="" + > + + + 'admin::components.flat-picker.date','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::flat-picker.date'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> + except(['value', ':value', 'v-model', 'rules', ':rules', 'label', ':label'])->merge(['class' => 'w-full rounded border border-gray-200 px-2.5 py-2 text-sm font-normal text-gray-800 transition-all hover:border-gray-400 focus:border-gray-400 dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300 dark:hover:border-gray-400 dark:focus:border-gray-400'])); ?> + + autocomplete="off" + /> + renderComponent(); ?> + + + + + + + + + + + + + + + only(['name', ':name', 'value', ':value', 'v-model', 'rules', ':rules', 'label', ':label'])->merge(['rules' => 'regex:^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}$'])); ?> + + name="" + > + + + 'admin::components.flat-picker.datetime','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::flat-picker.datetime'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> + except(['value', ':value', 'v-model', 'rules', ':rules', 'label', ':label'])->merge(['class' => 'w-full rounded border border-gray-200 px-2.5 py-2 text-sm font-normal text-gray-800 transition-all hover:border-gray-400 focus:border-gray-400 dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300 dark:hover:border-gray-400 dark:focus:border-gray-400'])); ?> + + autocomplete="off" + > + renderComponent(); ?> + + + + + + + + + + + + + + only(['name', ':name', 'value', ':value', 'v-model', 'rules', ':rules', 'label', ':label'])); ?> + + name="" + > + + + + + + + except([])->merge(['class' => 'flex w-full flex-col rounded-md border bg-white px-3 py-2.5 text-sm font-normal text-gray-600 transition-all hover:border-gray-400 dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300 dark:hover:border-gray-400'])); ?> + + name="" + multiple + > + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 'admin::components.media.images','data' => ['name' => ''.e($name).'',':class' => '[errors && errors[\''.e($name).'\'] ? \'border !border-red-600 hover:border-red-600\' : \'\']','attributes' => $attributes]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::media.images'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['name' => ''.e($name).'',':class' => '[errors && errors[\''.e($name).'\'] ? \'border !border-red-600 hover:border-red-600\' : \'\']','attributes' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($attributes)]); ?> +renderComponent(); ?> + + + + + + + + + + + + + + + + 'admin::components.form.control-group.controls.inline.text','data' => ['attributes' => $attributes]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.controls.inline.text'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['attributes' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($attributes)]); ?> +renderComponent(); ?> + + + + + + + + + + + + + + > + + + + + + + + + + 'admin::components.form.control-group.controls.tags','data' => ['name' => $name,'data' => $attributes->get(':data') ?? $attributes->get('data'),'attributes' => $attributes]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.controls.tags'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['name' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($name),'data' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($attributes->get(':data') ?? $attributes->get('data')),'attributes' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($attributes)]); ?> +renderComponent(); ?> + + + + + + + + + + + + +hasRenderedOnce('5546b0c1-8ed3-4551-bacd-2f1efcb47355')): $__env->markAsRenderedOnce('5546b0c1-8ed3-4551-bacd-2f1efcb47355'); +$__env->startPush('scripts'); ?> + + + +stopPush(); endif; ?> + \ No newline at end of file diff --git a/storage/framework/views/bfb95f08f5507d145605961ebeaa83f9.php b/storage/framework/views/bfb95f08f5507d145605961ebeaa83f9.php new file mode 100755 index 0000000..160e9c7 --- /dev/null +++ b/storage/framework/views/bfb95f08f5507d145605961ebeaa83f9.php @@ -0,0 +1,31 @@ +hasPages()): ?> + + + \ No newline at end of file diff --git a/storage/framework/views/c0c04d49115719602aeabe1311e2e11e.php b/storage/framework/views/c0c04d49115719602aeabe1311e2e11e.php new file mode 100755 index 0000000..22d108c --- /dev/null +++ b/storage/framework/views/c0c04d49115719602aeabe1311e2e11e.php @@ -0,0 +1,141 @@ + + +hasRenderedOnce('8d4ef6b4-0e2d-40a8-b8d6-d473e7086677')): $__env->markAsRenderedOnce('8d4ef6b4-0e2d-40a8-b8d6-d473e7086677'); +$__env->startPush('scripts'); ?> + + + +stopPush(); endif; ?> \ No newline at end of file diff --git a/storage/framework/views/c0eeafa5404ccb3b6a234ee46c87e511.php b/storage/framework/views/c0eeafa5404ccb3b6a234ee46c87e511.php new file mode 100755 index 0000000..b01c1e4 --- /dev/null +++ b/storage/framework/views/c0eeafa5404ccb3b6a234ee46c87e511.php @@ -0,0 +1,4 @@ +merge(['scope' => 'row', 'class' => 'border-b border-gray-200 dark:border-gray-800'])); ?>> + + + \ No newline at end of file diff --git a/storage/framework/views/c100bd2e7fff457a7b18e261caf1ef81.php b/storage/framework/views/c100bd2e7fff457a7b18e261caf1ef81.php new file mode 100755 index 0000000..0fa9e1e --- /dev/null +++ b/storage/framework/views/c100bd2e7fff457a7b18e261caf1ef81.php @@ -0,0 +1,272 @@ + + + + + + + + + 'admin::components.shimmer.dashboard.index.over-all','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::shimmer.dashboard.index.over-all'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> +renderComponent(); ?> + + + + + + + + + + + + + + +hasRenderedOnce('f8dfc77a-ec09-4f70-a95d-1744808b1fd4')): $__env->markAsRenderedOnce('f8dfc77a-ec09-4f70-a95d-1744808b1fd4'); +$__env->startPush('scripts'); ?> + + + +stopPush(); endif; ?> \ No newline at end of file diff --git a/storage/framework/views/c12f125c21d124ddb00e61b72c3d6467.php b/storage/framework/views/c12f125c21d124ddb00e61b72c3d6467.php new file mode 100755 index 0000000..b02efaf --- /dev/null +++ b/storage/framework/views/c12f125c21d124ddb00e61b72c3d6467.php @@ -0,0 +1,3 @@ +(function() { + document.write(`render(); ?>`.replaceAll('$', '\$')); +})(); \ No newline at end of file diff --git a/storage/framework/views/c216a456d8abda98e9a1e002200cd508.php b/storage/framework/views/c216a456d8abda98e9a1e002200cd508.php new file mode 100755 index 0000000..e9473de --- /dev/null +++ b/storage/framework/views/c216a456d8abda98e9a1e002200cd508.php @@ -0,0 +1,771 @@ + + + 'admin::components.layouts.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::layouts'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> + + slot('title', null, []); ?> + get('admin::app.settings.marketing.events.index.title'); ?> + endSlot(); ?> + +
    + +
    +
    + + + + + + + 'admin::components.breadcrumbs.index','data' => ['name' => 'settings.marketing.events']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::breadcrumbs'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['name' => 'settings.marketing.events']); ?> +renderComponent(); ?> + + + + + + + + + + + + + +
    + get('admin::app.settings.marketing.events.index.title'); ?> +
    +
    + +
    + +
    + + + + hasPermission('settings.automation.events.create')): ?> + + + + + +
    +
    +
    + + + + + 'admin::components.shimmer.datagrid.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::shimmer.datagrid'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> +renderComponent(); ?> + + + + + + + + + + +
    + + hasRenderedOnce('dc882a9b-9702-4cf2-b0d2-18fccebf0629')): $__env->markAsRenderedOnce('dc882a9b-9702-4cf2-b0d2-18fccebf0629'); +$__env->startPush('scripts'); ?> + + + + stopPush(); endif; ?> + renderComponent(); ?> + + + + + + + + + + \ No newline at end of file diff --git a/storage/framework/views/c4188c8d16ca50973c0514392a83278d.php b/storage/framework/views/c4188c8d16ca50973c0514392a83278d.php new file mode 100755 index 0000000..f6e5df9 --- /dev/null +++ b/storage/framework/views/c4188c8d16ca50973c0514392a83278d.php @@ -0,0 +1,70 @@ +> +
    +
    + +hasRenderedOnce('0cf3e4d9-9b67-4cbf-b9ad-1b55f671beca')): $__env->markAsRenderedOnce('0cf3e4d9-9b67-4cbf-b9ad-1b55f671beca'); +$__env->startPush('scripts'); ?> + + + +stopPush(); endif; ?> \ No newline at end of file diff --git a/storage/framework/views/c466ea3b4d80f80373c9b95dbad50b8c.php b/storage/framework/views/c466ea3b4d80f80373c9b95dbad50b8c.php new file mode 100755 index 0000000..e9bb25d --- /dev/null +++ b/storage/framework/views/c466ea3b4d80f80373c9b95dbad50b8c.php @@ -0,0 +1,550 @@ + + + 'admin::components.layouts.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::layouts'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> + slot('title', null, []); ?> + get('admin::app.settings.sources.index.title'); ?> + endSlot(); ?> + +
    + +
    +
    + + + + + + + 'admin::components.breadcrumbs.index','data' => ['name' => 'settings.sources']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::breadcrumbs'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['name' => 'settings.sources']); ?> +renderComponent(); ?> + + + + + + + + + + + + + +
    + get('admin::app.settings.sources.index.title'); ?> +
    +
    + +
    + + + + + hasPermission('settings.lead.sources.create')): ?> +
    + +
    + + + + +
    +
    + + + + + + 'admin::components.shimmer.datagrid.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::shimmer.datagrid'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> +renderComponent(); ?> + + + + + + + + + + +
    + + hasRenderedOnce('491f95c7-7f7b-4cee-9142-2b4657addfdb')): $__env->markAsRenderedOnce('491f95c7-7f7b-4cee-9142-2b4657addfdb'); +$__env->startPush('scripts'); ?> + + + + stopPush(); endif; ?> + renderComponent(); ?> + + + + + + + + + + \ No newline at end of file diff --git a/storage/framework/views/c4d70cd171bf2fc590ee7c7141de88d2.php b/storage/framework/views/c4d70cd171bf2fc590ee7c7141de88d2.php new file mode 100755 index 0000000..831f02f --- /dev/null +++ b/storage/framework/views/c4d70cd171bf2fc590ee7c7141de88d2.php @@ -0,0 +1,592 @@ + + + + + + 'admin::components.shimmer.common.address','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::shimmer.common.address'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> +renderComponent(); ?> + + + + + + + + + + + + +hasRenderedOnce('17832670-5dbe-47a2-b41a-eb029cac4704')): $__env->markAsRenderedOnce('17832670-5dbe-47a2-b41a-eb029cac4704'); +$__env->startPush('scripts'); ?> + + + +stopPush(); endif; ?> \ No newline at end of file diff --git a/storage/framework/views/c5467567decfdcefe29aac61f3d5589e.php b/storage/framework/views/c5467567decfdcefe29aac61f3d5589e.php new file mode 100755 index 0000000..febb786 --- /dev/null +++ b/storage/framework/views/c5467567decfdcefe29aac61f3d5589e.php @@ -0,0 +1,171 @@ + + + + + + + + + 'admin::components.shimmer.dashboard.index.top-selling-products','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::shimmer.dashboard.index.top-selling-products'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> +renderComponent(); ?> + + + + + + + + + + + + + + +hasRenderedOnce('f167b167-bc83-453d-9343-e2b3c7620fb9')): $__env->markAsRenderedOnce('f167b167-bc83-453d-9343-e2b3c7620fb9'); +$__env->startPush('scripts'); ?> + + + +stopPush(); endif; ?> + \ No newline at end of file diff --git a/storage/framework/views/c5bcc7f5f43cdf04c3e1958145d44ff7.php b/storage/framework/views/c5bcc7f5f43cdf04c3e1958145d44ff7.php new file mode 100755 index 0000000..1e53f60 --- /dev/null +++ b/storage/framework/views/c5bcc7f5f43cdf04c3e1958145d44ff7.php @@ -0,0 +1,711 @@ + + + + + + + + +hasRenderedOnce('68aaa7ec-9b95-4cc6-b24e-22ea46d877ae')): $__env->markAsRenderedOnce('68aaa7ec-9b95-4cc6-b24e-22ea46d877ae'); +$__env->startPush('scripts'); ?> + + + + + +stopPush(); endif; ?> \ No newline at end of file diff --git a/storage/framework/views/c62c8976e81c463eb2916ca0044ca1cb.php b/storage/framework/views/c62c8976e81c463eb2916ca0044ca1cb.php new file mode 100755 index 0000000..d7de6bd --- /dev/null +++ b/storage/framework/views/c62c8976e81c463eb2916ca0044ca1cb.php @@ -0,0 +1,21 @@ + +onlyProps(['count' => 5]) as $__key => $__value) { + $$__key = $$__key ?? $__value; +} ?> +exceptProps(['count' => 5]); ?> + 5]), 'is_string', ARRAY_FILTER_USE_KEY) as $__key => $__value) { + $$__key = $$__key ?? $__value; +} ?> + + $__value) { + if (array_key_exists($__key, $__defined_vars)) unset($$__key); +} ?> + + +
    + +
    +
    +
    + +
    \ No newline at end of file diff --git a/storage/framework/views/c6e4ea11ca7454f87ab86a2864a7cc06.php b/storage/framework/views/c6e4ea11ca7454f87ab86a2864a7cc06.php new file mode 100755 index 0000000..25c35f2 --- /dev/null +++ b/storage/framework/views/c6e4ea11ca7454f87ab86a2864a7cc06.php @@ -0,0 +1,47 @@ +hasPages()): ?> + + + \ No newline at end of file diff --git a/storage/framework/views/c84fe614c3ee24c1ddf401fb2bea6af0.php b/storage/framework/views/c84fe614c3ee24c1ddf401fb2bea6af0.php new file mode 100755 index 0000000..af9af20 --- /dev/null +++ b/storage/framework/views/c84fe614c3ee24c1ddf401fb2bea6af0.php @@ -0,0 +1,25 @@ +
    +
    +
    +
    + +
    + +
    + +
    + +
    + +
    + +
    + + +
    +
    +
    +
    + +
    +
    \ No newline at end of file diff --git a/storage/framework/views/c88b70a8a9feab42ed2b012b4e9ee5c1.php b/storage/framework/views/c88b70a8a9feab42ed2b012b4e9ee5c1.php new file mode 100755 index 0000000..32aa675 --- /dev/null +++ b/storage/framework/views/c88b70a8a9feab42ed2b012b4e9ee5c1.php @@ -0,0 +1,296 @@ + +onlyProps([ + 'allowEdit' => true, +]) as $__key => $__value) { + $$__key = $$__key ?? $__value; +} ?> +exceptProps([ + 'allowEdit' => true, +]); ?> + true, +]), 'is_string', ARRAY_FILTER_USE_KEY) as $__key => $__value) { + $$__key = $$__key ?? $__value; +} ?> + + $__value) { + if (array_key_exists($__key, $__defined_vars)) unset($$__key); +} ?> + + + + + :allow-edit="" +> +
    +
    +
    +
    +
    +
    + +hasRenderedOnce('a4ebd6db-27fe-4c39-9efa-81954db40347')): $__env->markAsRenderedOnce('a4ebd6db-27fe-4c39-9efa-81954db40347'); +$__env->startPush('scripts'); ?> + + + +stopPush(); endif; ?> \ No newline at end of file diff --git a/storage/framework/views/c93246842dd998089762986ccb96fd3d.php b/storage/framework/views/c93246842dd998089762986ccb96fd3d.php new file mode 100755 index 0000000..1978535 --- /dev/null +++ b/storage/framework/views/c93246842dd998089762986ccb96fd3d.php @@ -0,0 +1,254 @@ + + + 'admin::components.layouts.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::layouts'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> + slot('title', null, []); ?> + get($warehouse->name); ?> + endSlot(); ?> + +
    + + $warehouse]); ?> + + +
    + +
    + +
    + + + 'admin::components.breadcrumbs.index','data' => ['name' => 'settings.warehouses.view','entity' => $warehouse]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::breadcrumbs'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['name' => 'settings.warehouses.view','entity' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($warehouse)]); ?> +renderComponent(); ?> + + + + + + + + + +
    + + $warehouse]); ?> + + + + + + 'admin::components.tags.index','data' => ['attachEndpoint' => route('admin.settings.warehouses.tags.attach', $warehouse->id),'detachEndpoint' => route('admin.settings.warehouses.tags.detach', $warehouse->id),'addedTags' => $warehouse->tags]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::tags'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['attach-endpoint' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(route('admin.settings.warehouses.tags.attach', $warehouse->id)),'detach-endpoint' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(route('admin.settings.warehouses.tags.detach', $warehouse->id)),'added-tags' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($warehouse->tags)]); ?> +renderComponent(); ?> + + + + + + + + + + + $warehouse]); ?> + + + $warehouse]); ?> + + + +

    + name); ?> + +

    + + $warehouse]); ?> + + + $warehouse]); ?> + + + +
    + $warehouse]); ?> + + + + + + 'admin::components.activities.actions.file','data' => ['entity' => $warehouse,'entityControlName' => 'warehouse_id']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::activities.actions.file'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['entity' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($warehouse),'entity-control-name' => 'warehouse_id']); ?> +renderComponent(); ?> + + + + + + + + + + + $warehouse]); ?> + + + $warehouse]); ?> + + + + + + 'admin::components.activities.actions.note','data' => ['entity' => $warehouse,'entityControlName' => 'warehouse_id']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::activities.actions.note'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['entity' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($warehouse),'entity-control-name' => 'warehouse_id']); ?> +renderComponent(); ?> + + + + + + + + + + + $warehouse]); ?> + + + $warehouse]); ?> + + + + + + 'admin::components.activities.actions.activity','data' => ['entity' => $warehouse,'entityControlName' => 'warehouse_id']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::activities.actions.activity'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['entity' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($warehouse),'entity-control-name' => 'warehouse_id']); ?> +renderComponent(); ?> + + + + + + + + + + + $warehouse]); ?> + +
    + + $warehouse]); ?> + +
    + + + make('admin::settings.warehouses.view.general-information', \Illuminate\Support\Arr::except(get_defined_vars(), ['__data', '__path']))->render(); ?> + + + make('admin::settings.warehouses.view.contact-information', \Illuminate\Support\Arr::except(get_defined_vars(), ['__data', '__path']))->render(); ?> +
    + + $warehouse]); ?> + + + $warehouse]); ?> + + + +
    + $warehouse]); ?> + + + + + + 'admin::components.activities.index','data' => ['endpoint' => route('admin.settings.warehouse.activities.index', $warehouse->id),'types' => [ + ['name' => 'all', 'label' => trans('admin::app.settings.warehouses.view.all')], + ['name' => 'note', 'label' => trans('admin::app.settings.warehouses.view.notes')], + ['name' => 'file', 'label' => trans('admin::app.settings.warehouses.view.files')], + ['name' => 'system', 'label' => trans('admin::app.settings.warehouses.view.change-logs')], + ],'extraTypes' => [ + ['name' => 'location', 'label' => trans('admin::app.settings.warehouses.view.location')], + ]]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::activities'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['endpoint' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(route('admin.settings.warehouse.activities.index', $warehouse->id)),'types' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute([ + ['name' => 'all', 'label' => trans('admin::app.settings.warehouses.view.all')], + ['name' => 'note', 'label' => trans('admin::app.settings.warehouses.view.notes')], + ['name' => 'file', 'label' => trans('admin::app.settings.warehouses.view.files')], + ['name' => 'system', 'label' => trans('admin::app.settings.warehouses.view.change-logs')], + ]),'extra-types' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute([ + ['name' => 'location', 'label' => trans('admin::app.settings.warehouses.view.location')], + ])]); ?> + slot('location', null, []); ?> + make('admin::settings.warehouses.view.locations', \Illuminate\Support\Arr::except(get_defined_vars(), ['__data', '__path']))->render(); ?> + endSlot(); ?> + renderComponent(); ?> + + + + + + + + + + + $warehouse]); ?> + +
    + + $warehouse]); ?> + +
    + renderComponent(); ?> + + + + + + + + + \ No newline at end of file diff --git a/storage/framework/views/c96786be548c061098a89722818ccdd9.php b/storage/framework/views/c96786be548c061098a89722818ccdd9.php new file mode 100755 index 0000000..e3d9773 --- /dev/null +++ b/storage/framework/views/c96786be548c061098a89722818ccdd9.php @@ -0,0 +1,137 @@ + + + + +hasRenderedOnce('eb654c7d-dd22-46a0-80f5-66ba4111a4de')): $__env->markAsRenderedOnce('eb654c7d-dd22-46a0-80f5-66ba4111a4de'); +$__env->startPush('scripts'); ?> + + + +stopPush(); endif; ?> + \ No newline at end of file diff --git a/storage/framework/views/c9dd5fab3c50756806a823d0086ed3ab.php b/storage/framework/views/c9dd5fab3c50756806a823d0086ed3ab.php new file mode 100755 index 0000000..ad38238 --- /dev/null +++ b/storage/framework/views/c9dd5fab3c50756806a823d0086ed3ab.php @@ -0,0 +1,48 @@ + + + + + + Super Admin - Growup Pro + + + + + +
    + + + + + any()): ?> + + + + yieldContent('content'); ?> +
    + + + \ No newline at end of file diff --git a/storage/framework/views/cacd1ce355b094ed718c8e57c6c09cce.php b/storage/framework/views/cacd1ce355b094ed718c8e57c6c09cce.php new file mode 100755 index 0000000..1f06fc7 --- /dev/null +++ b/storage/framework/views/cacd1ce355b094ed718c8e57c6c09cce.php @@ -0,0 +1,131 @@ + + + 'admin::components.layouts.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::layouts'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> + + slot('title', null, []); ?> + get('admin::app.contacts.organizations.index.title'); ?> + endSlot(); ?> + +
    +
    +
    + + + + + + + 'admin::components.breadcrumbs.index','data' => ['name' => 'contacts.organizations']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::breadcrumbs'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['name' => 'contacts.organizations']); ?> +renderComponent(); ?> + + + + + + + + + + + + + +
    + get('admin::app.contacts.organizations.index.title'); ?> +
    +
    + +
    +
    + + + + hasPermission('contacts.organizations.create')): ?> + + + get('admin::app.contacts.organizations.index.create-btn'); ?> + + + + + +
    +
    +
    + + + + + + + 'admin::components.datagrid.index','data' => ['src' => route('admin.contacts.organizations.index')]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::datagrid'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['src' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(route('admin.contacts.organizations.index'))]); ?> + + + + 'admin::components.shimmer.datagrid.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::shimmer.datagrid'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> +renderComponent(); ?> + + + + + + + + + + renderComponent(); ?> + + + + + + + + + + + + +
    + renderComponent(); ?> + + + + + + + + + + \ No newline at end of file diff --git a/storage/framework/views/cc0143e300080a647abe2f5a7cc57b40.php b/storage/framework/views/cc0143e300080a647abe2f5a7cc57b40.php new file mode 100755 index 0000000..9fce8db --- /dev/null +++ b/storage/framework/views/cc0143e300080a647abe2f5a7cc57b40.php @@ -0,0 +1,172 @@ + + + + \ No newline at end of file diff --git a/storage/framework/views/cc637471677bcb38ce3f1da95b8515a3.php b/storage/framework/views/cc637471677bcb38ce3f1da95b8515a3.php new file mode 100755 index 0000000..43175a2 --- /dev/null +++ b/storage/framework/views/cc637471677bcb38ce3f1da95b8515a3.php @@ -0,0 +1,6 @@ +
    +
    + +
    +
    + \ No newline at end of file diff --git a/storage/framework/views/cd06a68343b54991724d7af0fd4fbf94.php b/storage/framework/views/cd06a68343b54991724d7af0fd4fbf94.php new file mode 100755 index 0000000..2e1464e --- /dev/null +++ b/storage/framework/views/cd06a68343b54991724d7af0fd4fbf94.php @@ -0,0 +1,160 @@ + + + + 'admin::components.layouts.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::layouts'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> + + slot('title', null, []); ?> + get('admin::app.contacts.organizations.edit.title'); ?> + endSlot(); ?> + + + + + + + 'admin::components.form.index','data' => ['action' => route('admin.contacts.organizations.update', $organization->id),'method' => 'PUT']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['action' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(route('admin.contacts.organizations.update', $organization->id)),'method' => 'PUT']); ?> +
    +
    +
    + $organization]); ?> + + + + + 'admin::components.breadcrumbs.index','data' => ['name' => 'contacts.organizations.edit','entity' => $organization]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::breadcrumbs'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['name' => 'contacts.organizations.edit','entity' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($organization)]); ?> +renderComponent(); ?> + + + + + + + + + + + $organization]); ?> + + +
    + get('admin::app.contacts.organizations.edit.title'); ?> +
    +
    + +
    +
    + $organization]); ?> + + + + + + $organization]); ?> + +
    +
    +
    + +
    + + + + + + 'admin::components.attributes.index','data' => ['customAttributes' => app('Webkul\Attribute\Repositories\AttributeRepository')->findWhere([ + 'entity_type' => 'organizations', + ]),'customValidations' => [ + 'name' => [ + 'max:100', + ], + 'address' => [ + 'max:100', + ], + 'postcode' => [ + 'postcode', + ], + ],'entity' => $organization]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::attributes'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['custom-attributes' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(app('Webkul\Attribute\Repositories\AttributeRepository')->findWhere([ + 'entity_type' => 'organizations', + ])),'custom-validations' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute([ + 'name' => [ + 'max:100', + ], + 'address' => [ + 'max:100', + ], + 'postcode' => [ + 'postcode', + ], + ]),'entity' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($organization)]); ?> +renderComponent(); ?> + + + + + + + + + + + + +
    +
    + renderComponent(); ?> + + + + + + + + + + + + + renderComponent(); ?> + + + + + + + + + + \ No newline at end of file diff --git a/storage/framework/views/cdf6fb19a5c0ad1ef5db7342b765bba8.php b/storage/framework/views/cdf6fb19a5c0ad1ef5db7342b765bba8.php new file mode 100755 index 0000000..0dab864 --- /dev/null +++ b/storage/framework/views/cdf6fb19a5c0ad1ef5db7342b765bba8.php @@ -0,0 +1,124 @@ + + + 'admin::components.layouts.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::layouts'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> + slot('title', null, []); ?> + get('admin::app.products.index.title'); ?> + endSlot(); ?> + +
    +
    +
    + + + + 'admin::components.breadcrumbs.index','data' => ['name' => 'products']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::breadcrumbs'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['name' => 'products']); ?> +renderComponent(); ?> + + + + + + + + + + +
    + get('admin::app.products.index.title'); ?> +
    +
    + +
    + + + + + hasPermission('products.create')): ?> + + + + + +
    +
    + + + + + + + 'admin::components.datagrid.index','data' => ['src' => route('admin.products.index')]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::datagrid'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['src' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(route('admin.products.index'))]); ?> + + + + 'admin::components.shimmer.datagrid.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::shimmer.datagrid'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> +renderComponent(); ?> + + + + + + + + + + renderComponent(); ?> + + + + + + + + + + + + +
    + renderComponent(); ?> + + + + + + + + + + \ No newline at end of file diff --git a/storage/framework/views/ce51d0382acd3068014849bcbd3390c7.php b/storage/framework/views/ce51d0382acd3068014849bcbd3390c7.php new file mode 100755 index 0000000..8321c0b --- /dev/null +++ b/storage/framework/views/ce51d0382acd3068014849bcbd3390c7.php @@ -0,0 +1,303 @@ + +onlyProps([ + 'allowEdit' => true, +]) as $__key => $__value) { + $$__key = $$__key ?? $__value; +} ?> +exceptProps([ + 'allowEdit' => true, +]); ?> + true, +]), 'is_string', ARRAY_FILTER_USE_KEY) as $__key => $__value) { + $$__key = $$__key ?? $__value; +} ?> + + $__value) { + if (array_key_exists($__key, $__defined_vars)) unset($$__key); +} ?> + + + + + :allow-edit="" +> +
    +
    +
    +
    +
    +
    + +hasRenderedOnce('e1ae9851-6a4a-4416-9f18-a9735ef86d8f')): $__env->markAsRenderedOnce('e1ae9851-6a4a-4416-9f18-a9735ef86d8f'); +$__env->startPush('scripts'); ?> + + + +stopPush(); endif; ?> \ No newline at end of file diff --git a/storage/framework/views/cef5a8b8fe9e2295a6f0cd070e4ab426.php b/storage/framework/views/cef5a8b8fe9e2295a6f0cd070e4ab426.php new file mode 100755 index 0000000..c0d73df --- /dev/null +++ b/storage/framework/views/cef5a8b8fe9e2295a6f0cd070e4ab426.php @@ -0,0 +1,303 @@ + +onlyProps([ + 'allowEdit' => true, +]) as $__key => $__value) { + $$__key = $$__key ?? $__value; +} ?> +exceptProps([ + 'allowEdit' => true, +]); ?> + true, +]), 'is_string', ARRAY_FILTER_USE_KEY) as $__key => $__value) { + $$__key = $$__key ?? $__value; +} ?> + + $__value) { + if (array_key_exists($__key, $__defined_vars)) unset($$__key); +} ?> + + + + + :allow-edit="" +> +
    +
    +
    +
    +
    +
    + +hasRenderedOnce('af33b841-7e72-4af8-ae47-b2d23cb2cffe')): $__env->markAsRenderedOnce('af33b841-7e72-4af8-ae47-b2d23cb2cffe'); +$__env->startPush('scripts'); ?> + + + +stopPush(); endif; ?> \ No newline at end of file diff --git a/storage/framework/views/cf663c2c06309f3a59c67ba60cc1815a.php b/storage/framework/views/cf663c2c06309f3a59c67ba60cc1815a.php new file mode 100755 index 0000000..462771b --- /dev/null +++ b/storage/framework/views/cf663c2c06309f3a59c67ba60cc1815a.php @@ -0,0 +1,1886 @@ + + + + + +hasRenderedOnce('75f33b77-4fb3-4ee6-a138-e7383144c628')): $__env->markAsRenderedOnce('75f33b77-4fb3-4ee6-a138-e7383144c628'); +$__env->startPush('scripts'); ?> + + + + + + + +stopPush(); endif; ?> + \ No newline at end of file diff --git a/storage/framework/views/d028a4887c85c25f7b1d6f3b0d730412.php b/storage/framework/views/d028a4887c85c25f7b1d6f3b0d730412.php new file mode 100755 index 0000000..988ca76 --- /dev/null +++ b/storage/framework/views/d028a4887c85c25f7b1d6f3b0d730412.php @@ -0,0 +1,93 @@ +hasPages()): ?> + + + \ No newline at end of file diff --git a/storage/framework/views/d03914f7418dbbe11a34e35b629d81da.php b/storage/framework/views/d03914f7418dbbe11a34e35b629d81da.php new file mode 100755 index 0000000..4f32a06 --- /dev/null +++ b/storage/framework/views/d03914f7418dbbe11a34e35b629d81da.php @@ -0,0 +1,65 @@ +
    + + +
    + +
    +
    + + + + + 'admin::components.form.control-group.control','data' => ['type' => 'file','id' => $attribute->code,'name' => $attribute->code,'rules' => $validations,'label' => $attribute->name]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.control'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['type' => 'file','id' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($attribute->code),'name' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($attribute->code),'rules' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($validations),'label' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($attribute->name)]); ?> +renderComponent(); ?> + + + + + + + + + +
    + + +
    + + + 'admin::components.form.control-group.control','data' => ['type' => 'checkbox','name' => ''.e($attribute->code).'[delete]','id' => ''.e($attribute->code).'[delete]','for' => ''.e($attribute->code).'[delete]','value' => '1']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.control'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['type' => 'checkbox','name' => ''.e($attribute->code).'[delete]','id' => ''.e($attribute->code).'[delete]','for' => ''.e($attribute->code).'[delete]','value' => '1']); ?> +renderComponent(); ?> + + + + + + + + + + + +
    + \ No newline at end of file diff --git a/storage/framework/views/d088af29b2c8f0235601107a5f871950.php b/storage/framework/views/d088af29b2c8f0235601107a5f871950.php new file mode 100755 index 0000000..112d845 --- /dev/null +++ b/storage/framework/views/d088af29b2c8f0235601107a5f871950.php @@ -0,0 +1,237 @@ + + + 'admin::components.layouts.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::layouts'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> + slot('title', null, []); ?> + get($product->name); ?> + endSlot(); ?> + + +
    + + $product]); ?> + + +
    + +
    + +
    + + + 'admin::components.breadcrumbs.index','data' => ['name' => 'products.view','entity' => $product]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::breadcrumbs'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['name' => 'products.view','entity' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($product)]); ?> +renderComponent(); ?> + + + + + + + + + +
    + + $product]); ?> + + + + + + 'admin::components.tags.index','data' => ['attachEndpoint' => route('admin.products.tags.attach', $product->id),'detachEndpoint' => route('admin.products.tags.detach', $product->id),'addedTags' => $product->tags]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::tags'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['attach-endpoint' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(route('admin.products.tags.attach', $product->id)),'detach-endpoint' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(route('admin.products.tags.detach', $product->id)),'added-tags' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($product->tags)]); ?> +renderComponent(); ?> + + + + + + + + + + + $product]); ?> + + + +
    + $product]); ?> + + +

    + name); ?> + +

    + + $product]); ?> + + + $product]); ?> + + +

    + get('admin::app.products.view.sku'); ?> : sku); ?> + +

    + + $product]); ?> + +
    + + $product]); ?> + + + +
    + $product]); ?> + + + + + + 'admin::components.activities.actions.note','data' => ['entity' => $product,'entityControlName' => 'product_id']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::activities.actions.note'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['entity' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($product),'entity-control-name' => 'product_id']); ?> +renderComponent(); ?> + + + + + + + + + + + $product]); ?> + + + $product]); ?> + + + + + + 'admin::components.activities.actions.file','data' => ['entity' => $product,'entityControlName' => 'product_id']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::activities.actions.file'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['entity' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($product),'entity-control-name' => 'product_id']); ?> +renderComponent(); ?> + + + + + + + + + + + $product]); ?> + +
    + + $product]); ?> + +
    + + + make('admin::products.view.attributes', \Illuminate\Support\Arr::except(get_defined_vars(), ['__data', '__path']))->render(); ?> +
    + + $product]); ?> + + + $product]); ?> + + + +
    + $product]); ?> + + + + + + 'admin::components.activities.index','data' => ['endpoint' => route('admin.products.activities.index', $product->id),'types' => [ + ['name' => 'all', 'label' => trans('admin::app.products.view.all')], + ['name' => 'note', 'label' => trans('admin::app.products.view.notes')], + ['name' => 'file', 'label' => trans('admin::app.products.view.files')], + ['name' => 'system', 'label' => trans('admin::app.products.view.change-logs')], + ],'extraTypes' => [ + ['name' => 'inventory', 'label' => trans('admin::app.products.view.inventories')], + ]]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::activities'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['endpoint' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(route('admin.products.activities.index', $product->id)),'types' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute([ + ['name' => 'all', 'label' => trans('admin::app.products.view.all')], + ['name' => 'note', 'label' => trans('admin::app.products.view.notes')], + ['name' => 'file', 'label' => trans('admin::app.products.view.files')], + ['name' => 'system', 'label' => trans('admin::app.products.view.change-logs')], + ]),'extra-types' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute([ + ['name' => 'inventory', 'label' => trans('admin::app.products.view.inventories')], + ])]); ?> + slot('inventory', null, []); ?> + make('admin::products.view.inventory', \Illuminate\Support\Arr::except(get_defined_vars(), ['__data', '__path']))->render(); ?> + endSlot(); ?> + renderComponent(); ?> + + + + + + + + + + + $product]); ?> + +
    + + $product]); ?> + +
    + renderComponent(); ?> + + + + + + + + + \ No newline at end of file diff --git a/storage/framework/views/d152e93aa18084fce458b6000ce4c6d0.php b/storage/framework/views/d152e93aa18084fce458b6000ce4c6d0.php new file mode 100755 index 0000000..e554186 --- /dev/null +++ b/storage/framework/views/d152e93aa18084fce458b6000ce4c6d0.php @@ -0,0 +1,37 @@ + +onlyProps([ + 'name' => null, + 'controlName' => '', +]) as $__key => $__value) { + $$__key = $$__key ?? $__value; +} ?> +exceptProps([ + 'name' => null, + 'controlName' => '', +]); ?> + null, + 'controlName' => '', +]), 'is_string', ARRAY_FILTER_USE_KEY) as $__key => $__value) { + $$__key = $$__key ?? $__value; +} ?> + + $__value) { + if (array_key_exists($__key, $__defined_vars)) unset($$__key); +} ?> + + + + + name="" + v-slot="{ message }" +> +

    merge(['class' => 'mt-1 text-xs italic text-red-600'])); ?> + + v-text="message" + > +

    +
    + \ No newline at end of file diff --git a/storage/framework/views/d1f08c39f1f5d58707d54efd7804b954.php b/storage/framework/views/d1f08c39f1f5d58707d54efd7804b954.php new file mode 100755 index 0000000..0326deb --- /dev/null +++ b/storage/framework/views/d1f08c39f1f5d58707d54efd7804b954.php @@ -0,0 +1,164 @@ +
    + hasPermission('leads.create') + || bouncer()->hasPermission('quotes.create') + || bouncer()->hasPermission('mail.create') + || bouncer()->hasPermission('contacts.persons.create') + || bouncer()->hasPermission('contacts.organizations.create') + || bouncer()->hasPermission('products.create') + || bouncer()->hasPermission('settings.automation.attributes.create') + || bouncer()->hasPermission('settings.user.roles.create') + || bouncer()->hasPermission('settings.user.users.create') + ): ?> + + + 'admin::components.dropdown.index','data' => ['position' => 'bottom-right']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::dropdown'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['position' => 'bottom-right']); ?> + slot('toggle', null, []); ?> + + + endSlot(); ?> + + + slot('content', null, ['class' => 'mt-2 !p-0']); ?> +
    +
    + + hasPermission('leads.create')): ?> + + + + + hasPermission('quotes.create')): ?> + + + + + hasPermission('mail.create')): ?> + + + + + hasPermission('contacts.persons.create')): ?> + + + + + hasPermission('contacts.organizations.create')): ?> + + + + + hasPermission('products.create')): ?> + + + + + hasPermission('settings.automation.attributes.create')): ?> + + + + + hasPermission('settings.user.roles.create')): ?> + + + + + hasPermission('settings.user.users.create')): ?> + + +
    +
    + endSlot(); ?> + renderComponent(); ?> + + + + + + + + + + +
    + \ No newline at end of file diff --git a/storage/framework/views/d2c46ca36ad74e62d092fa104c6403d2.php b/storage/framework/views/d2c46ca36ad74e62d092fa104c6403d2.php new file mode 100755 index 0000000..0aac4ec --- /dev/null +++ b/storage/framework/views/d2c46ca36ad74e62d092fa104c6403d2.php @@ -0,0 +1,29 @@ +lookup_type + ? app('Webkul\Attribute\Repositories\AttributeRepository')->getLookUpOptions($attribute->lookup_type) + : $attribute->options()->orderBy('sort_order')->get(); + + $selectedOption = old($attribute->code) ?: $value; +?> + + + + 'admin::components.form.control-group.controls.inline.multiselect','data' => [':name' => '\''.e($attribute->code).'\'',':value' => '\''.e($selectedOption).'\'','data' => $options,'rules' => 'required','position' => 'left','label' => $attribute->name,':errors' => 'errors','placeholder' => $attribute->name,'url' => $url,'allowEdit' => $allowEdit]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.controls.inline.multiselect'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([':name' => '\''.e($attribute->code).'\'',':value' => '\''.e($selectedOption).'\'','data' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($options),'rules' => 'required','position' => 'left','label' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($attribute->name),':errors' => 'errors','placeholder' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($attribute->name),'url' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($url),'allow-edit' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($allowEdit)]); ?> +renderComponent(); ?> + + + + + + + + + + \ No newline at end of file diff --git a/storage/framework/views/d33307fb31bb2672758386635ebd2409.php b/storage/framework/views/d33307fb31bb2672758386635ebd2409.php new file mode 100755 index 0000000..5f7f63f --- /dev/null +++ b/storage/framework/views/d33307fb31bb2672758386635ebd2409.php @@ -0,0 +1,21 @@ + +onlyProps(['count' => 5]) as $__key => $__value) { + $$__key = $$__key ?? $__value; +} ?> +exceptProps(['count' => 5]); ?> + 5]), 'is_string', ARRAY_FILTER_USE_KEY) as $__key => $__value) { + $$__key = $$__key ?? $__value; +} ?> + + $__value) { + if (array_key_exists($__key, $__defined_vars)) unset($$__key); +} ?> + + +
    + +
    + + +
    +
    \ No newline at end of file diff --git a/storage/framework/views/d4062cf192494d743f721004ae6def7a.php b/storage/framework/views/d4062cf192494d743f721004ae6def7a.php new file mode 100755 index 0000000..c724e61 --- /dev/null +++ b/storage/framework/views/d4062cf192494d743f721004ae6def7a.php @@ -0,0 +1,1251 @@ +getEmailTemplatePlaceholders()); ?> + + + + 'admin::components.layouts.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::layouts'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> + + slot('title', null, []); ?> + get('admin::app.settings.webhooks.edit.title'); ?> + endSlot(); ?> + + $webhook]); ?> + + + + + 'admin::components.form.index','data' => ['action' => route('admin.settings.webhooks.update', $webhook->id),'method' => 'PUT']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['action' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(route('admin.settings.webhooks.update', $webhook->id)),'method' => 'PUT']); ?> +
    +
    +
    + $webhook]); ?> + + + + + + 'admin::components.breadcrumbs.index','data' => ['name' => 'settings.webhooks.edit','entity' => $webhook]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::breadcrumbs'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['name' => 'settings.webhooks.edit','entity' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($webhook)]); ?> +renderComponent(); ?> + + + + + + + + + + + $webhook]); ?> + + +
    + get('admin::app.settings.webhooks.edit.title'); ?> +
    +
    + +
    +
    + $webhook]); ?> + + + + + + $webhook]); ?> + +
    +
    +
    + + +
    + renderComponent(); ?> + + + + + + + + + + + $webhook]); ?> + + + hasRenderedOnce('797656a1-99a5-4505-8607-5138991eb3de')): $__env->markAsRenderedOnce('797656a1-99a5-4505-8607-5138991eb3de'); +$__env->startPush('scripts'); ?> + + + + + + + + + + + + stopPush(); endif; ?> + + hasRenderedOnce('6c805669-c44a-421d-a5db-c7e3839b5555')): $__env->markAsRenderedOnce('6c805669-c44a-421d-a5db-c7e3839b5555'); +$__env->startPush('styles'); ?> + + + + + + stopPush(); endif; ?> + renderComponent(); ?> + + + + + + + + + + \ No newline at end of file diff --git a/storage/framework/views/d4b0a3e17c2124cfec42f81937afea08.php b/storage/framework/views/d4b0a3e17c2124cfec42f81937afea08.php new file mode 100755 index 0000000..d44a33c --- /dev/null +++ b/storage/framework/views/d4b0a3e17c2124cfec42f81937afea08.php @@ -0,0 +1,243 @@ + + + + + + + + + + <?php echo e($title ?? ''); ?> + + + + + + + + + + + yieldPushContent('meta'); ?> + + set(['src/Resources/assets/css/app.css', 'src/Resources/assets/js/app.js'])); ?> + + + + + + + getConfigData('general.design.admin_logo.favicon')): ?> + + + + + + getConfigData('general.settings.menu_color.brand_color') ?? '#0E90D9'; + ?> + + yieldPushContent('styles'); ?> + + + + + + + + + + + +
    + + + + 'admin::components.flash-group.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::flash-group'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> +renderComponent(); ?> + + + + + + + + + + + + + + 'admin::components.modal.confirm','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::modal.confirm'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> +renderComponent(); ?> + + + + + + + + + + + + + + + + + 'admin::components.layouts.header.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::layouts.header'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> +renderComponent(); ?> + + + + + + + + + + + + + + +
    + + + + + yieldPushContent('scripts'); ?> + + + + + + + + + + + + \ No newline at end of file diff --git a/storage/framework/views/d5041d7ba88a56444ac758c9cce83a35.php b/storage/framework/views/d5041d7ba88a56444ac758c9cce83a35.php new file mode 100755 index 0000000..40bfd22 --- /dev/null +++ b/storage/framework/views/d5041d7ba88a56444ac758c9cce83a35.php @@ -0,0 +1,197 @@ + + + + + +hasRenderedOnce('bb73b107-31ac-4737-9514-6a75fec4156a')): $__env->markAsRenderedOnce('bb73b107-31ac-4737-9514-6a75fec4156a'); +$__env->startPush('scripts'); ?> + + + +stopPush(); endif; ?> + \ No newline at end of file diff --git a/storage/framework/views/d66b74b49d95530ad03f4294dd4ab050.php b/storage/framework/views/d66b74b49d95530ad03f4294dd4ab050.php new file mode 100755 index 0000000..efe56f3 --- /dev/null +++ b/storage/framework/views/d66b74b49d95530ad03f4294dd4ab050.php @@ -0,0 +1,245 @@ + + +
    + + +
    + +
    +
    + + + + + get("admin::app.common.custom-attributes.add-more"); ?> + +
    + + +hasRenderedOnce('572b2766-7cf4-4ed8-a1e6-ee2589734b87')): $__env->markAsRenderedOnce('572b2766-7cf4-4ed8-a1e6-ee2589734b87'); +$__env->startPush('scripts'); ?> + + + +stopPush(); endif; ?> + \ No newline at end of file diff --git a/storage/framework/views/d6c7c91ccd6193f9cd451e4deeedba4d.php b/storage/framework/views/d6c7c91ccd6193f9cd451e4deeedba4d.php new file mode 100755 index 0000000..a9a5f42 --- /dev/null +++ b/storage/framework/views/d6c7c91ccd6193f9cd451e4deeedba4d.php @@ -0,0 +1,226 @@ + + + 'web_form::components.layouts.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('web_form::layouts'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> + slot('title', null, []); ?> + title); ?> + + endSlot(); ?> + + + +
    +
    + + + 'web_form::components.spinner.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('web_form::spinner'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> +renderComponent(); ?> + + + + + + + + + +
    +
    +
    + + hasRenderedOnce('ff8bdc2f-f3fc-488b-bb17-b15f60c35846')): $__env->markAsRenderedOnce('ff8bdc2f-f3fc-488b-bb17-b15f60c35846'); +$__env->startPush('scripts'); ?> + + + + stopPush(); endif; ?> + renderComponent(); ?> + + + + + + + + + + \ No newline at end of file diff --git a/storage/framework/views/d6fbed627e4c89b29c413eb23eeadcdb.php b/storage/framework/views/d6fbed627e4c89b29c413eb23eeadcdb.php new file mode 100755 index 0000000..555f2a9 --- /dev/null +++ b/storage/framework/views/d6fbed627e4c89b29c413eb23eeadcdb.php @@ -0,0 +1,709 @@ + + + + +hasRenderedOnce('3631ecc4-5ca0-4422-8433-da11d9ab5207')): $__env->markAsRenderedOnce('3631ecc4-5ca0-4422-8433-da11d9ab5207'); +$__env->startPush('scripts'); ?> + + + +stopPush(); endif; ?> + \ No newline at end of file diff --git a/storage/framework/views/d76543fc136a2fb26036cf2dc1a322f3.php b/storage/framework/views/d76543fc136a2fb26036cf2dc1a322f3.php new file mode 100755 index 0000000..b6cd425 --- /dev/null +++ b/storage/framework/views/d76543fc136a2fb26036cf2dc1a322f3.php @@ -0,0 +1,21 @@ + + + 'admin::components.form.control-group.controls.inline.email','data' => [':name' => '\''.e($attribute->code).'\'','value' => $value,'rules' => 'required|decimal:4','position' => 'left','label' => $attribute->name,':errors' => 'errors','placeholder' => $attribute->name,'url' => $url,'allowEdit' => $allowEdit]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.controls.inline.email'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([':name' => '\''.e($attribute->code).'\'','value' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($value),'rules' => 'required|decimal:4','position' => 'left','label' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($attribute->name),':errors' => 'errors','placeholder' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($attribute->name),'url' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($url),'allow-edit' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($allowEdit)]); ?> +renderComponent(); ?> + + + + + + + + + + \ No newline at end of file diff --git a/storage/framework/views/d7daa0669623d0843faae680d79d5170.php b/storage/framework/views/d7daa0669623d0843faae680d79d5170.php new file mode 100755 index 0000000..b5f3833 --- /dev/null +++ b/storage/framework/views/d7daa0669623d0843faae680d79d5170.php @@ -0,0 +1,300 @@ + + + 'admin::components.layouts.anonymous','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::layouts.anonymous'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> + + slot('title', null, []); ?> + get('admin::app.users.login.title'); ?> + endSlot(); ?> + +
    +
    + + getConfigData('general.design.admin_logo.logo_image')): ?> + <?php echo e(config('app.name')); ?> + + <?php echo e(config('app.name')); ?> + + +
    + + + + + + + 'admin::components.form.index','data' => ['action' => route('admin.session.store')]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['action' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(route('admin.session.store'))]); ?> +

    + get('admin::app.users.login.title'); ?> +

    + +
    + + + + 'admin::components.form.control-group.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> + + + 'admin::components.form.control-group.label','data' => ['class' => 'required']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.label'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['class' => 'required']); ?> + get('admin::app.users.login.email'); ?> + renderComponent(); ?> + + + + + + + + + + + + + 'admin::components.form.control-group.control','data' => ['type' => 'email','class' => 'w-[254px] max-w-full','id' => 'email','name' => 'email','rules' => 'required|email','label' => trans('admin::app.users.login.email'),'placeholder' => trans('admin::app.users.login.email')]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.control'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['type' => 'email','class' => 'w-[254px] max-w-full','id' => 'email','name' => 'email','rules' => 'required|email','label' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(trans('admin::app.users.login.email')),'placeholder' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(trans('admin::app.users.login.email'))]); ?> +renderComponent(); ?> + + + + + + + + + + + + + 'admin::components.form.control-group.error','data' => ['controlName' => 'email']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.error'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['control-name' => 'email']); ?> +renderComponent(); ?> + + + + + + + + + + renderComponent(); ?> + + + + + + + + + + + + + + 'admin::components.form.control-group.index','data' => ['class' => 'relative w-full']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['class' => 'relative w-full']); ?> + + + 'admin::components.form.control-group.label','data' => ['class' => 'required']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.label'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['class' => 'required']); ?> + get('admin::app.users.login.password'); ?> + renderComponent(); ?> + + + + + + + + + + + + + 'admin::components.form.control-group.control','data' => ['type' => 'password','class' => 'w-[254px] max-w-full ltr:pr-10 rtl:pl-10','id' => 'password','name' => 'password','rules' => 'required|min:6','label' => trans('admin::app.users.login.password'),'placeholder' => trans('admin::app.users.login.password')]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.control'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['type' => 'password','class' => 'w-[254px] max-w-full ltr:pr-10 rtl:pl-10','id' => 'password','name' => 'password','rules' => 'required|min:6','label' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(trans('admin::app.users.login.password')),'placeholder' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(trans('admin::app.users.login.password'))]); ?> +renderComponent(); ?> + + + + + + + + + + + + + + + + 'admin::components.form.control-group.error','data' => ['controlName' => 'password']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.error'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['control-name' => 'password']); ?> +renderComponent(); ?> + + + + + + + + + + renderComponent(); ?> + + + + + + + + + +
    + +
    + + + get('admin::app.users.login.forget-password-link'); ?> + + + + +
    + renderComponent(); ?> + + + + + + + + + + + + +
    +
    + + +
    + Desenvolvido por + + Blyzer + +
    + + startPush('scripts'); ?> + + stopPush(); ?> + renderComponent(); ?> + + + + + + + + + + \ No newline at end of file diff --git a/storage/framework/views/d8243be939fa006d973e91115191161b.php b/storage/framework/views/d8243be939fa006d973e91115191161b.php new file mode 100755 index 0000000..dab8094 --- /dev/null +++ b/storage/framework/views/d8243be939fa006d973e91115191161b.php @@ -0,0 +1,37 @@ + +onlyProps([ + 'name' => null, + 'controlName' => '', +]) as $__key => $__value) { + $$__key = $$__key ?? $__value; +} ?> +exceptProps([ + 'name' => null, + 'controlName' => '', +]); ?> + null, + 'controlName' => '', +]), 'is_string', ARRAY_FILTER_USE_KEY) as $__key => $__value) { + $$__key = $$__key ?? $__value; +} ?> + + $__value) { + if (array_key_exists($__key, $__defined_vars)) unset($$__key); +} ?> + + + + + name="" + v-slot="{ message }" +> +

    merge(['class' => 'mt-1 text-xs italic text-red-600'])); ?> + + v-text="message" + > +

    +
    + \ No newline at end of file diff --git a/storage/framework/views/d84bcbb3d7b8d427bb210340b35bbd2f.php b/storage/framework/views/d84bcbb3d7b8d427bb210340b35bbd2f.php new file mode 100755 index 0000000..c4af01a --- /dev/null +++ b/storage/framework/views/d84bcbb3d7b8d427bb210340b35bbd2f.php @@ -0,0 +1,1282 @@ + + + 'admin::components.layouts.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::layouts'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> + slot('title', null, []); ?> + get('admin::app.settings.users.index.title'); ?> + endSlot(); ?> + +
    +
    +
    + + + + 'admin::components.breadcrumbs.index','data' => ['name' => 'settings.users']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::breadcrumbs'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['name' => 'settings.users']); ?> +renderComponent(); ?> + + + + + + + + + + +
    + get('admin::app.settings.users.index.title'); ?> +
    +
    + +
    + + + + + hasPermission('settings.user.users.create')): ?> +
    + +
    + + + + +
    +
    + + + + + + 'admin::components.shimmer.datagrid.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::shimmer.datagrid'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> +renderComponent(); ?> + + + + + + + + + + +
    + + hasRenderedOnce('4f44c9f8-9ec4-4bf4-9601-24ef6bf9eddd')): $__env->markAsRenderedOnce('4f44c9f8-9ec4-4bf4-9601-24ef6bf9eddd'); +$__env->startPush('scripts'); ?> + + + + stopPush(); endif; ?> + renderComponent(); ?> + + + + + + + + + + \ No newline at end of file diff --git a/storage/framework/views/dc0412c0780ee8f64f910e45f574ee0f.php b/storage/framework/views/dc0412c0780ee8f64f910e45f574ee0f.php new file mode 100755 index 0000000..9709c1f --- /dev/null +++ b/storage/framework/views/dc0412c0780ee8f64f910e45f574ee0f.php @@ -0,0 +1,639 @@ + +onlyProps([ + 'isMultiRow' => false, + 'toolbarLeftBefore' => null, + 'toolbarLeftAfter' => null, + 'toolbarRightBefore' => null, + 'toolbarRightAfter' => null, +]) as $__key => $__value) { + $$__key = $$__key ?? $__value; +} ?> +exceptProps([ + 'isMultiRow' => false, + 'toolbarLeftBefore' => null, + 'toolbarLeftAfter' => null, + 'toolbarRightBefore' => null, + 'toolbarRightAfter' => null, +]); ?> + false, + 'toolbarLeftBefore' => null, + 'toolbarLeftAfter' => null, + 'toolbarRightBefore' => null, + 'toolbarRightAfter' => null, +]), 'is_string', ARRAY_FILTER_USE_KEY) as $__key => $__value) { + $$__key = $$__key ?? $__value; +} ?> + + $__value) { + if (array_key_exists($__key, $__defined_vars)) unset($$__key); +} ?> + + +> + + + + +hasRenderedOnce('c8738b28-86a1-499c-9d0f-6cd666a57056')): $__env->markAsRenderedOnce('c8738b28-86a1-499c-9d0f-6cd666a57056'); +$__env->startPush('scripts'); ?> + + + +stopPush(); endif; ?> + \ No newline at end of file diff --git a/storage/framework/views/dcfc209cfcd29250c5cd4457912cc6c0.php b/storage/framework/views/dcfc209cfcd29250c5cd4457912cc6c0.php new file mode 100755 index 0000000..79465ee --- /dev/null +++ b/storage/framework/views/dcfc209cfcd29250c5cd4457912cc6c0.php @@ -0,0 +1,240 @@ +> +
    + + + get('admin::app.export.export'); ?> +
    +
    + +hasRenderedOnce('25d5a7ab-5f4f-4dda-9f88-4ff6361ae381')): $__env->markAsRenderedOnce('25d5a7ab-5f4f-4dda-9f88-4ff6361ae381'); +$__env->startPush('scripts'); ?> + + + +stopPush(); endif; ?> + \ No newline at end of file diff --git a/storage/framework/views/dd110fa48c7ea808250a8c92771c47cb.php b/storage/framework/views/dd110fa48c7ea808250a8c92771c47cb.php new file mode 100755 index 0000000..e3f5361 --- /dev/null +++ b/storage/framework/views/dd110fa48c7ea808250a8c92771c47cb.php @@ -0,0 +1,386 @@ + + + 'admin::components.layouts.anonymous','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::layouts.anonymous'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> + + slot('title', null, []); ?> + get('admin::app.users.reset-password.title'); ?> + endSlot(); ?> + +
    +
    + + getConfigData('general.design.admin_logo.logo_image')): ?> + <?php echo e(config('app.name')); ?> + + <?php echo e(config('app.name')); ?> + + +
    + + + + + + + 'admin::components.form.index','data' => ['action' => route('admin.reset_password.store')]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['action' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(route('admin.reset_password.store'))]); ?> +
    +

    + get('admin::app.users.reset-password.title'); ?> +

    +
    + + + + 'admin::components.form.control-group.control','data' => ['type' => 'hidden','name' => 'token','value' => $token]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.control'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['type' => 'hidden','name' => 'token','value' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($token)]); ?> +renderComponent(); ?> + + + + + + + + + + +
    + + + + 'admin::components.form.control-group.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> + + + 'admin::components.form.control-group.label','data' => ['class' => 'required']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.label'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['class' => 'required']); ?> + get('admin::app.users.reset-password.email'); ?> + renderComponent(); ?> + + + + + + + + + + + + + 'admin::components.form.control-group.control','data' => ['type' => 'email','class' => 'w-[254px] max-w-full','id' => 'email','name' => 'email','rules' => 'required|email','label' => trans('admin::app.users.reset-password.email'),'placeholder' => trans('admin::app.users.reset-password.email')]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.control'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['type' => 'email','class' => 'w-[254px] max-w-full','id' => 'email','name' => 'email','rules' => 'required|email','label' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(trans('admin::app.users.reset-password.email')),'placeholder' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(trans('admin::app.users.reset-password.email'))]); ?> +renderComponent(); ?> + + + + + + + + + + + + + 'admin::components.form.control-group.error','data' => ['controlName' => 'email']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.error'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['control-name' => 'email']); ?> +renderComponent(); ?> + + + + + + + + + + renderComponent(); ?> + + + + + + + + + + + + + + 'admin::components.form.control-group.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> + + + 'admin::components.form.control-group.label','data' => ['class' => 'required']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.label'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['class' => 'required']); ?> + get('admin::app.users.reset-password.password'); ?> + renderComponent(); ?> + + + + + + + + + + + + + 'admin::components.form.control-group.control','data' => ['type' => 'password','class' => 'w-[254px] max-w-full','id' => 'password','name' => 'password','rules' => 'required|min:6','label' => trans('admin::app.users.reset-password.password'),'placeholder' => trans('admin::app.users.reset-password.password'),'ref' => 'password']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.control'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['type' => 'password','class' => 'w-[254px] max-w-full','id' => 'password','name' => 'password','rules' => 'required|min:6','label' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(trans('admin::app.users.reset-password.password')),'placeholder' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(trans('admin::app.users.reset-password.password')),'ref' => 'password']); ?> +renderComponent(); ?> + + + + + + + + + + + + + 'admin::components.form.control-group.error','data' => ['controlName' => 'password']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.error'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['control-name' => 'password']); ?> +renderComponent(); ?> + + + + + + + + + + renderComponent(); ?> + + + + + + + + + + + + + + 'admin::components.form.control-group.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> + + + 'admin::components.form.control-group.label','data' => ['class' => 'required']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.label'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['class' => 'required']); ?> + get('admin::app.users.reset-password.confirm-password'); ?> + renderComponent(); ?> + + + + + + + + + + + + + 'admin::components.form.control-group.control','data' => ['type' => 'password','class' => 'w-[254px] max-w-full','id' => 'password_confirmation','name' => 'password_confirmation','rules' => 'confirmed:@password','label' => trans('admin::app.users.reset-password.confirm-password'),'placeholder' => trans('admin::app.users.reset-password.confirm-password'),'ref' => 'password']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.control'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['type' => 'password','class' => 'w-[254px] max-w-full','id' => 'password_confirmation','name' => 'password_confirmation','rules' => 'confirmed:@password','label' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(trans('admin::app.users.reset-password.confirm-password')),'placeholder' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(trans('admin::app.users.reset-password.confirm-password')),'ref' => 'password']); ?> +renderComponent(); ?> + + + + + + + + + + + + + 'admin::components.form.control-group.error','data' => ['controlName' => 'password_confirmation']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.error'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['control-name' => 'password_confirmation']); ?> +renderComponent(); ?> + + + + + + + + + + renderComponent(); ?> + + + + + + + + + +
    + +
    + + + get('admin::app.users.reset-password.back-link-title'); ?> + + + + +
    + renderComponent(); ?> + + + + + + + + + + + + +
    +
    + + +
    + Desenvolvido por + + Blyzer + +
    + + renderComponent(); ?> + + + + + + + + + + \ No newline at end of file diff --git a/storage/framework/views/dd176efcf4d159000b9a55553f87ccb1.php b/storage/framework/views/dd176efcf4d159000b9a55553f87ccb1.php new file mode 100755 index 0000000..9ff64a9 --- /dev/null +++ b/storage/framework/views/dd176efcf4d159000b9a55553f87ccb1.php @@ -0,0 +1,106 @@ + $person]); ?> + + +organization): ?> +
    +

    + get('admin::app.contacts.persons.view.about-organization'); ?> + + +

    + +
    + $person]); ?> + + + + + + 'admin::components.avatar.index','data' => ['name' => $person->organization->name]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::avatar'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['name' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($person->organization->name)]); ?> +renderComponent(); ?> + + + + + + + + + + + $person]); ?> + + + +
    + $person]); ?> + + + + organization->name); ?> + + + + $person]); ?> + + + + $person]); ?> + + + organization->address): ?> +
    + organization->address['address'])): ?> + + organization->address['address']); ?> + + + + + organization->address['postcode']) + && isset($person->organization->address['city']) + ): ?> + + organization->address['postcode'] . ' ' . $person->organization->address['city']); ?> + + + + + organization->address['state'])): ?> + + state_name($person->organization->address['state'])); ?> + + + + + organization->address['country'])): ?> + + country_name($person->organization->address['country'])); ?> + + + +
    + + + $person]); ?> + +
    +
    +
    + + + $person]); ?> + + \ No newline at end of file diff --git a/storage/framework/views/dd310000961f2d208873a737c27d849a.php b/storage/framework/views/dd310000961f2d208873a737c27d849a.php new file mode 100755 index 0000000..0ad1c1a --- /dev/null +++ b/storage/framework/views/dd310000961f2d208873a737c27d849a.php @@ -0,0 +1,35 @@ + + + + + + + <?php echo $__env->yieldContent('title'); ?> + + + + + + +
    +
    +
    +
    + yieldContent('code'); ?> +
    + +
    + yieldContent('message'); ?> +
    +
    +
    +
    + + + \ No newline at end of file diff --git a/storage/framework/views/dd4f775cdf3e345524a2ade89dee5cd6.php b/storage/framework/views/dd4f775cdf3e345524a2ade89dee5cd6.php new file mode 100755 index 0000000..e4d9505 --- /dev/null +++ b/storage/framework/views/dd4f775cdf3e345524a2ade89dee5cd6.php @@ -0,0 +1,84 @@ +> + + + + +hasRenderedOnce('96fdc140-b8c4-417a-983a-d8499483590a')): $__env->markAsRenderedOnce('96fdc140-b8c4-417a-983a-d8499483590a'); +$__env->startPush('scripts'); ?> + + + +stopPush(); endif; ?> + \ No newline at end of file diff --git a/storage/framework/views/dd90c61f625f87e8ccaf54e392e6603a.php b/storage/framework/views/dd90c61f625f87e8ccaf54e392e6603a.php new file mode 100755 index 0000000..de91e2e --- /dev/null +++ b/storage/framework/views/dd90c61f625f87e8ccaf54e392e6603a.php @@ -0,0 +1,153 @@ + + + + + + <?php echo e($title ?? ''); ?> + + + + + + + + + + + yieldPushContent('meta'); ?> + + set(['src/Resources/assets/css/app.css', 'src/Resources/assets/js/app.js'])); ?> + + + + + + + getConfigData('general.design.admin_logo.favicon')): ?> + + + + + + getConfigData('general.settings.menu_color.brand_color') ?? '#0E90D9'; + ?> + + yieldPushContent('styles'); ?> + + + + + + + + + + + +
    + + + + 'admin::components.flash-group.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::flash-group'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> +renderComponent(); ?> + + + + + + + + + + + + + + + + + + + +
    + + + + + yieldPushContent('scripts'); ?> + + + + + + + + + + + + + + \ No newline at end of file diff --git a/storage/framework/views/ddc7cd9af3029afaf2b177122446790d.php b/storage/framework/views/ddc7cd9af3029afaf2b177122446790d.php new file mode 100755 index 0000000..5242797 --- /dev/null +++ b/storage/framework/views/ddc7cd9af3029afaf2b177122446790d.php @@ -0,0 +1,67 @@ +
    + + + <?php echo e($attribute->code); ?> + + + + + + 'admin::components.form.control-group.control','data' => ['type' => 'file','id' => $attribute->code,'name' => $attribute->code,'class' => '!w-full','rules' => $validations,'label' => $attribute->name]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.control'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['type' => 'file','id' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($attribute->code),'name' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($attribute->code),'class' => '!w-full','rules' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($validations),'label' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($attribute->name)]); ?> +renderComponent(); ?> + + + + + + + + + +
    + + +
    + + + 'admin::components.form.control-group.control','data' => ['type' => 'checkbox','name' => ''.e($attribute->code).'[delete]','id' => ''.e($attribute->code).'[delete]','for' => ''.e($attribute->code).'[delete]','value' => '1']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.control'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['type' => 'checkbox','name' => ''.e($attribute->code).'[delete]','id' => ''.e($attribute->code).'[delete]','for' => ''.e($attribute->code).'[delete]','value' => '1']); ?> +renderComponent(); ?> + + + + + + + + + + + +
    + \ No newline at end of file diff --git a/storage/framework/views/ddde46e2c3e07f623e890cd4be59e607.php b/storage/framework/views/ddde46e2c3e07f623e890cd4be59e607.php new file mode 100755 index 0000000..6276a76 --- /dev/null +++ b/storage/framework/views/ddde46e2c3e07f623e890cd4be59e607.php @@ -0,0 +1,17 @@ + +
    + +
    + +
    +

    +

    +
    +
    + + +
    +

    +
    +
    + \ No newline at end of file diff --git a/storage/framework/views/dde597c3b13585264f473de3430b8792.php b/storage/framework/views/dde597c3b13585264f473de3430b8792.php new file mode 100755 index 0000000..d5067b8 --- /dev/null +++ b/storage/framework/views/dde597c3b13585264f473de3430b8792.php @@ -0,0 +1,90 @@ + $warehouse]); ?> + + +
    + + + 'admin::components.accordion.index','data' => ['class' => 'select-none !border-none']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::accordion'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['class' => 'select-none !border-none']); ?> + slot('header', null, ['class' => '!p-0']); ?> +

    + get('admin::app.settings.warehouses.view.general-information.title'); ?> +

    + endSlot(); ?> + + slot('content', null, ['class' => 'mt-4 !px-0 !pb-0']); ?> + + + + 'admin::components.form.index','data' => ['vSlot' => '{ meta, errors, handleSubmit }','as' => 'div','ref' => 'modalForm']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['v-slot' => '{ meta, errors, handleSubmit }','as' => 'div','ref' => 'modalForm']); ?> +
    + $warehouse]); ?> + + + + + 'admin::components.attributes.view','data' => ['customAttributes' => app('Webkul\Attribute\Repositories\AttributeRepository')->findWhere([ + 'entity_type' => 'warehouses', + ['code', 'NOTIN', ['contact_name', 'contact_emails', 'contact_numbers', 'contact_address']] + ]),'entity' => $warehouse,'url' => route('admin.settings.warehouses.update', $warehouse->id),'allowEdit' => true]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::attributes.view'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['custom-attributes' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(app('Webkul\Attribute\Repositories\AttributeRepository')->findWhere([ + 'entity_type' => 'warehouses', + ['code', 'NOTIN', ['contact_name', 'contact_emails', 'contact_numbers', 'contact_address']] + ])),'entity' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($warehouse),'url' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(route('admin.settings.warehouses.update', $warehouse->id)),'allow-edit' => true]); ?> +renderComponent(); ?> + + + + + + + + + + + $warehouse]); ?> + +
    + renderComponent(); ?> + + + + + + + + + + endSlot(); ?> + renderComponent(); ?> + + + + + + + + + +
    + + $warehouse]); ?> \ No newline at end of file diff --git a/storage/framework/views/decb4b9850e964b06d91abea7ed638e3.php b/storage/framework/views/decb4b9850e964b06d91abea7ed638e3.php new file mode 100755 index 0000000..c1a9032 --- /dev/null +++ b/storage/framework/views/decb4b9850e964b06d91abea7ed638e3.php @@ -0,0 +1,541 @@ + + + 'admin::components.layouts.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::layouts'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> + slot('title', null, []); ?> + get('admin::app.settings.types.index.title'); ?> + endSlot(); ?> + +
    + +
    +
    + + + + 'admin::components.breadcrumbs.index','data' => ['name' => 'settings.types']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::breadcrumbs'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['name' => 'settings.types']); ?> +renderComponent(); ?> + + + + + + + + + + +
    + get('admin::app.settings.types.index.title'); ?> +
    +
    + +
    + + + + +
    + hasPermission('settings.lead.types.create')): ?> + + +
    + + + +
    +
    + + + + + + 'admin::components.shimmer.datagrid.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::shimmer.datagrid'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> +renderComponent(); ?> + + + + + + + + + + +
    + + hasRenderedOnce('be77aea3-16c9-4cc2-b08a-63eb271869ff')): $__env->markAsRenderedOnce('be77aea3-16c9-4cc2-b08a-63eb271869ff'); +$__env->startPush('scripts'); ?> + + + + stopPush(); endif; ?> + renderComponent(); ?> + + + + + + + + + + \ No newline at end of file diff --git a/storage/framework/views/e0276c8bee964928573ce227b79ec846.php b/storage/framework/views/e0276c8bee964928573ce227b79ec846.php new file mode 100755 index 0000000..3c328ed --- /dev/null +++ b/storage/framework/views/e0276c8bee964928573ce227b79ec846.php @@ -0,0 +1,66 @@ + +onlyProps(['isMultiRow' => false]) as $__key => $__value) { + $$__key = $$__key ?? $__value; +} ?> +exceptProps(['isMultiRow' => false]); ?> + false]), 'is_string', ARRAY_FILTER_USE_KEY) as $__key => $__value) { + $$__key = $$__key ?? $__value; +} ?> + + $__value) { + if (array_key_exists($__key, $__defined_vars)) unset($$__key); +} ?> + + + + +
    +
    + +
    + +
    + +
    + +
    + +
    +
    + +
    +
    +
    + +
    +
    +
    + +
    +
    + +
    + +
    +
    +
    + +
    +
    + +
    + +
    +
    + +
    +
    + +
    + +
    +
    +
    + + + \ No newline at end of file diff --git a/storage/framework/views/e0688c0fbc190f2d2b5546e07a44af84.php b/storage/framework/views/e0688c0fbc190f2d2b5546e07a44af84.php new file mode 100755 index 0000000..7f97904 --- /dev/null +++ b/storage/framework/views/e0688c0fbc190f2d2b5546e07a44af84.php @@ -0,0 +1,524 @@ + + + 'admin::components.layouts.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::layouts'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> + slot('title', null, []); ?> + get('admin::app.contacts.persons.index.title'); ?> + endSlot(); ?> + +
    +
    +
    + + + 'admin::components.breadcrumbs.index','data' => ['name' => 'contacts.persons']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::breadcrumbs'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['name' => 'contacts.persons']); ?> +renderComponent(); ?> + + + + + + + + + + +
    + get('admin::app.contacts.persons.index.title'); ?> +
    +
    + +
    + + + + 'admin::components.datagrid.export.index','data' => ['src' => route('admin.contacts.persons.index')]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::datagrid.export'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['src' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(route('admin.contacts.persons.index'))]); ?> +renderComponent(); ?> + + + + + + + + + + + +
    + + + + hasPermission('contacts.persons.create')): ?> + + get('admin::app.contacts.persons.index.create-btn'); ?> + + + + + +
    +
    +
    + + + + + + + + + 'admin::components.shimmer.datagrid.index','data' => ['isMultiRow' => true]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::shimmer.datagrid'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['is-multi-row' => true]); ?> +renderComponent(); ?> + + + + + + + + + + + + + +
    + + hasRenderedOnce('df5f3c37-a084-4096-bf45-176fa44ed86b')): $__env->markAsRenderedOnce('df5f3c37-a084-4096-bf45-176fa44ed86b'); +$__env->startPush('scripts'); ?> + + + + stopPush(); endif; ?> + renderComponent(); ?> + + + + + + + + + + \ No newline at end of file diff --git a/storage/framework/views/e0c0309d658af32f720f58d954a75621.php b/storage/framework/views/e0c0309d658af32f720f58d954a75621.php new file mode 100755 index 0000000..42fc627 --- /dev/null +++ b/storage/framework/views/e0c0309d658af32f720f58d954a75621.php @@ -0,0 +1,338 @@ + +onlyProps([ + 'allowEdit' => true, +]) as $__key => $__value) { + $$__key = $$__key ?? $__value; +} ?> +exceptProps([ + 'allowEdit' => true, +]); ?> + true, +]), 'is_string', ARRAY_FILTER_USE_KEY) as $__key => $__value) { + $$__key = $$__key ?? $__value; +} ?> + + $__value) { + if (array_key_exists($__key, $__defined_vars)) unset($$__key); +} ?> + + + + + :allow-edit="" +> +
    +
    +
    +
    +
    +
    + +hasRenderedOnce('f79c19b7-f75f-4480-a1f8-a24c307c98d7')): $__env->markAsRenderedOnce('f79c19b7-f75f-4480-a1f8-a24c307c98d7'); +$__env->startPush('scripts'); ?> + + + +stopPush(); endif; ?> + \ No newline at end of file diff --git a/storage/framework/views/e10715403ad8ebf33c12c87a3c8d124c.php b/storage/framework/views/e10715403ad8ebf33c12c87a3c8d124c.php new file mode 100755 index 0000000..5540eff --- /dev/null +++ b/storage/framework/views/e10715403ad8ebf33c12c87a3c8d124c.php @@ -0,0 +1,5 @@ +merge(['scope' => 'row', 'class' => 'whitespace-nowrap px-6 py-4'])); ?>> + + + + \ No newline at end of file diff --git a/storage/framework/views/e12515669a36502caee1fcb5890b704c.php b/storage/framework/views/e12515669a36502caee1fcb5890b704c.php new file mode 100755 index 0000000..8c13c48 --- /dev/null +++ b/storage/framework/views/e12515669a36502caee1fcb5890b704c.php @@ -0,0 +1,101 @@ +> + +hasRenderedOnce('7bd77868-25fe-4b00-8f76-7ef7dc06bc41')): $__env->markAsRenderedOnce('7bd77868-25fe-4b00-8f76-7ef7dc06bc41'); +$__env->startPush('scripts'); ?> + + + + +stopPush(); endif; ?> \ No newline at end of file diff --git a/storage/framework/views/e17ea57b30de72877d20a53f3c29aeaf.php b/storage/framework/views/e17ea57b30de72877d20a53f3c29aeaf.php new file mode 100755 index 0000000..3832567 --- /dev/null +++ b/storage/framework/views/e17ea57b30de72877d20a53f3c29aeaf.php @@ -0,0 +1,207 @@ + + + +hasRenderedOnce('fb5e9d37-dd4a-4a2f-b8ac-506cd5b0f6c3')): $__env->markAsRenderedOnce('fb5e9d37-dd4a-4a2f-b8ac-506cd5b0f6c3'); +$__env->startPush('scripts'); ?> + + + +stopPush(); endif; ?> + \ No newline at end of file diff --git a/storage/framework/views/e1a71a194e9c94ace82a6690e1ce6f27.php b/storage/framework/views/e1a71a194e9c94ace82a6690e1ce6f27.php new file mode 100755 index 0000000..f51c888 --- /dev/null +++ b/storage/framework/views/e1a71a194e9c94ace82a6690e1ce6f27.php @@ -0,0 +1,5 @@ +
  • merge(['class' => 'cursor-pointer px-5 py-2 text-sm text-gray-800 hover:bg-gray-100 dark:text-gray-300 dark:hover:bg-gray-950 '])); ?>> + + +
  • + \ No newline at end of file diff --git a/storage/framework/views/e21f4ff533736ebf8374e63f2f425fbf.php b/storage/framework/views/e21f4ff533736ebf8374e63f2f425fbf.php new file mode 100755 index 0000000..1519430 --- /dev/null +++ b/storage/framework/views/e21f4ff533736ebf8374e63f2f425fbf.php @@ -0,0 +1,5 @@ + + \ No newline at end of file diff --git a/storage/framework/views/e2ad14a097b32f80f7bfc5e55946b567.php b/storage/framework/views/e2ad14a097b32f80f7bfc5e55946b567.php new file mode 100755 index 0000000..62dbc90 --- /dev/null +++ b/storage/framework/views/e2ad14a097b32f80f7bfc5e55946b567.php @@ -0,0 +1,683 @@ + +
    + + + +
    +
    + +hasRenderedOnce('8f62ca86-c471-439d-b205-3eb51ef204af')): $__env->markAsRenderedOnce('8f62ca86-c471-439d-b205-3eb51ef204af'); +$__env->startPush('scripts'); ?> + + + +stopPush(); endif; ?> + \ No newline at end of file diff --git a/storage/framework/views/e41ac4cb9266fc960043673a707c4bc4.php b/storage/framework/views/e41ac4cb9266fc960043673a707c4bc4.php new file mode 100755 index 0000000..305b152 --- /dev/null +++ b/storage/framework/views/e41ac4cb9266fc960043673a707c4bc4.php @@ -0,0 +1,6 @@ +
    +
    + +
    +
    + \ No newline at end of file diff --git a/storage/framework/views/e44c3f8c8fc495a1ec2f928ecd6f077b.php b/storage/framework/views/e44c3f8c8fc495a1ec2f928ecd6f077b.php new file mode 100755 index 0000000..ce808c7 --- /dev/null +++ b/storage/framework/views/e44c3f8c8fc495a1ec2f928ecd6f077b.php @@ -0,0 +1,522 @@ + +onlyProps([ + 'attachEndpoint', + 'detachEndpoint', + 'addedTags' => [], +]) as $__key => $__value) { + $$__key = $$__key ?? $__value; +} ?> +exceptProps([ + 'attachEndpoint', + 'detachEndpoint', + 'addedTags' => [], +]); ?> + [], +]), 'is_string', ARRAY_FILTER_USE_KEY) as $__key => $__value) { + $$__key = $$__key ?? $__value; +} ?> + + $__value) { + if (array_key_exists($__key, $__defined_vars)) unset($$__key); +} ?> + + + + + + 'admin::components.shimmer.tags.index','data' => ['count' => '3']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::shimmer.tags'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['count' => '3']); ?> +renderComponent(); ?> + + + + + + + + + + + +hasRenderedOnce('a237dcd9-dc58-4f0e-ae19-f689f09882d5')): $__env->markAsRenderedOnce('a237dcd9-dc58-4f0e-ae19-f689f09882d5'); +$__env->startPush('scripts'); ?> + + + +stopPush(); endif; ?> \ No newline at end of file diff --git a/storage/framework/views/e5ab0b39aa46cbd3d851dae297b36740.php b/storage/framework/views/e5ab0b39aa46cbd3d851dae297b36740.php new file mode 100755 index 0000000..8df8595 --- /dev/null +++ b/storage/framework/views/e5ab0b39aa46cbd3d851dae297b36740.php @@ -0,0 +1,210 @@ + + + + + + + + + 'admin::components.shimmer.dashboard.index.open-leads-by-states','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::shimmer.dashboard.index.open-leads-by-states'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> +renderComponent(); ?> + + + + + + + + + + + + + + +hasRenderedOnce('295b0215-985f-4bb8-b0e1-6d6d9f99d567')): $__env->markAsRenderedOnce('295b0215-985f-4bb8-b0e1-6d6d9f99d567'); +$__env->startPush('scripts'); ?> + + + + +stopPush(); endif; ?> + \ No newline at end of file diff --git a/storage/framework/views/e5fb6ecb638634ab6fe102fca42ca237.php b/storage/framework/views/e5fb6ecb638634ab6fe102fca42ca237.php new file mode 100755 index 0000000..2d576ef --- /dev/null +++ b/storage/framework/views/e5fb6ecb638634ab6fe102fca42ca237.php @@ -0,0 +1,212 @@ + + + + + + + + + 'admin::components.shimmer.dashboard.index.revenue-by-sources','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::shimmer.dashboard.index.revenue-by-sources'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> +renderComponent(); ?> + + + + + + + + + + + + + + +hasRenderedOnce('2df48a80-59ed-4075-8db2-8a9396dc039a')): $__env->markAsRenderedOnce('2df48a80-59ed-4075-8db2-8a9396dc039a'); +$__env->startPush('scripts'); ?> + + + +stopPush(); endif; ?> + \ No newline at end of file diff --git a/storage/framework/views/e646a2dc3039e01a727e45c31f6b5969.php b/storage/framework/views/e646a2dc3039e01a727e45c31f6b5969.php new file mode 100755 index 0000000..edc32ad --- /dev/null +++ b/storage/framework/views/e646a2dc3039e01a727e45c31f6b5969.php @@ -0,0 +1,1312 @@ + + + + + + + + + +hasRenderedOnce('23d1f82e-535c-4989-b9c7-f3b20b7a2b81')): $__env->markAsRenderedOnce('23d1f82e-535c-4989-b9c7-f3b20b7a2b81'); +$__env->startPush('scripts'); ?> + + + + + + + +stopPush(); endif; ?> + \ No newline at end of file diff --git a/storage/framework/views/e655b5dc7a417cc04c20dd7746949c81.php b/storage/framework/views/e655b5dc7a417cc04c20dd7746949c81.php new file mode 100755 index 0000000..6fd66ca --- /dev/null +++ b/storage/framework/views/e655b5dc7a417cc04c20dd7746949c81.php @@ -0,0 +1,25 @@ +
    +
    +
    +
    + +
    + +
    + +
    + +
    + +
    + +
    + + +
    +
    +
    +
    + +
    +
    \ No newline at end of file diff --git a/storage/framework/views/e69116b6c1b73e7d6d7e525efdf78de0.php b/storage/framework/views/e69116b6c1b73e7d6d7e525efdf78de0.php new file mode 100755 index 0000000..cc154bb --- /dev/null +++ b/storage/framework/views/e69116b6c1b73e7d6d7e525efdf78de0.php @@ -0,0 +1,102 @@ + + + + + + + + + +hasRenderedOnce('64651783-3a8a-406c-9163-41b52cc49711')): $__env->markAsRenderedOnce('64651783-3a8a-406c-9163-41b52cc49711'); +$__env->startPush('scripts'); ?> + + + +stopPush(); endif; ?> + \ No newline at end of file diff --git a/storage/framework/views/e8684d137bef4b6d7a4a6952ea74c011.php b/storage/framework/views/e8684d137bef4b6d7a4a6952ea74c011.php new file mode 100755 index 0000000..a899a39 --- /dev/null +++ b/storage/framework/views/e8684d137bef4b6d7a4a6952ea74c011.php @@ -0,0 +1,210 @@ + + + + + + + + + 'admin::components.shimmer.dashboard.index.open-leads-by-states','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::shimmer.dashboard.index.open-leads-by-states'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> +renderComponent(); ?> + + + + + + + + + + + + + + +hasRenderedOnce('09a68fd0-2fcd-4cb0-b4a4-2a100b52f6a3')): $__env->markAsRenderedOnce('09a68fd0-2fcd-4cb0-b4a4-2a100b52f6a3'); +$__env->startPush('scripts'); ?> + + + + +stopPush(); endif; ?> + \ No newline at end of file diff --git a/storage/framework/views/e8ce166cee254d2d793d7f11fa6d8524.php b/storage/framework/views/e8ce166cee254d2d793d7f11fa6d8524.php new file mode 100644 index 0000000..cc8df1f --- /dev/null +++ b/storage/framework/views/e8ce166cee254d2d793d7f11fa6d8524.php @@ -0,0 +1,240 @@ +startComponent('super-admin.layouts.anonymous'); ?> +
    +
    + Growup Pro + +
    + + + 'admin::components.form.index','data' => ['action' => route('super-admin.session.store')]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['action' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(route('super-admin.session.store'))]); ?> +

    + Super Admin Login +

    + +
    + + + + 'admin::components.form.control-group.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> + + + 'admin::components.form.control-group.label','data' => ['class' => 'required']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.label'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['class' => 'required']); ?> + Email + renderComponent(); ?> + + + + + + + + + + + + + 'admin::components.form.control-group.control','data' => ['type' => 'email','class' => 'w-[254px] max-w-full','id' => 'email','name' => 'email','rules' => 'required|email','label' => 'Email','placeholder' => 'Email']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.control'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['type' => 'email','class' => 'w-[254px] max-w-full','id' => 'email','name' => 'email','rules' => 'required|email','label' => 'Email','placeholder' => 'Email']); ?> +renderComponent(); ?> + + + + + + + + + + + + + 'admin::components.form.control-group.error','data' => ['controlName' => 'email']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.error'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['control-name' => 'email']); ?> +renderComponent(); ?> + + + + + + + + + + renderComponent(); ?> + + + + + + + + + + + + + + 'admin::components.form.control-group.index','data' => ['class' => 'relative w-full']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['class' => 'relative w-full']); ?> + + + 'admin::components.form.control-group.label','data' => ['class' => 'required']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.label'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['class' => 'required']); ?> + Password + renderComponent(); ?> + + + + + + + + + + + + + 'admin::components.form.control-group.control','data' => ['type' => 'password','class' => 'w-[254px] max-w-full ltr:pr-10 rtl:pl-10','id' => 'password','name' => 'password','rules' => 'required|min:6','label' => 'Password','placeholder' => 'Password']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.control'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['type' => 'password','class' => 'w-[254px] max-w-full ltr:pr-10 rtl:pl-10','id' => 'password','name' => 'password','rules' => 'required|min:6','label' => 'Password','placeholder' => 'Password']); ?> +renderComponent(); ?> + + + + + + + + + + + + + + + + 'admin::components.form.control-group.error','data' => ['controlName' => 'password']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.error'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['control-name' => 'password']); ?> +renderComponent(); ?> + + + + + + + + + + renderComponent(); ?> + + + + + + + + + +
    + +
    + +
    + renderComponent(); ?> + + + + + + + + + +
    +
    + +
    + Desenvolvido por + + Blyzer + +
    +
    + + startPush('scripts'); ?> + + stopPush(); ?> +renderComponent(); ?> + + \ No newline at end of file diff --git a/storage/framework/views/e9a64ccf83e40b6b16a288dc330a6877.php b/storage/framework/views/e9a64ccf83e40b6b16a288dc330a6877.php new file mode 100755 index 0000000..9d1831d --- /dev/null +++ b/storage/framework/views/e9a64ccf83e40b6b16a288dc330a6877.php @@ -0,0 +1,63 @@ +lookup_type + ? app('Webkul\Attribute\Repositories\AttributeRepository')->getLookUpOptions($attribute->lookup_type) + : $attribute->options()->orderBy('sort_order')->get(); + + $selectedOption = old($attribute->code, $value); + + $selectedOption = is_array($selectedOption) ? $selectedOption : explode(',', $selectedOption); +?> + + + +addLoop($__currentLoopData); foreach($__currentLoopData as $option): $__env->incrementLoopIndices(); $loop = $__env->getLastLoop(); ?> + + + 'admin::components.form.control-group.index','data' => ['class' => '!mb-2 flex items-center gap-2.5']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['class' => '!mb-2 flex items-center gap-2.5']); ?> + + + 'admin::components.form.control-group.control','data' => ['type' => 'checkbox','id' => $option->id,'name' => ''.e($attribute->code).'[]','value' => $option->id,'for' => $option->id,'label' => $option->name,'checked' => in_array($option->id, $selectedOption)]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.control'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['type' => 'checkbox','id' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($option->id),'name' => ''.e($attribute->code).'[]','value' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($option->id),'for' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($option->id),'label' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($option->name),'checked' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(in_array($option->id, $selectedOption))]); ?> +renderComponent(); ?> + + + + + + + + + + + + renderComponent(); ?> + + + + + + + + + +popLoop(); $loop = $__env->getLastLoop(); ?> + \ No newline at end of file diff --git a/storage/framework/views/ed507c4a065f40e23e7c18c118e304cc.php b/storage/framework/views/ed507c4a065f40e23e7c18c118e304cc.php new file mode 100755 index 0000000..bee5434 --- /dev/null +++ b/storage/framework/views/ed507c4a065f40e23e7c18c118e304cc.php @@ -0,0 +1,5 @@ +merge(['scope' => 'row', 'class' => 'whitespace-nowrap px-6 py-4'])); ?>> + + + + \ No newline at end of file diff --git a/storage/framework/views/edb8e49c7ccaa4a5bd586b67f28eb732.php b/storage/framework/views/edb8e49c7ccaa4a5bd586b67f28eb732.php new file mode 100755 index 0000000..0716349 --- /dev/null +++ b/storage/framework/views/edb8e49c7ccaa4a5bd586b67f28eb732.php @@ -0,0 +1,46 @@ +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + +
    +
    +
    +
    + + +
    +
    +
    +
    +
    + +
    +
    +
    +
    +
    + +
    +
    +
    +
    +
    +
    +
    +
    \ No newline at end of file diff --git a/storage/framework/views/edeb0bd066809f3fa4eb174c19fe02a4.php b/storage/framework/views/edeb0bd066809f3fa4eb174c19fe02a4.php new file mode 100755 index 0000000..d21a3c5 --- /dev/null +++ b/storage/framework/views/edeb0bd066809f3fa4eb174c19fe02a4.php @@ -0,0 +1,427 @@ + +onlyProps([ + 'allowEdit' => true, +]) as $__key => $__value) { + $$__key = $$__key ?? $__value; +} ?> +exceptProps([ + 'allowEdit' => true, +]); ?> + true, +]), 'is_string', ARRAY_FILTER_USE_KEY) as $__key => $__value) { + $$__key = $$__key ?? $__value; +} ?> + + $__value) { + if (array_key_exists($__key, $__defined_vars)) unset($$__key); +} ?> + + +except('value')); ?> + + :value=get('value'))); ?> + + :allow-edit="" +> +
    +
    +
    +
    +
    +
    + +hasRenderedOnce('dd1c357c-739c-4c5b-a892-9b53df3d53b9')): $__env->markAsRenderedOnce('dd1c357c-739c-4c5b-a892-9b53df3d53b9'); +$__env->startPush('scripts'); ?> + + + +stopPush(); endif; ?> \ No newline at end of file diff --git a/storage/framework/views/ee76b80f4b4c257890fa6eb02c461b47.php b/storage/framework/views/ee76b80f4b4c257890fa6eb02c461b47.php new file mode 100755 index 0000000..c00124e --- /dev/null +++ b/storage/framework/views/ee76b80f4b4c257890fa6eb02c461b47.php @@ -0,0 +1,4 @@ +merge(['class' => 'bg-gray-50 dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300'])); ?>> + + + \ No newline at end of file diff --git a/storage/framework/views/eea27cf20a93f6533c1f9f77ddbc40bc.php b/storage/framework/views/eea27cf20a93f6533c1f9f77ddbc40bc.php new file mode 100755 index 0000000..8b697af --- /dev/null +++ b/storage/framework/views/eea27cf20a93f6533c1f9f77ddbc40bc.php @@ -0,0 +1,126 @@ + + + 'admin::components.layouts.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::layouts'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> + + slot('title', null, []); ?> + get('admin::app.settings.roles.index.title'); ?> + endSlot(); ?> + +
    +
    +
    + + + + + + + 'admin::components.breadcrumbs.index','data' => ['name' => 'settings.roles']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::breadcrumbs'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['name' => 'settings.roles']); ?> +renderComponent(); ?> + + + + + + + + + + + + + +
    + + get('admin::app.settings.roles.index.title'); ?> +
    +
    + +
    + +
    + + + + hasPermission('settings.user.roles.create')): ?> + + get('admin::app.settings.roles.index.create-btn'); ?> + + + + + +
    +
    +
    + + + + 'admin::components.datagrid.index','data' => ['src' => route('admin.settings.roles.index')]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::datagrid'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['src' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(route('admin.settings.roles.index'))]); ?> + + + + 'admin::components.shimmer.datagrid.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::shimmer.datagrid'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> +renderComponent(); ?> + + + + + + + + + + renderComponent(); ?> + + + + + + + + + +
    + renderComponent(); ?> + + + + + + + + + + \ No newline at end of file diff --git a/storage/framework/views/efa161867573b91595bb8fdc55cb83ff.php b/storage/framework/views/efa161867573b91595bb8fdc55cb83ff.php new file mode 100755 index 0000000..cd3ac16 --- /dev/null +++ b/storage/framework/views/efa161867573b91595bb8fdc55cb83ff.php @@ -0,0 +1,131 @@ + + + 'admin::components.layouts.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::layouts'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> + slot('title', null, []); ?> + get('admin::app.settings.data-transfer.imports.index.title'); ?> + endSlot(); ?> + +
    +
    +
    + + + + + + + 'admin::components.breadcrumbs.index','data' => ['name' => 'settings.data_transfers']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::breadcrumbs'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['name' => 'settings.data_transfers']); ?> +renderComponent(); ?> + + + + + + + + + + + + + +
    + get('admin::app.settings.data-transfer.imports.index.title'); ?> +
    +
    + +
    + +
    + + + + hasPermission('settings.data_transfer.imports.create')): ?> + + get('admin::app.settings.data-transfer.imports.index.button-title'); ?> + + + + + +
    +
    +
    + + + + + + + + 'admin::components.datagrid.index','data' => ['src' => route('admin.settings.data_transfer.imports.index')]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::datagrid'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['src' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(route('admin.settings.data_transfer.imports.index'))]); ?> + + + + 'admin::components.shimmer.datagrid.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::shimmer.datagrid'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> +renderComponent(); ?> + + + + + + + + + + renderComponent(); ?> + + + + + + + + + + + + +
    + renderComponent(); ?> + + + + + + + + + + \ No newline at end of file diff --git a/storage/framework/views/f037afa2cd3deb169723c7576dd246cc.php b/storage/framework/views/f037afa2cd3deb169723c7576dd246cc.php new file mode 100755 index 0000000..4fcfddf --- /dev/null +++ b/storage/framework/views/f037afa2cd3deb169723c7576dd246cc.php @@ -0,0 +1,904 @@ + + + 'admin::components.layouts.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::layouts'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> + slot('title', null, []); ?> + get('admin::app.activities.index.title'); ?> + endSlot(); ?> + + + + + + +
    +
    +
    + + + 'admin::components.breadcrumbs.index','data' => ['name' => 'activities']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::breadcrumbs'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['name' => 'activities']); ?> +renderComponent(); ?> + + + + + + + + + + +
    + get('admin::app.activities.index.title'); ?> +
    +
    + +
    + + + +
    +
    + + + get('view-type') == 'table' + || ! request()->has('view-type') + ): ?> + + + 'admin::components.shimmer.datagrid.index','data' => ['isMultiRow' => true]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::shimmer.datagrid'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['is-multi-row' => true]); ?> +renderComponent(); ?> + + + + + + + + + + +
    +
    + + + + + hasRenderedOnce('c12f313a-0e3d-451d-9a23-0c17b1fb89cb')): $__env->markAsRenderedOnce('c12f313a-0e3d-451d-9a23-0c17b1fb89cb'); +$__env->startPush('scripts'); ?> + + + + + + + + + + stopPush(); endif; ?> + + hasRenderedOnce('15e7085f-fe8b-4b1a-921f-7b0939007d9b')): $__env->markAsRenderedOnce('15e7085f-fe8b-4b1a-921f-7b0939007d9b'); +$__env->startPush('styles'); ?> + + stopPush(); endif; ?> + renderComponent(); ?> + + + + + + + + + + \ No newline at end of file diff --git a/storage/framework/views/f0479fe0a9819bb77bf23ff2870d14a2.php b/storage/framework/views/f0479fe0a9819bb77bf23ff2870d14a2.php new file mode 100755 index 0000000..6a1998b --- /dev/null +++ b/storage/framework/views/f0479fe0a9819bb77bf23ff2870d14a2.php @@ -0,0 +1,24 @@ + + + + addLoop($__currentLoopData); foreach($__currentLoopData as $column): $__env->incrementLoopIndices(); $loop = $__env->getLastLoop(); ?> + + popLoop(); $loop = $__env->getLastLoop(); ?> + + + + + addLoop($__currentLoopData); foreach($__currentLoopData as $record): $__env->incrementLoopIndices(); $loop = $__env->getLastLoop(); ?> + + addLoop($__currentLoopData); foreach($__currentLoopData as $column): $__env->incrementLoopIndices(); $loop = $__env->getLastLoop(); ?> + getClosure()): ?> + + + + + popLoop(); $loop = $__env->getLastLoop(); ?> + + popLoop(); $loop = $__env->getLastLoop(); ?> + +
    getLabel()); ?>
    {$column->getIndex()}); ?>
    + \ No newline at end of file diff --git a/storage/framework/views/f056c191d683862e733efe7cbf77a1bb.php b/storage/framework/views/f056c191d683862e733efe7cbf77a1bb.php new file mode 100755 index 0000000..ad6df74 --- /dev/null +++ b/storage/framework/views/f056c191d683862e733efe7cbf77a1bb.php @@ -0,0 +1,240 @@ +> +
    + + + get('admin::app.export.export'); ?> +
    +
    + +hasRenderedOnce('cb1b0382-096e-42fd-ac4c-15d6bb15f81e')): $__env->markAsRenderedOnce('cb1b0382-096e-42fd-ac4c-15d6bb15f81e'); +$__env->startPush('scripts'); ?> + + + +stopPush(); endif; ?> + \ No newline at end of file diff --git a/storage/framework/views/f08f9a4bdbea6736050597a3e3943772.php b/storage/framework/views/f08f9a4bdbea6736050597a3e3943772.php new file mode 100755 index 0000000..4fd237f --- /dev/null +++ b/storage/framework/views/f08f9a4bdbea6736050597a3e3943772.php @@ -0,0 +1,59 @@ + +has('as')): ?> + > + + + + + + + +onlyProps([ + 'method' => 'POST', + ]) as $__key => $__value) { + $$__key = $$__key ?? $__value; +} ?> +exceptProps([ + 'method' => 'POST', + ]); ?> + 'POST', + ]), 'is_string', ARRAY_FILTER_USE_KEY) as $__key => $__value) { + $$__key = $$__key ?? $__value; +} ?> + + $__value) { + if (array_key_exists($__key, $__defined_vars)) unset($$__key); +} ?> + + + + + + + > + + + + + + + + + + + + \ No newline at end of file diff --git a/storage/framework/views/f14cd80c650555595b28d3c36344c1c2.php b/storage/framework/views/f14cd80c650555595b28d3c36344c1c2.php new file mode 100755 index 0000000..4d01956 --- /dev/null +++ b/storage/framework/views/f14cd80c650555595b28d3c36344c1c2.php @@ -0,0 +1,31 @@ + +
    +
    +
    +
    +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    +
    + +
    +
    +
    +
    + +
    +
    +
    +
    +
    +
    + \ No newline at end of file diff --git a/storage/framework/views/f1631a8fe6a313e38d60d7a7f4fbff66.php b/storage/framework/views/f1631a8fe6a313e38d60d7a7f4fbff66.php new file mode 100755 index 0000000..ca3730a --- /dev/null +++ b/storage/framework/views/f1631a8fe6a313e38d60d7a7f4fbff66.php @@ -0,0 +1,17 @@ +
    +
    +

    +

    +
    + +
    +
    +

    +

    +

    +

    +

    +

    +
    +
    +
    \ No newline at end of file diff --git a/storage/framework/views/f16a27acdab6bea42a9a04dc2f8c8311.php b/storage/framework/views/f16a27acdab6bea42a9a04dc2f8c8311.php new file mode 100755 index 0000000..9bd7fda --- /dev/null +++ b/storage/framework/views/f16a27acdab6bea42a9a04dc2f8c8311.php @@ -0,0 +1,130 @@ +getActiveConfigurationItem(); +?> + + + + 'admin::components.layouts.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::layouts'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> + slot('title', null, []); ?> + getName()); ?> + + endSlot(); ?> + + + + + + + + 'admin::components.form.index','data' => ['action' => '','enctype' => 'multipart/form-data']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['action' => '','enctype' => 'multipart/form-data']); ?> + +
    +

    + + +

    + + +
    + + + + + + get('admin::app.configuration.index.back'); ?> + + + + + + + + + + + + +
    +
    + +
    + getChildren(); $__env->addLoop($__currentLoopData); foreach($__currentLoopData as $child): $__env->incrementLoopIndices(); $loop = $__env->getLastLoop(); ?> +
    +

    + getName()); ?> + +

    + +

    + getInfo(); ?> + +

    +
    + +
    + + + + getFields(); $__env->addLoop($__currentLoopData); foreach($__currentLoopData as $field): $__env->incrementLoopIndices(); $loop = $__env->getLastLoop(); ?> + getType() == 'blade' + && view()->exists($path = $field->getPath()) + ): ?> + render(); ?> + + + make('admin::configuration.field-type', \Illuminate\Support\Arr::except(get_defined_vars(), ['__data', '__path']))->render(); ?> + + popLoop(); $loop = $__env->getLastLoop(); ?> + + + +
    + popLoop(); $loop = $__env->getLastLoop(); ?> +
    + renderComponent(); ?> + + + + + + + + + + + + + renderComponent(); ?> + + + + + + + + + + \ No newline at end of file diff --git a/storage/framework/views/f2d44e75f98e6576692a8ccc837b1e6f.php b/storage/framework/views/f2d44e75f98e6576692a8ccc837b1e6f.php new file mode 100755 index 0000000..51d64fb --- /dev/null +++ b/storage/framework/views/f2d44e75f98e6576692a8ccc837b1e6f.php @@ -0,0 +1,3 @@ +
    merge(['class' => 'shimmer block bg-neutral-100'])); ?>> + +
    \ No newline at end of file diff --git a/storage/framework/views/f2fe26289caa447896210dce80973ed6.php b/storage/framework/views/f2fe26289caa447896210dce80973ed6.php new file mode 100755 index 0000000..e4ac345 --- /dev/null +++ b/storage/framework/views/f2fe26289caa447896210dce80973ed6.php @@ -0,0 +1,254 @@ + + + 'admin::components.layouts.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::layouts'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> + slot('title', null, []); ?> + get('admin::app.settings.webforms.index.title'); ?> + endSlot(); ?> + + +
    +
    +
    + + + + 'admin::components.breadcrumbs.index','data' => ['name' => 'settings.web_forms']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::breadcrumbs'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['name' => 'settings.web_forms']); ?> +renderComponent(); ?> + + + + + + + + + + +
    + get('admin::app.settings.webforms.index.title'); ?> +
    +
    + +
    + +
    + hasPermission('admin.settings.web_forms.create')): ?> + + +
    +
    +
    + + + + + 'admin::components.shimmer.settings.web-forms.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::shimmer.settings.web-forms'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> +renderComponent(); ?> + + + + + + + + + +
    +
    + + hasRenderedOnce('11f4f4eb-05be-4955-88b8-79eaa3ccc39d')): $__env->markAsRenderedOnce('11f4f4eb-05be-4955-88b8-79eaa3ccc39d'); +$__env->startPush('scripts'); ?> + + + + stopPush(); endif; ?> + renderComponent(); ?> + + + + + + + + + + \ No newline at end of file diff --git a/storage/framework/views/f43374d46900c297198a91efd93280bb.php b/storage/framework/views/f43374d46900c297198a91efd93280bb.php new file mode 100755 index 0000000..6241bb2 --- /dev/null +++ b/storage/framework/views/f43374d46900c297198a91efd93280bb.php @@ -0,0 +1,131 @@ + + + 'admin::components.layouts.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::layouts'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> + + slot('title', null, []); ?> + get('admin::app.contacts.organizations.index.title'); ?> + endSlot(); ?> + +
    +
    +
    + + + + + + + 'admin::components.breadcrumbs.index','data' => ['name' => 'contacts.organizations']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::breadcrumbs'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['name' => 'contacts.organizations']); ?> +renderComponent(); ?> + + + + + + + + + + + + + +
    + get('admin::app.contacts.organizations.index.title'); ?> +
    +
    + +
    +
    + + + + hasPermission('contacts.organizations.create')): ?> + + + get('admin::app.contacts.organizations.index.create-btn'); ?> + + + + + +
    +
    +
    + + + + + + + 'admin::components.datagrid.index','data' => ['src' => route('admin.contacts.organizations.index')]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::datagrid'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['src' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(route('admin.contacts.organizations.index'))]); ?> + + + + 'admin::components.shimmer.datagrid.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::shimmer.datagrid'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> +renderComponent(); ?> + + + + + + + + + + renderComponent(); ?> + + + + + + + + + + + + +
    + renderComponent(); ?> + + + + + + + + + + \ No newline at end of file diff --git a/storage/framework/views/f441b0949af07185b51f5f12270d8ff0.php b/storage/framework/views/f441b0949af07185b51f5f12270d8ff0.php new file mode 100755 index 0000000..6826847 --- /dev/null +++ b/storage/framework/views/f441b0949af07185b51f5f12270d8ff0.php @@ -0,0 +1,2047 @@ + + + 'admin::components.layouts.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::layouts'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> + + slot('title', null, []); ?> + get('admin::app.settings.webforms.edit.title'); ?> + endSlot(); ?> + + + + 'admin::components.form.index','data' => ['action' => route('admin.settings.web_forms.update', $webForm->id),'method' => 'PUT']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['action' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(route('admin.settings.web_forms.update', $webForm->id)),'method' => 'PUT']); ?> +
    +
    +
    + $webForm]); ?> + + + + + + 'admin::components.breadcrumbs.index','data' => ['name' => 'settings.web_forms.edit','entity' => $webForm]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::breadcrumbs'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['name' => 'settings.web_forms.edit','entity' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($webForm)]); ?> +renderComponent(); ?> + + + + + + + + + + + $webForm]); ?> + + +
    + get('admin::app.settings.webforms.edit.title'); ?> +
    +
    + +
    +
    + $webForm]); ?> + + + + + + $webForm]); ?> + + + $webForm]); ?> + + + + get('admin::app.settings.webforms.edit.preview'); ?> + + + $webForm]); ?> + + + $webForm]); ?> + + + + + $webForm]); ?> + +
    +
    +
    + + + +
    + renderComponent(); ?> + + + + + + + + + + + hasRenderedOnce('c49e556c-bca8-4b49-bdf6-65cf96b93abc')): $__env->markAsRenderedOnce('c49e556c-bca8-4b49-bdf6-65cf96b93abc'); +$__env->startPush('scripts'); ?> + '); ?>" + /> + + + get('admin::app.settings.webforms.edit.copy'); ?> + + renderComponent(); ?> + + + + + + + + + + + $webForm]); ?> + + endSlot(); ?> + renderComponent(); ?> + + + + + + + + + +
    + + + + + + + + stopPush(); endif; ?> + renderComponent(); ?> + + + + + + + + + + \ No newline at end of file diff --git a/storage/framework/views/f4b3949f3dd837ea9b805b03044ea7c1.php b/storage/framework/views/f4b3949f3dd837ea9b805b03044ea7c1.php new file mode 100755 index 0000000..8d383ea --- /dev/null +++ b/storage/framework/views/f4b3949f3dd837ea9b805b03044ea7c1.php @@ -0,0 +1,90 @@ + $warehouse]); ?> + + +
    + + + 'admin::components.accordion.index','data' => ['class' => 'select-none !border-none']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::accordion'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['class' => 'select-none !border-none']); ?> + slot('header', null, ['class' => '!p-0']); ?> +

    + get('admin::app.settings.warehouses.view.contact-information.title'); ?> +

    + endSlot(); ?> + + slot('content', null, ['class' => 'mt-4 !px-0 !pb-0']); ?> + + + + 'admin::components.form.index','data' => ['vSlot' => '{ meta, errors, handleSubmit }','as' => 'div','ref' => 'modalForm']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['v-slot' => '{ meta, errors, handleSubmit }','as' => 'div','ref' => 'modalForm']); ?> +
    + $warehouse]); ?> + + + + + 'admin::components.attributes.view','data' => ['customAttributes' => app('Webkul\Attribute\Repositories\AttributeRepository')->findWhere([ + 'entity_type' => 'warehouses', + ['code', 'IN', ['contact_name', 'contact_emails', 'contact_numbers', 'contact_address']] + ]),'entity' => $warehouse,'url' => route('admin.settings.warehouses.update', $warehouse->id),'allowEdit' => true]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::attributes.view'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['custom-attributes' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(app('Webkul\Attribute\Repositories\AttributeRepository')->findWhere([ + 'entity_type' => 'warehouses', + ['code', 'IN', ['contact_name', 'contact_emails', 'contact_numbers', 'contact_address']] + ])),'entity' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($warehouse),'url' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(route('admin.settings.warehouses.update', $warehouse->id)),'allow-edit' => true]); ?> +renderComponent(); ?> + + + + + + + + + + + $warehouse]); ?> + +
    + renderComponent(); ?> + + + + + + + + + + endSlot(); ?> + renderComponent(); ?> + + + + + + + + + +
    + + $warehouse]); ?> \ No newline at end of file diff --git a/storage/framework/views/f520e9e1ec939cb1f5cade832c4d3dc8.php b/storage/framework/views/f520e9e1ec939cb1f5cade832c4d3dc8.php new file mode 100755 index 0000000..2aebf5d --- /dev/null +++ b/storage/framework/views/f520e9e1ec939cb1f5cade832c4d3dc8.php @@ -0,0 +1,251 @@ + +onlyProps([ + 'isActive' => false, + 'position' => 'center', + 'size' => 'normal', +]) as $__key => $__value) { + $$__key = $$__key ?? $__value; +} ?> +exceptProps([ + 'isActive' => false, + 'position' => 'center', + 'size' => 'normal', +]); ?> + false, + 'position' => 'center', + 'size' => 'normal', +]), 'is_string', ARRAY_FILTER_USE_KEY) as $__key => $__value) { + $$__key = $$__key ?? $__value; +} ?> + + $__value) { + if (array_key_exists($__key, $__defined_vars)) unset($$__key); +} ?> + + + + +> + + + + + + + + + + + + + + + + + +hasRenderedOnce('08f886d0-7a4b-4378-805a-271c51e35067')): $__env->markAsRenderedOnce('08f886d0-7a4b-4378-805a-271c51e35067'); +$__env->startPush('scripts'); ?> + + + +stopPush(); endif; ?> \ No newline at end of file diff --git a/storage/framework/views/f561d5461c8e88c79bbe9c1621e3ec4c.php b/storage/framework/views/f561d5461c8e88c79bbe9c1621e3ec4c.php new file mode 100755 index 0000000..10c6961 --- /dev/null +++ b/storage/framework/views/f561d5461c8e88c79bbe9c1621e3ec4c.php @@ -0,0 +1,212 @@ + + + + + + + + + 'admin::components.shimmer.dashboard.index.revenue-by-types','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::shimmer.dashboard.index.revenue-by-types'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> +renderComponent(); ?> + + + + + + + + + + + + + + +hasRenderedOnce('c8568fc6-3d7c-4284-8a60-220f046ca83f')): $__env->markAsRenderedOnce('c8568fc6-3d7c-4284-8a60-220f046ca83f'); +$__env->startPush('scripts'); ?> + + + +stopPush(); endif; ?> + \ No newline at end of file diff --git a/storage/framework/views/f6b76ad05f9eca674f592a3144628674.php b/storage/framework/views/f6b76ad05f9eca674f592a3144628674.php new file mode 100755 index 0000000..b48fcf9 --- /dev/null +++ b/storage/framework/views/f6b76ad05f9eca674f592a3144628674.php @@ -0,0 +1,39 @@ + + + +
    +
    + + + + + make('admin::leads.index.kanban.search', \Illuminate\Support\Arr::except(get_defined_vars(), ['__data', '__path']))->render(); ?> + + + + + + + + + make('admin::leads.index.kanban.filter', \Illuminate\Support\Arr::except(get_defined_vars(), ['__data', '__path']))->render(); ?> + + + + + +
    + + + + + + make('admin::leads.index.view-switcher', \Illuminate\Support\Arr::except(get_defined_vars(), ['__data', '__path']))->render(); ?> + + + +
    + + + + \ No newline at end of file diff --git a/storage/framework/views/f76c362f43ac9716be49beee6dc42bcd.php b/storage/framework/views/f76c362f43ac9716be49beee6dc42bcd.php new file mode 100755 index 0000000..7824438 --- /dev/null +++ b/storage/framework/views/f76c362f43ac9716be49beee6dc42bcd.php @@ -0,0 +1,47 @@ + +onlyProps([ + 'customAttributes' => [], + 'entity' => null, + 'allowEdit' => false, + 'url' => null, +]) as $__key => $__value) { + $$__key = $$__key ?? $__value; +} ?> +exceptProps([ + 'customAttributes' => [], + 'entity' => null, + 'allowEdit' => false, + 'url' => null, +]); ?> + [], + 'entity' => null, + 'allowEdit' => false, + 'url' => null, +]), 'is_string', ARRAY_FILTER_USE_KEY) as $__key => $__value) { + $$__key = $$__key ?? $__value; +} ?> + + $__value) { + if (array_key_exists($__key, $__defined_vars)) unset($$__key); +} ?> + + +
    + addLoop($__currentLoopData); foreach($__currentLoopData as $attribute): $__env->incrementLoopIndices(); $loop = $__env->getLastLoop(); ?> + exists($typeView = 'admin::components.attributes.view.' . $attribute->type)): ?> +
    +
    name); ?>
    + +
    + make($typeView, [ + 'attribute' => $attribute, + 'value' => isset($entity) ? $entity[$attribute->code] : null, + 'allowEdit' => $allowEdit, + 'url' => $url, + ], \Illuminate\Support\Arr::except(get_defined_vars(), ['__data', '__path']))->render(); ?> +
    +
    + + popLoop(); $loop = $__env->getLastLoop(); ?> +
    \ No newline at end of file diff --git a/storage/framework/views/f79dde1f2e8081a7a504b6f8c11336b2.php b/storage/framework/views/f79dde1f2e8081a7a504b6f8c11336b2.php new file mode 100755 index 0000000..aa59a7c --- /dev/null +++ b/storage/framework/views/f79dde1f2e8081a7a504b6f8c11336b2.php @@ -0,0 +1,5 @@ +merge(['scope' => 'col', 'class' => 'whitespace-nowrap px-6 py-4 font-semibold'])); ?>> + + + + \ No newline at end of file diff --git a/storage/framework/views/f88f0d9a8e2f1cc80cecccd60df508eb.php b/storage/framework/views/f88f0d9a8e2f1cc80cecccd60df508eb.php new file mode 100755 index 0000000..d31f3aa --- /dev/null +++ b/storage/framework/views/f88f0d9a8e2f1cc80cecccd60df508eb.php @@ -0,0 +1,30 @@ +hasPages()): ?> + + + \ No newline at end of file diff --git a/storage/framework/views/fa24ec43edd90de89ad19da955a1ecc4.php b/storage/framework/views/fa24ec43edd90de89ad19da955a1ecc4.php new file mode 100755 index 0000000..61c22d8 --- /dev/null +++ b/storage/framework/views/fa24ec43edd90de89ad19da955a1ecc4.php @@ -0,0 +1,245 @@ + + + 'admin::components.layouts.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::layouts'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> + + slot('title', null, []); ?> + get('admin::app.configuration.index.title'); ?> + endSlot(); ?> + + + + + 'admin::components.breadcrumbs.index','data' => ['name' => 'configuration']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::breadcrumbs'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['name' => 'configuration']); ?> +renderComponent(); ?> + + + + + + + + + + + + + + +
    +

    + get('admin::app.configuration.index.title'); ?> +

    + + + + + + +
    + + + +
    +
    + + + +
    + + + + + + + + +
    + getItems(); $__env->addLoop($__currentLoopData); foreach($__currentLoopData as $item): $__env->incrementLoopIndices(); $loop = $__env->getLastLoop(); ?> +
    +
    + +

    + getName()); ?> + +

    + + +

    + getInfo()); ?> + +

    +
    + +
    + + getChildren(); $__env->addLoop($__currentLoopData); foreach($__currentLoopData as $key => $child): $__env->incrementLoopIndices(); $loop = $__env->getLastLoop(); ?> + + getIcon()): ?> +
    + +
    + + +
    +

    + getName()); ?> + +

    + +

    + getInfo()); ?> + +

    +
    +
    + popLoop(); $loop = $__env->getLastLoop(); ?> +
    +
    + popLoop(); $loop = $__env->getLastLoop(); ?> +
    + + + + + hasRenderedOnce('a7252e14-29e8-4999-b3be-204631ca8cc4')): $__env->markAsRenderedOnce('a7252e14-29e8-4999-b3be-204631ca8cc4'); +$__env->startPush('scripts'); ?> + + + + stopPush(); endif; ?> + renderComponent(); ?> + + + + + + + + + + \ No newline at end of file diff --git a/storage/framework/views/fa2cf417103f02e1394dd139791598d8.php b/storage/framework/views/fa2cf417103f02e1394dd139791598d8.php new file mode 100755 index 0000000..cdda42e --- /dev/null +++ b/storage/framework/views/fa2cf417103f02e1394dd139791598d8.php @@ -0,0 +1,224 @@ + + + + 'admin::components.layouts.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::layouts'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> + + slot('title', null, []); ?> + get('admin::app.products.edit.title'); ?> + endSlot(); ?> + + + + + + + 'admin::components.form.index','data' => ['action' => route('admin.products.update', $product->id),'encType' => 'multipart/form-data','method' => 'PUT']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['action' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(route('admin.products.update', $product->id)),'encType' => 'multipart/form-data','method' => 'PUT']); ?> +
    +
    +
    + + + + 'admin::components.breadcrumbs.index','data' => ['name' => 'products.edit','entity' => $product]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::breadcrumbs'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['name' => 'products.edit','entity' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($product)]); ?> +renderComponent(); ?> + + + + + + + + + + +
    + get('admin::app.products.edit.title'); ?> +
    +
    + +
    +
    + $product]); ?> + + + + + + $product]); ?> + +
    +
    +
    + +
    + +
    +
    +

    + get('admin::app.products.create.general'); ?> +

    + + $product]); ?> + + + + + 'admin::components.attributes.index','data' => ['customAttributes' => app('Webkul\Attribute\Repositories\AttributeRepository')->findWhere([ + 'entity_type' => 'products', + ['code', 'NOTIN', ['price', 'quantity']], + ]),'entity' => $product]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::attributes'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['custom-attributes' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(app('Webkul\Attribute\Repositories\AttributeRepository')->findWhere([ + 'entity_type' => 'products', + ['code', 'NOTIN', ['price', 'quantity']], + ])),'entity' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($product)]); ?> +renderComponent(); ?> + + + + + + + + + + + $product]); ?> + +
    +
    + + +
    + $product]); ?> + + + + + 'admin::components.accordion.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::accordion'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> + slot('header', null, []); ?> + $product]); ?> + + +
    +

    + get('admin::app.products.create.price'); ?> +

    +
    + + $product]); ?> + + endSlot(); ?> + + slot('content', null, []); ?> + $product]); ?> + + + + + 'admin::components.attributes.index','data' => ['customAttributes' => app('Webkul\Attribute\Repositories\AttributeRepository')->findWhere([ + 'entity_type' => 'products', + ['code', 'IN', ['price', 'quantity']], + ]),'entity' => $product]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::attributes'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['custom-attributes' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(app('Webkul\Attribute\Repositories\AttributeRepository')->findWhere([ + 'entity_type' => 'products', + ['code', 'IN', ['price', 'quantity']], + ])),'entity' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($product)]); ?> +renderComponent(); ?> + + + + + + + + + + + $product]); ?> + + endSlot(); ?> + renderComponent(); ?> + + + + + + + + + + + $product]); ?> + +
    +
    +
    + renderComponent(); ?> + + + + + + + + + + + + + renderComponent(); ?> + + + + + + + + + + \ No newline at end of file diff --git a/storage/framework/views/fa555339de4cdf446f116325eadd4dc6.php b/storage/framework/views/fa555339de4cdf446f116325eadd4dc6.php new file mode 100755 index 0000000..74df977 --- /dev/null +++ b/storage/framework/views/fa555339de4cdf446f116325eadd4dc6.php @@ -0,0 +1,5 @@ +
    merge(['class' => 'mb-4'])); ?>> + + +
    + \ No newline at end of file diff --git a/storage/framework/views/fae2acf3af7f796b07d789eb150178f8.php b/storage/framework/views/fae2acf3af7f796b07d789eb150178f8.php new file mode 100755 index 0000000..f6f8b85 --- /dev/null +++ b/storage/framework/views/fae2acf3af7f796b07d789eb150178f8.php @@ -0,0 +1,18 @@ + +
    + +
    + +
    +

    +

    +
    +
    + + +
    +

    +
    +
    + + \ No newline at end of file diff --git a/storage/framework/views/fb10a49c8fba3a1c0b12ed4f3e8cbba2.php b/storage/framework/views/fb10a49c8fba3a1c0b12ed4f3e8cbba2.php new file mode 100755 index 0000000..706afd8 --- /dev/null +++ b/storage/framework/views/fb10a49c8fba3a1c0b12ed4f3e8cbba2.php @@ -0,0 +1,16 @@ +
    +
    +
    +
    + +
    +
    + +
    +
    +
    +
    + +
    +
    +
    \ No newline at end of file diff --git a/storage/framework/views/fc252ae46c09f7fd2b704dab985a93a7.php b/storage/framework/views/fc252ae46c09f7fd2b704dab985a93a7.php new file mode 100755 index 0000000..c8630ea --- /dev/null +++ b/storage/framework/views/fc252ae46c09f7fd2b704dab985a93a7.php @@ -0,0 +1,195 @@ + + + 'admin::components.layouts.anonymous','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::layouts.anonymous'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> + + slot('title', null, []); ?> + get('admin::app.users.forget-password.create.page-title'); ?> + endSlot(); ?> + +
    +
    + + getConfigData('general.design.admin_logo.logo_image')): ?> + <?php echo e(config('app.name')); ?> + + <?php echo e(config('app.name')); ?> + + +
    + + + + + + + 'admin::components.form.index','data' => ['action' => route('admin.forgot_password.store')]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['action' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(route('admin.forgot_password.store'))]); ?> +
    +

    + get('admin::app.users.forget-password.create.title'); ?> +

    +
    + +
    + + + + 'admin::components.form.control-group.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> + + + 'admin::components.form.control-group.label','data' => ['class' => 'required']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.label'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['class' => 'required']); ?> + get('admin::app.users.forget-password.create.email'); ?> + renderComponent(); ?> + + + + + + + + + + + + + 'admin::components.form.control-group.control','data' => ['type' => 'email','class' => 'w-[254px] max-w-full','id' => 'email','name' => 'email','rules' => 'required|email','value' => old('email'),'label' => trans('admin::app.users.forget-password.create.email'),'placeholder' => trans('admin::app.users.forget-password.create.email')]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.control'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['type' => 'email','class' => 'w-[254px] max-w-full','id' => 'email','name' => 'email','rules' => 'required|email','value' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(old('email')),'label' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(trans('admin::app.users.forget-password.create.email')),'placeholder' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(trans('admin::app.users.forget-password.create.email'))]); ?> +renderComponent(); ?> + + + + + + + + + + + + + 'admin::components.form.control-group.error','data' => ['controlName' => 'email']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.error'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['control-name' => 'email']); ?> +renderComponent(); ?> + + + + + + + + + + renderComponent(); ?> + + + + + + + + + +
    + +
    + + + get('admin::app.users.forget-password.create.sign-in-link'); ?> + + + + +
    + renderComponent(); ?> + + + + + + + + + + + + +
    +
    + + +
    + Desenvolvido por + + Blyzer + +
    + + renderComponent(); ?> + + + + + + + + + + \ No newline at end of file diff --git a/storage/framework/views/fca414b36e4c13c171c46bfef449ceb3.php b/storage/framework/views/fca414b36e4c13c171c46bfef449ceb3.php new file mode 100755 index 0000000..6cc0e47 --- /dev/null +++ b/storage/framework/views/fca414b36e4c13c171c46bfef449ceb3.php @@ -0,0 +1,126 @@ + + + 'admin::components.layouts.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::layouts'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> + slot('title', null, []); ?> + get('admin::app.settings.warehouses.index.title'); ?> + endSlot(); ?> + +
    +
    +
    + + + + 'admin::components.breadcrumbs.index','data' => ['name' => 'settings.warehouses']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::breadcrumbs'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['name' => 'settings.warehouses']); ?> +renderComponent(); ?> + + + + + + + + + + +
    + + get('admin::app.settings.warehouses.index.title'); ?> +
    +
    + +
    + +
    + + + + hasPermission('settings.automation.warehouses.create')): ?> + + get('admin::app.settings.warehouses.index.create-btn'); ?> + + + + + +
    +
    +
    + + + + + + + + 'admin::components.datagrid.index','data' => ['src' => route('admin.settings.warehouses.index')]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::datagrid'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['src' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(route('admin.settings.warehouses.index'))]); ?> + + + + 'admin::components.shimmer.datagrid.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::shimmer.datagrid'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> +renderComponent(); ?> + + + + + + + + + + renderComponent(); ?> + + + + + + + + + + + + +
    + renderComponent(); ?> + + + + + + + + + + \ No newline at end of file diff --git a/storage/framework/views/fca436142e86e0113dba7bd2c8bbc281.php b/storage/framework/views/fca436142e86e0113dba7bd2c8bbc281.php new file mode 100755 index 0000000..70ce902 --- /dev/null +++ b/storage/framework/views/fca436142e86e0113dba7bd2c8bbc281.php @@ -0,0 +1,17 @@ + +
    + +
    + +
    +

    +

    +
    +
    + + +
    +

    +
    +
    + \ No newline at end of file diff --git a/storage/framework/views/fd0024623da8afa781adf503b6c5876e.php b/storage/framework/views/fd0024623da8afa781adf503b6c5876e.php new file mode 100755 index 0000000..70fb540 --- /dev/null +++ b/storage/framework/views/fd0024623da8afa781adf503b6c5876e.php @@ -0,0 +1,126 @@ + + + +
    + + + 'admin::components.dropdown.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::dropdown'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> + slot('toggle', null, []); ?> + + + + + + + + endSlot(); ?> + + slot('content', null, ['class' => '!p-0']); ?> + + + + +
    + + get('admin::app.leads.index.view-switcher.all-pipelines'); ?> + +
    + + + + + + all(); $__env->addLoop($__currentLoopData); foreach($__currentLoopData as $tempPipeline): $__env->incrementLoopIndices(); $loop = $__env->getLastLoop(); ?> + $tempPipeline]); ?> + + + + name); ?> + + + + $tempPipeline]); ?> + + popLoop(); $loop = $__env->getLastLoop(); ?> + + + + + + + + get('admin::app.leads.index.view-switcher.create-new-pipeline'); ?> + + + + + + endSlot(); ?> + renderComponent(); ?> + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + +
    +
    + + \ No newline at end of file diff --git a/storage/framework/views/fd6bc016b04e3ac46f0ac3e7d1cd9e82.php b/storage/framework/views/fd6bc016b04e3ac46f0ac3e7d1cd9e82.php new file mode 100755 index 0000000..60e4287 --- /dev/null +++ b/storage/framework/views/fd6bc016b04e3ac46f0ac3e7d1cd9e82.php @@ -0,0 +1,232 @@ + + + + 'admin::components.layouts.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::layouts'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> + + slot('title', null, []); ?> + get('admin::app.settings.warehouses.edit.title'); ?> + endSlot(); ?> + + $warehouse]); ?> + + + + + 'admin::components.form.index','data' => ['method' => 'PUT','action' => route('admin.settings.warehouses.update', $warehouse->id)]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['method' => 'PUT','action' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(route('admin.settings.warehouses.update', $warehouse->id))]); ?> +
    +
    +
    + + + + + + + 'admin::components.breadcrumbs.index','data' => ['name' => 'settings.warehouses.edit','entity' => $warehouse]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::breadcrumbs'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['name' => 'settings.warehouses.edit','entity' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($warehouse)]); ?> +renderComponent(); ?> + + + + + + + + + + + + + +
    + get('admin::app.settings.warehouses.edit.title'); ?> +
    +
    + +
    +
    + + + + + + + + +
    +
    +
    + +
    + +
    +
    +

    + get('admin::app.settings.warehouses.edit.contact-info'); ?> +

    + + $warehouse]); ?> + + + + + 'admin::components.attributes.index','data' => ['customAttributes' => app('Webkul\Attribute\Repositories\AttributeRepository')->findWhere([ + ['code', 'NOTIN', ['name', 'description']], + 'entity_type' => 'warehouses', + ])->sortBy('sort_order'),'customValidations' => [ + 'contact_address' => [ + 'max:100', + ], + 'postcode' => [ + 'postcode', + ], + ],'entity' => $warehouse]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::attributes'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['custom-attributes' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(app('Webkul\Attribute\Repositories\AttributeRepository')->findWhere([ + ['code', 'NOTIN', ['name', 'description']], + 'entity_type' => 'warehouses', + ])->sortBy('sort_order')),'custom-validations' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute([ + 'contact_address' => [ + 'max:100', + ], + 'postcode' => [ + 'postcode', + ], + ]),'entity' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($warehouse)]); ?> +renderComponent(); ?> + + + + + + + + + + + $warehouse]); ?> + +
    +
    + + +
    + + + 'admin::components.accordion.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::accordion'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> + slot('header', null, []); ?> +
    +

    + get('admin::app.settings.roles.create.general'); ?> +

    +
    + endSlot(); ?> + + slot('content', null, []); ?> + $warehouse]); ?> + + + + + 'admin::components.attributes.index','data' => ['customAttributes' => app('Webkul\Attribute\Repositories\AttributeRepository')->findWhere([ + ['code', 'IN', ['name', 'description']], + 'entity_type' => 'warehouses', + ])->sortBy('sort_order'),'entity' => $warehouse]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::attributes'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['custom-attributes' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(app('Webkul\Attribute\Repositories\AttributeRepository')->findWhere([ + ['code', 'IN', ['name', 'description']], + 'entity_type' => 'warehouses', + ])->sortBy('sort_order')),'entity' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($warehouse)]); ?> +renderComponent(); ?> + + + + + + + + + + + $warehouse]); ?> + + endSlot(); ?> + renderComponent(); ?> + + + + + + + + + +
    +
    +
    + renderComponent(); ?> + + + + + + + + + + + $warehouse]); ?> + + renderComponent(); ?> + + + + + + + + + + \ No newline at end of file diff --git a/storage/framework/views/fe5faeb9d28c73897b30c50e779419a2.php b/storage/framework/views/fe5faeb9d28c73897b30c50e779419a2.php new file mode 100755 index 0000000..c01fed4 --- /dev/null +++ b/storage/framework/views/fe5faeb9d28c73897b30c50e779419a2.php @@ -0,0 +1,116 @@ +
    + +
    +
    +
    +
    +
    + +
    + +
    +
    +
    +
    +
    + +
    + +
    +
    + +
    +
    + + +
    +
    + +
    +
    + + +
    +
    +
    + +
    +
    + +
    +
    + +
    +
    +
    + + +
    +
    +
    + +
    +
    + +
    +
    + +
    +
    +
    +
    +
    + + +
    +
    +
    +
    +
    +
    + +
    + +
    +
    + +
    +
    + +
    +
    +
    +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    + +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + + +
    +
    +
    +
    +
    +
    +
    +
    \ No newline at end of file diff --git a/storage/framework/views/fe66cc2a12be3423c9157b9f1427314e.php b/storage/framework/views/fe66cc2a12be3423c9157b9f1427314e.php new file mode 100755 index 0000000..205e7e3 --- /dev/null +++ b/storage/framework/views/fe66cc2a12be3423c9157b9f1427314e.php @@ -0,0 +1,34 @@ +lookup_type + ? app('Webkul\Attribute\Repositories\AttributeRepository')->getLookUpOptions($attribute->lookup_type) + : $attribute->options()->orderBy('sort_order')->get(); + + $selectedOption = old($attribute->code) ?: $value; +?> + + + + \ No newline at end of file diff --git a/storage/framework/views/fe7372eb19574941f5c3dac69cde3dc3.php b/storage/framework/views/fe7372eb19574941f5c3dac69cde3dc3.php new file mode 100755 index 0000000..38f7c55 --- /dev/null +++ b/storage/framework/views/fe7372eb19574941f5c3dac69cde3dc3.php @@ -0,0 +1,904 @@ + + + 'admin::components.layouts.index','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::layouts'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> + slot('title', null, []); ?> + get('admin::app.activities.index.title'); ?> + endSlot(); ?> + + + + + + +
    +
    +
    + + + 'admin::components.breadcrumbs.index','data' => ['name' => 'activities']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::breadcrumbs'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['name' => 'activities']); ?> +renderComponent(); ?> + + + + + + + + + + +
    + get('admin::app.activities.index.title'); ?> +
    +
    + +
    + + + +
    +
    + + + get('view-type') == 'table' + || ! request()->has('view-type') + ): ?> + + + 'admin::components.shimmer.datagrid.index','data' => ['isMultiRow' => true]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::shimmer.datagrid'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['is-multi-row' => true]); ?> +renderComponent(); ?> + + + + + + + + + + +
    +
    + + + + + hasRenderedOnce('0ff9b9a3-5f6f-4bc1-a85f-4b17fc84289b')): $__env->markAsRenderedOnce('0ff9b9a3-5f6f-4bc1-a85f-4b17fc84289b'); +$__env->startPush('scripts'); ?> + + + + + + + + + + stopPush(); endif; ?> + + hasRenderedOnce('946f376c-8376-44ad-a2a7-e5eed00e970b')): $__env->markAsRenderedOnce('946f376c-8376-44ad-a2a7-e5eed00e970b'); +$__env->startPush('styles'); ?> + + stopPush(); endif; ?> + renderComponent(); ?> + + + + + + + + + + \ No newline at end of file diff --git a/storage/framework/views/ffd442e3c0a04c0587373e639425db60.php b/storage/framework/views/ffd442e3c0a04c0587373e639425db60.php new file mode 100755 index 0000000..e8e8a8a --- /dev/null +++ b/storage/framework/views/ffd442e3c0a04c0587373e639425db60.php @@ -0,0 +1,487 @@ + +onlyProps([ + 'type' => 'text', + 'name' => '', +]) as $__key => $__value) { + $$__key = $$__key ?? $__value; +} ?> +exceptProps([ + 'type' => 'text', + 'name' => '', +]); ?> + 'text', + 'name' => '', +]), 'is_string', ARRAY_FILTER_USE_KEY) as $__key => $__value) { + $$__key = $$__key ?? $__value; +} ?> + + $__value) { + if (array_key_exists($__key, $__defined_vars)) unset($$__key); +} ?> + + + + + + + + only(['name', ':name', 'value', ':value', 'v-model', 'rules', ':rules', 'label', ':label'])); ?> + + name="" + > + except(['value', ':value', 'v-model', 'rules', ':rules', 'label', ':label'])->merge(['class' => 'w-full rounded border border-gray-200 px-2.5 py-2 text-sm font-normal text-gray-800 transition-all hover:border-gray-400 focus:border-gray-400 dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300 dark:hover:border-gray-400 dark:focus:border-gray-400'])); ?> + + /> + + + + + + only(['name', ':name', 'value', ':value', 'v-model', 'rules', ':rules', 'label', ':label'])); ?> + + name="" + > +
    + + attributes->merge(['class' => 'py-2.5 text-gray-500 ltr:pl-4 rtl:pr-4'])); ?>> + + + + + + + + + + + except(['value', ':value', 'v-model', 'rules', ':rules', 'label', ':label'])->merge(['class' => 'w-full p-2.5 text-sm text-gray-600 dark:bg-gray-900 dark:text-gray-300'])); ?> + + /> +
    +
    + + + + + only(['name', ':name', 'value', ':value', 'v-model', 'rules', ':rules', 'label', ':label'])); ?> + + name="" + > + except(['value', ':value', 'v-model', 'rules', ':rules', 'label', ':label'])->merge(['class' => 'w-full rounded-md border px-3 py-2.5 text-sm text-gray-600 transition-all hover:border-gray-400 focus:border-gray-400 dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300 dark:file:bg-gray-800 dark:file:dark:text-white dark:hover:border-gray-400 dark:focus:border-gray-400'])); ?> + + @change="handleChange" + @blur="handleBlur" + /> + + + + + + except('class')); ?> + + > + except(['value'])->merge(['class' => 'w-full appearance-none rounded-md border text-sm text-gray-600 transition-all hover:border-gray-400 dark:text-gray-300 dark:hover:border-gray-400'])); ?> + + > + + + + + only(['name', ':name', 'value', ':value', 'v-model', 'rules', ':rules', 'label', ':label'])); ?> + + name="" + > + + + get('tinymce', false) || $attributes->get(':tinymce', false)): ?> + + + 'admin::components.tinymce.index','data' => ['selector' => 'textarea#' . $attributes->get('id'),':field' => 'field']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::tinymce'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['selector' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute('textarea#' . $attributes->get('id')),':field' => 'field']); ?> +renderComponent(); ?> + + + + + + + + + + + + + + + + only(['name', ':name', 'value', ':value', 'v-model', 'rules', ':rules', 'label', ':label'])->merge(['rules' => 'regex:^\d{4}-\d{2}-\d{2}$'])); ?> + + name="" + > + + + 'admin::components.flat-picker.date','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::flat-picker.date'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> + except(['value', ':value', 'v-model', 'rules', ':rules', 'label', ':label'])->merge(['class' => 'w-full rounded border border-gray-200 px-2.5 py-2 text-sm font-normal text-gray-800 transition-all hover:border-gray-400 focus:border-gray-400 dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300 dark:hover:border-gray-400 dark:focus:border-gray-400'])); ?> + + autocomplete="off" + /> + renderComponent(); ?> + + + + + + + + + + + + + + + only(['name', ':name', 'value', ':value', 'v-model', 'rules', ':rules', 'label', ':label'])->merge(['rules' => 'regex:^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}$'])); ?> + + name="" + > + + + 'admin::components.flat-picker.datetime','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::flat-picker.datetime'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes([]); ?> + except(['value', ':value', 'v-model', 'rules', ':rules', 'label', ':label'])->merge(['class' => 'w-full rounded border border-gray-200 px-2.5 py-2 text-sm font-normal text-gray-800 transition-all hover:border-gray-400 focus:border-gray-400 dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300 dark:hover:border-gray-400 dark:focus:border-gray-400'])); ?> + + autocomplete="off" + > + renderComponent(); ?> + + + + + + + + + + + + + + only(['name', ':name', 'value', ':value', 'v-model', 'rules', ':rules', 'label', ':label'])); ?> + + name="" + > + + + + + + + except([])->merge(['class' => 'flex w-full flex-col rounded-md border bg-white px-3 py-2.5 text-sm font-normal text-gray-600 transition-all hover:border-gray-400 dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300 dark:hover:border-gray-400'])); ?> + + name="" + multiple + > + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 'admin::components.media.images','data' => ['name' => ''.e($name).'',':class' => '[errors && errors[\''.e($name).'\'] ? \'border !border-red-600 hover:border-red-600\' : \'\']','attributes' => $attributes]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::media.images'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['name' => ''.e($name).'',':class' => '[errors && errors[\''.e($name).'\'] ? \'border !border-red-600 hover:border-red-600\' : \'\']','attributes' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($attributes)]); ?> +renderComponent(); ?> + + + + + + + + + + + + + + + + 'admin::components.form.control-group.controls.inline.text','data' => ['attributes' => $attributes]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.controls.inline.text'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['attributes' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($attributes)]); ?> +renderComponent(); ?> + + + + + + + + + + + + + + > + + + + + + + + + + 'admin::components.form.control-group.controls.tags','data' => ['name' => $name,'data' => $attributes->get(':data') ?? $attributes->get('data'),'attributes' => $attributes]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? (array) $attributes->getIterator() : [])); ?> +withName('admin::form.control-group.controls.tags'); ?> +shouldRender()): ?> +startComponent($component->resolveView(), $component->data()); ?> +getConstructor()): ?> +except(collect($constructor->getParameters())->map->getName()->all()); ?> + +withAttributes(['name' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($name),'data' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($attributes->get(':data') ?? $attributes->get('data')),'attributes' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($attributes)]); ?> +renderComponent(); ?> + + + + + + + + + + + + +hasRenderedOnce('7bb8a351-3dc6-4b7c-bb38-979069ee082f')): $__env->markAsRenderedOnce('7bb8a351-3dc6-4b7c-bb38-979069ee082f'); +$__env->startPush('scripts'); ?> + + + +stopPush(); endif; ?> \ No newline at end of file diff --git a/storage/logs/laravel.log b/storage/logs/laravel.log new file mode 100755 index 0000000..fd3166e --- /dev/null +++ b/storage/logs/laravel.log @@ -0,0 +1,1055 @@ +[2026-01-29 13:34:52] local.ERROR: PHP Parse error: Syntax error, unexpected '=' on line 1 {"exception":"[object] (Psy\\Exception\\ParseErrorException(code: 0): PHP Parse error: Syntax error, unexpected '=' on line 1 at /var/www/html/vendor/psy/psysh/src/Exception/ParseErrorException.php:44) +[stacktrace] +#0 /var/www/html/vendor/psy/psysh/src/CodeCleaner.php(306): Psy\\Exception\\ParseErrorException::fromParseError(Object(PhpParser\\Error)) +#1 /var/www/html/vendor/psy/psysh/src/CodeCleaner.php(240): Psy\\CodeCleaner->parse('clean(Array, false) +#3 /var/www/html/vendor/psy/psysh/src/Shell.php(881): Psy\\Shell->addCode('use Webkul\\\\User...', true) +#4 /var/www/html/vendor/psy/psysh/src/Shell.php(1390): Psy\\Shell->setCode('use Webkul\\\\User...', true) +#5 /var/www/html/vendor/laravel/tinker/src/Console/TinkerCommand.php(76): Psy\\Shell->execute('use Webkul\\\\User...') +#6 /var/www/html/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(36): Laravel\\Tinker\\Console\\TinkerCommand->handle() +#7 /var/www/html/vendor/laravel/framework/src/Illuminate/Container/Util.php(41): Illuminate\\Container\\BoundMethod::Illuminate\\Container\\{closure}() +#8 /var/www/html/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(93): Illuminate\\Container\\Util::unwrapIfClosure(Object(Closure)) +#9 /var/www/html/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(35): Illuminate\\Container\\BoundMethod::callBoundMethod(Object(Illuminate\\Foundation\\Application), Array, Object(Closure)) +#10 /var/www/html/vendor/laravel/framework/src/Illuminate/Container/Container.php(662): Illuminate\\Container\\BoundMethod::call(Object(Illuminate\\Foundation\\Application), Array, Array, NULL) +#11 /var/www/html/vendor/laravel/framework/src/Illuminate/Console/Command.php(211): Illuminate\\Container\\Container->call(Array) +#12 /var/www/html/vendor/symfony/console/Command/Command.php(326): Illuminate\\Console\\Command->execute(Object(Symfony\\Component\\Console\\Input\\ArgvInput), Object(Illuminate\\Console\\OutputStyle)) +#13 /var/www/html/vendor/laravel/framework/src/Illuminate/Console/Command.php(180): Symfony\\Component\\Console\\Command\\Command->run(Object(Symfony\\Component\\Console\\Input\\ArgvInput), Object(Illuminate\\Console\\OutputStyle)) +#14 /var/www/html/vendor/symfony/console/Application.php(1096): Illuminate\\Console\\Command->run(Object(Symfony\\Component\\Console\\Input\\ArgvInput), Object(Symfony\\Component\\Console\\Output\\ConsoleOutput)) +#15 /var/www/html/vendor/symfony/console/Application.php(324): Symfony\\Component\\Console\\Application->doRunCommand(Object(Laravel\\Tinker\\Console\\TinkerCommand), Object(Symfony\\Component\\Console\\Input\\ArgvInput), Object(Symfony\\Component\\Console\\Output\\ConsoleOutput)) +#16 /var/www/html/vendor/symfony/console/Application.php(175): Symfony\\Component\\Console\\Application->doRun(Object(Symfony\\Component\\Console\\Input\\ArgvInput), Object(Symfony\\Component\\Console\\Output\\ConsoleOutput)) +#17 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Console/Kernel.php(201): Symfony\\Component\\Console\\Application->run(Object(Symfony\\Component\\Console\\Input\\ArgvInput), Object(Symfony\\Component\\Console\\Output\\ConsoleOutput)) +#18 /var/www/html/artisan(35): Illuminate\\Foundation\\Console\\Kernel->handle(Object(Symfony\\Component\\Console\\Input\\ArgvInput), Object(Symfony\\Component\\Console\\Output\\ConsoleOutput)) +#19 {main} +"} +[2026-01-29 14:54:37] local.ERROR: Call to undefined method Stancl\Tenancy\Database\Models\Tenant::domains() {"exception":"[object] (BadMethodCallException(code: 0): Call to undefined method Stancl\\Tenancy\\Database\\Models\\Tenant::domains() at /var/www/html/vendor/laravel/framework/src/Illuminate/Support/Traits/ForwardsCalls.php:67) +[stacktrace] +#0 /var/www/html/vendor/laravel/framework/src/Illuminate/Support/Traits/ForwardsCalls.php(36): Illuminate\\Database\\Eloquent\\Model::throwBadMethodCallException('domains') +#1 /var/www/html/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Model.php(2335): Illuminate\\Database\\Eloquent\\Model->forwardCallTo(Object(Illuminate\\Database\\Eloquent\\Builder), 'domains', Array) +#2 /var/www/html/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Concerns/QueriesRelationships.php(876): Illuminate\\Database\\Eloquent\\Model->__call('domains', Array) +#3 /var/www/html/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Relations/Relation.php(110): Illuminate\\Database\\Eloquent\\Builder->Illuminate\\Database\\Eloquent\\Concerns\\{closure}() +#4 /var/www/html/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Concerns/QueriesRelationships.php(875): Illuminate\\Database\\Eloquent\\Relations\\Relation::noConstraints(Object(Closure)) +#5 /var/www/html/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Concerns/QueriesRelationships.php(39): Illuminate\\Database\\Eloquent\\Builder->getRelationWithoutConstraints('domains') +#6 /var/www/html/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Concerns/QueriesRelationships.php(152): Illuminate\\Database\\Eloquent\\Builder->has('domains', '>=', 1, 'and', Object(Closure)) +#7 /var/www/html/vendor/stancl/tenancy/src/Resolvers/DomainTenantResolver.php(36): Illuminate\\Database\\Eloquent\\Builder->whereHas('domains', Object(Closure)) +#8 /var/www/html/vendor/stancl/tenancy/src/Resolvers/Contracts/CachedTenantResolver.php(34): Stancl\\Tenancy\\Resolvers\\DomainTenantResolver->resolveWithoutCache('localhost') +#9 /var/www/html/vendor/stancl/tenancy/src/Middleware/IdentificationMiddleware.php(26): Stancl\\Tenancy\\Resolvers\\Contracts\\CachedTenantResolver->resolve('localhost') +#10 /var/www/html/vendor/stancl/tenancy/src/Middleware/InitializeTenancyByDomain.php(37): Stancl\\Tenancy\\Middleware\\IdentificationMiddleware->initializeTenancy(Object(Illuminate\\Http\\Request), Object(Closure), 'localhost') +#11 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Stancl\\Tenancy\\Middleware\\InitializeTenancyByDomain->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#12 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(119): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#13 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Router.php(805): Illuminate\\Pipeline\\Pipeline->then(Object(Closure)) +#14 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Router.php(784): Illuminate\\Routing\\Router->runRouteWithinStack(Object(Illuminate\\Routing\\Route), Object(Illuminate\\Http\\Request)) +#15 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Router.php(748): Illuminate\\Routing\\Router->runRoute(Object(Illuminate\\Http\\Request), Object(Illuminate\\Routing\\Route)) +#16 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Router.php(737): Illuminate\\Routing\\Router->dispatchToRoute(Object(Illuminate\\Http\\Request)) +#17 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(200): Illuminate\\Routing\\Router->dispatch(Object(Illuminate\\Http\\Request)) +#18 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(144): Illuminate\\Foundation\\Http\\Kernel->Illuminate\\Foundation\\Http\\{closure}(Object(Illuminate\\Http\\Request)) +#19 /var/www/html/vendor/barryvdh/laravel-debugbar/src/Middleware/InjectDebugbar.php(66): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#20 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Barryvdh\\Debugbar\\Middleware\\InjectDebugbar->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#21 /var/www/html/packages/Webkul/Installer/src/Http/Middleware/CanInstall.php(28): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#22 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Webkul\\Installer\\Http\\Middleware\\CanInstall->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#23 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php(21): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#24 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TrimStrings.php(40): Illuminate\\Foundation\\Http\\Middleware\\TransformsRequest->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#25 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Foundation\\Http\\Middleware\\TrimStrings->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#26 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/ValidatePostSize.php(27): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#27 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Foundation\\Http\\Middleware\\ValidatePostSize->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#28 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/PreventRequestsDuringMaintenance.php(99): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#29 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Foundation\\Http\\Middleware\\PreventRequestsDuringMaintenance->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#30 /var/www/html/vendor/laravel/framework/src/Illuminate/Http/Middleware/HandleCors.php(49): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#31 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Http\\Middleware\\HandleCors->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#32 /var/www/html/vendor/laravel/framework/src/Illuminate/Http/Middleware/TrustProxies.php(39): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#33 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Http\\Middleware\\TrustProxies->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#34 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(119): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#35 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(175): Illuminate\\Pipeline\\Pipeline->then(Object(Closure)) +#36 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(144): Illuminate\\Foundation\\Http\\Kernel->sendRequestThroughRouter(Object(Illuminate\\Http\\Request)) +#37 /var/www/html/public/index.php(51): Illuminate\\Foundation\\Http\\Kernel->handle(Object(Illuminate\\Http\\Request)) +#38 {main} +"} +[2026-01-29 15:08:41] local.ERROR: Tenant could not be identified on domain localhost {"exception":"[object] (Stancl\\Tenancy\\Exceptions\\TenantCouldNotBeIdentifiedOnDomainException(code: 0): Tenant could not be identified on domain localhost at /var/www/html/vendor/stancl/tenancy/src/Resolvers/DomainTenantResolver.php:48) +[stacktrace] +#0 /var/www/html/vendor/stancl/tenancy/src/Resolvers/Contracts/CachedTenantResolver.php(34): Stancl\\Tenancy\\Resolvers\\DomainTenantResolver->resolveWithoutCache('localhost') +#1 /var/www/html/vendor/stancl/tenancy/src/Middleware/IdentificationMiddleware.php(26): Stancl\\Tenancy\\Resolvers\\Contracts\\CachedTenantResolver->resolve('localhost') +#2 /var/www/html/vendor/stancl/tenancy/src/Middleware/InitializeTenancyByDomain.php(37): Stancl\\Tenancy\\Middleware\\IdentificationMiddleware->initializeTenancy(Object(Illuminate\\Http\\Request), Object(Closure), 'localhost') +#3 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Stancl\\Tenancy\\Middleware\\InitializeTenancyByDomain->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#4 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(119): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#5 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Router.php(805): Illuminate\\Pipeline\\Pipeline->then(Object(Closure)) +#6 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Router.php(784): Illuminate\\Routing\\Router->runRouteWithinStack(Object(Illuminate\\Routing\\Route), Object(Illuminate\\Http\\Request)) +#7 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Router.php(748): Illuminate\\Routing\\Router->runRoute(Object(Illuminate\\Http\\Request), Object(Illuminate\\Routing\\Route)) +#8 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Router.php(737): Illuminate\\Routing\\Router->dispatchToRoute(Object(Illuminate\\Http\\Request)) +#9 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(200): Illuminate\\Routing\\Router->dispatch(Object(Illuminate\\Http\\Request)) +#10 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(144): Illuminate\\Foundation\\Http\\Kernel->Illuminate\\Foundation\\Http\\{closure}(Object(Illuminate\\Http\\Request)) +#11 /var/www/html/vendor/barryvdh/laravel-debugbar/src/Middleware/InjectDebugbar.php(66): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#12 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Barryvdh\\Debugbar\\Middleware\\InjectDebugbar->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#13 /var/www/html/packages/Webkul/Installer/src/Http/Middleware/CanInstall.php(28): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#14 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Webkul\\Installer\\Http\\Middleware\\CanInstall->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#15 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php(21): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#16 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TrimStrings.php(40): Illuminate\\Foundation\\Http\\Middleware\\TransformsRequest->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#17 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Foundation\\Http\\Middleware\\TrimStrings->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#18 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/ValidatePostSize.php(27): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#19 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Foundation\\Http\\Middleware\\ValidatePostSize->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#20 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/PreventRequestsDuringMaintenance.php(99): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#21 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Foundation\\Http\\Middleware\\PreventRequestsDuringMaintenance->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#22 /var/www/html/vendor/laravel/framework/src/Illuminate/Http/Middleware/HandleCors.php(49): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#23 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Http\\Middleware\\HandleCors->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#24 /var/www/html/vendor/laravel/framework/src/Illuminate/Http/Middleware/TrustProxies.php(39): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#25 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Http\\Middleware\\TrustProxies->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#26 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(119): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#27 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(175): Illuminate\\Pipeline\\Pipeline->then(Object(Closure)) +#28 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(144): Illuminate\\Foundation\\Http\\Kernel->sendRequestThroughRouter(Object(Illuminate\\Http\\Request)) +#29 /var/www/html/public/index.php(51): Illuminate\\Foundation\\Http\\Kernel->handle(Object(Illuminate\\Http\\Request)) +#30 {main} +"} +[2026-01-29 15:09:49] local.ERROR: Tenant could not be identified on domain localhost {"exception":"[object] (Stancl\\Tenancy\\Exceptions\\TenantCouldNotBeIdentifiedOnDomainException(code: 0): Tenant could not be identified on domain localhost at /var/www/html/vendor/stancl/tenancy/src/Resolvers/DomainTenantResolver.php:48) +[stacktrace] +#0 /var/www/html/vendor/stancl/tenancy/src/Resolvers/Contracts/CachedTenantResolver.php(34): Stancl\\Tenancy\\Resolvers\\DomainTenantResolver->resolveWithoutCache('localhost') +#1 /var/www/html/vendor/stancl/tenancy/src/Middleware/IdentificationMiddleware.php(26): Stancl\\Tenancy\\Resolvers\\Contracts\\CachedTenantResolver->resolve('localhost') +#2 /var/www/html/vendor/stancl/tenancy/src/Middleware/InitializeTenancyByDomain.php(37): Stancl\\Tenancy\\Middleware\\IdentificationMiddleware->initializeTenancy(Object(Illuminate\\Http\\Request), Object(Closure), 'localhost') +#3 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Stancl\\Tenancy\\Middleware\\InitializeTenancyByDomain->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#4 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(119): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#5 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Router.php(805): Illuminate\\Pipeline\\Pipeline->then(Object(Closure)) +#6 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Router.php(784): Illuminate\\Routing\\Router->runRouteWithinStack(Object(Illuminate\\Routing\\Route), Object(Illuminate\\Http\\Request)) +#7 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Router.php(748): Illuminate\\Routing\\Router->runRoute(Object(Illuminate\\Http\\Request), Object(Illuminate\\Routing\\Route)) +#8 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Router.php(737): Illuminate\\Routing\\Router->dispatchToRoute(Object(Illuminate\\Http\\Request)) +#9 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(200): Illuminate\\Routing\\Router->dispatch(Object(Illuminate\\Http\\Request)) +#10 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(144): Illuminate\\Foundation\\Http\\Kernel->Illuminate\\Foundation\\Http\\{closure}(Object(Illuminate\\Http\\Request)) +#11 /var/www/html/vendor/barryvdh/laravel-debugbar/src/Middleware/InjectDebugbar.php(66): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#12 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Barryvdh\\Debugbar\\Middleware\\InjectDebugbar->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#13 /var/www/html/packages/Webkul/Installer/src/Http/Middleware/CanInstall.php(28): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#14 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Webkul\\Installer\\Http\\Middleware\\CanInstall->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#15 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php(21): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#16 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TrimStrings.php(40): Illuminate\\Foundation\\Http\\Middleware\\TransformsRequest->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#17 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Foundation\\Http\\Middleware\\TrimStrings->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#18 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/ValidatePostSize.php(27): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#19 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Foundation\\Http\\Middleware\\ValidatePostSize->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#20 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/PreventRequestsDuringMaintenance.php(99): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#21 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Foundation\\Http\\Middleware\\PreventRequestsDuringMaintenance->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#22 /var/www/html/vendor/laravel/framework/src/Illuminate/Http/Middleware/HandleCors.php(49): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#23 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Http\\Middleware\\HandleCors->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#24 /var/www/html/vendor/laravel/framework/src/Illuminate/Http/Middleware/TrustProxies.php(39): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#25 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Http\\Middleware\\TrustProxies->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#26 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(119): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#27 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(175): Illuminate\\Pipeline\\Pipeline->then(Object(Closure)) +#28 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(144): Illuminate\\Foundation\\Http\\Kernel->sendRequestThroughRouter(Object(Illuminate\\Http\\Request)) +#29 /var/www/html/public/index.php(51): Illuminate\\Foundation\\Http\\Kernel->handle(Object(Illuminate\\Http\\Request)) +#30 {main} +"} +[2026-01-29 15:14:30] local.ERROR: Tenant could not be identified on domain localhost {"exception":"[object] (Stancl\\Tenancy\\Exceptions\\TenantCouldNotBeIdentifiedOnDomainException(code: 0): Tenant could not be identified on domain localhost at /var/www/html/vendor/stancl/tenancy/src/Resolvers/DomainTenantResolver.php:48) +[stacktrace] +#0 /var/www/html/vendor/stancl/tenancy/src/Resolvers/Contracts/CachedTenantResolver.php(34): Stancl\\Tenancy\\Resolvers\\DomainTenantResolver->resolveWithoutCache('localhost') +#1 /var/www/html/vendor/stancl/tenancy/src/Middleware/IdentificationMiddleware.php(26): Stancl\\Tenancy\\Resolvers\\Contracts\\CachedTenantResolver->resolve('localhost') +#2 /var/www/html/vendor/stancl/tenancy/src/Middleware/InitializeTenancyByDomain.php(37): Stancl\\Tenancy\\Middleware\\IdentificationMiddleware->initializeTenancy(Object(Illuminate\\Http\\Request), Object(Closure), 'localhost') +#3 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Stancl\\Tenancy\\Middleware\\InitializeTenancyByDomain->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#4 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(119): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#5 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Router.php(805): Illuminate\\Pipeline\\Pipeline->then(Object(Closure)) +#6 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Router.php(784): Illuminate\\Routing\\Router->runRouteWithinStack(Object(Illuminate\\Routing\\Route), Object(Illuminate\\Http\\Request)) +#7 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Router.php(748): Illuminate\\Routing\\Router->runRoute(Object(Illuminate\\Http\\Request), Object(Illuminate\\Routing\\Route)) +#8 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Router.php(737): Illuminate\\Routing\\Router->dispatchToRoute(Object(Illuminate\\Http\\Request)) +#9 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(200): Illuminate\\Routing\\Router->dispatch(Object(Illuminate\\Http\\Request)) +#10 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(144): Illuminate\\Foundation\\Http\\Kernel->Illuminate\\Foundation\\Http\\{closure}(Object(Illuminate\\Http\\Request)) +#11 /var/www/html/vendor/barryvdh/laravel-debugbar/src/Middleware/InjectDebugbar.php(66): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#12 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Barryvdh\\Debugbar\\Middleware\\InjectDebugbar->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#13 /var/www/html/packages/Webkul/Installer/src/Http/Middleware/CanInstall.php(28): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#14 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Webkul\\Installer\\Http\\Middleware\\CanInstall->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#15 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php(21): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#16 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TrimStrings.php(40): Illuminate\\Foundation\\Http\\Middleware\\TransformsRequest->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#17 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Foundation\\Http\\Middleware\\TrimStrings->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#18 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/ValidatePostSize.php(27): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#19 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Foundation\\Http\\Middleware\\ValidatePostSize->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#20 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/PreventRequestsDuringMaintenance.php(99): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#21 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Foundation\\Http\\Middleware\\PreventRequestsDuringMaintenance->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#22 /var/www/html/vendor/laravel/framework/src/Illuminate/Http/Middleware/HandleCors.php(49): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#23 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Http\\Middleware\\HandleCors->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#24 /var/www/html/vendor/laravel/framework/src/Illuminate/Http/Middleware/TrustProxies.php(39): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#25 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Http\\Middleware\\TrustProxies->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#26 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(119): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#27 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(175): Illuminate\\Pipeline\\Pipeline->then(Object(Closure)) +#28 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(144): Illuminate\\Foundation\\Http\\Kernel->sendRequestThroughRouter(Object(Illuminate\\Http\\Request)) +#29 /var/www/html/public/index.php(51): Illuminate\\Foundation\\Http\\Kernel->handle(Object(Illuminate\\Http\\Request)) +#30 {main} +"} +[2026-01-29 15:21:53] local.ERROR: Tenant could not be identified on domain localhost {"exception":"[object] (Stancl\\Tenancy\\Exceptions\\TenantCouldNotBeIdentifiedOnDomainException(code: 0): Tenant could not be identified on domain localhost at /var/www/html/vendor/stancl/tenancy/src/Resolvers/DomainTenantResolver.php:48) +[stacktrace] +#0 /var/www/html/vendor/stancl/tenancy/src/Resolvers/Contracts/CachedTenantResolver.php(34): Stancl\\Tenancy\\Resolvers\\DomainTenantResolver->resolveWithoutCache('localhost') +#1 /var/www/html/vendor/stancl/tenancy/src/Middleware/IdentificationMiddleware.php(26): Stancl\\Tenancy\\Resolvers\\Contracts\\CachedTenantResolver->resolve('localhost') +#2 /var/www/html/vendor/stancl/tenancy/src/Middleware/InitializeTenancyByDomain.php(37): Stancl\\Tenancy\\Middleware\\IdentificationMiddleware->initializeTenancy(Object(Illuminate\\Http\\Request), Object(Closure), 'localhost') +#3 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Stancl\\Tenancy\\Middleware\\InitializeTenancyByDomain->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#4 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(119): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#5 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Router.php(805): Illuminate\\Pipeline\\Pipeline->then(Object(Closure)) +#6 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Router.php(784): Illuminate\\Routing\\Router->runRouteWithinStack(Object(Illuminate\\Routing\\Route), Object(Illuminate\\Http\\Request)) +#7 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Router.php(748): Illuminate\\Routing\\Router->runRoute(Object(Illuminate\\Http\\Request), Object(Illuminate\\Routing\\Route)) +#8 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Router.php(737): Illuminate\\Routing\\Router->dispatchToRoute(Object(Illuminate\\Http\\Request)) +#9 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(200): Illuminate\\Routing\\Router->dispatch(Object(Illuminate\\Http\\Request)) +#10 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(144): Illuminate\\Foundation\\Http\\Kernel->Illuminate\\Foundation\\Http\\{closure}(Object(Illuminate\\Http\\Request)) +#11 /var/www/html/vendor/barryvdh/laravel-debugbar/src/Middleware/InjectDebugbar.php(66): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#12 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Barryvdh\\Debugbar\\Middleware\\InjectDebugbar->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#13 /var/www/html/packages/Webkul/Installer/src/Http/Middleware/CanInstall.php(28): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#14 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Webkul\\Installer\\Http\\Middleware\\CanInstall->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#15 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php(21): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#16 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TrimStrings.php(40): Illuminate\\Foundation\\Http\\Middleware\\TransformsRequest->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#17 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Foundation\\Http\\Middleware\\TrimStrings->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#18 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/ValidatePostSize.php(27): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#19 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Foundation\\Http\\Middleware\\ValidatePostSize->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#20 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/PreventRequestsDuringMaintenance.php(99): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#21 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Foundation\\Http\\Middleware\\PreventRequestsDuringMaintenance->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#22 /var/www/html/vendor/laravel/framework/src/Illuminate/Http/Middleware/HandleCors.php(49): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#23 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Http\\Middleware\\HandleCors->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#24 /var/www/html/vendor/laravel/framework/src/Illuminate/Http/Middleware/TrustProxies.php(39): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#25 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Http\\Middleware\\TrustProxies->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#26 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(119): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#27 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(175): Illuminate\\Pipeline\\Pipeline->then(Object(Closure)) +#28 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(144): Illuminate\\Foundation\\Http\\Kernel->sendRequestThroughRouter(Object(Illuminate\\Http\\Request)) +#29 /var/www/html/public/index.php(51): Illuminate\\Foundation\\Http\\Kernel->handle(Object(Illuminate\\Http\\Request)) +#30 {main} +"} +[2026-01-29 15:22:00] local.ERROR: Tenant could not be identified on domain localhost {"exception":"[object] (Stancl\\Tenancy\\Exceptions\\TenantCouldNotBeIdentifiedOnDomainException(code: 0): Tenant could not be identified on domain localhost at /var/www/html/vendor/stancl/tenancy/src/Resolvers/DomainTenantResolver.php:48) +[stacktrace] +#0 /var/www/html/vendor/stancl/tenancy/src/Resolvers/Contracts/CachedTenantResolver.php(34): Stancl\\Tenancy\\Resolvers\\DomainTenantResolver->resolveWithoutCache('localhost') +#1 /var/www/html/vendor/stancl/tenancy/src/Middleware/IdentificationMiddleware.php(26): Stancl\\Tenancy\\Resolvers\\Contracts\\CachedTenantResolver->resolve('localhost') +#2 /var/www/html/vendor/stancl/tenancy/src/Middleware/InitializeTenancyByDomain.php(37): Stancl\\Tenancy\\Middleware\\IdentificationMiddleware->initializeTenancy(Object(Illuminate\\Http\\Request), Object(Closure), 'localhost') +#3 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Stancl\\Tenancy\\Middleware\\InitializeTenancyByDomain->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#4 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(119): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#5 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Router.php(805): Illuminate\\Pipeline\\Pipeline->then(Object(Closure)) +#6 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Router.php(784): Illuminate\\Routing\\Router->runRouteWithinStack(Object(Illuminate\\Routing\\Route), Object(Illuminate\\Http\\Request)) +#7 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Router.php(748): Illuminate\\Routing\\Router->runRoute(Object(Illuminate\\Http\\Request), Object(Illuminate\\Routing\\Route)) +#8 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Router.php(737): Illuminate\\Routing\\Router->dispatchToRoute(Object(Illuminate\\Http\\Request)) +#9 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(200): Illuminate\\Routing\\Router->dispatch(Object(Illuminate\\Http\\Request)) +#10 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(144): Illuminate\\Foundation\\Http\\Kernel->Illuminate\\Foundation\\Http\\{closure}(Object(Illuminate\\Http\\Request)) +#11 /var/www/html/vendor/barryvdh/laravel-debugbar/src/Middleware/InjectDebugbar.php(66): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#12 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Barryvdh\\Debugbar\\Middleware\\InjectDebugbar->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#13 /var/www/html/packages/Webkul/Installer/src/Http/Middleware/CanInstall.php(28): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#14 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Webkul\\Installer\\Http\\Middleware\\CanInstall->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#15 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php(21): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#16 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TrimStrings.php(40): Illuminate\\Foundation\\Http\\Middleware\\TransformsRequest->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#17 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Foundation\\Http\\Middleware\\TrimStrings->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#18 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/ValidatePostSize.php(27): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#19 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Foundation\\Http\\Middleware\\ValidatePostSize->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#20 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/PreventRequestsDuringMaintenance.php(99): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#21 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Foundation\\Http\\Middleware\\PreventRequestsDuringMaintenance->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#22 /var/www/html/vendor/laravel/framework/src/Illuminate/Http/Middleware/HandleCors.php(49): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#23 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Http\\Middleware\\HandleCors->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#24 /var/www/html/vendor/laravel/framework/src/Illuminate/Http/Middleware/TrustProxies.php(39): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#25 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Http\\Middleware\\TrustProxies->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#26 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(119): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#27 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(175): Illuminate\\Pipeline\\Pipeline->then(Object(Closure)) +#28 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(144): Illuminate\\Foundation\\Http\\Kernel->sendRequestThroughRouter(Object(Illuminate\\Http\\Request)) +#29 /var/www/html/public/index.php(51): Illuminate\\Foundation\\Http\\Kernel->handle(Object(Illuminate\\Http\\Request)) +#30 {main} +"} +[2026-01-29 15:25:07] local.ERROR: Tenant could not be identified on domain localhost {"exception":"[object] (Stancl\\Tenancy\\Exceptions\\TenantCouldNotBeIdentifiedOnDomainException(code: 0): Tenant could not be identified on domain localhost at /var/www/html/vendor/stancl/tenancy/src/Resolvers/DomainTenantResolver.php:48) +[stacktrace] +#0 /var/www/html/vendor/stancl/tenancy/src/Resolvers/Contracts/CachedTenantResolver.php(34): Stancl\\Tenancy\\Resolvers\\DomainTenantResolver->resolveWithoutCache('localhost') +#1 /var/www/html/vendor/stancl/tenancy/src/Middleware/IdentificationMiddleware.php(26): Stancl\\Tenancy\\Resolvers\\Contracts\\CachedTenantResolver->resolve('localhost') +#2 /var/www/html/vendor/stancl/tenancy/src/Middleware/InitializeTenancyByDomain.php(37): Stancl\\Tenancy\\Middleware\\IdentificationMiddleware->initializeTenancy(Object(Illuminate\\Http\\Request), Object(Closure), 'localhost') +#3 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Stancl\\Tenancy\\Middleware\\InitializeTenancyByDomain->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#4 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(119): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#5 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Router.php(805): Illuminate\\Pipeline\\Pipeline->then(Object(Closure)) +#6 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Router.php(784): Illuminate\\Routing\\Router->runRouteWithinStack(Object(Illuminate\\Routing\\Route), Object(Illuminate\\Http\\Request)) +#7 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Router.php(748): Illuminate\\Routing\\Router->runRoute(Object(Illuminate\\Http\\Request), Object(Illuminate\\Routing\\Route)) +#8 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Router.php(737): Illuminate\\Routing\\Router->dispatchToRoute(Object(Illuminate\\Http\\Request)) +#9 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(200): Illuminate\\Routing\\Router->dispatch(Object(Illuminate\\Http\\Request)) +#10 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(144): Illuminate\\Foundation\\Http\\Kernel->Illuminate\\Foundation\\Http\\{closure}(Object(Illuminate\\Http\\Request)) +#11 /var/www/html/vendor/barryvdh/laravel-debugbar/src/Middleware/InjectDebugbar.php(66): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#12 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Barryvdh\\Debugbar\\Middleware\\InjectDebugbar->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#13 /var/www/html/packages/Webkul/Installer/src/Http/Middleware/CanInstall.php(28): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#14 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Webkul\\Installer\\Http\\Middleware\\CanInstall->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#15 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php(21): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#16 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TrimStrings.php(40): Illuminate\\Foundation\\Http\\Middleware\\TransformsRequest->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#17 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Foundation\\Http\\Middleware\\TrimStrings->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#18 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/ValidatePostSize.php(27): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#19 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Foundation\\Http\\Middleware\\ValidatePostSize->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#20 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/PreventRequestsDuringMaintenance.php(99): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#21 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Foundation\\Http\\Middleware\\PreventRequestsDuringMaintenance->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#22 /var/www/html/vendor/laravel/framework/src/Illuminate/Http/Middleware/HandleCors.php(49): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#23 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Http\\Middleware\\HandleCors->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#24 /var/www/html/vendor/laravel/framework/src/Illuminate/Http/Middleware/TrustProxies.php(39): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#25 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Http\\Middleware\\TrustProxies->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#26 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(119): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#27 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(175): Illuminate\\Pipeline\\Pipeline->then(Object(Closure)) +#28 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(144): Illuminate\\Foundation\\Http\\Kernel->sendRequestThroughRouter(Object(Illuminate\\Http\\Request)) +#29 /var/www/html/public/index.php(51): Illuminate\\Foundation\\Http\\Kernel->handle(Object(Illuminate\\Http\\Request)) +#30 {main} +"} +[2026-01-29 15:25:55] local.ERROR: Tenant could not be identified on domain localhost {"exception":"[object] (Stancl\\Tenancy\\Exceptions\\TenantCouldNotBeIdentifiedOnDomainException(code: 0): Tenant could not be identified on domain localhost at /var/www/html/vendor/stancl/tenancy/src/Resolvers/DomainTenantResolver.php:48) +[stacktrace] +#0 /var/www/html/vendor/stancl/tenancy/src/Resolvers/Contracts/CachedTenantResolver.php(34): Stancl\\Tenancy\\Resolvers\\DomainTenantResolver->resolveWithoutCache('localhost') +#1 /var/www/html/vendor/stancl/tenancy/src/Middleware/IdentificationMiddleware.php(26): Stancl\\Tenancy\\Resolvers\\Contracts\\CachedTenantResolver->resolve('localhost') +#2 /var/www/html/vendor/stancl/tenancy/src/Middleware/InitializeTenancyByDomain.php(37): Stancl\\Tenancy\\Middleware\\IdentificationMiddleware->initializeTenancy(Object(Illuminate\\Http\\Request), Object(Closure), 'localhost') +#3 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Stancl\\Tenancy\\Middleware\\InitializeTenancyByDomain->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#4 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(119): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#5 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Router.php(805): Illuminate\\Pipeline\\Pipeline->then(Object(Closure)) +#6 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Router.php(784): Illuminate\\Routing\\Router->runRouteWithinStack(Object(Illuminate\\Routing\\Route), Object(Illuminate\\Http\\Request)) +#7 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Router.php(748): Illuminate\\Routing\\Router->runRoute(Object(Illuminate\\Http\\Request), Object(Illuminate\\Routing\\Route)) +#8 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Router.php(737): Illuminate\\Routing\\Router->dispatchToRoute(Object(Illuminate\\Http\\Request)) +#9 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(200): Illuminate\\Routing\\Router->dispatch(Object(Illuminate\\Http\\Request)) +#10 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(144): Illuminate\\Foundation\\Http\\Kernel->Illuminate\\Foundation\\Http\\{closure}(Object(Illuminate\\Http\\Request)) +#11 /var/www/html/vendor/barryvdh/laravel-debugbar/src/Middleware/InjectDebugbar.php(66): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#12 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Barryvdh\\Debugbar\\Middleware\\InjectDebugbar->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#13 /var/www/html/packages/Webkul/Installer/src/Http/Middleware/CanInstall.php(28): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#14 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Webkul\\Installer\\Http\\Middleware\\CanInstall->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#15 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php(21): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#16 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TrimStrings.php(40): Illuminate\\Foundation\\Http\\Middleware\\TransformsRequest->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#17 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Foundation\\Http\\Middleware\\TrimStrings->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#18 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/ValidatePostSize.php(27): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#19 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Foundation\\Http\\Middleware\\ValidatePostSize->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#20 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/PreventRequestsDuringMaintenance.php(99): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#21 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Foundation\\Http\\Middleware\\PreventRequestsDuringMaintenance->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#22 /var/www/html/vendor/laravel/framework/src/Illuminate/Http/Middleware/HandleCors.php(49): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#23 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Http\\Middleware\\HandleCors->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#24 /var/www/html/vendor/laravel/framework/src/Illuminate/Http/Middleware/TrustProxies.php(39): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#25 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Http\\Middleware\\TrustProxies->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#26 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(119): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#27 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(175): Illuminate\\Pipeline\\Pipeline->then(Object(Closure)) +#28 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(144): Illuminate\\Foundation\\Http\\Kernel->sendRequestThroughRouter(Object(Illuminate\\Http\\Request)) +#29 /var/www/html/public/index.php(51): Illuminate\\Foundation\\Http\\Kernel->handle(Object(Illuminate\\Http\\Request)) +#30 {main} +"} +[2026-01-29 15:34:43] local.ERROR: Tenant could not be identified on domain localhost {"exception":"[object] (Stancl\\Tenancy\\Exceptions\\TenantCouldNotBeIdentifiedOnDomainException(code: 0): Tenant could not be identified on domain localhost at /var/www/html/vendor/stancl/tenancy/src/Resolvers/DomainTenantResolver.php:48) +[stacktrace] +#0 /var/www/html/vendor/stancl/tenancy/src/Resolvers/Contracts/CachedTenantResolver.php(34): Stancl\\Tenancy\\Resolvers\\DomainTenantResolver->resolveWithoutCache('localhost') +#1 /var/www/html/vendor/stancl/tenancy/src/Middleware/IdentificationMiddleware.php(26): Stancl\\Tenancy\\Resolvers\\Contracts\\CachedTenantResolver->resolve('localhost') +#2 /var/www/html/vendor/stancl/tenancy/src/Middleware/InitializeTenancyByDomain.php(37): Stancl\\Tenancy\\Middleware\\IdentificationMiddleware->initializeTenancy(Object(Illuminate\\Http\\Request), Object(Closure), 'localhost') +#3 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Stancl\\Tenancy\\Middleware\\InitializeTenancyByDomain->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#4 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(119): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#5 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Router.php(805): Illuminate\\Pipeline\\Pipeline->then(Object(Closure)) +#6 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Router.php(784): Illuminate\\Routing\\Router->runRouteWithinStack(Object(Illuminate\\Routing\\Route), Object(Illuminate\\Http\\Request)) +#7 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Router.php(748): Illuminate\\Routing\\Router->runRoute(Object(Illuminate\\Http\\Request), Object(Illuminate\\Routing\\Route)) +#8 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Router.php(737): Illuminate\\Routing\\Router->dispatchToRoute(Object(Illuminate\\Http\\Request)) +#9 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(200): Illuminate\\Routing\\Router->dispatch(Object(Illuminate\\Http\\Request)) +#10 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(144): Illuminate\\Foundation\\Http\\Kernel->Illuminate\\Foundation\\Http\\{closure}(Object(Illuminate\\Http\\Request)) +#11 /var/www/html/vendor/barryvdh/laravel-debugbar/src/Middleware/InjectDebugbar.php(66): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#12 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Barryvdh\\Debugbar\\Middleware\\InjectDebugbar->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#13 /var/www/html/packages/Webkul/Installer/src/Http/Middleware/CanInstall.php(28): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#14 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Webkul\\Installer\\Http\\Middleware\\CanInstall->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#15 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php(21): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#16 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TrimStrings.php(40): Illuminate\\Foundation\\Http\\Middleware\\TransformsRequest->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#17 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Foundation\\Http\\Middleware\\TrimStrings->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#18 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/ValidatePostSize.php(27): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#19 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Foundation\\Http\\Middleware\\ValidatePostSize->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#20 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/PreventRequestsDuringMaintenance.php(99): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#21 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Foundation\\Http\\Middleware\\PreventRequestsDuringMaintenance->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#22 /var/www/html/vendor/laravel/framework/src/Illuminate/Http/Middleware/HandleCors.php(49): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#23 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Http\\Middleware\\HandleCors->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#24 /var/www/html/vendor/laravel/framework/src/Illuminate/Http/Middleware/TrustProxies.php(39): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#25 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Http\\Middleware\\TrustProxies->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#26 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(119): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#27 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(175): Illuminate\\Pipeline\\Pipeline->then(Object(Closure)) +#28 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(144): Illuminate\\Foundation\\Http\\Kernel->sendRequestThroughRouter(Object(Illuminate\\Http\\Request)) +#29 /var/www/html/public/index.php(51): Illuminate\\Foundation\\Http\\Kernel->handle(Object(Illuminate\\Http\\Request)) +#30 {main} +"} +[2026-01-29 15:34:49] local.ERROR: Tenant could not be identified on domain localhost {"exception":"[object] (Stancl\\Tenancy\\Exceptions\\TenantCouldNotBeIdentifiedOnDomainException(code: 0): Tenant could not be identified on domain localhost at /var/www/html/vendor/stancl/tenancy/src/Resolvers/DomainTenantResolver.php:48) +[stacktrace] +#0 /var/www/html/vendor/stancl/tenancy/src/Resolvers/Contracts/CachedTenantResolver.php(34): Stancl\\Tenancy\\Resolvers\\DomainTenantResolver->resolveWithoutCache('localhost') +#1 /var/www/html/vendor/stancl/tenancy/src/Middleware/IdentificationMiddleware.php(26): Stancl\\Tenancy\\Resolvers\\Contracts\\CachedTenantResolver->resolve('localhost') +#2 /var/www/html/vendor/stancl/tenancy/src/Middleware/InitializeTenancyByDomain.php(37): Stancl\\Tenancy\\Middleware\\IdentificationMiddleware->initializeTenancy(Object(Illuminate\\Http\\Request), Object(Closure), 'localhost') +#3 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Stancl\\Tenancy\\Middleware\\InitializeTenancyByDomain->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#4 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(119): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#5 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Router.php(805): Illuminate\\Pipeline\\Pipeline->then(Object(Closure)) +#6 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Router.php(784): Illuminate\\Routing\\Router->runRouteWithinStack(Object(Illuminate\\Routing\\Route), Object(Illuminate\\Http\\Request)) +#7 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Router.php(748): Illuminate\\Routing\\Router->runRoute(Object(Illuminate\\Http\\Request), Object(Illuminate\\Routing\\Route)) +#8 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Router.php(737): Illuminate\\Routing\\Router->dispatchToRoute(Object(Illuminate\\Http\\Request)) +#9 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(200): Illuminate\\Routing\\Router->dispatch(Object(Illuminate\\Http\\Request)) +#10 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(144): Illuminate\\Foundation\\Http\\Kernel->Illuminate\\Foundation\\Http\\{closure}(Object(Illuminate\\Http\\Request)) +#11 /var/www/html/vendor/barryvdh/laravel-debugbar/src/Middleware/InjectDebugbar.php(66): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#12 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Barryvdh\\Debugbar\\Middleware\\InjectDebugbar->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#13 /var/www/html/packages/Webkul/Installer/src/Http/Middleware/CanInstall.php(28): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#14 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Webkul\\Installer\\Http\\Middleware\\CanInstall->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#15 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php(21): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#16 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TrimStrings.php(40): Illuminate\\Foundation\\Http\\Middleware\\TransformsRequest->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#17 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Foundation\\Http\\Middleware\\TrimStrings->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#18 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/ValidatePostSize.php(27): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#19 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Foundation\\Http\\Middleware\\ValidatePostSize->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#20 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/PreventRequestsDuringMaintenance.php(99): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#21 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Foundation\\Http\\Middleware\\PreventRequestsDuringMaintenance->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#22 /var/www/html/vendor/laravel/framework/src/Illuminate/Http/Middleware/HandleCors.php(49): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#23 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Http\\Middleware\\HandleCors->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#24 /var/www/html/vendor/laravel/framework/src/Illuminate/Http/Middleware/TrustProxies.php(39): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#25 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Http\\Middleware\\TrustProxies->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#26 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(119): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#27 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(175): Illuminate\\Pipeline\\Pipeline->then(Object(Closure)) +#28 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(144): Illuminate\\Foundation\\Http\\Kernel->sendRequestThroughRouter(Object(Illuminate\\Http\\Request)) +#29 /var/www/html/public/index.php(51): Illuminate\\Foundation\\Http\\Kernel->handle(Object(Illuminate\\Http\\Request)) +#30 {main} +"} +[2026-01-29 15:37:07] local.ERROR: Tenant could not be identified on domain localhost {"exception":"[object] (Stancl\\Tenancy\\Exceptions\\TenantCouldNotBeIdentifiedOnDomainException(code: 0): Tenant could not be identified on domain localhost at /var/www/html/vendor/stancl/tenancy/src/Resolvers/DomainTenantResolver.php:48) +[stacktrace] +#0 /var/www/html/vendor/stancl/tenancy/src/Resolvers/Contracts/CachedTenantResolver.php(34): Stancl\\Tenancy\\Resolvers\\DomainTenantResolver->resolveWithoutCache('localhost') +#1 /var/www/html/vendor/stancl/tenancy/src/Middleware/IdentificationMiddleware.php(26): Stancl\\Tenancy\\Resolvers\\Contracts\\CachedTenantResolver->resolve('localhost') +#2 /var/www/html/vendor/stancl/tenancy/src/Middleware/InitializeTenancyByDomain.php(37): Stancl\\Tenancy\\Middleware\\IdentificationMiddleware->initializeTenancy(Object(Illuminate\\Http\\Request), Object(Closure), 'localhost') +#3 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Stancl\\Tenancy\\Middleware\\InitializeTenancyByDomain->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#4 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(119): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#5 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Router.php(805): Illuminate\\Pipeline\\Pipeline->then(Object(Closure)) +#6 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Router.php(784): Illuminate\\Routing\\Router->runRouteWithinStack(Object(Illuminate\\Routing\\Route), Object(Illuminate\\Http\\Request)) +#7 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Router.php(748): Illuminate\\Routing\\Router->runRoute(Object(Illuminate\\Http\\Request), Object(Illuminate\\Routing\\Route)) +#8 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Router.php(737): Illuminate\\Routing\\Router->dispatchToRoute(Object(Illuminate\\Http\\Request)) +#9 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(200): Illuminate\\Routing\\Router->dispatch(Object(Illuminate\\Http\\Request)) +#10 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(144): Illuminate\\Foundation\\Http\\Kernel->Illuminate\\Foundation\\Http\\{closure}(Object(Illuminate\\Http\\Request)) +#11 /var/www/html/vendor/barryvdh/laravel-debugbar/src/Middleware/InjectDebugbar.php(66): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#12 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Barryvdh\\Debugbar\\Middleware\\InjectDebugbar->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#13 /var/www/html/packages/Webkul/Installer/src/Http/Middleware/CanInstall.php(28): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#14 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Webkul\\Installer\\Http\\Middleware\\CanInstall->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#15 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php(21): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#16 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TrimStrings.php(40): Illuminate\\Foundation\\Http\\Middleware\\TransformsRequest->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#17 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Foundation\\Http\\Middleware\\TrimStrings->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#18 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/ValidatePostSize.php(27): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#19 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Foundation\\Http\\Middleware\\ValidatePostSize->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#20 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/PreventRequestsDuringMaintenance.php(99): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#21 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Foundation\\Http\\Middleware\\PreventRequestsDuringMaintenance->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#22 /var/www/html/vendor/laravel/framework/src/Illuminate/Http/Middleware/HandleCors.php(49): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#23 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Http\\Middleware\\HandleCors->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#24 /var/www/html/vendor/laravel/framework/src/Illuminate/Http/Middleware/TrustProxies.php(39): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#25 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Http\\Middleware\\TrustProxies->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#26 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(119): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#27 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(175): Illuminate\\Pipeline\\Pipeline->then(Object(Closure)) +#28 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(144): Illuminate\\Foundation\\Http\\Kernel->sendRequestThroughRouter(Object(Illuminate\\Http\\Request)) +#29 /var/www/html/public/index.php(51): Illuminate\\Foundation\\Http\\Kernel->handle(Object(Illuminate\\Http\\Request)) +#30 {main} +"} +[2026-01-29 15:37:11] local.ERROR: Tenant could not be identified on domain localhost {"exception":"[object] (Stancl\\Tenancy\\Exceptions\\TenantCouldNotBeIdentifiedOnDomainException(code: 0): Tenant could not be identified on domain localhost at /var/www/html/vendor/stancl/tenancy/src/Resolvers/DomainTenantResolver.php:48) +[stacktrace] +#0 /var/www/html/vendor/stancl/tenancy/src/Resolvers/Contracts/CachedTenantResolver.php(34): Stancl\\Tenancy\\Resolvers\\DomainTenantResolver->resolveWithoutCache('localhost') +#1 /var/www/html/vendor/stancl/tenancy/src/Middleware/IdentificationMiddleware.php(26): Stancl\\Tenancy\\Resolvers\\Contracts\\CachedTenantResolver->resolve('localhost') +#2 /var/www/html/vendor/stancl/tenancy/src/Middleware/InitializeTenancyByDomain.php(37): Stancl\\Tenancy\\Middleware\\IdentificationMiddleware->initializeTenancy(Object(Illuminate\\Http\\Request), Object(Closure), 'localhost') +#3 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Stancl\\Tenancy\\Middleware\\InitializeTenancyByDomain->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#4 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(119): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#5 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Router.php(805): Illuminate\\Pipeline\\Pipeline->then(Object(Closure)) +#6 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Router.php(784): Illuminate\\Routing\\Router->runRouteWithinStack(Object(Illuminate\\Routing\\Route), Object(Illuminate\\Http\\Request)) +#7 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Router.php(748): Illuminate\\Routing\\Router->runRoute(Object(Illuminate\\Http\\Request), Object(Illuminate\\Routing\\Route)) +#8 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Router.php(737): Illuminate\\Routing\\Router->dispatchToRoute(Object(Illuminate\\Http\\Request)) +#9 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(200): Illuminate\\Routing\\Router->dispatch(Object(Illuminate\\Http\\Request)) +#10 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(144): Illuminate\\Foundation\\Http\\Kernel->Illuminate\\Foundation\\Http\\{closure}(Object(Illuminate\\Http\\Request)) +#11 /var/www/html/vendor/barryvdh/laravel-debugbar/src/Middleware/InjectDebugbar.php(66): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#12 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Barryvdh\\Debugbar\\Middleware\\InjectDebugbar->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#13 /var/www/html/packages/Webkul/Installer/src/Http/Middleware/CanInstall.php(28): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#14 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Webkul\\Installer\\Http\\Middleware\\CanInstall->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#15 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php(21): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#16 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TrimStrings.php(40): Illuminate\\Foundation\\Http\\Middleware\\TransformsRequest->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#17 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Foundation\\Http\\Middleware\\TrimStrings->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#18 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/ValidatePostSize.php(27): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#19 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Foundation\\Http\\Middleware\\ValidatePostSize->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#20 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/PreventRequestsDuringMaintenance.php(99): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#21 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Foundation\\Http\\Middleware\\PreventRequestsDuringMaintenance->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#22 /var/www/html/vendor/laravel/framework/src/Illuminate/Http/Middleware/HandleCors.php(49): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#23 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Http\\Middleware\\HandleCors->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#24 /var/www/html/vendor/laravel/framework/src/Illuminate/Http/Middleware/TrustProxies.php(39): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#25 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Http\\Middleware\\TrustProxies->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#26 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(119): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#27 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(175): Illuminate\\Pipeline\\Pipeline->then(Object(Closure)) +#28 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(144): Illuminate\\Foundation\\Http\\Kernel->sendRequestThroughRouter(Object(Illuminate\\Http\\Request)) +#29 /var/www/html/public/index.php(51): Illuminate\\Foundation\\Http\\Kernel->handle(Object(Illuminate\\Http\\Request)) +#30 {main} +"} +[2026-01-29 15:42:53] local.ERROR: Tenant could not be identified on domain localhost {"exception":"[object] (Stancl\\Tenancy\\Exceptions\\TenantCouldNotBeIdentifiedOnDomainException(code: 0): Tenant could not be identified on domain localhost at /var/www/html/vendor/stancl/tenancy/src/Resolvers/DomainTenantResolver.php:48) +[stacktrace] +#0 /var/www/html/vendor/stancl/tenancy/src/Resolvers/Contracts/CachedTenantResolver.php(34): Stancl\\Tenancy\\Resolvers\\DomainTenantResolver->resolveWithoutCache('localhost') +#1 /var/www/html/vendor/stancl/tenancy/src/Middleware/IdentificationMiddleware.php(26): Stancl\\Tenancy\\Resolvers\\Contracts\\CachedTenantResolver->resolve('localhost') +#2 /var/www/html/vendor/stancl/tenancy/src/Middleware/InitializeTenancyByDomain.php(37): Stancl\\Tenancy\\Middleware\\IdentificationMiddleware->initializeTenancy(Object(Illuminate\\Http\\Request), Object(Closure), 'localhost') +#3 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Stancl\\Tenancy\\Middleware\\InitializeTenancyByDomain->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#4 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(119): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#5 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Router.php(805): Illuminate\\Pipeline\\Pipeline->then(Object(Closure)) +#6 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Router.php(784): Illuminate\\Routing\\Router->runRouteWithinStack(Object(Illuminate\\Routing\\Route), Object(Illuminate\\Http\\Request)) +#7 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Router.php(748): Illuminate\\Routing\\Router->runRoute(Object(Illuminate\\Http\\Request), Object(Illuminate\\Routing\\Route)) +#8 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Router.php(737): Illuminate\\Routing\\Router->dispatchToRoute(Object(Illuminate\\Http\\Request)) +#9 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(200): Illuminate\\Routing\\Router->dispatch(Object(Illuminate\\Http\\Request)) +#10 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(144): Illuminate\\Foundation\\Http\\Kernel->Illuminate\\Foundation\\Http\\{closure}(Object(Illuminate\\Http\\Request)) +#11 /var/www/html/vendor/barryvdh/laravel-debugbar/src/Middleware/InjectDebugbar.php(66): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#12 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Barryvdh\\Debugbar\\Middleware\\InjectDebugbar->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#13 /var/www/html/packages/Webkul/Installer/src/Http/Middleware/CanInstall.php(28): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#14 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Webkul\\Installer\\Http\\Middleware\\CanInstall->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#15 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php(21): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#16 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TrimStrings.php(40): Illuminate\\Foundation\\Http\\Middleware\\TransformsRequest->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#17 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Foundation\\Http\\Middleware\\TrimStrings->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#18 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/ValidatePostSize.php(27): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#19 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Foundation\\Http\\Middleware\\ValidatePostSize->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#20 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/PreventRequestsDuringMaintenance.php(99): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#21 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Foundation\\Http\\Middleware\\PreventRequestsDuringMaintenance->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#22 /var/www/html/vendor/laravel/framework/src/Illuminate/Http/Middleware/HandleCors.php(49): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#23 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Http\\Middleware\\HandleCors->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#24 /var/www/html/vendor/laravel/framework/src/Illuminate/Http/Middleware/TrustProxies.php(39): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#25 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Http\\Middleware\\TrustProxies->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#26 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(119): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#27 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(175): Illuminate\\Pipeline\\Pipeline->then(Object(Closure)) +#28 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(144): Illuminate\\Foundation\\Http\\Kernel->sendRequestThroughRouter(Object(Illuminate\\Http\\Request)) +#29 /var/www/html/public/index.php(51): Illuminate\\Foundation\\Http\\Kernel->handle(Object(Illuminate\\Http\\Request)) +#30 {main} +"} +[2026-01-29 16:07:29] local.ERROR: SQLSTATE[42S22]: Column not found: 1054 Unknown column 'channel_code' in 'field list' (Connection: tenant, SQL: insert into `core_config` (`code`, `value`, `channel_code`, `locale_code`) values (general.general.locale.code, pt_BR, ?, ?)) {"exception":"[object] (Illuminate\\Database\\QueryException(code: 42S22): SQLSTATE[42S22]: Column not found: 1054 Unknown column 'channel_code' in 'field list' (Connection: tenant, SQL: insert into `core_config` (`code`, `value`, `channel_code`, `locale_code`) values (general.general.locale.code, pt_BR, ?, ?)) at /var/www/html/vendor/laravel/framework/src/Illuminate/Database/Connection.php:829) +[stacktrace] +#0 /var/www/html/vendor/laravel/framework/src/Illuminate/Database/Connection.php(783): Illuminate\\Database\\Connection->runQueryCallback('insert into `co...', Array, Object(Closure)) +#1 /var/www/html/vendor/laravel/framework/src/Illuminate/Database/MySqlConnection.php(34): Illuminate\\Database\\Connection->run('insert into `co...', Array, Object(Closure)) +#2 /var/www/html/vendor/laravel/framework/src/Illuminate/Database/Query/Builder.php(3498): Illuminate\\Database\\MySqlConnection->insert('insert into `co...', Array) +#3 /var/www/html/vendor/laravel/framework/src/Illuminate/Database/Query/Builder.php(3638): Illuminate\\Database\\Query\\Builder->insert(Array) +#4 /var/www/html/fix-locale.php(36): Illuminate\\Database\\Query\\Builder->updateOrInsert(Array, Array) +#5 {main} + +[previous exception] [object] (PDOException(code: 42S22): SQLSTATE[42S22]: Column not found: 1054 Unknown column 'channel_code' in 'field list' at /var/www/html/vendor/laravel/framework/src/Illuminate/Database/MySqlConnection.php:39) +[stacktrace] +#0 /var/www/html/vendor/laravel/framework/src/Illuminate/Database/MySqlConnection.php(39): PDO->prepare('insert into `co...') +#1 /var/www/html/vendor/laravel/framework/src/Illuminate/Database/Connection.php(816): Illuminate\\Database\\MySqlConnection->Illuminate\\Database\\{closure}('insert into `co...', Array) +#2 /var/www/html/vendor/laravel/framework/src/Illuminate/Database/Connection.php(783): Illuminate\\Database\\Connection->runQueryCallback('insert into `co...', Array, Object(Closure)) +#3 /var/www/html/vendor/laravel/framework/src/Illuminate/Database/MySqlConnection.php(34): Illuminate\\Database\\Connection->run('insert into `co...', Array, Object(Closure)) +#4 /var/www/html/vendor/laravel/framework/src/Illuminate/Database/Query/Builder.php(3498): Illuminate\\Database\\MySqlConnection->insert('insert into `co...', Array) +#5 /var/www/html/vendor/laravel/framework/src/Illuminate/Database/Query/Builder.php(3638): Illuminate\\Database\\Query\\Builder->insert(Array) +#6 /var/www/html/fix-locale.php(36): Illuminate\\Database\\Query\\Builder->updateOrInsert(Array, Array) +#7 {main} +"} +[2026-01-30 12:00:58] local.ERROR: Tenant could not be identified on domain localhost {"exception":"[object] (Stancl\\Tenancy\\Exceptions\\TenantCouldNotBeIdentifiedOnDomainException(code: 0): Tenant could not be identified on domain localhost at /var/www/html/vendor/stancl/tenancy/src/Resolvers/DomainTenantResolver.php:48) +[stacktrace] +#0 /var/www/html/vendor/stancl/tenancy/src/Resolvers/Contracts/CachedTenantResolver.php(34): Stancl\\Tenancy\\Resolvers\\DomainTenantResolver->resolveWithoutCache('localhost') +#1 /var/www/html/vendor/stancl/tenancy/src/Middleware/IdentificationMiddleware.php(26): Stancl\\Tenancy\\Resolvers\\Contracts\\CachedTenantResolver->resolve('localhost') +#2 /var/www/html/vendor/stancl/tenancy/src/Middleware/InitializeTenancyByDomain.php(37): Stancl\\Tenancy\\Middleware\\IdentificationMiddleware->initializeTenancy(Object(Illuminate\\Http\\Request), Object(Closure), 'localhost') +#3 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Stancl\\Tenancy\\Middleware\\InitializeTenancyByDomain->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#4 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(119): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#5 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Router.php(805): Illuminate\\Pipeline\\Pipeline->then(Object(Closure)) +#6 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Router.php(784): Illuminate\\Routing\\Router->runRouteWithinStack(Object(Illuminate\\Routing\\Route), Object(Illuminate\\Http\\Request)) +#7 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Router.php(748): Illuminate\\Routing\\Router->runRoute(Object(Illuminate\\Http\\Request), Object(Illuminate\\Routing\\Route)) +#8 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Router.php(737): Illuminate\\Routing\\Router->dispatchToRoute(Object(Illuminate\\Http\\Request)) +#9 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(200): Illuminate\\Routing\\Router->dispatch(Object(Illuminate\\Http\\Request)) +#10 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(144): Illuminate\\Foundation\\Http\\Kernel->Illuminate\\Foundation\\Http\\{closure}(Object(Illuminate\\Http\\Request)) +#11 /var/www/html/vendor/barryvdh/laravel-debugbar/src/Middleware/InjectDebugbar.php(66): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#12 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Barryvdh\\Debugbar\\Middleware\\InjectDebugbar->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#13 /var/www/html/packages/Webkul/Installer/src/Http/Middleware/CanInstall.php(28): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#14 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Webkul\\Installer\\Http\\Middleware\\CanInstall->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#15 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php(21): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#16 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TrimStrings.php(40): Illuminate\\Foundation\\Http\\Middleware\\TransformsRequest->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#17 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Foundation\\Http\\Middleware\\TrimStrings->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#18 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/ValidatePostSize.php(27): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#19 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Foundation\\Http\\Middleware\\ValidatePostSize->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#20 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/PreventRequestsDuringMaintenance.php(99): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#21 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Foundation\\Http\\Middleware\\PreventRequestsDuringMaintenance->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#22 /var/www/html/vendor/laravel/framework/src/Illuminate/Http/Middleware/HandleCors.php(49): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#23 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Http\\Middleware\\HandleCors->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#24 /var/www/html/vendor/laravel/framework/src/Illuminate/Http/Middleware/TrustProxies.php(39): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#25 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Http\\Middleware\\TrustProxies->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#26 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(119): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#27 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(175): Illuminate\\Pipeline\\Pipeline->then(Object(Closure)) +#28 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(144): Illuminate\\Foundation\\Http\\Kernel->sendRequestThroughRouter(Object(Illuminate\\Http\\Request)) +#29 /var/www/html/public/index.php(51): Illuminate\\Foundation\\Http\\Kernel->handle(Object(Illuminate\\Http\\Request)) +#30 {main} +"} +[2026-01-30 14:17:29] local.ERROR: Debugbar exception: Database connection [tenant] not configured. +[2026-01-30 15:15:02] local.ERROR: file_put_contents(/var/www/html/storage/tenanttenant1/framework/cache/repository-cache-keys.json): Failed to open stream: No such file or directory +[2026-01-30 15:27:14] local.ERROR: file_put_contents(/var/www/html/storage/tenanttenant2/framework/cache/repository-cache-keys.json): Failed to open stream: No such file or directory +[2026-01-30 15:44:27] local.INFO: Core Config Keys: general, general.general, general.general.locale_settings, general.general.admin_logo, general.settings, general.settings.footer, general.settings.menu, general.settings.menu_color, general.magic_ai, general.magic_ai.settings, general.magic_ai.doc_generation, email, email.imap, email.imap.account +[2026-02-02 09:14:24] local.ERROR: file_put_contents(/var/www/html/storage/tenanttenant1/framework/cache/repository-cache-keys.json): Failed to open stream: No such file or directory +[2026-02-02 09:14:27] local.ERROR: file_put_contents(/var/www/html/storage/tenanttenant1/framework/cache/repository-cache-keys.json): Failed to open stream: No such file or directory +[2026-02-02 09:14:30] local.ERROR: file_put_contents(/var/www/html/storage/tenanttenant1/framework/cache/repository-cache-keys.json): Failed to open stream: No such file or directory +[2026-02-02 09:30:37] local.ERROR: file_put_contents(/var/www/html/storage/tenanttenant2/framework/cache/repository-cache-keys.json): Failed to open stream: No such file or directory +[2026-02-02 09:37:18] local.ERROR: file_put_contents(/var/www/html/storage/tenanttenant1/framework/cache/repository-cache-keys.json): Failed to open stream: No such file or directory +[2026-02-02 09:37:27] local.ERROR: file_put_contents(/var/www/html/storage/tenanttenant1/framework/cache/repository-cache-keys.json): Failed to open stream: No such file or directory +[2026-02-02 09:40:50] local.ERROR: SQLSTATE[42S02]: Base table or view not found: 1146 Table 'tenant_tenant2.tenants' doesn't exist (Connection: tenant, SQL: select count(*) as aggregate from `tenants` where `id` = tenant3) {"userId":1,"exception":"[object] (Illuminate\\Database\\QueryException(code: 42S02): SQLSTATE[42S02]: Base table or view not found: 1146 Table 'tenant_tenant2.tenants' doesn't exist (Connection: tenant, SQL: select count(*) as aggregate from `tenants` where `id` = tenant3) at /var/www/html/vendor/laravel/framework/src/Illuminate/Database/Connection.php:829) +[stacktrace] +#0 /var/www/html/vendor/laravel/framework/src/Illuminate/Database/Connection.php(783): Illuminate\\Database\\Connection->runQueryCallback('select count(*)...', Array, Object(Closure)) +#1 /var/www/html/vendor/laravel/framework/src/Illuminate/Database/Connection.php(414): Illuminate\\Database\\Connection->run('select count(*)...', Array, Object(Closure)) +#2 /var/www/html/vendor/laravel/framework/src/Illuminate/Database/Query/Builder.php(2913): Illuminate\\Database\\Connection->select('select count(*)...', Array, false) +#3 /var/www/html/vendor/laravel/framework/src/Illuminate/Database/Query/Builder.php(2902): Illuminate\\Database\\Query\\Builder->runSelect() +#4 /var/www/html/vendor/laravel/framework/src/Illuminate/Database/Query/Builder.php(3456): Illuminate\\Database\\Query\\Builder->Illuminate\\Database\\Query\\{closure}() +#5 /var/www/html/vendor/laravel/framework/src/Illuminate/Database/Query/Builder.php(2901): Illuminate\\Database\\Query\\Builder->onceWithColumns(Array, Object(Closure)) +#6 /var/www/html/vendor/laravel/framework/src/Illuminate/Database/Query/Builder.php(3383): Illuminate\\Database\\Query\\Builder->get(Array) +#7 /var/www/html/vendor/laravel/framework/src/Illuminate/Database/Query/Builder.php(3311): Illuminate\\Database\\Query\\Builder->aggregate('count', Array) +#8 /var/www/html/vendor/laravel/framework/src/Illuminate/Validation/DatabasePresenceVerifier.php(54): Illuminate\\Database\\Query\\Builder->count() +#9 /var/www/html/vendor/laravel/framework/src/Illuminate/Validation/Concerns/ValidatesAttributes.php(948): Illuminate\\Validation\\DatabasePresenceVerifier->getCount('tenants', 'id', 'tenant3', NULL, NULL, Array) +#10 /var/www/html/vendor/laravel/framework/src/Illuminate/Validation/Validator.php(660): Illuminate\\Validation\\Validator->validateUnique('id', 'tenant3', Array, Object(Illuminate\\Validation\\Validator)) +#11 /var/www/html/vendor/laravel/framework/src/Illuminate/Validation/Validator.php(459): Illuminate\\Validation\\Validator->validateAttribute('id', 'Unique') +#12 /var/www/html/vendor/laravel/framework/src/Illuminate/Validation/Validator.php(494): Illuminate\\Validation\\Validator->passes() +#13 /var/www/html/vendor/laravel/framework/src/Illuminate/Validation/Validator.php(536): Illuminate\\Validation\\Validator->fails() +#14 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Providers/FoundationServiceProvider.php(124): Illuminate\\Validation\\Validator->validate() +#15 /var/www/html/vendor/laravel/framework/src/Illuminate/Macroable/Traits/Macroable.php(123): Illuminate\\Http\\Request->Illuminate\\Foundation\\Providers\\{closure}(Array) +#16 /var/www/html/app/Http/Controllers/SuperAdmin/TenantController.php(24): Illuminate\\Http\\Request->__call('validate', Array) +#17 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Controller.php(54): App\\Http\\Controllers\\SuperAdmin\\TenantController->store(Object(Illuminate\\Http\\Request)) +#18 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/ControllerDispatcher.php(43): Illuminate\\Routing\\Controller->callAction('store', Array) +#19 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Route.php(259): Illuminate\\Routing\\ControllerDispatcher->dispatch(Object(Illuminate\\Routing\\Route), Object(App\\Http\\Controllers\\SuperAdmin\\TenantController), 'store') +#20 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Route.php(205): Illuminate\\Routing\\Route->runController() +#21 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Router.php(806): Illuminate\\Routing\\Route->run() +#22 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(144): Illuminate\\Routing\\Router->Illuminate\\Routing\\{closure}(Object(Illuminate\\Http\\Request)) +#23 /var/www/html/vendor/barryvdh/laravel-debugbar/src/Middleware/InjectDebugbar.php(66): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#24 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Barryvdh\\Debugbar\\Middleware\\InjectDebugbar->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#25 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Middleware/SubstituteBindings.php(50): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#26 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Routing\\Middleware\\SubstituteBindings->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#27 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/VerifyCsrfToken.php(78): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#28 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Foundation\\Http\\Middleware\\VerifyCsrfToken->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#29 /var/www/html/vendor/laravel/framework/src/Illuminate/View/Middleware/ShareErrorsFromSession.php(49): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#30 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\View\\Middleware\\ShareErrorsFromSession->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#31 /var/www/html/vendor/laravel/framework/src/Illuminate/Session/Middleware/StartSession.php(121): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#32 /var/www/html/vendor/laravel/framework/src/Illuminate/Session/Middleware/StartSession.php(64): Illuminate\\Session\\Middleware\\StartSession->handleStatefulRequest(Object(Illuminate\\Http\\Request), Object(Illuminate\\Session\\Store), Object(Closure)) +#33 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Session\\Middleware\\StartSession->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#34 /var/www/html/vendor/laravel/framework/src/Illuminate/Cookie/Middleware/AddQueuedCookiesToResponse.php(37): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#35 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Cookie\\Middleware\\AddQueuedCookiesToResponse->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#36 /var/www/html/vendor/laravel/framework/src/Illuminate/Cookie/Middleware/EncryptCookies.php(67): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#37 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Cookie\\Middleware\\EncryptCookies->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#38 /var/www/html/vendor/stancl/tenancy/src/Middleware/IdentificationMiddleware.php(36): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#39 /var/www/html/vendor/stancl/tenancy/src/Middleware/InitializeTenancyByDomain.php(37): Stancl\\Tenancy\\Middleware\\IdentificationMiddleware->initializeTenancy(Object(Illuminate\\Http\\Request), Object(Closure), 'tenant2.localho...') +#40 /var/www/html/app/Http/Middleware/UniversalTenancy.php(20): Stancl\\Tenancy\\Middleware\\InitializeTenancyByDomain->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#41 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): App\\Http\\Middleware\\UniversalTenancy->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#42 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(119): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#43 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Router.php(805): Illuminate\\Pipeline\\Pipeline->then(Object(Closure)) +#44 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Router.php(784): Illuminate\\Routing\\Router->runRouteWithinStack(Object(Illuminate\\Routing\\Route), Object(Illuminate\\Http\\Request)) +#45 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Router.php(748): Illuminate\\Routing\\Router->runRoute(Object(Illuminate\\Http\\Request), Object(Illuminate\\Routing\\Route)) +#46 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Router.php(737): Illuminate\\Routing\\Router->dispatchToRoute(Object(Illuminate\\Http\\Request)) +#47 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(200): Illuminate\\Routing\\Router->dispatch(Object(Illuminate\\Http\\Request)) +#48 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(144): Illuminate\\Foundation\\Http\\Kernel->Illuminate\\Foundation\\Http\\{closure}(Object(Illuminate\\Http\\Request)) +#49 /var/www/html/vendor/barryvdh/laravel-debugbar/src/Middleware/InjectDebugbar.php(66): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#50 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Barryvdh\\Debugbar\\Middleware\\InjectDebugbar->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#51 /var/www/html/packages/Webkul/Installer/src/Http/Middleware/CanInstall.php(28): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#52 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Webkul\\Installer\\Http\\Middleware\\CanInstall->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#53 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php(21): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#54 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TrimStrings.php(40): Illuminate\\Foundation\\Http\\Middleware\\TransformsRequest->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#55 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Foundation\\Http\\Middleware\\TrimStrings->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#56 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/ValidatePostSize.php(27): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#57 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Foundation\\Http\\Middleware\\ValidatePostSize->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#58 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/PreventRequestsDuringMaintenance.php(99): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#59 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Foundation\\Http\\Middleware\\PreventRequestsDuringMaintenance->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#60 /var/www/html/vendor/laravel/framework/src/Illuminate/Http/Middleware/HandleCors.php(49): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#61 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Http\\Middleware\\HandleCors->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#62 /var/www/html/vendor/laravel/framework/src/Illuminate/Http/Middleware/TrustProxies.php(39): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#63 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Http\\Middleware\\TrustProxies->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#64 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(119): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#65 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(175): Illuminate\\Pipeline\\Pipeline->then(Object(Closure)) +#66 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(144): Illuminate\\Foundation\\Http\\Kernel->sendRequestThroughRouter(Object(Illuminate\\Http\\Request)) +#67 /var/www/html/public/index.php(51): Illuminate\\Foundation\\Http\\Kernel->handle(Object(Illuminate\\Http\\Request)) +#68 {main} + +[previous exception] [object] (PDOException(code: 42S02): SQLSTATE[42S02]: Base table or view not found: 1146 Table 'tenant_tenant2.tenants' doesn't exist at /var/www/html/vendor/laravel/framework/src/Illuminate/Database/Connection.php:423) +[stacktrace] +#0 /var/www/html/vendor/laravel/framework/src/Illuminate/Database/Connection.php(423): PDO->prepare('select count(*)...') +#1 /var/www/html/vendor/laravel/framework/src/Illuminate/Database/Connection.php(816): Illuminate\\Database\\Connection->Illuminate\\Database\\{closure}('select count(*)...', Array) +#2 /var/www/html/vendor/laravel/framework/src/Illuminate/Database/Connection.php(783): Illuminate\\Database\\Connection->runQueryCallback('select count(*)...', Array, Object(Closure)) +#3 /var/www/html/vendor/laravel/framework/src/Illuminate/Database/Connection.php(414): Illuminate\\Database\\Connection->run('select count(*)...', Array, Object(Closure)) +#4 /var/www/html/vendor/laravel/framework/src/Illuminate/Database/Query/Builder.php(2913): Illuminate\\Database\\Connection->select('select count(*)...', Array, false) +#5 /var/www/html/vendor/laravel/framework/src/Illuminate/Database/Query/Builder.php(2902): Illuminate\\Database\\Query\\Builder->runSelect() +#6 /var/www/html/vendor/laravel/framework/src/Illuminate/Database/Query/Builder.php(3456): Illuminate\\Database\\Query\\Builder->Illuminate\\Database\\Query\\{closure}() +#7 /var/www/html/vendor/laravel/framework/src/Illuminate/Database/Query/Builder.php(2901): Illuminate\\Database\\Query\\Builder->onceWithColumns(Array, Object(Closure)) +#8 /var/www/html/vendor/laravel/framework/src/Illuminate/Database/Query/Builder.php(3383): Illuminate\\Database\\Query\\Builder->get(Array) +#9 /var/www/html/vendor/laravel/framework/src/Illuminate/Database/Query/Builder.php(3311): Illuminate\\Database\\Query\\Builder->aggregate('count', Array) +#10 /var/www/html/vendor/laravel/framework/src/Illuminate/Validation/DatabasePresenceVerifier.php(54): Illuminate\\Database\\Query\\Builder->count() +#11 /var/www/html/vendor/laravel/framework/src/Illuminate/Validation/Concerns/ValidatesAttributes.php(948): Illuminate\\Validation\\DatabasePresenceVerifier->getCount('tenants', 'id', 'tenant3', NULL, NULL, Array) +#12 /var/www/html/vendor/laravel/framework/src/Illuminate/Validation/Validator.php(660): Illuminate\\Validation\\Validator->validateUnique('id', 'tenant3', Array, Object(Illuminate\\Validation\\Validator)) +#13 /var/www/html/vendor/laravel/framework/src/Illuminate/Validation/Validator.php(459): Illuminate\\Validation\\Validator->validateAttribute('id', 'Unique') +#14 /var/www/html/vendor/laravel/framework/src/Illuminate/Validation/Validator.php(494): Illuminate\\Validation\\Validator->passes() +#15 /var/www/html/vendor/laravel/framework/src/Illuminate/Validation/Validator.php(536): Illuminate\\Validation\\Validator->fails() +#16 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Providers/FoundationServiceProvider.php(124): Illuminate\\Validation\\Validator->validate() +#17 /var/www/html/vendor/laravel/framework/src/Illuminate/Macroable/Traits/Macroable.php(123): Illuminate\\Http\\Request->Illuminate\\Foundation\\Providers\\{closure}(Array) +#18 /var/www/html/app/Http/Controllers/SuperAdmin/TenantController.php(24): Illuminate\\Http\\Request->__call('validate', Array) +#19 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Controller.php(54): App\\Http\\Controllers\\SuperAdmin\\TenantController->store(Object(Illuminate\\Http\\Request)) +#20 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/ControllerDispatcher.php(43): Illuminate\\Routing\\Controller->callAction('store', Array) +#21 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Route.php(259): Illuminate\\Routing\\ControllerDispatcher->dispatch(Object(Illuminate\\Routing\\Route), Object(App\\Http\\Controllers\\SuperAdmin\\TenantController), 'store') +#22 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Route.php(205): Illuminate\\Routing\\Route->runController() +#23 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Router.php(806): Illuminate\\Routing\\Route->run() +#24 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(144): Illuminate\\Routing\\Router->Illuminate\\Routing\\{closure}(Object(Illuminate\\Http\\Request)) +#25 /var/www/html/vendor/barryvdh/laravel-debugbar/src/Middleware/InjectDebugbar.php(66): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#26 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Barryvdh\\Debugbar\\Middleware\\InjectDebugbar->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#27 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Middleware/SubstituteBindings.php(50): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#28 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Routing\\Middleware\\SubstituteBindings->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#29 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/VerifyCsrfToken.php(78): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#30 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Foundation\\Http\\Middleware\\VerifyCsrfToken->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#31 /var/www/html/vendor/laravel/framework/src/Illuminate/View/Middleware/ShareErrorsFromSession.php(49): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#32 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\View\\Middleware\\ShareErrorsFromSession->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#33 /var/www/html/vendor/laravel/framework/src/Illuminate/Session/Middleware/StartSession.php(121): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#34 /var/www/html/vendor/laravel/framework/src/Illuminate/Session/Middleware/StartSession.php(64): Illuminate\\Session\\Middleware\\StartSession->handleStatefulRequest(Object(Illuminate\\Http\\Request), Object(Illuminate\\Session\\Store), Object(Closure)) +#35 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Session\\Middleware\\StartSession->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#36 /var/www/html/vendor/laravel/framework/src/Illuminate/Cookie/Middleware/AddQueuedCookiesToResponse.php(37): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#37 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Cookie\\Middleware\\AddQueuedCookiesToResponse->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#38 /var/www/html/vendor/laravel/framework/src/Illuminate/Cookie/Middleware/EncryptCookies.php(67): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#39 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Cookie\\Middleware\\EncryptCookies->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#40 /var/www/html/vendor/stancl/tenancy/src/Middleware/IdentificationMiddleware.php(36): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#41 /var/www/html/vendor/stancl/tenancy/src/Middleware/InitializeTenancyByDomain.php(37): Stancl\\Tenancy\\Middleware\\IdentificationMiddleware->initializeTenancy(Object(Illuminate\\Http\\Request), Object(Closure), 'tenant2.localho...') +#42 /var/www/html/app/Http/Middleware/UniversalTenancy.php(20): Stancl\\Tenancy\\Middleware\\InitializeTenancyByDomain->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#43 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): App\\Http\\Middleware\\UniversalTenancy->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#44 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(119): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#45 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Router.php(805): Illuminate\\Pipeline\\Pipeline->then(Object(Closure)) +#46 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Router.php(784): Illuminate\\Routing\\Router->runRouteWithinStack(Object(Illuminate\\Routing\\Route), Object(Illuminate\\Http\\Request)) +#47 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Router.php(748): Illuminate\\Routing\\Router->runRoute(Object(Illuminate\\Http\\Request), Object(Illuminate\\Routing\\Route)) +#48 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Router.php(737): Illuminate\\Routing\\Router->dispatchToRoute(Object(Illuminate\\Http\\Request)) +#49 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(200): Illuminate\\Routing\\Router->dispatch(Object(Illuminate\\Http\\Request)) +#50 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(144): Illuminate\\Foundation\\Http\\Kernel->Illuminate\\Foundation\\Http\\{closure}(Object(Illuminate\\Http\\Request)) +#51 /var/www/html/vendor/barryvdh/laravel-debugbar/src/Middleware/InjectDebugbar.php(66): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#52 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Barryvdh\\Debugbar\\Middleware\\InjectDebugbar->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#53 /var/www/html/packages/Webkul/Installer/src/Http/Middleware/CanInstall.php(28): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#54 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Webkul\\Installer\\Http\\Middleware\\CanInstall->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#55 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php(21): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#56 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TrimStrings.php(40): Illuminate\\Foundation\\Http\\Middleware\\TransformsRequest->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#57 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Foundation\\Http\\Middleware\\TrimStrings->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#58 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/ValidatePostSize.php(27): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#59 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Foundation\\Http\\Middleware\\ValidatePostSize->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#60 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/PreventRequestsDuringMaintenance.php(99): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#61 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Foundation\\Http\\Middleware\\PreventRequestsDuringMaintenance->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#62 /var/www/html/vendor/laravel/framework/src/Illuminate/Http/Middleware/HandleCors.php(49): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#63 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Http\\Middleware\\HandleCors->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#64 /var/www/html/vendor/laravel/framework/src/Illuminate/Http/Middleware/TrustProxies.php(39): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#65 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Http\\Middleware\\TrustProxies->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#66 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(119): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#67 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(175): Illuminate\\Pipeline\\Pipeline->then(Object(Closure)) +#68 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(144): Illuminate\\Foundation\\Http\\Kernel->sendRequestThroughRouter(Object(Illuminate\\Http\\Request)) +#69 /var/www/html/public/index.php(51): Illuminate\\Foundation\\Http\\Kernel->handle(Object(Illuminate\\Http\\Request)) +#70 {main} +"} +[2026-02-02 09:41:05] local.ERROR: SQLSTATE[42S02]: Base table or view not found: 1146 Table 'tenant_tenant2.tenants' doesn't exist (Connection: tenant, SQL: select count(*) as aggregate from `tenants` where `id` = tenant3) {"userId":1,"exception":"[object] (Illuminate\\Database\\QueryException(code: 42S02): SQLSTATE[42S02]: Base table or view not found: 1146 Table 'tenant_tenant2.tenants' doesn't exist (Connection: tenant, SQL: select count(*) as aggregate from `tenants` where `id` = tenant3) at /var/www/html/vendor/laravel/framework/src/Illuminate/Database/Connection.php:829) +[stacktrace] +#0 /var/www/html/vendor/laravel/framework/src/Illuminate/Database/Connection.php(783): Illuminate\\Database\\Connection->runQueryCallback('select count(*)...', Array, Object(Closure)) +#1 /var/www/html/vendor/laravel/framework/src/Illuminate/Database/Connection.php(414): Illuminate\\Database\\Connection->run('select count(*)...', Array, Object(Closure)) +#2 /var/www/html/vendor/laravel/framework/src/Illuminate/Database/Query/Builder.php(2913): Illuminate\\Database\\Connection->select('select count(*)...', Array, false) +#3 /var/www/html/vendor/laravel/framework/src/Illuminate/Database/Query/Builder.php(2902): Illuminate\\Database\\Query\\Builder->runSelect() +#4 /var/www/html/vendor/laravel/framework/src/Illuminate/Database/Query/Builder.php(3456): Illuminate\\Database\\Query\\Builder->Illuminate\\Database\\Query\\{closure}() +#5 /var/www/html/vendor/laravel/framework/src/Illuminate/Database/Query/Builder.php(2901): Illuminate\\Database\\Query\\Builder->onceWithColumns(Array, Object(Closure)) +#6 /var/www/html/vendor/laravel/framework/src/Illuminate/Database/Query/Builder.php(3383): Illuminate\\Database\\Query\\Builder->get(Array) +#7 /var/www/html/vendor/laravel/framework/src/Illuminate/Database/Query/Builder.php(3311): Illuminate\\Database\\Query\\Builder->aggregate('count', Array) +#8 /var/www/html/vendor/laravel/framework/src/Illuminate/Validation/DatabasePresenceVerifier.php(54): Illuminate\\Database\\Query\\Builder->count() +#9 /var/www/html/vendor/laravel/framework/src/Illuminate/Validation/Concerns/ValidatesAttributes.php(948): Illuminate\\Validation\\DatabasePresenceVerifier->getCount('tenants', 'id', 'tenant3', NULL, NULL, Array) +#10 /var/www/html/vendor/laravel/framework/src/Illuminate/Validation/Validator.php(660): Illuminate\\Validation\\Validator->validateUnique('id', 'tenant3', Array, Object(Illuminate\\Validation\\Validator)) +#11 /var/www/html/vendor/laravel/framework/src/Illuminate/Validation/Validator.php(459): Illuminate\\Validation\\Validator->validateAttribute('id', 'Unique') +#12 /var/www/html/vendor/laravel/framework/src/Illuminate/Validation/Validator.php(494): Illuminate\\Validation\\Validator->passes() +#13 /var/www/html/vendor/laravel/framework/src/Illuminate/Validation/Validator.php(536): Illuminate\\Validation\\Validator->fails() +#14 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Providers/FoundationServiceProvider.php(124): Illuminate\\Validation\\Validator->validate() +#15 /var/www/html/vendor/laravel/framework/src/Illuminate/Macroable/Traits/Macroable.php(123): Illuminate\\Http\\Request->Illuminate\\Foundation\\Providers\\{closure}(Array) +#16 /var/www/html/app/Http/Controllers/SuperAdmin/TenantController.php(24): Illuminate\\Http\\Request->__call('validate', Array) +#17 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Controller.php(54): App\\Http\\Controllers\\SuperAdmin\\TenantController->store(Object(Illuminate\\Http\\Request)) +#18 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/ControllerDispatcher.php(43): Illuminate\\Routing\\Controller->callAction('store', Array) +#19 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Route.php(259): Illuminate\\Routing\\ControllerDispatcher->dispatch(Object(Illuminate\\Routing\\Route), Object(App\\Http\\Controllers\\SuperAdmin\\TenantController), 'store') +#20 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Route.php(205): Illuminate\\Routing\\Route->runController() +#21 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Router.php(806): Illuminate\\Routing\\Route->run() +#22 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(144): Illuminate\\Routing\\Router->Illuminate\\Routing\\{closure}(Object(Illuminate\\Http\\Request)) +#23 /var/www/html/vendor/barryvdh/laravel-debugbar/src/Middleware/InjectDebugbar.php(66): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#24 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Barryvdh\\Debugbar\\Middleware\\InjectDebugbar->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#25 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Middleware/SubstituteBindings.php(50): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#26 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Routing\\Middleware\\SubstituteBindings->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#27 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/VerifyCsrfToken.php(78): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#28 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Foundation\\Http\\Middleware\\VerifyCsrfToken->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#29 /var/www/html/vendor/laravel/framework/src/Illuminate/View/Middleware/ShareErrorsFromSession.php(49): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#30 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\View\\Middleware\\ShareErrorsFromSession->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#31 /var/www/html/vendor/laravel/framework/src/Illuminate/Session/Middleware/StartSession.php(121): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#32 /var/www/html/vendor/laravel/framework/src/Illuminate/Session/Middleware/StartSession.php(64): Illuminate\\Session\\Middleware\\StartSession->handleStatefulRequest(Object(Illuminate\\Http\\Request), Object(Illuminate\\Session\\Store), Object(Closure)) +#33 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Session\\Middleware\\StartSession->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#34 /var/www/html/vendor/laravel/framework/src/Illuminate/Cookie/Middleware/AddQueuedCookiesToResponse.php(37): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#35 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Cookie\\Middleware\\AddQueuedCookiesToResponse->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#36 /var/www/html/vendor/laravel/framework/src/Illuminate/Cookie/Middleware/EncryptCookies.php(67): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#37 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Cookie\\Middleware\\EncryptCookies->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#38 /var/www/html/vendor/stancl/tenancy/src/Middleware/IdentificationMiddleware.php(36): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#39 /var/www/html/vendor/stancl/tenancy/src/Middleware/InitializeTenancyByDomain.php(37): Stancl\\Tenancy\\Middleware\\IdentificationMiddleware->initializeTenancy(Object(Illuminate\\Http\\Request), Object(Closure), 'tenant2.localho...') +#40 /var/www/html/app/Http/Middleware/UniversalTenancy.php(20): Stancl\\Tenancy\\Middleware\\InitializeTenancyByDomain->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#41 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): App\\Http\\Middleware\\UniversalTenancy->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#42 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(119): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#43 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Router.php(805): Illuminate\\Pipeline\\Pipeline->then(Object(Closure)) +#44 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Router.php(784): Illuminate\\Routing\\Router->runRouteWithinStack(Object(Illuminate\\Routing\\Route), Object(Illuminate\\Http\\Request)) +#45 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Router.php(748): Illuminate\\Routing\\Router->runRoute(Object(Illuminate\\Http\\Request), Object(Illuminate\\Routing\\Route)) +#46 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Router.php(737): Illuminate\\Routing\\Router->dispatchToRoute(Object(Illuminate\\Http\\Request)) +#47 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(200): Illuminate\\Routing\\Router->dispatch(Object(Illuminate\\Http\\Request)) +#48 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(144): Illuminate\\Foundation\\Http\\Kernel->Illuminate\\Foundation\\Http\\{closure}(Object(Illuminate\\Http\\Request)) +#49 /var/www/html/vendor/barryvdh/laravel-debugbar/src/Middleware/InjectDebugbar.php(66): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#50 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Barryvdh\\Debugbar\\Middleware\\InjectDebugbar->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#51 /var/www/html/packages/Webkul/Installer/src/Http/Middleware/CanInstall.php(28): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#52 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Webkul\\Installer\\Http\\Middleware\\CanInstall->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#53 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php(21): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#54 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TrimStrings.php(40): Illuminate\\Foundation\\Http\\Middleware\\TransformsRequest->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#55 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Foundation\\Http\\Middleware\\TrimStrings->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#56 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/ValidatePostSize.php(27): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#57 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Foundation\\Http\\Middleware\\ValidatePostSize->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#58 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/PreventRequestsDuringMaintenance.php(99): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#59 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Foundation\\Http\\Middleware\\PreventRequestsDuringMaintenance->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#60 /var/www/html/vendor/laravel/framework/src/Illuminate/Http/Middleware/HandleCors.php(49): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#61 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Http\\Middleware\\HandleCors->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#62 /var/www/html/vendor/laravel/framework/src/Illuminate/Http/Middleware/TrustProxies.php(39): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#63 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Http\\Middleware\\TrustProxies->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#64 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(119): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#65 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(175): Illuminate\\Pipeline\\Pipeline->then(Object(Closure)) +#66 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(144): Illuminate\\Foundation\\Http\\Kernel->sendRequestThroughRouter(Object(Illuminate\\Http\\Request)) +#67 /var/www/html/public/index.php(51): Illuminate\\Foundation\\Http\\Kernel->handle(Object(Illuminate\\Http\\Request)) +#68 {main} + +[previous exception] [object] (PDOException(code: 42S02): SQLSTATE[42S02]: Base table or view not found: 1146 Table 'tenant_tenant2.tenants' doesn't exist at /var/www/html/vendor/laravel/framework/src/Illuminate/Database/Connection.php:423) +[stacktrace] +#0 /var/www/html/vendor/laravel/framework/src/Illuminate/Database/Connection.php(423): PDO->prepare('select count(*)...') +#1 /var/www/html/vendor/laravel/framework/src/Illuminate/Database/Connection.php(816): Illuminate\\Database\\Connection->Illuminate\\Database\\{closure}('select count(*)...', Array) +#2 /var/www/html/vendor/laravel/framework/src/Illuminate/Database/Connection.php(783): Illuminate\\Database\\Connection->runQueryCallback('select count(*)...', Array, Object(Closure)) +#3 /var/www/html/vendor/laravel/framework/src/Illuminate/Database/Connection.php(414): Illuminate\\Database\\Connection->run('select count(*)...', Array, Object(Closure)) +#4 /var/www/html/vendor/laravel/framework/src/Illuminate/Database/Query/Builder.php(2913): Illuminate\\Database\\Connection->select('select count(*)...', Array, false) +#5 /var/www/html/vendor/laravel/framework/src/Illuminate/Database/Query/Builder.php(2902): Illuminate\\Database\\Query\\Builder->runSelect() +#6 /var/www/html/vendor/laravel/framework/src/Illuminate/Database/Query/Builder.php(3456): Illuminate\\Database\\Query\\Builder->Illuminate\\Database\\Query\\{closure}() +#7 /var/www/html/vendor/laravel/framework/src/Illuminate/Database/Query/Builder.php(2901): Illuminate\\Database\\Query\\Builder->onceWithColumns(Array, Object(Closure)) +#8 /var/www/html/vendor/laravel/framework/src/Illuminate/Database/Query/Builder.php(3383): Illuminate\\Database\\Query\\Builder->get(Array) +#9 /var/www/html/vendor/laravel/framework/src/Illuminate/Database/Query/Builder.php(3311): Illuminate\\Database\\Query\\Builder->aggregate('count', Array) +#10 /var/www/html/vendor/laravel/framework/src/Illuminate/Validation/DatabasePresenceVerifier.php(54): Illuminate\\Database\\Query\\Builder->count() +#11 /var/www/html/vendor/laravel/framework/src/Illuminate/Validation/Concerns/ValidatesAttributes.php(948): Illuminate\\Validation\\DatabasePresenceVerifier->getCount('tenants', 'id', 'tenant3', NULL, NULL, Array) +#12 /var/www/html/vendor/laravel/framework/src/Illuminate/Validation/Validator.php(660): Illuminate\\Validation\\Validator->validateUnique('id', 'tenant3', Array, Object(Illuminate\\Validation\\Validator)) +#13 /var/www/html/vendor/laravel/framework/src/Illuminate/Validation/Validator.php(459): Illuminate\\Validation\\Validator->validateAttribute('id', 'Unique') +#14 /var/www/html/vendor/laravel/framework/src/Illuminate/Validation/Validator.php(494): Illuminate\\Validation\\Validator->passes() +#15 /var/www/html/vendor/laravel/framework/src/Illuminate/Validation/Validator.php(536): Illuminate\\Validation\\Validator->fails() +#16 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Providers/FoundationServiceProvider.php(124): Illuminate\\Validation\\Validator->validate() +#17 /var/www/html/vendor/laravel/framework/src/Illuminate/Macroable/Traits/Macroable.php(123): Illuminate\\Http\\Request->Illuminate\\Foundation\\Providers\\{closure}(Array) +#18 /var/www/html/app/Http/Controllers/SuperAdmin/TenantController.php(24): Illuminate\\Http\\Request->__call('validate', Array) +#19 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Controller.php(54): App\\Http\\Controllers\\SuperAdmin\\TenantController->store(Object(Illuminate\\Http\\Request)) +#20 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/ControllerDispatcher.php(43): Illuminate\\Routing\\Controller->callAction('store', Array) +#21 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Route.php(259): Illuminate\\Routing\\ControllerDispatcher->dispatch(Object(Illuminate\\Routing\\Route), Object(App\\Http\\Controllers\\SuperAdmin\\TenantController), 'store') +#22 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Route.php(205): Illuminate\\Routing\\Route->runController() +#23 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Router.php(806): Illuminate\\Routing\\Route->run() +#24 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(144): Illuminate\\Routing\\Router->Illuminate\\Routing\\{closure}(Object(Illuminate\\Http\\Request)) +#25 /var/www/html/vendor/barryvdh/laravel-debugbar/src/Middleware/InjectDebugbar.php(66): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#26 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Barryvdh\\Debugbar\\Middleware\\InjectDebugbar->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#27 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Middleware/SubstituteBindings.php(50): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#28 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Routing\\Middleware\\SubstituteBindings->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#29 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/VerifyCsrfToken.php(78): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#30 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Foundation\\Http\\Middleware\\VerifyCsrfToken->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#31 /var/www/html/vendor/laravel/framework/src/Illuminate/View/Middleware/ShareErrorsFromSession.php(49): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#32 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\View\\Middleware\\ShareErrorsFromSession->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#33 /var/www/html/vendor/laravel/framework/src/Illuminate/Session/Middleware/StartSession.php(121): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#34 /var/www/html/vendor/laravel/framework/src/Illuminate/Session/Middleware/StartSession.php(64): Illuminate\\Session\\Middleware\\StartSession->handleStatefulRequest(Object(Illuminate\\Http\\Request), Object(Illuminate\\Session\\Store), Object(Closure)) +#35 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Session\\Middleware\\StartSession->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#36 /var/www/html/vendor/laravel/framework/src/Illuminate/Cookie/Middleware/AddQueuedCookiesToResponse.php(37): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#37 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Cookie\\Middleware\\AddQueuedCookiesToResponse->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#38 /var/www/html/vendor/laravel/framework/src/Illuminate/Cookie/Middleware/EncryptCookies.php(67): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#39 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Cookie\\Middleware\\EncryptCookies->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#40 /var/www/html/vendor/stancl/tenancy/src/Middleware/IdentificationMiddleware.php(36): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#41 /var/www/html/vendor/stancl/tenancy/src/Middleware/InitializeTenancyByDomain.php(37): Stancl\\Tenancy\\Middleware\\IdentificationMiddleware->initializeTenancy(Object(Illuminate\\Http\\Request), Object(Closure), 'tenant2.localho...') +#42 /var/www/html/app/Http/Middleware/UniversalTenancy.php(20): Stancl\\Tenancy\\Middleware\\InitializeTenancyByDomain->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#43 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): App\\Http\\Middleware\\UniversalTenancy->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#44 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(119): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#45 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Router.php(805): Illuminate\\Pipeline\\Pipeline->then(Object(Closure)) +#46 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Router.php(784): Illuminate\\Routing\\Router->runRouteWithinStack(Object(Illuminate\\Routing\\Route), Object(Illuminate\\Http\\Request)) +#47 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Router.php(748): Illuminate\\Routing\\Router->runRoute(Object(Illuminate\\Http\\Request), Object(Illuminate\\Routing\\Route)) +#48 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Router.php(737): Illuminate\\Routing\\Router->dispatchToRoute(Object(Illuminate\\Http\\Request)) +#49 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(200): Illuminate\\Routing\\Router->dispatch(Object(Illuminate\\Http\\Request)) +#50 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(144): Illuminate\\Foundation\\Http\\Kernel->Illuminate\\Foundation\\Http\\{closure}(Object(Illuminate\\Http\\Request)) +#51 /var/www/html/vendor/barryvdh/laravel-debugbar/src/Middleware/InjectDebugbar.php(66): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#52 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Barryvdh\\Debugbar\\Middleware\\InjectDebugbar->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#53 /var/www/html/packages/Webkul/Installer/src/Http/Middleware/CanInstall.php(28): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#54 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Webkul\\Installer\\Http\\Middleware\\CanInstall->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#55 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php(21): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#56 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TrimStrings.php(40): Illuminate\\Foundation\\Http\\Middleware\\TransformsRequest->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#57 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Foundation\\Http\\Middleware\\TrimStrings->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#58 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/ValidatePostSize.php(27): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#59 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Foundation\\Http\\Middleware\\ValidatePostSize->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#60 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/PreventRequestsDuringMaintenance.php(99): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#61 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Foundation\\Http\\Middleware\\PreventRequestsDuringMaintenance->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#62 /var/www/html/vendor/laravel/framework/src/Illuminate/Http/Middleware/HandleCors.php(49): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#63 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Http\\Middleware\\HandleCors->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#64 /var/www/html/vendor/laravel/framework/src/Illuminate/Http/Middleware/TrustProxies.php(39): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#65 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Http\\Middleware\\TrustProxies->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#66 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(119): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#67 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(175): Illuminate\\Pipeline\\Pipeline->then(Object(Closure)) +#68 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(144): Illuminate\\Foundation\\Http\\Kernel->sendRequestThroughRouter(Object(Illuminate\\Http\\Request)) +#69 /var/www/html/public/index.php(51): Illuminate\\Foundation\\Http\\Kernel->handle(Object(Illuminate\\Http\\Request)) +#70 {main} +"} +[2026-02-02 12:15:13] local.ERROR: file_put_contents(/var/www/html/storage/framework/views/455eceb602548652aae99ec6afb7fa77.php): Failed to open stream: Permission denied {"userId":1,"exception":"[object] (ErrorException(code: 0): file_put_contents(/var/www/html/storage/framework/views/455eceb602548652aae99ec6afb7fa77.php): Failed to open stream: Permission denied at /var/www/html/vendor/laravel/framework/src/Illuminate/Filesystem/Filesystem.php:204) +[stacktrace] +#0 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Bootstrap/HandleExceptions.php(255): Illuminate\\Foundation\\Bootstrap\\HandleExceptions->handleError(2, 'file_put_conten...', '/var/www/html/v...', 204) +#1 [internal function]: Illuminate\\Foundation\\Bootstrap\\HandleExceptions->Illuminate\\Foundation\\Bootstrap\\{closure}(2, 'file_put_conten...', '/var/www/html/v...', 204) +#2 /var/www/html/vendor/laravel/framework/src/Illuminate/Filesystem/Filesystem.php(204): file_put_contents('/var/www/html/s...', 's...', 0) +#3 /var/www/html/vendor/laravel/framework/src/Illuminate/View/Compilers/BladeCompiler.php(194): Illuminate\\Filesystem\\Filesystem->put('/var/www/html/s...', 's...') +#4 /var/www/html/vendor/laravel/framework/src/Illuminate/View/Engines/CompilerEngine.php(64): Illuminate\\View\\Compilers\\BladeCompiler->compile('/var/www/html/r...') +#5 /var/www/html/vendor/laravel/framework/src/Illuminate/View/View.php(207): Illuminate\\View\\Engines\\CompilerEngine->get('/var/www/html/r...', Array) +#6 /var/www/html/vendor/laravel/framework/src/Illuminate/View/View.php(190): Illuminate\\View\\View->getContents() +#7 /var/www/html/vendor/laravel/framework/src/Illuminate/View/View.php(159): Illuminate\\View\\View->renderContents() +#8 /var/www/html/vendor/laravel/framework/src/Illuminate/Http/Response.php(69): Illuminate\\View\\View->render() +#9 /var/www/html/vendor/laravel/framework/src/Illuminate/Http/Response.php(35): Illuminate\\Http\\Response->setContent(Object(Illuminate\\View\\View)) +#10 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Router.php(918): Illuminate\\Http\\Response->__construct(Object(Illuminate\\View\\View), 200, Array) +#11 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Router.php(885): Illuminate\\Routing\\Router::toResponse(Object(Illuminate\\Http\\Request), Object(Illuminate\\View\\View)) +#12 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Router.php(805): Illuminate\\Routing\\Router->prepareResponse(Object(Illuminate\\Http\\Request), Object(Illuminate\\View\\View)) +#13 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(144): Illuminate\\Routing\\Router->Illuminate\\Routing\\{closure}(Object(Illuminate\\Http\\Request)) +#14 /var/www/html/vendor/barryvdh/laravel-debugbar/src/Middleware/InjectDebugbar.php(66): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#15 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Barryvdh\\Debugbar\\Middleware\\InjectDebugbar->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#16 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Middleware/SubstituteBindings.php(50): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#17 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Routing\\Middleware\\SubstituteBindings->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#18 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/VerifyCsrfToken.php(78): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#19 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Foundation\\Http\\Middleware\\VerifyCsrfToken->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#20 /var/www/html/vendor/laravel/framework/src/Illuminate/View/Middleware/ShareErrorsFromSession.php(49): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#21 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\View\\Middleware\\ShareErrorsFromSession->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#22 /var/www/html/vendor/laravel/framework/src/Illuminate/Session/Middleware/StartSession.php(121): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#23 /var/www/html/vendor/laravel/framework/src/Illuminate/Session/Middleware/StartSession.php(64): Illuminate\\Session\\Middleware\\StartSession->handleStatefulRequest(Object(Illuminate\\Http\\Request), Object(Illuminate\\Session\\Store), Object(Closure)) +#24 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Session\\Middleware\\StartSession->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#25 /var/www/html/vendor/laravel/framework/src/Illuminate/Cookie/Middleware/AddQueuedCookiesToResponse.php(37): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#26 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Cookie\\Middleware\\AddQueuedCookiesToResponse->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#27 /var/www/html/vendor/laravel/framework/src/Illuminate/Cookie/Middleware/EncryptCookies.php(67): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#28 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Cookie\\Middleware\\EncryptCookies->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#29 /var/www/html/vendor/stancl/tenancy/src/Middleware/IdentificationMiddleware.php(36): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#30 /var/www/html/vendor/stancl/tenancy/src/Middleware/InitializeTenancyByDomain.php(37): Stancl\\Tenancy\\Middleware\\IdentificationMiddleware->initializeTenancy(Object(Illuminate\\Http\\Request), Object(Closure), 'tenant1.localho...') +#31 /var/www/html/app/Http/Middleware/UniversalTenancy.php(20): Stancl\\Tenancy\\Middleware\\InitializeTenancyByDomain->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#32 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): App\\Http\\Middleware\\UniversalTenancy->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#33 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(119): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#34 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Router.php(805): Illuminate\\Pipeline\\Pipeline->then(Object(Closure)) +#35 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Router.php(784): Illuminate\\Routing\\Router->runRouteWithinStack(Object(Illuminate\\Routing\\Route), Object(Illuminate\\Http\\Request)) +#36 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Router.php(748): Illuminate\\Routing\\Router->runRoute(Object(Illuminate\\Http\\Request), Object(Illuminate\\Routing\\Route)) +#37 /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Router.php(737): Illuminate\\Routing\\Router->dispatchToRoute(Object(Illuminate\\Http\\Request)) +#38 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(200): Illuminate\\Routing\\Router->dispatch(Object(Illuminate\\Http\\Request)) +#39 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(144): Illuminate\\Foundation\\Http\\Kernel->Illuminate\\Foundation\\Http\\{closure}(Object(Illuminate\\Http\\Request)) +#40 /var/www/html/vendor/barryvdh/laravel-debugbar/src/Middleware/InjectDebugbar.php(66): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#41 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Barryvdh\\Debugbar\\Middleware\\InjectDebugbar->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#42 /var/www/html/packages/Webkul/Installer/src/Http/Middleware/CanInstall.php(28): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#43 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Webkul\\Installer\\Http\\Middleware\\CanInstall->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#44 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php(21): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#45 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TrimStrings.php(40): Illuminate\\Foundation\\Http\\Middleware\\TransformsRequest->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#46 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Foundation\\Http\\Middleware\\TrimStrings->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#47 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/ValidatePostSize.php(27): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#48 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Foundation\\Http\\Middleware\\ValidatePostSize->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#49 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/PreventRequestsDuringMaintenance.php(99): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#50 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Foundation\\Http\\Middleware\\PreventRequestsDuringMaintenance->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#51 /var/www/html/vendor/laravel/framework/src/Illuminate/Http/Middleware/HandleCors.php(49): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#52 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Http\\Middleware\\HandleCors->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#53 /var/www/html/vendor/laravel/framework/src/Illuminate/Http/Middleware/TrustProxies.php(39): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#54 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Http\\Middleware\\TrustProxies->handle(Object(Illuminate\\Http\\Request), Object(Closure)) +#55 /var/www/html/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(119): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) +#56 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(175): Illuminate\\Pipeline\\Pipeline->then(Object(Closure)) +#57 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(144): Illuminate\\Foundation\\Http\\Kernel->sendRequestThroughRouter(Object(Illuminate\\Http\\Request)) +#58 /var/www/html/public/index.php(51): Illuminate\\Foundation\\Http\\Kernel->handle(Object(Illuminate\\Http\\Request)) +#59 {main} +"} +[2026-02-02 12:18:15] local.ERROR: could not find driver (Connection: mysql, SQL: select table_name as `name`, (data_length + index_length) as `size`, table_comment as `comment`, engine as `engine`, table_collation as `collation` from information_schema.tables where table_schema = 'laravel-crm' and table_type in ('BASE TABLE', 'SYSTEM VERSIONED') order by table_name) {"exception":"[object] (Illuminate\\Database\\QueryException(code: 0): could not find driver (Connection: mysql, SQL: select table_name as `name`, (data_length + index_length) as `size`, table_comment as `comment`, engine as `engine`, table_collation as `collation` from information_schema.tables where table_schema = 'laravel-crm' and table_type in ('BASE TABLE', 'SYSTEM VERSIONED') order by table_name) at /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Database/Connection.php:829) +[stacktrace] +#0 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Database/Connection.php(783): Illuminate\\Database\\Connection->runQueryCallback() +#1 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Database/Connection.php(414): Illuminate\\Database\\Connection->run() +#2 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Database/Connection.php(401): Illuminate\\Database\\Connection->select() +#3 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Database/Schema/MySqlBuilder.php(41): Illuminate\\Database\\Connection->selectFromWriteConnection() +#4 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Database/Schema/Builder.php(165): Illuminate\\Database\\Schema\\MySqlBuilder->getTables() +#5 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Database/Migrations/DatabaseMigrationRepository.php(184): Illuminate\\Database\\Schema\\Builder->hasTable() +#6 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Database/Migrations/Migrator.php(727): Illuminate\\Database\\Migrations\\DatabaseMigrationRepository->repositoryExists() +#7 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Database/Console/Migrations/MigrateCommand.php(140): Illuminate\\Database\\Migrations\\Migrator->repositoryExists() +#8 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Support/helpers.php(261): Illuminate\\Database\\Console\\Migrations\\MigrateCommand->{closure:Illuminate\\Database\\Console\\Migrations\\MigrateCommand::repositoryExists():140}() +#9 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Database/Console/Migrations/MigrateCommand.php(140): retry() +#10 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Database/Console/Migrations/MigrateCommand.php(116): Illuminate\\Database\\Console\\Migrations\\MigrateCommand->repositoryExists() +#11 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Database/Console/Migrations/MigrateCommand.php(84): Illuminate\\Database\\Console\\Migrations\\MigrateCommand->prepareDatabase() +#12 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Database/Migrations/Migrator.php(641): Illuminate\\Database\\Console\\Migrations\\MigrateCommand->{closure:Illuminate\\Database\\Console\\Migrations\\MigrateCommand::handle():83}() +#13 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Database/Console/Migrations/MigrateCommand.php(83): Illuminate\\Database\\Migrations\\Migrator->usingConnection() +#14 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(36): Illuminate\\Database\\Console\\Migrations\\MigrateCommand->handle() +#15 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Container/Util.php(41): Illuminate\\Container\\BoundMethod::{closure:Illuminate\\Container\\BoundMethod::call():35}() +#16 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(93): Illuminate\\Container\\Util::unwrapIfClosure() +#17 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(35): Illuminate\\Container\\BoundMethod::callBoundMethod() +#18 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Container/Container.php(662): Illuminate\\Container\\BoundMethod::call() +#19 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Console/Command.php(211): Illuminate\\Container\\Container->call() +#20 /home/farelos/compor/krayin/vendor/symfony/console/Command/Command.php(326): Illuminate\\Console\\Command->execute() +#21 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Console/Command.php(180): Symfony\\Component\\Console\\Command\\Command->run() +#22 /home/farelos/compor/krayin/vendor/symfony/console/Application.php(1096): Illuminate\\Console\\Command->run() +#23 /home/farelos/compor/krayin/vendor/symfony/console/Application.php(324): Symfony\\Component\\Console\\Application->doRunCommand() +#24 /home/farelos/compor/krayin/vendor/symfony/console/Application.php(175): Symfony\\Component\\Console\\Application->doRun() +#25 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Foundation/Console/Kernel.php(201): Symfony\\Component\\Console\\Application->run() +#26 /home/farelos/compor/krayin/artisan(35): Illuminate\\Foundation\\Console\\Kernel->handle() +#27 {main} + +[previous exception] [object] (PDOException(code: 0): could not find driver at /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Database/Connectors/Connector.php:65) +[stacktrace] +#0 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Database/Connectors/Connector.php(65): PDO->__construct() +#1 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Database/Connectors/Connector.php(44): Illuminate\\Database\\Connectors\\Connector->createPdoConnection() +#2 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Database/Connectors/MySqlConnector.php(24): Illuminate\\Database\\Connectors\\Connector->createConnection() +#3 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Database/Connectors/ConnectionFactory.php(184): Illuminate\\Database\\Connectors\\MySqlConnector->connect() +#4 [internal function]: Illuminate\\Database\\Connectors\\ConnectionFactory->{closure:Illuminate\\Database\\Connectors\\ConnectionFactory::createPdoResolverWithHosts():179}() +#5 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Database/Connection.php(1339): call_user_func() +#6 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Database/Connection.php(528): Illuminate\\Database\\Connection->getPdo() +#7 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Database/Connection.php(423): Illuminate\\Database\\Connection->getPdoForSelect() +#8 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Database/Connection.php(816): Illuminate\\Database\\Connection->{closure:Illuminate\\Database\\Connection::select():414}() +#9 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Database/Connection.php(783): Illuminate\\Database\\Connection->runQueryCallback() +#10 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Database/Connection.php(414): Illuminate\\Database\\Connection->run() +#11 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Database/Connection.php(401): Illuminate\\Database\\Connection->select() +#12 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Database/Schema/MySqlBuilder.php(41): Illuminate\\Database\\Connection->selectFromWriteConnection() +#13 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Database/Schema/Builder.php(165): Illuminate\\Database\\Schema\\MySqlBuilder->getTables() +#14 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Database/Migrations/DatabaseMigrationRepository.php(184): Illuminate\\Database\\Schema\\Builder->hasTable() +#15 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Database/Migrations/Migrator.php(727): Illuminate\\Database\\Migrations\\DatabaseMigrationRepository->repositoryExists() +#16 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Database/Console/Migrations/MigrateCommand.php(140): Illuminate\\Database\\Migrations\\Migrator->repositoryExists() +#17 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Support/helpers.php(261): Illuminate\\Database\\Console\\Migrations\\MigrateCommand->{closure:Illuminate\\Database\\Console\\Migrations\\MigrateCommand::repositoryExists():140}() +#18 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Database/Console/Migrations/MigrateCommand.php(140): retry() +#19 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Database/Console/Migrations/MigrateCommand.php(116): Illuminate\\Database\\Console\\Migrations\\MigrateCommand->repositoryExists() +#20 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Database/Console/Migrations/MigrateCommand.php(84): Illuminate\\Database\\Console\\Migrations\\MigrateCommand->prepareDatabase() +#21 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Database/Migrations/Migrator.php(641): Illuminate\\Database\\Console\\Migrations\\MigrateCommand->{closure:Illuminate\\Database\\Console\\Migrations\\MigrateCommand::handle():83}() +#22 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Database/Console/Migrations/MigrateCommand.php(83): Illuminate\\Database\\Migrations\\Migrator->usingConnection() +#23 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(36): Illuminate\\Database\\Console\\Migrations\\MigrateCommand->handle() +#24 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Container/Util.php(41): Illuminate\\Container\\BoundMethod::{closure:Illuminate\\Container\\BoundMethod::call():35}() +#25 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(93): Illuminate\\Container\\Util::unwrapIfClosure() +#26 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(35): Illuminate\\Container\\BoundMethod::callBoundMethod() +#27 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Container/Container.php(662): Illuminate\\Container\\BoundMethod::call() +#28 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Console/Command.php(211): Illuminate\\Container\\Container->call() +#29 /home/farelos/compor/krayin/vendor/symfony/console/Command/Command.php(326): Illuminate\\Console\\Command->execute() +#30 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Console/Command.php(180): Symfony\\Component\\Console\\Command\\Command->run() +#31 /home/farelos/compor/krayin/vendor/symfony/console/Application.php(1096): Illuminate\\Console\\Command->run() +#32 /home/farelos/compor/krayin/vendor/symfony/console/Application.php(324): Symfony\\Component\\Console\\Application->doRunCommand() +#33 /home/farelos/compor/krayin/vendor/symfony/console/Application.php(175): Symfony\\Component\\Console\\Application->doRun() +#34 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Foundation/Console/Kernel.php(201): Symfony\\Component\\Console\\Application->run() +#35 /home/farelos/compor/krayin/artisan(35): Illuminate\\Foundation\\Console\\Kernel->handle() +#36 {main} +"} +[2026-02-02 12:18:19] local.ERROR: could not find driver (Connection: mysql, SQL: select * from `users` where (`email` = admin@example.com) limit 1) {"exception":"[object] (Illuminate\\Database\\QueryException(code: 0): could not find driver (Connection: mysql, SQL: select * from `users` where (`email` = admin@example.com) limit 1) at /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Database/Connection.php:829) +[stacktrace] +#0 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Database/Connection.php(783): Illuminate\\Database\\Connection->runQueryCallback() +#1 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Database/Connection.php(414): Illuminate\\Database\\Connection->run() +#2 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Database/Query/Builder.php(2913): Illuminate\\Database\\Connection->select() +#3 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Database/Query/Builder.php(2902): Illuminate\\Database\\Query\\Builder->runSelect() +#4 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Database/Query/Builder.php(3456): Illuminate\\Database\\Query\\Builder->{closure:Illuminate\\Database\\Query\\Builder::get():2901}() +#5 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Database/Query/Builder.php(2901): Illuminate\\Database\\Query\\Builder->onceWithColumns() +#6 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Builder.php(739): Illuminate\\Database\\Query\\Builder->get() +#7 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Builder.php(723): Illuminate\\Database\\Eloquent\\Builder->getModels() +#8 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Database/Concerns/BuildsQueries.php(333): Illuminate\\Database\\Eloquent\\Builder->get() +#9 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Builder.php(568): Illuminate\\Database\\Eloquent\\Builder->first() +#10 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Support/Traits/ForwardsCalls.php(23): Illuminate\\Database\\Eloquent\\Builder->firstOrCreate() +#11 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Model.php(2335): Illuminate\\Database\\Eloquent\\Model->forwardCallTo() +#12 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Model.php(2347): Illuminate\\Database\\Eloquent\\Model->__call() +#13 /home/farelos/compor/krayin/database/seeders/SuperAdminSeeder.php(14): Illuminate\\Database\\Eloquent\\Model::__callStatic() +#14 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(36): Database\\Seeders\\SuperAdminSeeder->run() +#15 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Container/Util.php(41): Illuminate\\Container\\BoundMethod::{closure:Illuminate\\Container\\BoundMethod::call():35}() +#16 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(93): Illuminate\\Container\\Util::unwrapIfClosure() +#17 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(35): Illuminate\\Container\\BoundMethod::callBoundMethod() +#18 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Container/Container.php(662): Illuminate\\Container\\BoundMethod::call() +#19 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Database/Seeder.php(184): Illuminate\\Container\\Container->call() +#20 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Database/Seeder.php(193): Illuminate\\Database\\Seeder->{closure:Illuminate\\Database\\Seeder::__invoke():183}() +#21 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Database/Console/Seeds/SeedCommand.php(70): Illuminate\\Database\\Seeder->__invoke() +#22 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Concerns/GuardsAttributes.php(155): Illuminate\\Database\\Console\\Seeds\\SeedCommand->{closure:Illuminate\\Database\\Console\\Seeds\\SeedCommand::handle():69}() +#23 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Database/Console/Seeds/SeedCommand.php(69): Illuminate\\Database\\Eloquent\\Model::unguarded() +#24 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(36): Illuminate\\Database\\Console\\Seeds\\SeedCommand->handle() +#25 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Container/Util.php(41): Illuminate\\Container\\BoundMethod::{closure:Illuminate\\Container\\BoundMethod::call():35}() +#26 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(93): Illuminate\\Container\\Util::unwrapIfClosure() +#27 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(35): Illuminate\\Container\\BoundMethod::callBoundMethod() +#28 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Container/Container.php(662): Illuminate\\Container\\BoundMethod::call() +#29 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Console/Command.php(211): Illuminate\\Container\\Container->call() +#30 /home/farelos/compor/krayin/vendor/symfony/console/Command/Command.php(326): Illuminate\\Console\\Command->execute() +#31 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Console/Command.php(180): Symfony\\Component\\Console\\Command\\Command->run() +#32 /home/farelos/compor/krayin/vendor/symfony/console/Application.php(1096): Illuminate\\Console\\Command->run() +#33 /home/farelos/compor/krayin/vendor/symfony/console/Application.php(324): Symfony\\Component\\Console\\Application->doRunCommand() +#34 /home/farelos/compor/krayin/vendor/symfony/console/Application.php(175): Symfony\\Component\\Console\\Application->doRun() +#35 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Foundation/Console/Kernel.php(201): Symfony\\Component\\Console\\Application->run() +#36 /home/farelos/compor/krayin/artisan(35): Illuminate\\Foundation\\Console\\Kernel->handle() +#37 {main} + +[previous exception] [object] (PDOException(code: 0): could not find driver at /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Database/Connectors/Connector.php:65) +[stacktrace] +#0 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Database/Connectors/Connector.php(65): PDO->__construct() +#1 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Database/Connectors/Connector.php(44): Illuminate\\Database\\Connectors\\Connector->createPdoConnection() +#2 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Database/Connectors/MySqlConnector.php(24): Illuminate\\Database\\Connectors\\Connector->createConnection() +#3 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Database/Connectors/ConnectionFactory.php(184): Illuminate\\Database\\Connectors\\MySqlConnector->connect() +#4 [internal function]: Illuminate\\Database\\Connectors\\ConnectionFactory->{closure:Illuminate\\Database\\Connectors\\ConnectionFactory::createPdoResolverWithHosts():179}() +#5 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Database/Connection.php(1339): call_user_func() +#6 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Database/Connection.php(1375): Illuminate\\Database\\Connection->getPdo() +#7 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Database/Connection.php(528): Illuminate\\Database\\Connection->getReadPdo() +#8 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Database/Connection.php(423): Illuminate\\Database\\Connection->getPdoForSelect() +#9 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Database/Connection.php(816): Illuminate\\Database\\Connection->{closure:Illuminate\\Database\\Connection::select():414}() +#10 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Database/Connection.php(783): Illuminate\\Database\\Connection->runQueryCallback() +#11 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Database/Connection.php(414): Illuminate\\Database\\Connection->run() +#12 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Database/Query/Builder.php(2913): Illuminate\\Database\\Connection->select() +#13 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Database/Query/Builder.php(2902): Illuminate\\Database\\Query\\Builder->runSelect() +#14 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Database/Query/Builder.php(3456): Illuminate\\Database\\Query\\Builder->{closure:Illuminate\\Database\\Query\\Builder::get():2901}() +#15 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Database/Query/Builder.php(2901): Illuminate\\Database\\Query\\Builder->onceWithColumns() +#16 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Builder.php(739): Illuminate\\Database\\Query\\Builder->get() +#17 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Builder.php(723): Illuminate\\Database\\Eloquent\\Builder->getModels() +#18 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Database/Concerns/BuildsQueries.php(333): Illuminate\\Database\\Eloquent\\Builder->get() +#19 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Builder.php(568): Illuminate\\Database\\Eloquent\\Builder->first() +#20 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Support/Traits/ForwardsCalls.php(23): Illuminate\\Database\\Eloquent\\Builder->firstOrCreate() +#21 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Model.php(2335): Illuminate\\Database\\Eloquent\\Model->forwardCallTo() +#22 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Model.php(2347): Illuminate\\Database\\Eloquent\\Model->__call() +#23 /home/farelos/compor/krayin/database/seeders/SuperAdminSeeder.php(14): Illuminate\\Database\\Eloquent\\Model::__callStatic() +#24 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(36): Database\\Seeders\\SuperAdminSeeder->run() +#25 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Container/Util.php(41): Illuminate\\Container\\BoundMethod::{closure:Illuminate\\Container\\BoundMethod::call():35}() +#26 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(93): Illuminate\\Container\\Util::unwrapIfClosure() +#27 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(35): Illuminate\\Container\\BoundMethod::callBoundMethod() +#28 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Container/Container.php(662): Illuminate\\Container\\BoundMethod::call() +#29 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Database/Seeder.php(184): Illuminate\\Container\\Container->call() +#30 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Database/Seeder.php(193): Illuminate\\Database\\Seeder->{closure:Illuminate\\Database\\Seeder::__invoke():183}() +#31 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Database/Console/Seeds/SeedCommand.php(70): Illuminate\\Database\\Seeder->__invoke() +#32 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Concerns/GuardsAttributes.php(155): Illuminate\\Database\\Console\\Seeds\\SeedCommand->{closure:Illuminate\\Database\\Console\\Seeds\\SeedCommand::handle():69}() +#33 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Database/Console/Seeds/SeedCommand.php(69): Illuminate\\Database\\Eloquent\\Model::unguarded() +#34 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(36): Illuminate\\Database\\Console\\Seeds\\SeedCommand->handle() +#35 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Container/Util.php(41): Illuminate\\Container\\BoundMethod::{closure:Illuminate\\Container\\BoundMethod::call():35}() +#36 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(93): Illuminate\\Container\\Util::unwrapIfClosure() +#37 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(35): Illuminate\\Container\\BoundMethod::callBoundMethod() +#38 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Container/Container.php(662): Illuminate\\Container\\BoundMethod::call() +#39 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Console/Command.php(211): Illuminate\\Container\\Container->call() +#40 /home/farelos/compor/krayin/vendor/symfony/console/Command/Command.php(326): Illuminate\\Console\\Command->execute() +#41 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Console/Command.php(180): Symfony\\Component\\Console\\Command\\Command->run() +#42 /home/farelos/compor/krayin/vendor/symfony/console/Application.php(1096): Illuminate\\Console\\Command->run() +#43 /home/farelos/compor/krayin/vendor/symfony/console/Application.php(324): Symfony\\Component\\Console\\Application->doRunCommand() +#44 /home/farelos/compor/krayin/vendor/symfony/console/Application.php(175): Symfony\\Component\\Console\\Application->doRun() +#45 /home/farelos/compor/krayin/vendor/laravel/framework/src/Illuminate/Foundation/Console/Kernel.php(201): Symfony\\Component\\Console\\Application->run() +#46 /home/farelos/compor/krayin/artisan(35): Illuminate\\Foundation\\Console\\Kernel->handle() +#47 {main} +"} diff --git a/vite.config.js b/vite.config.js new file mode 100644 index 0000000..421b569 --- /dev/null +++ b/vite.config.js @@ -0,0 +1,11 @@ +import { defineConfig } from 'vite'; +import laravel from 'laravel-vite-plugin'; + +export default defineConfig({ + plugins: [ + laravel({ + input: ['resources/css/app.css', 'resources/js/app.js'], + refresh: true, + }), + ], +});