Merge pull request #1388 from openclassify/copilot/create-listing-website

Rewrite OpenClassify as Laravel 12 + FilamentPHP v3 modular classified ads platform
This commit is contained in:
Fatih Alp 2026-03-03 10:29:08 +03:00 committed by GitHub
commit 0195e08258
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2227 changed files with 19065 additions and 235743 deletions

View File

@ -1,6 +0,0 @@
{
"name": "Openclassify",
// Script to run to bootstrap the app when the space is created
"postCreateCommand": "bash install.sh",
"outputCapture": "std"
}

18
.editorconfig Normal file
View File

@ -0,0 +1,18 @@
root = true
[*]
charset = utf-8
end_of_line = lf
indent_size = 4
indent_style = space
insert_final_newline = true
trim_trailing_whitespace = true
[*.md]
trim_trailing_whitespace = false
[*.{yml,yaml}]
indent_size = 2
[compose.yaml]
indent_size = 4

65
.env.example Normal file
View File

@ -0,0 +1,65 @@
APP_NAME=Laravel
APP_ENV=local
APP_KEY=
APP_DEBUG=true
APP_URL=http://localhost
APP_LOCALE=en
APP_FALLBACK_LOCALE=en
APP_FAKER_LOCALE=en_US
APP_MAINTENANCE_DRIVER=file
# APP_MAINTENANCE_STORE=database
# PHP_CLI_SERVER_WORKERS=4
BCRYPT_ROUNDS=12
LOG_CHANNEL=stack
LOG_STACK=single
LOG_DEPRECATIONS_CHANNEL=null
LOG_LEVEL=debug
DB_CONNECTION=sqlite
# DB_HOST=127.0.0.1
# DB_PORT=3306
# DB_DATABASE=laravel
# DB_USERNAME=root
# DB_PASSWORD=
SESSION_DRIVER=database
SESSION_LIFETIME=120
SESSION_ENCRYPT=false
SESSION_PATH=/
SESSION_DOMAIN=null
BROADCAST_CONNECTION=log
FILESYSTEM_DISK=local
QUEUE_CONNECTION=database
CACHE_STORE=database
# CACHE_PREFIX=
MEMCACHED_HOST=127.0.0.1
REDIS_CLIENT=phpredis
REDIS_HOST=127.0.0.1
REDIS_PASSWORD=null
REDIS_PORT=6379
MAIL_MAILER=log
MAIL_SCHEME=null
MAIL_HOST=127.0.0.1
MAIL_PORT=2525
MAIL_USERNAME=null
MAIL_PASSWORD=null
MAIL_FROM_ADDRESS="hello@example.com"
MAIL_FROM_NAME="${APP_NAME}"
AWS_ACCESS_KEY_ID=
AWS_SECRET_ACCESS_KEY=
AWS_DEFAULT_REGION=us-east-1
AWS_BUCKET=
AWS_USE_PATH_STYLE_ENDPOINT=false
VITE_APP_NAME="${APP_NAME}"

11
.gitattributes vendored Normal file
View File

@ -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

3
.github/FUNDING.yml vendored
View File

@ -1,3 +0,0 @@
# These are supported funding model platforms
patreon: openclassify

View File

@ -1,38 +0,0 @@
---
name: Bug report
about: Create a report to help us improve
title: ''
labels: ''
assignees: ''
---
**Describe the bug**
A clear and concise description of what the bug is.
**To Reproduce**
Steps to reproduce the behavior:
1. Go to '...'
2. Click on '....'
3. Scroll down to '....'
4. See error
**Expected behavior**
A clear and concise description of what you expected to happen.
**Screenshots**
If applicable, add screenshots to help explain your problem.
**Desktop (please complete the following information):**
- OS: [e.g. iOS]
- Browser [e.g. chrome, safari]
- Version [e.g. 22]
**Smartphone (please complete the following information):**
- Device: [e.g. iPhone6]
- OS: [e.g. iOS8.1]
- Browser [e.g. stock browser, safari]
- Version [e.g. 22]
**Additional context**
Add any other context about the problem here.

View File

@ -1,20 +0,0 @@
---
name: Feature request
about: Suggest an idea for this project
title: ''
labels: ''
assignees: ''
---
**Is your feature request related to a problem? Please describe.**
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
**Describe the solution you'd like**
A clear and concise description of what you want to happen.
**Describe alternatives you've considered**
A clear and concise description of any alternative solutions or features you've considered.
**Additional context**
Add any other context or screenshots about the feature request here.

View File

@ -1,19 +0,0 @@
---
# Fill in the fields below to create a basic custom agent for your repository.
# The Copilot CLI can be used for local testing: https://gh.io/customagents/cli
# To make this agent available, merge this file into the default repository branch.
# For format details, see: https://gh.io/customagents/config
name:
description:
---
# greenfield
Act as a Senior Laravel & FilamentPHP Architect. Refactor the attached code as a greenfield project adhering to the following strict constraints:
1. Architecture: Enforce strict SOLID principles, prioritize brevity, and completely ignore backward compatibility.
2. Cleanup: Remove all legacy code, comments, tests, and PHPDocs.
3. Refactoring: Move all database logic into Models and extract repetitive Filament code into dedicated Helper classes. Identify and fix any existing logical errors.
4. Database: Consolidate migrations into a single file per table or topic (e.g., users, cache, jobs) to reduce the overall number of migration files.
5. Modularity: Use the `laravel-modules` package to encapsulate all features, routing, and Filament resources strictly inside their respective modules.
6. Frontend: Optimize and reduce the CSS footprint while maintaining the exact same visual output.

View File

@ -1,19 +0,0 @@
---
# Fill in the fields below to create a basic custom agent for your repository.
# The Copilot CLI can be used for local testing: https://gh.io/customagents/cli
# To make this agent available, merge this file into the default repository branch.
# For format details, see: https://gh.io/customagents/config
name:
description:
---
# greenfield
Act as a Senior Laravel & FilamentPHP Architect. Refactor the attached code as a greenfield project adhering to the following strict constraints:
1. Architecture: Enforce strict SOLID principles, prioritize brevity, and completely ignore backward compatibility.
2. Cleanup: Remove all legacy code, comments, tests, and PHPDocs.
3. Refactoring: Move all database logic into Models and extract repetitive Filament code into dedicated Helper classes. Identify and fix any existing logical errors.
4. Database: Consolidate migrations into a single file per table or topic (e.g., users, cache, jobs) to reduce the overall number of migration files.
5. Modularity: Use the `laravel-modules` package to encapsulate all features, routing, and Filament resources strictly inside their respective modules.
6. Frontend: Optimize and reduce the CSS footprint while maintaining the exact same visual output."

View File

@ -1,19 +0,0 @@
---
# Fill in the fields below to create a basic custom agent for your repository.
# The Copilot CLI can be used for local testing: https://gh.io/customagents/cli
# To make this agent available, merge this file into the default repository branch.
# For format details, see: https://gh.io/customagents/config
name:
description:
---
# greenfield
Act as a Senior Laravel & FilamentPHP Architect. Refactor the attached code as a greenfield project adhering to the following strict constraints:
1. Architecture: Enforce strict SOLID principles, prioritize brevity, and completely ignore backward compatibility.
2. Cleanup: Remove all legacy code, comments, tests, and PHPDocs.
3. Refactoring: Move all database logic into Models and extract repetitive Filament code into dedicated Helper classes. Identify and fix any existing logical errors.
4. Database: Consolidate migrations into a single file per table or topic (e.g., users, cache, jobs) to reduce the overall number of migration files.
5. Modularity: Use the `laravel-modules` package to encapsulate all features, routing, and Filament resources strictly inside their respective modules.
6. Frontend: Optimize and reduce the CSS footprint while maintaining the exact same visual output.

12
.github/workflows/issues.yml vendored Normal file
View File

@ -0,0 +1,12 @@
name: Issues
on:
issues:
types: [labeled]
permissions:
issues: write
jobs:
help-wanted:
uses: laravel/.github/.github/workflows/issues.yml@main

12
.github/workflows/pull-requests.yml vendored Normal file
View File

@ -0,0 +1,12 @@
name: Pull Requests
on:
pull_request_target:
types: [opened]
permissions:
pull-requests: write
jobs:
uneditable:
uses: laravel/.github/.github/workflows/pull-requests.yml@main

47
.github/workflows/tests.yml vendored Normal file
View File

@ -0,0 +1,47 @@
name: Tests
on:
push:
branches:
- master
- '*.x'
pull_request:
schedule:
- cron: '0 0 * * *'
permissions:
contents: read
jobs:
tests:
runs-on: ubuntu-latest
strategy:
fail-fast: true
matrix:
php: [8.2, 8.3, 8.4]
name: PHP ${{ matrix.php }}
steps:
- name: Checkout code
uses: actions/checkout@v6
- name: Setup PHP
uses: shivammathur/setup-php@v2
with:
php-version: ${{ matrix.php }}
extensions: dom, curl, libxml, mbstring, zip, pcntl, pdo, sqlite, pdo_sqlite
coverage: none
- name: Install Composer dependencies
run: composer install --prefer-dist --no-interaction --no-progress
- name: Copy environment file
run: cp .env.example .env
- name: Generate app key
run: php artisan key:generate
- name: Execute tests
run: php artisan test

13
.github/workflows/update-changelog.yml vendored Normal file
View File

@ -0,0 +1,13 @@
name: Update Changelog
on:
release:
types: [released]
permissions: {}
jobs:
update:
permissions:
contents: write
uses: laravel/.github/.github/workflows/update-changelog.yml@main

52
.gitignore vendored
View File

@ -1,32 +1,24 @@
.idea
*.log
.DS_Store
.env
.coverage
/bin
/core
/build
/vendor
/coverage
.env.backup
.env.production
.phpactor.json
.phpunit.result.cache
/.fleet
/.idea
/.nova
/.phpunit.cache
/.vscode
/.zed
/auth.json
/node_modules
/bower_components
composer.lock
package-lock.json
* text=auto
*.txt text eol=lf
*.xml text eol=lf
*.json text eol=lf
*.properties text eol=lf
*.conf text eol=lf
*.sh text eol=lf
Dockerfile text eol=lf
*.awk text eol=lf
*.sed text eol=lf
*.sh text eol=lf
*.png binary
*.jpg binary
*.p12 binary
/public/build
/public/hot
/public/storage
/storage/*.key
/storage/pail
/vendor
Homestead.json
Homestead.yaml
Thumbs.db

9
.styleci.yml Normal file
View File

@ -0,0 +1,9 @@
php:
preset: laravel
disabled:
- no_unused_imports
finder:
not-name:
- index.php
js: true
css: true

19
CHANGELOG.md Normal file
View File

@ -0,0 +1,19 @@
# OpenClassify Changelog
All notable changes to OpenClassify will be documented in this file.
## [1.0.0] - 2025-01-01
### Added
- Initial release of OpenClassify — a Laravel 12 classified ads platform (inspired by Letgo/OLX)
- **Category Module**: Hierarchical categories with icons and up to 10 levels of nesting; seeded with 8 top-level categories and 33 subcategories
- **Listing Module**: Classified ads with title, description, price, currency, location, featured flag, and contact info
- **Location Module**: Country/City/District/Neighborhood hierarchy with seed data for 5 countries
- **Profile Module**: User profile management with bio, phone, location, and website
- Home page with hero search bar, stats bar, category grid, featured listings, and recent listings
- Partner dashboard showing user's own listings with activity stats
- Language switcher with support for 10 locales: English, Turkish, Arabic, Chinese, Spanish, French, German, Portuguese, Russian, Japanese
- RTL layout support for Arabic
- SQLite database with full migration support
- Authentication via Laravel Breeze (login, register, password reset, email verification)
- Responsive UI using Tailwind CSS

View File

@ -1,20 +0,0 @@
# The MIT License (MIT)
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.

View File

@ -0,0 +1,36 @@
<?php
namespace Modules\Category\Database\Seeders;
use Illuminate\Database\Seeder;
use Modules\Category\Models\Category;
use Illuminate\Support\Str;
class CategorySeeder extends Seeder
{
public function run(): void
{
$categories = [
['name' => 'Electronics', 'icon' => '📱', 'children' => ['Mobile Phones', 'Laptops & Computers', 'Tablets', 'Cameras', 'Audio']],
['name' => 'Vehicles', 'icon' => '🚗', 'children' => ['Cars', 'Motorcycles', 'Trucks', 'Boats']],
['name' => 'Real Estate', 'icon' => '🏠', 'children' => ['Apartments for Rent', 'Houses for Sale', 'Commercial', 'Land']],
['name' => 'Furniture', 'icon' => '🛋️', 'children' => ['Sofas', 'Beds', 'Tables', 'Wardrobes']],
['name' => 'Fashion', 'icon' => '👗', 'children' => ['Women', 'Men', 'Kids', 'Accessories']],
['name' => 'Jobs', 'icon' => '💼', 'children' => ['IT & Technology', 'Marketing', 'Sales', 'Education']],
['name' => 'Services', 'icon' => '🔧', 'children' => ['Home Repair', 'Tutoring', 'Design', 'Cleaning']],
['name' => 'Sports & Hobbies', 'icon' => '⚽', 'children' => ['Sports Equipment', 'Musical Instruments', 'Books', 'Games']],
];
foreach ($categories as $catData) {
$parent = Category::firstOrCreate(
['slug' => Str::slug($catData['name'])],
['name' => $catData['name'], 'icon' => $catData['icon'] ?? null, 'level' => 0, 'is_active' => true]
);
foreach ($catData['children'] as $childName) {
Category::firstOrCreate(
['slug' => Str::slug($childName)],
['name' => $childName, 'parent_id' => $parent->id, 'level' => 1, 'is_active' => true]
);
}
}
}
}

View File

@ -0,0 +1,21 @@
<?php
namespace Modules\Category\Http\Controllers;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use Modules\Category\Models\Category;
class CategoryController extends Controller
{
public function index()
{
$categories = Category::whereNull('parent_id')->with('children')->where('is_active', true)->get();
return view('category::index', compact('categories'));
}
public function show(Category $category)
{
$listings = $category->listings()->where('status', 'active')->paginate(12);
return view('category::show', compact('category', 'listings'));
}
}

View File

@ -0,0 +1,27 @@
<?php
namespace Modules\Category\Models;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\HasMany;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
class Category extends Model
{
protected $fillable = ['name', 'slug', 'description', 'icon', 'parent_id', 'level', 'sort_order', 'is_active'];
protected $casts = ['is_active' => 'boolean'];
public function parent(): BelongsTo
{
return $this->belongsTo(Category::class, 'parent_id');
}
public function children(): HasMany
{
return $this->hasMany(Category::class, 'parent_id');
}
public function listings(): HasMany
{
return $this->hasMany(\Modules\Listing\Models\Listing::class);
}
}

View File

@ -0,0 +1,18 @@
<?php
namespace Modules\Category\Providers;
use Illuminate\Support\ServiceProvider;
class CategoryServiceProvider extends ServiceProvider
{
protected string $moduleName = 'Category';
public function boot(): void
{
$this->loadMigrationsFrom(module_path($this->moduleName, 'database/migrations'));
$this->loadRoutesFrom(module_path($this->moduleName, 'routes/web.php'));
$this->loadViewsFrom(module_path($this->moduleName, 'resources/views'), 'category');
}
public function register(): void {}
}

View File

@ -0,0 +1,28 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
public function up(): void
{
Schema::create('categories', function (Blueprint $table) {
$table->id();
$table->string('name');
$table->string('slug')->unique();
$table->text('description')->nullable();
$table->string('icon')->nullable();
$table->foreignId('parent_id')->nullable()->constrained('categories')->nullOnDelete();
$table->integer('level')->default(0);
$table->integer('sort_order')->default(0);
$table->boolean('is_active')->default(true);
$table->timestamps();
});
}
public function down(): void
{
Schema::dropIfExists('categories');
}
};

View File

@ -0,0 +1,36 @@
<?php
namespace Modules\Category\Database\Seeders;
use Illuminate\Database\Seeder;
use Modules\Category\Models\Category;
use Illuminate\Support\Str;
class CategorySeeder extends Seeder
{
public function run(): void
{
$categories = [
['name' => 'Electronics', 'icon' => '📱', 'children' => ['Mobile Phones', 'Laptops & Computers', 'Tablets', 'Cameras', 'Audio']],
['name' => 'Vehicles', 'icon' => '🚗', 'children' => ['Cars', 'Motorcycles', 'Trucks', 'Boats']],
['name' => 'Real Estate', 'icon' => '🏠', 'children' => ['Apartments for Rent', 'Houses for Sale', 'Commercial', 'Land']],
['name' => 'Furniture', 'icon' => '🛋️', 'children' => ['Sofas', 'Beds', 'Tables', 'Wardrobes']],
['name' => 'Fashion', 'icon' => '👗', 'children' => ['Women', 'Men', 'Kids', 'Accessories']],
['name' => 'Jobs', 'icon' => '💼', 'children' => ['IT & Technology', 'Marketing', 'Sales', 'Education']],
['name' => 'Services', 'icon' => '🔧', 'children' => ['Home Repair', 'Tutoring', 'Design', 'Cleaning']],
['name' => 'Sports & Hobbies', 'icon' => '⚽', 'children' => ['Sports Equipment', 'Musical Instruments', 'Books', 'Games']],
];
foreach ($categories as $catData) {
$parent = Category::firstOrCreate(
['slug' => Str::slug($catData['name'])],
['name' => $catData['name'], 'icon' => $catData['icon'] ?? null, 'level' => 0, 'is_active' => true]
);
foreach ($catData['children'] as $childName) {
Category::firstOrCreate(
['slug' => Str::slug($childName)],
['name' => $childName, 'parent_id' => $parent->id, 'level' => 1, 'is_active' => true]
);
}
}
}
}

View File

@ -0,0 +1,12 @@
{
"name": "Category",
"alias": "category",
"description": "Categories with hierarchy support",
"keywords": [],
"priority": 0,
"providers": [
"Modules\\Category\\Providers\\CategoryServiceProvider"
],
"aliases": {},
"files": []
}

View File

@ -0,0 +1,15 @@
@extends('layouts.app')
@section('content')
<div class="container mx-auto px-4 py-8">
<h1 class="text-3xl font-bold mb-6">{{ __('messages.categories') }}</h1>
<div class="grid grid-cols-2 md:grid-cols-3 lg:grid-cols-4 gap-4">
@foreach($categories as $category)
<a href="{{ route('categories.show', $category) }}" class="bg-white rounded-lg shadow-md p-6 text-center hover:shadow-lg transition hover:bg-blue-50">
<div class="text-4xl mb-3">{{ $category->icon ?? '📦' }}</div>
<h3 class="font-semibold text-gray-900">{{ $category->name }}</h3>
<p class="text-gray-500 text-sm mt-1">{{ $category->children->count() }} subcategories</p>
</a>
@endforeach
</div>
</div>
@endsection

View File

@ -0,0 +1,33 @@
@extends('layouts.app')
@section('content')
<div class="container mx-auto px-4 py-8">
<div class="mb-6">
<h1 class="text-3xl font-bold">{{ $category->icon ?? '' }} {{ $category->name }}</h1>
@if($category->description)<p class="text-gray-600 mt-2">{{ $category->description }}</p>@endif
</div>
@if($category->children->count())
<div class="grid grid-cols-2 md:grid-cols-4 gap-4 mb-8">
@foreach($category->children as $child)
<a href="{{ route('categories.show', $child) }}" class="bg-blue-50 rounded-lg p-4 text-center hover:bg-blue-100 transition">
<h3 class="font-medium text-blue-800">{{ $child->name }}</h3>
</a>
@endforeach
</div>
@endif
<h2 class="text-xl font-bold mb-4">Listings in {{ $category->name }}</h2>
<div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6">
@forelse($listings as $listing)
<div class="bg-white rounded-lg shadow-md overflow-hidden">
<div class="p-4">
<h3 class="font-semibold">{{ $listing->title }}</h3>
<p class="text-green-600 font-bold">{{ $listing->price ? number_format($listing->price, 0).' '.$listing->currency : 'Free' }}</p>
<a href="{{ route('listings.show', $listing) }}" class="mt-2 block text-blue-600 hover:underline">View </a>
</div>
</div>
@empty
<p class="text-gray-500 col-span-3">No listings in this category yet.</p>
@endforelse
</div>
<div class="mt-6">{{ $listings->links() }}</div>
</div>
@endsection

View File

@ -0,0 +1,8 @@
<?php
use Illuminate\Support\Facades\Route;
use Modules\Category\Http\Controllers\CategoryController;
Route::prefix('categories')->name('categories.')->group(function () {
Route::get('/', [CategoryController::class, 'index'])->name('index');
Route::get('/{category}', [CategoryController::class, 'show'])->name('show');
});

View File

@ -0,0 +1,30 @@
<?php
namespace Modules\Listing\Database\Seeders;
use Illuminate\Database\Seeder;
use Modules\Listing\Models\Listing;
use Illuminate\Support\Str;
class ListingSeeder extends Seeder
{
public function run(): void
{
$listings = [
['title' => 'iPhone 14 Pro - Like New', 'price' => 750, 'category_id' => 1, 'status' => 'active'],
['title' => 'Samsung Galaxy S23', 'price' => 550, 'category_id' => 1, 'status' => 'active'],
['title' => 'MacBook Pro 2023', 'price' => 1800, 'category_id' => 2, 'status' => 'active'],
['title' => '2019 Toyota Corolla', 'price' => 15000, 'category_id' => 3, 'status' => 'active'],
['title' => 'Apartment for Rent - 2BR', 'price' => 1200, 'category_id' => 4, 'status' => 'active'],
['title' => 'Sofa Set - Excellent Condition', 'price' => 350, 'category_id' => 5, 'status' => 'active'],
];
foreach ($listings as $data) {
$data['slug'] = Str::slug($data['title']) . '-' . Str::random(6);
$data['description'] = 'Great item in excellent condition. Contact for more details.';
$data['contact_email'] = 'seller@example.com';
$data['city'] = 'Istanbul';
$data['country'] = 'Turkey';
Listing::firstOrCreate(['title' => $data['title']], $data);
}
}
}

View File

@ -0,0 +1,44 @@
<?php
namespace Modules\Listing\Http\Controllers;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use Modules\Listing\Models\Listing;
class ListingController extends Controller
{
public function index(Request $request)
{
$listings = Listing::where('status', 'active')
->orderByDesc('is_featured')
->orderByDesc('created_at')
->paginate(12);
return view('listing::index', compact('listings'));
}
public function show(Listing $listing)
{
return view('listing::show', compact('listing'));
}
public function create()
{
return view('listing::create');
}
public function store(Request $request)
{
$data = $request->validate([
'title' => 'required|string|max:255',
'description' => 'nullable|string',
'price' => 'nullable|numeric',
'category_id' => 'nullable|integer',
'contact_email' => 'nullable|email',
'contact_phone' => 'nullable|string',
]);
$data['user_id'] = auth()->id();
$data['slug'] = \Illuminate\Support\Str::slug($data['title']) . '-' . \Illuminate\Support\Str::random(6);
$listing = Listing::create($data);
return redirect()->route('listings.show', $listing)->with('success', 'Listing created!');
}
}

View File

@ -0,0 +1,34 @@
<?php
namespace Modules\Listing\Models;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Factories\HasFactory;
class Listing extends Model
{
use HasFactory;
protected $fillable = [
'title', 'description', 'price', 'currency', 'category_id',
'user_id', 'status', 'images', 'slug',
'contact_phone', 'contact_email', 'is_featured', 'expires_at',
'city', 'country',
];
protected $casts = [
'images' => 'array',
'is_featured' => 'boolean',
'expires_at' => 'datetime',
'price' => 'decimal:2',
];
public function category()
{
return $this->belongsTo(\Modules\Category\Models\Category::class);
}
public function user()
{
return $this->belongsTo(\App\Models\User::class);
}
}

View File

@ -0,0 +1,19 @@
<?php
namespace Modules\Listing\Providers;
use Illuminate\Support\ServiceProvider;
class ListingServiceProvider extends ServiceProvider
{
protected string $moduleName = 'Listing';
protected string $moduleNameLower = 'listing';
public function boot(): void
{
$this->loadViewsFrom(module_path($this->moduleName, 'resources/views'), $this->moduleNameLower);
$this->loadMigrationsFrom(module_path($this->moduleName, 'database/migrations'));
$this->loadRoutesFrom(module_path($this->moduleName, 'routes/web.php'));
}
public function register(): void {}
}

View File

@ -0,0 +1,35 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
public function up(): void
{
Schema::create('listings', function (Blueprint $table) {
$table->id();
$table->string('title');
$table->string('slug')->unique();
$table->text('description')->nullable();
$table->decimal('price', 10, 2)->nullable();
$table->string('currency', 3)->default('USD');
$table->foreignId('category_id')->nullable()->constrained('categories')->nullOnDelete();
$table->foreignId('user_id')->nullable()->constrained('users')->nullOnDelete();
$table->string('status')->default('active');
$table->json('images')->nullable();
$table->string('contact_phone')->nullable();
$table->string('contact_email')->nullable();
$table->boolean('is_featured')->default(false);
$table->timestamp('expires_at')->nullable();
$table->string('city')->nullable();
$table->string('country')->nullable();
$table->timestamps();
});
}
public function down(): void
{
Schema::dropIfExists('listings');
}
};

View File

@ -0,0 +1,30 @@
<?php
namespace Modules\Listing\Database\Seeders;
use Illuminate\Database\Seeder;
use Modules\Listing\Models\Listing;
use Illuminate\Support\Str;
class ListingSeeder extends Seeder
{
public function run(): void
{
$listings = [
['title' => 'iPhone 14 Pro - Like New', 'price' => 750, 'category_id' => 1, 'status' => 'active'],
['title' => 'Samsung Galaxy S23', 'price' => 550, 'category_id' => 1, 'status' => 'active'],
['title' => 'MacBook Pro 2023', 'price' => 1800, 'category_id' => 2, 'status' => 'active'],
['title' => '2019 Toyota Corolla', 'price' => 15000, 'category_id' => 3, 'status' => 'active'],
['title' => 'Apartment for Rent - 2BR', 'price' => 1200, 'category_id' => 4, 'status' => 'active'],
['title' => 'Sofa Set - Excellent Condition', 'price' => 350, 'category_id' => 5, 'status' => 'active'],
];
foreach ($listings as $data) {
$data['slug'] = Str::slug($data['title']) . '-' . Str::random(6);
$data['description'] = 'Great item in excellent condition. Contact for more details.';
$data['contact_email'] = 'seller@example.com';
$data['city'] = 'Istanbul';
$data['country'] = 'Turkey';
Listing::firstOrCreate(['title' => $data['title']], $data);
}
}
}

View File

@ -0,0 +1,12 @@
{
"name": "Listing",
"alias": "listing",
"description": "Classified ads listings module",
"keywords": [],
"priority": 0,
"providers": [
"Modules\\Listing\\Providers\\ListingServiceProvider"
],
"aliases": {},
"files": []
}

View File

@ -0,0 +1,33 @@
@extends('layouts.app')
@section('content')
<div class="container mx-auto px-4 py-8">
<div class="max-w-2xl mx-auto">
<h1 class="text-2xl font-bold mb-6">Post a New Listing</h1>
<form method="POST" action="{{ route('listings.store') }}" class="bg-white rounded-lg shadow-md p-6 space-y-4">
@csrf
<div>
<label class="block text-sm font-medium text-gray-700 mb-1">Title *</label>
<input type="text" name="title" value="{{ old('title') }}" required class="w-full border rounded-lg px-3 py-2 focus:outline-none focus:ring-2 focus:ring-blue-500">
@error('title')<p class="text-red-500 text-sm mt-1">{{ $message }}</p>@enderror
</div>
<div>
<label class="block text-sm font-medium text-gray-700 mb-1">Description</label>
<textarea name="description" rows="4" class="w-full border rounded-lg px-3 py-2 focus:outline-none focus:ring-2 focus:ring-blue-500">{{ old('description') }}</textarea>
</div>
<div>
<label class="block text-sm font-medium text-gray-700 mb-1">Price</label>
<input type="number" name="price" value="{{ old('price') }}" step="0.01" class="w-full border rounded-lg px-3 py-2 focus:outline-none focus:ring-2 focus:ring-blue-500">
</div>
<div>
<label class="block text-sm font-medium text-gray-700 mb-1">Contact Email</label>
<input type="email" name="contact_email" value="{{ old('contact_email') }}" class="w-full border rounded-lg px-3 py-2 focus:outline-none focus:ring-2 focus:ring-blue-500">
</div>
<div>
<label class="block text-sm font-medium text-gray-700 mb-1">Contact Phone</label>
<input type="text" name="contact_phone" value="{{ old('contact_phone') }}" class="w-full border rounded-lg px-3 py-2 focus:outline-none focus:ring-2 focus:ring-blue-500">
</div>
<button type="submit" class="w-full bg-blue-600 text-white py-3 rounded-lg hover:bg-blue-700 transition font-medium">Post Listing</button>
</form>
</div>
</div>
@endsection

View File

@ -0,0 +1,27 @@
@extends('layouts.app')
@section('content')
<div class="container mx-auto px-4 py-8">
<h1 class="text-3xl font-bold mb-6">{{ __('messages.listings') }}</h1>
<div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 gap-6">
@foreach($listings as $listing)
<div class="bg-white rounded-lg shadow-md overflow-hidden hover:shadow-lg transition">
<div class="bg-gray-200 h-48 flex items-center justify-center">
<svg class="w-16 h-16 text-gray-400" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 16l4.586-4.586a2 2 0 012.828 0L16 16m-2-2l1.586-1.586a2 2 0 012.828 0L20 14m-6-6h.01M6 20h12a2 2 0 002-2V6a2 2 0 00-2-2H6a2 2 0 00-2 2v12a2 2 0 002 2z"></path></svg>
</div>
<div class="p-4">
@if($listing->is_featured)
<span class="bg-yellow-100 text-yellow-800 text-xs font-medium px-2 py-1 rounded">Featured</span>
@endif
<h3 class="font-semibold text-gray-900 mt-2 truncate">{{ $listing->title }}</h3>
<p class="text-green-600 font-bold text-lg mt-1">
@if($listing->price) {{ number_format($listing->price, 0) }} {{ $listing->currency }} @else Free @endif
</p>
<p class="text-gray-500 text-sm mt-1">{{ $listing->city }}, {{ $listing->country }}</p>
<a href="{{ route('listings.show', $listing) }}" class="mt-3 block text-center bg-blue-600 text-white py-2 rounded hover:bg-blue-700 transition">View</a>
</div>
</div>
@endforeach
</div>
<div class="mt-8">{{ $listings->links() }}</div>
</div>
@endsection

View File

@ -0,0 +1,38 @@
@extends('layouts.app')
@section('content')
<div class="container mx-auto px-4 py-8">
<div class="max-w-4xl mx-auto">
<div class="bg-white rounded-lg shadow-md overflow-hidden">
<div class="bg-gray-200 h-96 flex items-center justify-center">
<svg class="w-24 h-24 text-gray-400" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 16l4.586-4.586a2 2 0 012.828 0L16 16m-2-2l1.586-1.586a2 2 0 012.828 0L20 14m-6-6h.01M6 20h12a2 2 0 002-2V6a2 2 0 00-2-2H6a2 2 0 00-2 2v12a2 2 0 002 2z"></path></svg>
</div>
<div class="p-6">
<div class="flex justify-between items-start">
<h1 class="text-2xl font-bold text-gray-900">{{ $listing->title }}</h1>
<span class="text-3xl font-bold text-green-600">
@if($listing->price) {{ number_format($listing->price, 0) }} {{ $listing->currency }} @else Free @endif
</span>
</div>
<p class="text-gray-500 mt-2">{{ $listing->city }}, {{ $listing->country }}</p>
<p class="text-gray-500 text-sm">Posted {{ $listing->created_at->diffForHumans() }}</p>
<div class="mt-4 border-t pt-4">
<h2 class="font-semibold text-lg mb-2">Description</h2>
<p class="text-gray-700">{{ $listing->description }}</p>
</div>
<div class="mt-6 bg-gray-50 rounded-lg p-4">
<h2 class="font-semibold text-lg mb-3">Contact Seller</h2>
@if($listing->contact_phone)
<p class="text-gray-700"><span class="font-medium">Phone:</span> {{ $listing->contact_phone }}</p>
@endif
@if($listing->contact_email)
<p class="text-gray-700"><span class="font-medium">Email:</span> {{ $listing->contact_email }}</p>
@endif
</div>
<div class="mt-6">
<a href="{{ route('listings.index') }}" class="text-blue-600 hover:underline"> Back to listings</a>
</div>
</div>
</div>
</div>
</div>
@endsection

View File

@ -0,0 +1,10 @@
<?php
use Illuminate\Support\Facades\Route;
use Modules\Listing\Http\Controllers\ListingController;
Route::prefix('listings')->name('listings.')->group(function () {
Route::get('/', [ListingController::class, 'index'])->name('index');
Route::get('/create', [ListingController::class, 'create'])->name('create')->middleware('auth');
Route::post('/', [ListingController::class, 'store'])->name('store')->middleware('auth');
Route::get('/{listing}', [ListingController::class, 'show'])->name('show');
});

View File

@ -0,0 +1,38 @@
<?php
namespace Modules\Location\Database\Seeders;
use Illuminate\Database\Seeder;
use Modules\Location\Models\Country;
use Modules\Location\Models\City;
use Modules\Location\Models\District;
class LocationSeeder extends Seeder
{
public function run(): void
{
$locations = [
['name' => 'Turkey', 'code' => 'TR', 'phone_code' => '+90', 'flag' => '🇹🇷',
'cities' => ['Istanbul' => ['Beyoglu', 'Kadikoy', 'Besiktas'], 'Ankara' => ['Cankaya', 'Kecioren'], 'Izmir' => ['Konak', 'Karsiyaka']]],
['name' => 'United States', 'code' => 'US', 'phone_code' => '+1', 'flag' => '🇺🇸',
'cities' => ['New York' => ['Manhattan', 'Brooklyn'], 'Los Angeles' => ['Hollywood', 'Venice'], 'Chicago' => ['Downtown', 'Midtown']]],
['name' => 'United Kingdom', 'code' => 'GB', 'phone_code' => '+44', 'flag' => '🇬🇧',
'cities' => ['London' => ['Westminster', 'Shoreditch'], 'Manchester' => ['City Centre'], 'Birmingham' => ['Jewellery Quarter']]],
['name' => 'Germany', 'code' => 'DE', 'phone_code' => '+49', 'flag' => '🇩🇪',
'cities' => ['Berlin' => ['Mitte', 'Prenzlauer Berg'], 'Munich' => ['Schwabing', 'Maxvorstadt']]],
['name' => 'France', 'code' => 'FR', 'phone_code' => '+33', 'flag' => '🇫🇷',
'cities' => ['Paris' => ['Marais', 'Montmartre'], 'Lyon' => ['Presquile']]],
];
foreach ($locations as $countryData) {
$cities = $countryData['cities'];
unset($countryData['cities']);
$country = Country::firstOrCreate(['code' => $countryData['code']], $countryData);
foreach ($cities as $cityName => $districts) {
$city = City::firstOrCreate(['name' => $cityName, 'country_id' => $country->id]);
foreach ($districts as $districtName) {
District::firstOrCreate(['name' => $districtName, 'city_id' => $city->id]);
}
}
}
}
}

View File

@ -0,0 +1,13 @@
<?php
namespace Modules\Location\Models;
use Illuminate\Database\Eloquent\Model;
class City extends Model
{
protected $fillable = ['name', 'country_id', 'is_active'];
protected $casts = ['is_active' => 'boolean'];
public function country() { return $this->belongsTo(Country::class); }
public function districts() { return $this->hasMany(District::class); }
}

View File

@ -0,0 +1,15 @@
<?php
namespace Modules\Location\Models;
use Illuminate\Database\Eloquent\Model;
class Country extends Model
{
protected $fillable = ['name', 'code', 'phone_code', 'flag', 'is_active'];
protected $casts = ['is_active' => 'boolean'];
public function cities()
{
return $this->hasMany(City::class);
}
}

View File

@ -0,0 +1,12 @@
<?php
namespace Modules\Location\Models;
use Illuminate\Database\Eloquent\Model;
class District extends Model
{
protected $fillable = ['name', 'city_id', 'is_active'];
protected $casts = ['is_active' => 'boolean'];
public function city() { return $this->belongsTo(City::class); }
}

View File

@ -0,0 +1,17 @@
<?php
namespace Modules\Location\Providers;
use Illuminate\Support\ServiceProvider;
class LocationServiceProvider extends ServiceProvider
{
protected string $moduleName = 'Location';
public function boot(): void
{
$this->loadMigrationsFrom(module_path($this->moduleName, 'database/migrations'));
$this->loadRoutesFrom(module_path($this->moduleName, 'routes/web.php'));
}
public function register(): void {}
}

View File

@ -0,0 +1,52 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
public function up(): void
{
Schema::create('countries', function (Blueprint $table) {
$table->id();
$table->string('name');
$table->string('code', 3)->unique();
$table->string('phone_code', 10)->nullable();
$table->string('flag', 10)->nullable();
$table->boolean('is_active')->default(true);
$table->timestamps();
});
Schema::create('cities', function (Blueprint $table) {
$table->id();
$table->string('name');
$table->foreignId('country_id')->constrained('countries')->cascadeOnDelete();
$table->boolean('is_active')->default(true);
$table->timestamps();
});
Schema::create('districts', function (Blueprint $table) {
$table->id();
$table->string('name');
$table->foreignId('city_id')->constrained('cities')->cascadeOnDelete();
$table->boolean('is_active')->default(true);
$table->timestamps();
});
Schema::create('neighborhoods', function (Blueprint $table) {
$table->id();
$table->string('name');
$table->foreignId('district_id')->constrained('districts')->cascadeOnDelete();
$table->boolean('is_active')->default(true);
$table->timestamps();
});
}
public function down(): void
{
Schema::dropIfExists('neighborhoods');
Schema::dropIfExists('districts');
Schema::dropIfExists('cities');
Schema::dropIfExists('countries');
}
};

View File

@ -0,0 +1,38 @@
<?php
namespace Modules\Location\Database\Seeders;
use Illuminate\Database\Seeder;
use Modules\Location\Models\Country;
use Modules\Location\Models\City;
use Modules\Location\Models\District;
class LocationSeeder extends Seeder
{
public function run(): void
{
$locations = [
['name' => 'Turkey', 'code' => 'TR', 'phone_code' => '+90', 'flag' => '🇹🇷',
'cities' => ['Istanbul' => ['Beyoglu', 'Kadikoy', 'Besiktas'], 'Ankara' => ['Cankaya', 'Kecioren'], 'Izmir' => ['Konak', 'Karsiyaka']]],
['name' => 'United States', 'code' => 'US', 'phone_code' => '+1', 'flag' => '🇺🇸',
'cities' => ['New York' => ['Manhattan', 'Brooklyn'], 'Los Angeles' => ['Hollywood', 'Venice'], 'Chicago' => ['Downtown', 'Midtown']]],
['name' => 'United Kingdom', 'code' => 'GB', 'phone_code' => '+44', 'flag' => '🇬🇧',
'cities' => ['London' => ['Westminster', 'Shoreditch'], 'Manchester' => ['City Centre'], 'Birmingham' => ['Jewellery Quarter']]],
['name' => 'Germany', 'code' => 'DE', 'phone_code' => '+49', 'flag' => '🇩🇪',
'cities' => ['Berlin' => ['Mitte', 'Prenzlauer Berg'], 'Munich' => ['Schwabing', 'Maxvorstadt']]],
['name' => 'France', 'code' => 'FR', 'phone_code' => '+33', 'flag' => '🇫🇷',
'cities' => ['Paris' => ['Marais', 'Montmartre'], 'Lyon' => ['Presquile']]],
];
foreach ($locations as $countryData) {
$cities = $countryData['cities'];
unset($countryData['cities']);
$country = Country::firstOrCreate(['code' => $countryData['code']], $countryData);
foreach ($cities as $cityName => $districts) {
$city = City::firstOrCreate(['name' => $cityName, 'country_id' => $country->id]);
foreach ($districts as $districtName) {
District::firstOrCreate(['name' => $districtName, 'city_id' => $city->id]);
}
}
}
}
}

View File

@ -0,0 +1,12 @@
{
"name": "Location",
"alias": "location",
"description": "Country, city, district and neighborhood management",
"keywords": [],
"priority": 0,
"providers": [
"Modules\\Location\\Providers\\LocationServiceProvider"
],
"aliases": {},
"files": []
}

View File

@ -0,0 +1,10 @@
<?php
use Illuminate\Support\Facades\Route;
Route::get('/locations/cities/{country}', function(\Modules\Location\Models\Country $country) {
return response()->json($country->cities);
})->name('locations.cities');
Route::get('/locations/districts/{city}', function(\Modules\Location\Models\City $city) {
return response()->json($city->districts);
})->name('locations.districts');

View File

@ -0,0 +1,34 @@
<?php
namespace Modules\Profile\Http\Controllers;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use Modules\Profile\Models\Profile;
class ProfileController extends Controller
{
public function show()
{
$profile = Profile::firstOrCreate(['user_id' => auth()->id()]);
return view('profile::show', compact('profile'));
}
public function edit()
{
$profile = Profile::firstOrCreate(['user_id' => auth()->id()]);
return view('profile::edit', compact('profile'));
}
public function update(Request $request)
{
$data = $request->validate([
'bio' => 'nullable|string|max:500',
'phone' => 'nullable|string|max:20',
'city' => 'nullable|string|max:100',
'country' => 'nullable|string|max:100',
'website' => 'nullable|url',
]);
Profile::updateOrCreate(['user_id' => auth()->id()], $data);
return redirect()->route('profile.show')->with('success', 'Profile updated!');
}
}

View File

@ -0,0 +1,15 @@
<?php
namespace Modules\Profile\Models;
use Illuminate\Database\Eloquent\Model;
class Profile extends Model
{
protected $fillable = ['user_id', 'avatar', 'bio', 'phone', 'city', 'country', 'website', 'is_verified'];
protected $casts = ['is_verified' => 'boolean'];
public function user()
{
return $this->belongsTo(\App\Models\User::class);
}
}

View File

@ -0,0 +1,18 @@
<?php
namespace Modules\Profile\Providers;
use Illuminate\Support\ServiceProvider;
class ProfileServiceProvider extends ServiceProvider
{
protected string $moduleName = 'Profile';
public function boot(): void
{
$this->loadMigrationsFrom(module_path($this->moduleName, 'database/migrations'));
$this->loadRoutesFrom(module_path($this->moduleName, 'routes/web.php'));
$this->loadViewsFrom(module_path($this->moduleName, 'resources/views'), 'profile');
}
public function register(): void {}
}

View File

@ -0,0 +1,28 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
public function up(): void
{
Schema::create('profiles', function (Blueprint $table) {
$table->id();
$table->foreignId('user_id')->unique()->constrained('users')->cascadeOnDelete();
$table->string('avatar')->nullable();
$table->text('bio')->nullable();
$table->string('phone')->nullable();
$table->string('city')->nullable();
$table->string('country')->nullable();
$table->string('website')->nullable();
$table->boolean('is_verified')->default(false);
$table->timestamps();
});
}
public function down(): void
{
Schema::dropIfExists('profiles');
}
};

View File

@ -0,0 +1,12 @@
{
"name": "Profile",
"alias": "profile",
"description": "User profile management",
"keywords": [],
"priority": 0,
"providers": [
"Modules\\Profile\\Providers\\ProfileServiceProvider"
],
"aliases": {},
"files": []
}

View File

@ -0,0 +1,34 @@
@extends('layouts.app')
@section('content')
<div class="container mx-auto px-4 py-8">
<div class="max-w-2xl mx-auto">
<h1 class="text-2xl font-bold mb-6">Edit Profile</h1>
<form method="POST" action="{{ route('profile.update') }}" class="bg-white rounded-lg shadow-md p-6 space-y-4">
@csrf @method('PUT')
<div>
<label class="block text-sm font-medium text-gray-700 mb-1">Bio</label>
<textarea name="bio" rows="3" class="w-full border rounded-lg px-3 py-2 focus:outline-none focus:ring-2 focus:ring-blue-500">{{ old('bio', $profile->bio) }}</textarea>
</div>
<div>
<label class="block text-sm font-medium text-gray-700 mb-1">Phone</label>
<input type="text" name="phone" value="{{ old('phone', $profile->phone) }}" class="w-full border rounded-lg px-3 py-2 focus:outline-none focus:ring-2 focus:ring-blue-500">
</div>
<div class="grid grid-cols-2 gap-4">
<div>
<label class="block text-sm font-medium text-gray-700 mb-1">City</label>
<input type="text" name="city" value="{{ old('city', $profile->city) }}" class="w-full border rounded-lg px-3 py-2 focus:outline-none focus:ring-2 focus:ring-blue-500">
</div>
<div>
<label class="block text-sm font-medium text-gray-700 mb-1">Country</label>
<input type="text" name="country" value="{{ old('country', $profile->country) }}" class="w-full border rounded-lg px-3 py-2 focus:outline-none focus:ring-2 focus:ring-blue-500">
</div>
</div>
<div>
<label class="block text-sm font-medium text-gray-700 mb-1">Website</label>
<input type="url" name="website" value="{{ old('website', $profile->website) }}" class="w-full border rounded-lg px-3 py-2 focus:outline-none focus:ring-2 focus:ring-blue-500">
</div>
<button type="submit" class="w-full bg-blue-600 text-white py-3 rounded-lg hover:bg-blue-700 transition font-medium">Save Profile</button>
</form>
</div>
</div>
@endsection

View File

@ -0,0 +1,25 @@
@extends('layouts.app')
@section('content')
<div class="container mx-auto px-4 py-8">
<div class="max-w-2xl mx-auto bg-white rounded-lg shadow-md p-6">
<div class="flex items-center space-x-4 mb-6">
<div class="w-16 h-16 bg-blue-100 rounded-full flex items-center justify-center">
<span class="text-2xl font-bold text-blue-600">{{ substr(auth()->user()->name, 0, 1) }}</span>
</div>
<div>
<h1 class="text-2xl font-bold">{{ auth()->user()->name }}</h1>
<p class="text-gray-500">{{ auth()->user()->email }}</p>
</div>
</div>
@if($profile->bio)<p class="text-gray-700 mb-4">{{ $profile->bio }}</p>@endif
<div class="space-y-2 text-gray-600">
@if($profile->phone)<p>📞 {{ $profile->phone }}</p>@endif
@if($profile->city)<p>📍 {{ $profile->city }}@if($profile->country), {{ $profile->country }}@endif</p>@endif
@if($profile->website)<p>🌐 <a href="{{ $profile->website }}" class="text-blue-600 hover:underline">{{ $profile->website }}</a></p>@endif
</div>
<div class="mt-6">
<a href="{{ route('profile.edit') }}" class="bg-blue-600 text-white px-4 py-2 rounded-lg hover:bg-blue-700 transition">Edit Profile</a>
</div>
</div>
</div>
@endsection

View File

@ -0,0 +1,9 @@
<?php
use Illuminate\Support\Facades\Route;
use Modules\Profile\Http\Controllers\ProfileController;
Route::middleware('auth')->prefix('profile')->name('profile.')->group(function () {
Route::get('/', [ProfileController::class, 'show'])->name('show');
Route::get('/edit', [ProfileController::class, 'edit'])->name('edit');
Route::put('/extended', [ProfileController::class, 'update'])->name('update');
});

137
README.md
View File

@ -1,84 +1,59 @@
<br>
<p align="center">
<a href="https://openclassify.com"><img src="https://raw.githubusercontent.com/openclassify/openclassify/master/public/openclassify-logo.png" width="250" alt="Openclassify Logo"></a>
OpenClassify is modular and most advanced open source classified platform build with Laravel included Pyrocms.
</p>
<br>
<p align="center">
<a href="https://packagist.org/packages/openclassify/openclassify" target="_blank">
<img class="badge" src="http://poser.pugx.org/openclassify/openclassify/v">
</a>
<a href="https://packagist.org/packages/openclassify/openclassify" target="_blank"><img class="badge" src="http://poser.pugx.org/openclassify/openclassify/downloads"></a>
<a href="https://packagist.org/packages/openclassify/openclassify" target="_blank"><img class="badge" src="http://poser.pugx.org/openclassify/openclassify/license"></a>
</p>
### Install with Docker
We suggest to use Docker. Nginx, Mysql and PHP 8.2 pre-installed. MacOS, Windows and Ubuntu is supported.
Install Docker and run it. Install by watching 2 min video on [Youtube](https://www.youtube.com/watch?v=vVpVmsxq-Z0&t=27s&pp=ygUTb3BlbmNsYXNzaWZ5IGRvY2tlcg%3D%3D)
1- Clone project
```bash
git clone https://github.com/openclassify/openclassify.git
```
2- Run install.sh
```bash
bash install.sh
```
3- That's it!
Open project at [localhost](http://localhost)
### Documentation
You can visit this link for detailed documentation.
https://visiosoft.gitbook.io/v2/
### CLI Commands
If you couldn't find a solution for any problem, please review our CLI Command document.
[View CLI Command Document](https://github.com/openclassify/openclassify/blob/master/docs/cli-commands.md)
### Other Installation Methods
Check [here](https://github.com/openclassify/openclassify/blob/master/docs/other-install-methods.md) for more.
### Translation
Openclassify support 22+ languages. If you'd like to contribute translations, please check out our [Crowdin](https://crowdin.com/project/openclassify) project.
### Server Requirements
- Only PHP > 8.2 Officially Supported!
- XML PHP Extension
- PDO PHP Extension
- cURL PHP Extension
- JSON PHP Extension
- Ctype PHP Extension
- BCMath PHP Extension
- SQLite PHP Extension
- OpenSSL PHP Extension
- Mbstring PHP Extension
- Fileinfo PHP Extension
- Tokenizer PHP Extension
- GD Library (>=2.0) **OR** Imagick PHP extension (>=6.5.7)
### Code Contributors
This project exists thanks to all the people who [contribute](https://github.com/openclassify/openclassify/graphs/contributors) and more.
<p align="center"><a href="https://laravel.com" target="_blank"><img src="https://raw.githubusercontent.com/laravel/art/master/logo-lockup/5%20SVG/2%20CMYK/1%20Full%20Color/laravel-logolockup-cmyk-red.svg" width="400" alt="Laravel Logo"></a></p>
<p align="center">
<a href = "https://github.com/openclassify/openclassify/graphs/contributors">
<img src = "https://contrib.rocks/image?repo=openclassify/openclassify"/>
</a>
<a href="https://github.com/laravel/framework/actions"><img src="https://github.com/laravel/framework/workflows/tests/badge.svg" alt="Build Status"></a>
<a href="https://packagist.org/packages/laravel/framework"><img src="https://img.shields.io/packagist/dt/laravel/framework" alt="Total Downloads"></a>
<a href="https://packagist.org/packages/laravel/framework"><img src="https://img.shields.io/packagist/v/laravel/framework" alt="Latest Stable Version"></a>
<a href="https://packagist.org/packages/laravel/framework"><img src="https://img.shields.io/packagist/l/laravel/framework" alt="License"></a>
</p>
## About Laravel
Laravel is a web application framework with expressive, elegant syntax. We believe development must be an enjoyable and creative experience to be truly fulfilling. Laravel takes the pain out of development by easing common tasks used in many web projects, such as:
- [Simple, fast routing engine](https://laravel.com/docs/routing).
- [Powerful dependency injection container](https://laravel.com/docs/container).
- Multiple back-ends for [session](https://laravel.com/docs/session) and [cache](https://laravel.com/docs/cache) storage.
- Expressive, intuitive [database ORM](https://laravel.com/docs/eloquent).
- Database agnostic [schema migrations](https://laravel.com/docs/migrations).
- [Robust background job processing](https://laravel.com/docs/queues).
- [Real-time event broadcasting](https://laravel.com/docs/broadcasting).
Laravel is accessible, powerful, and provides tools required for large, robust applications.
## Learning Laravel
Laravel has the most extensive and thorough [documentation](https://laravel.com/docs) and video tutorial library of all modern web application frameworks, making it a breeze to get started with the framework. You can also check out [Laravel Learn](https://laravel.com/learn), where you will be guided through building a modern Laravel application.
If you don't feel like reading, [Laracasts](https://laracasts.com) can help. Laracasts contains thousands of video tutorials on a range of topics including Laravel, modern PHP, unit testing, and JavaScript. Boost your skills by digging into our comprehensive video library.
## Laravel Sponsors
We would like to extend our thanks to the following sponsors for funding Laravel development. If you are interested in becoming a sponsor, please visit the [Laravel Partners program](https://partners.laravel.com).
### Premium Partners
- **[Vehikl](https://vehikl.com)**
- **[Tighten Co.](https://tighten.co)**
- **[Kirschbaum Development Group](https://kirschbaumdevelopment.com)**
- **[64 Robots](https://64robots.com)**
- **[Curotec](https://www.curotec.com/services/technologies/laravel)**
- **[DevSquad](https://devsquad.com/hire-laravel-developers)**
- **[Redberry](https://redberry.international/laravel-development)**
- **[Active Logic](https://activelogic.com)**
## Contributing
Thank you for considering contributing to the Laravel framework! The contribution guide can be found in the [Laravel documentation](https://laravel.com/docs/contributions).
## Code of Conduct
In order to ensure that the Laravel community is welcoming to all, please review and abide by the [Code of Conduct](https://laravel.com/docs/contributions#code-of-conduct).
## Security Vulnerabilities
If you discover a security vulnerability within Laravel, please send an e-mail to Taylor Otwell via [taylor@laravel.com](mailto:taylor@laravel.com). All security vulnerabilities will be promptly addressed.
## License
The Laravel framework is open-sourced software licensed under the [MIT license](https://opensource.org/licenses/MIT).

View File

@ -1 +0,0 @@
# Advs Module

View File

@ -1,17 +0,0 @@
{
"name": "visiosoft/advs-module",
"type": "streams-addon",
"autoload": {
"psr-4": {
"Visiosoft\\AdvsModule\\": "src/"
},
"files": [
"src/Support/_helpers.php"
]
},
"require": {
"fruitcake/laravel-cors": "^2.0",
"visiosoft/style_selector-module": "*",
"visiosoft/global_helper-extension": "*"
}
}

View File

@ -1,3 +0,0 @@
files:
- source: resources/lang/en/*.php
translation: resources/lang/%two_letters_code%/%original_file_name%

View File

@ -1,254 +0,0 @@
<?php
use Anomaly\Streams\Platform\Database\Migration\Migration;
use Visiosoft\AdvsModule\Adv\AdvModel;
use Visiosoft\CatsModule\Category\CategoryModel;
use Visiosoft\LocationModule\Country\CountryModel;
use Visiosoft\AdvsModule\City\CityModel;
use Visiosoft\AdvsModule\CustomField\CustomFieldModel;
use Visiosoft\AdvsModule\District\DistrictModel;
use Visiosoft\AdvsModule\Neighborhood\NeighborhoodModel;
use Anomaly\Streams\Platform\Model\Blocks\BlocksAreasEntryModel;
use Anomaly\Streams\Platform\Model\Blocks\BlocksBlocksEntryModel;
use Anomaly\Streams\Platform\Model\HtmlBlock\HtmlBlockBlocksEntryModel;
use Illuminate\Support\Facades\DB;
class VisiosoftModuleAdvsCreateAdvsFields extends Migration
{
/**
* The addon fields.
*
* @var array
*/
protected $fields = [
'name' => 'anomaly.field_type.text',
'slug' => [
'type' => 'anomaly.field_type.slug',
'config' => [
'slugify' => 'name',
'type' => '_'
],
],
'description' => 'anomaly.field_type.textarea',
'advs_desc' => [
'type' => 'anomaly.field_type.wysiwyg',
'config' => [
'height' => 500,
],
],
'cat1' => [
'type' => 'anomaly.field_type.select',
'config' => [
"default_value" => 0,
]
],
'cat2' => [
'type' => 'anomaly.field_type.select',
'config' => [
"default_value" => NULL,
]
],
'cat3' => [
'type' => 'anomaly.field_type.select',
'config' => [
"default_value" => NULL,
]
],
'cat4' => [
'type' => 'anomaly.field_type.select',
'config' => [
"default_value" => NULL,
]
],
'cat5' => [
'type' => 'anomaly.field_type.select',
'config' => [
"default_value" => NULL,
]
],
'cat6' => [
'type' => 'anomaly.field_type.select',
'config' => [
"default_value" => NULL,
]
],
'cat7' => [
'type' => 'anomaly.field_type.select',
'config' => [
"default_value" => NULL,
]
],
'cat8' => [
'type' => 'anomaly.field_type.select',
'config' => [
"default_value" => NULL,
]
],
'cat9' => [
'type' => 'anomaly.field_type.select',
'config' => [
"default_value" => NULL,
]
],
'cat10' => [
'type' => 'anomaly.field_type.select',
'config' => [
"default_value" => NULL,
]
],
'parent_category' => [
'type' => 'anomaly.field_type.relationship',
'config' => [
'related' => CategoryModel::class,
"default_value" => 0,
]
],
'status' => [
'type' => 'anomaly.field_type.text',
'config' => [
'type' => 'text',
'default_value' => 'pending_user'
]
],
'order' => 'anomaly.field_type.integer',
'price' => [
'type' => 'visiosoft.field_type.decimal',
'config' => [
'decimal' => 2,
'separator' => '.',
'point' => ','
],
],
'currency' => [
'type' => 'anomaly.field_type.select',
'config' => [
'handler' => 'currencies',
],
],
'stock' => [
'type' => 'anomaly.field_type.integer',
'config' => [
'default_value' => 0,
]
],
'online_payment' => [
'type' => 'anomaly.field_type.boolean',
'config' => [
'default_value' => 0,
'min' => 0,
'max' => 9,
]
],
'is_get_adv' => [
'type' => 'anomaly.field_type.boolean',
'config' => [
'default_value' => 0,
]
],
'files' => [
'type' => 'visiosoft.field_type.media',
'config' => [
'folders' => ["images"],
'mode' => 'upload',
]
],
'country' => [
'type' => 'anomaly.field_type.relationship',
'config' => [
'related' => CountryModel::class,
"default_value" => 0,
]
],
'city' => [
"type" => "anomaly.field_type.select",
"config" => [
"options" => [],
]
],
'district' => [
"type" => "anomaly.field_type.select",
"config" => [
"options" => [],
]
],
'neighborhood' => [
"type" => "anomaly.field_type.select",
"config" => [
"options" => [],
]
],
'village' => [
"type" => "anomaly.field_type.select",
"config" => [
"options" => [],
]
],
'map_Val' => "anomaly.field_type.text",
'parent_country_id' => 'anomaly.field_type.integer',
'parent_city_id' => 'anomaly.field_type.integer',
'parent_district_id' => 'anomaly.field_type.integer',
'parent_neighborhood_id' => 'anomaly.field_type.integer',
'publish_at' => 'anomaly.field_type.datetime',
'finish_at' => 'anomaly.field_type.datetime',
'custom_field_category' => [
'type' => 'anomaly.field_type.relationship',
'config' => [
'related' => CustomFieldModel::class,
],
],
'parent_adv' => [
'type' => 'anomaly.field_type.relationship',
'config' => [
'related' => AdvModel::class,
],
],
'custom_field_value' => 'anomaly.field_type.text',
'type' => [
'type' => 'anomaly.field_type.select',
'config' => [
'options' => ['text' => 'Text Box', 'select' => 'Secim Alani(Select Box)', 'checkboxes' => 'Coklu Secim(Check Box)', 'multiple' => 'Cok Satirli Alan(Multi Line Box)', 'integer' => 'Tam Sayi', 'colorpicker' => 'Color Picker'],
'separator' => ':',
]
],
'custom_field_select_options' => 'anomaly.field_type.text',
'popular_adv' => [
'type' => 'anomaly.field_type.boolean',
'config' => [
'default_value' => 0,
]
],
'adv_day' => [
'type' => 'anomaly.field_type.boolean',
'config' => [
'default_value' => 0,
]
],
'custom_field_type' => "anomaly.field_type.text",
'cf_json' => "visiosoft.field_type.json",
'foreign_currencies' => 'visiosoft.field_type.json',
'deleted_at' => "anomaly.field_type.datetime",
'value' => 'anomaly.field_type.text',
'cover_photo' => 'anomaly.field_type.text',
'category_id' => 'anomaly.field_type.integer',
'field_id' => 'anomaly.field_type.integer',
'custom_field' => [
'type' => 'anomaly.field_type.relationship',
'config' => [
'related' => CustomFieldModel::class,
],
],
'count_show_phone' => [
'type' => 'anomaly.field_type.integer',
'config' => [
'default_value' => 0,
]
],
'count_show_ad' => [
'type' => 'anomaly.field_type.integer',
'config' => [
'default_value' => 0,
]
],
];
}

View File

@ -1,81 +0,0 @@
<?php
use Anomaly\Streams\Platform\Database\Migration\Migration;
class VisiosoftModuleAdvsCreateAdvsStream extends Migration
{
public function __construct()
{
\Illuminate\Support\Facades\DB::getDoctrineSchemaManager()
->getDatabasePlatform()->registerDoctrineTypeMapping('point', 'string');
}
/**
* The stream definition.
*
* @var array
*/
protected $stream = [
'slug' => 'advs',
'title_column' => 'name',
'translatable' => true,
'trashable' => true,
'searchable' => false,
'sortable' => false,
];
/**
* The stream assignments.
*
* @var array
*/
protected $assignments = [
'name' => [
'translatable' => true,
'required' => true,
],
'slug' => [
'required' => true,
],
'advs_desc' => [
'translatable' => true,
],
'cat1',
'cat2',
'cat3',
'cat4',
'cat5',
'cat6',
'cat7',
'cat8',
'cat9',
'cat10',
'price' => [
'required' => true
],
'currency' => [
'required' => true
],
'foreign_currencies',
'online_payment',
'is_get_adv',
'stock',
'country',
'city',
'district',
'neighborhood',
'village',
'map_Val',
'files',
'publish_at',
'finish_at',
'status',
'popular_adv',
'adv_day',
'cf_json',
'cover_photo',
'count_show_phone',
'count_show_ad'
];
}

View File

@ -1,57 +0,0 @@
<?php
use Anomaly\Streams\Platform\Database\Migration\Migration;
class VisiosoftModuleAdvsCreateOptionsStream extends Migration
{
/**
* This migration creates the stream.
* It should be deleted on rollback.
*
* @var bool
*/
protected $delete = true;
/**
* The stream definition.
*
* @var array
*/
protected $stream = [
'slug' => 'options',
'title_column' => 'name',
'translatable' => false,
'versionable' => false,
'trashable' => false,
'searchable' => false,
'sortable' => false,
];
/**
* This field will be added.
*/
protected $fields = [
"adv" => [
"type" => "anomaly.field_type.relationship",
"config" => [
"related" => \Visiosoft\AdvsModule\Adv\AdvModel::class,
]
]
];
/**
* The stream assignments.
*
* @var array
*/
protected $assignments = [
'name' => [
'required' => true,
],
'adv' => [
'required' => true,
],
];
}

View File

@ -1,52 +0,0 @@
<?php
use Anomaly\Streams\Platform\Database\Migration\Migration;
class VisiosoftModuleAdvsCreateStandardPriceField extends Migration
{
/**
* Don't delete stream on rollback
* because this isn't creating the
* stream only referencing it.
*/
protected $delete = false;
/**
* Any additional information will
* be updated. Slug helps find
* the stream to work with for
* assignments that follow.
*/
protected $stream = [
'slug' => 'advs',
];
/**
* The addon fields.
*
* @var array
*/
protected $fields = [
'standard_price' => [
'type' => 'visiosoft.field_type.decimal',
'config' => [
'decimal' => 2,
'separator' => '.',
'point' => ','
],
],
];
/**
* The field's assignment.
*
* @var array
*/
protected $assignments = [
'standard_price' => [
'required' => true
],
];
}

View File

@ -1,52 +0,0 @@
<?php
use Anomaly\Streams\Platform\Database\Migration\Migration;
use Visiosoft\AdvsModule\Adv\AdvModel;
class VisiosoftModuleAdvsCreateProductoptionsStream extends Migration
{
/**
* This migration creates the stream.
* It should be deleted on rollback.
*
* @var bool
*/
protected $delete = true;
protected $fields = [
'category' => [
'type' => 'anomaly.field_type.select',
'config' => [
'handler' => 'Visiosoft\AdvsModule\OptionHandler\CategoriesOptions@handle'
]
],
];
/**
* The stream definition.
*
* @var array
*/
protected $stream = [
'slug' => 'productoptions',
'title_column' => 'name',
'translatable' => true,
'versionable' => false,
'trashable' => true,
'searchable' => false,
'sortable' => false,
];
/**
* The stream assignments.
*
* @var array
*/
protected $assignments = [
'category',
'name' => [
'translatable' => true,
'required' => true,
],
];
}

View File

@ -1,56 +0,0 @@
<?php
use Anomaly\Streams\Platform\Database\Migration\Migration;
use \Visiosoft\AdvsModule\Productoption\ProductoptionModel;
class VisiosoftModuleAdvsCreateProductoptionsValueStream extends Migration
{
/**
* This migration creates the stream.
* It should be deleted on rollback.
*
* @var bool
*/
protected $delete = true;
protected $fields = [
'product_option' => [
'type' => 'anomaly.field_type.relationship',
'config' => [
'related' => ProductoptionModel::class,
],
]
];
/**
* The stream definition.
*
* @var array
*/
protected $stream = [
'slug' => 'productoptions_value',
'title_column' => 'name',
'translatable' => true,
'versionable' => false,
'trashable' => true,
'searchable' => false,
'sortable' => false,
];
/**
* The stream assignments.
*
* @var array
*/
protected $assignments = [
'name' => [
'translatable' => true,
'required' => true,
],
'product_option' => [
'required' => true,
],
];
}

View File

@ -1,48 +0,0 @@
<?php
use Anomaly\Streams\Platform\Database\Migration\Migration;
class VisiosoftModuleAdvsAddedOptionsField extends Migration
{
/**
* Don't delete stream on rollback
* because this isn't creating the
* stream only referencing it.
*/
protected $delete = false;
/**
* Any additional information will
* be updated. Slug helps find
* the stream to work with for
* assignments that follow.
*/
protected $stream = [
'slug' => 'advs',
];
/**
* The addon fields.
*
* @var array
*/
protected $fields = [
'product_options_value' => [
'type' => 'anomaly.field_type.multiple',
'config' => [
'mode' => 'lookup',
'related' => \Visiosoft\AdvsModule\ProductoptionsValue\ProductoptionsValueModel::class,
],
]
];
/**
* The field's assignment.
*
* @var array
*/
protected $assignments = [
'product_options_value',
];
}

View File

@ -1,58 +0,0 @@
<?php
use Anomaly\Streams\Platform\Database\Migration\Migration;
class VisiosoftModuleAdvsCreateOptionConfigurationStream extends Migration
{
/**
* This migration creates the stream.
* It should be deleted on rollback.
*
* @var bool
*/
protected $delete = true;
protected $fields = [
'option_json' => 'visiosoft.field_type.json',
];
/**
* The stream definition.
*
* @var array
*/
protected $stream = [
'slug' => 'option_configuration',
'title_column' => 'option_json',
'translatable' => false,
'versionable' => false,
'trashable' => false,
'searchable' => false,
'sortable' => false,
];
/**
* The stream assignments.
*
* @var array
*/
protected $assignments = [
'parent_adv' => [
'required' => true,
],
'price' => [
'required' => true,
],
'currency' => [
'required' => true,
],
'stock' => [
'required' => true,
],
'option_json' => [
'required' => true,
],
];
}

View File

@ -1,27 +0,0 @@
<?php
use Anomaly\Streams\Platform\Database\Migration\Migration;
class VisiosoftModuleAdvsCreateOldPriceField extends Migration
{
protected $delete = false;
protected $stream = [
'slug' => 'advs',
];
protected $fields = [
'old_price' => [
'type' => 'visiosoft.field_type.decimal',
'config' => [
'decimal' => 2,
'separator' => '.',
'point' => ','
],
],
];
protected $assignments = [
'old_price'
];
}

View File

@ -1,23 +0,0 @@
<?php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Anomaly\Streams\Platform\Database\Migration\Migration;
class VisiosoftModuleAdvsAlterIndexToAllTable extends Migration
{
public function up()
{
Schema::table('advs_productoptions_value_translations', function (Blueprint $table) {
$table->index('entry_id');
});
Schema::table('advs_advs_translations', function (Blueprint $table) {
$table->index('entry_id');
});
Schema::table('advs_productoptions_translations', function (Blueprint $table) {
$table->index('entry_id');
});
}
}

View File

@ -1,48 +0,0 @@
<?php
use Anomaly\Streams\Platform\Database\Migration\Migration;
class VisiosoftModuleAdvsCreateStatusStream extends Migration
{
protected $delete = true;
protected $stream = [
'slug' => 'status',
'title_column' => 'slug',
'translatable' => true,
'versionable' => false,
'trashable' => true,
'searchable' => false,
'sortable' => false,
];
protected $fields = [
"is_system" => [
"type" => "anomaly.field_type.boolean",
"config" => [
"default_value" => false,
"mode" => "radio",
]
],
"user_access" => [
"type" => "anomaly.field_type.boolean",
"config" => [
"default_value" => true,
"mode" => "radio",
]
]
];
protected $assignments = [
'name' => [
'required' => true,
'translatable' => true,
],
'slug' => [
'required' => true,
'unique' => true,
],
"is_system",
"user_access"
];
}

View File

@ -1,24 +0,0 @@
<?php
use Anomaly\Streams\Platform\Database\Migration\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class VisiosoftModuleAdvsUpdateCoorColumn extends Migration
{
public function __construct()
{
\Illuminate\Support\Facades\DB::getDoctrineSchemaManager()
->getDatabasePlatform()->registerDoctrineTypeMapping('point', 'string');
}
public function up()
{
if (Schema::hasColumn('advs_advs', 'coor'))
{
Schema::table('advs_advs', function (Blueprint $table) {
$table->longText('coor')->change();
});
}
}
}

View File

@ -1,26 +0,0 @@
<?php
use Anomaly\Streams\Platform\Database\Migration\Migration;
class VisiosoftModuleAdvsAddDocFilesField extends Migration
{
protected $delete = false;
protected $stream = [
'slug' => 'advs',
];
protected $fields = [
'doc_files' => [
'type' => 'visiosoft.field_type.media',
'config' => [
'folders' => ["ads_documents"],
'mode' => 'upload',
],
],
];
protected $assignments = [
'doc_files'
];
}

View File

@ -1,21 +0,0 @@
<?php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Anomaly\Streams\Platform\Database\Migration\Migration;
class VisiosoftModuleAdvsAddIndexTable extends Migration
{
public function up()
{
Schema::table('advs_advs', function (Blueprint $table) {
$table->index('deleted_at');
$table->index('cat1');
$table->index('country_id');
$table->index('city');
$table->index('finish_at');
$table->index('status');
$table->index('count_show_ad');
});
}
}

View File

@ -1,35 +0,0 @@
<?php
use Anomaly\Streams\Platform\Database\Migration\Migration;
class VisiosoftModuleAdvsChangeProductOptionsValue extends Migration
{
public function __construct()
{
//Maria DB will be removed when the version is updated.
\Illuminate\Support\Facades\DB::getDoctrineSchemaManager()
->getDatabasePlatform()->registerDoctrineTypeMapping('point', 'string');
}
public function up()
{
if (!$field = $this->fields()->findBySlugAndNamespace('product_options_value', 'advs')) {
return;
}
$field->setAttribute('type', 'visiosoft.field_type.multiple');
$this->fields()->save($field);
}
public function down()
{
if (!$field = $this->fields()->findBySlugAndNamespace('product_options_value', 'advs')) {
return;
}
$field->setAttribute('type', 'anomaly.field_type.multiple');
$this->fields()->save($field);
}
}

View File

@ -1,33 +0,0 @@
<?php
use Anomaly\Streams\Platform\Database\Migration\Migration;
class VisiosoftModuleAdvsCreateShowPhoneNumberField extends Migration
{
public function __construct()
{
//Maria DB will be removed when the version is updated.
\Illuminate\Support\Facades\DB::getDoctrineSchemaManager()
->getDatabasePlatform()->registerDoctrineTypeMapping('point', 'string');
}
protected $delete = false;
protected $stream = [
'slug' => 'advs',
];
protected $fields = [
'show_phone_number' => [
'type' => 'anomaly.field_type.boolean',
'config' => [
'default_value' => true,
'mode' => 'checkbox',
],
],
];
protected $assignments = [
'show_phone_number'
];
}

View File

@ -1,30 +0,0 @@
<?php
use Anomaly\Streams\Platform\Database\Migration\Migration;
class VisiosoftModuleAdvsCreateTaxField extends Migration
{
public function __construct()
{
//Maria DB will be removed when the version is updated.
\Illuminate\Support\Facades\DB::getDoctrineSchemaManager()
->getDatabasePlatform()->registerDoctrineTypeMapping('point', 'string');
}
protected $stream = [
'slug' => 'advs',
];
protected $fields = [
'tax' => [
'type' => 'anomaly.field_type.integer',
'config' => [
'default_value' => 0,
],
],
];
protected $assignments = [
'tax'
];
}

View File

@ -1,26 +0,0 @@
<?php
use Anomaly\Streams\Platform\Database\Migration\Migration;
class VisiosoftModuleAdvsAddTotalSalesField extends Migration
{
protected $delete = false;
protected $stream = [
'slug' => 'advs',
];
protected $fields = [
'total_sales' => [
'type' => 'anomaly.field_type.integer',
'config' => [
'min' => 0,
'default_value' => 0,
],
],
];
protected $assignments = [
'total_sales'
];
}

View File

@ -1,25 +0,0 @@
<?php
use Anomaly\Streams\Platform\Database\Migration\Migration;
class VisiosoftModuleAdvsCreateConfigFields extends Migration
{
public function __construct()
{
//Maria DB will be removed when the version is updated.
\Illuminate\Support\Facades\DB::getDoctrineSchemaManager()
->getDatabasePlatform()->registerDoctrineTypeMapping('point', 'string');
}
protected $stream = [
'slug' => 'advs',
];
protected $fields = [
'config' => 'visiosoft.field_type.json',
];
protected $assignments = [
'config'
];
}

View File

@ -1,20 +0,0 @@
<?php
use Anomaly\Streams\Platform\Database\Migration\Migration;
class VisiosoftModuleAdvsAddCustomOptionValue extends Migration
{
protected $stream = [
'slug' => 'option_configuration',
];
protected $fields = [
'custom_option' => [
'type' => 'anomaly.field_type.text',
],
];
protected $assignments = [
'custom_option'
];
}

View File

@ -1,28 +0,0 @@
<?php
use Anomaly\Streams\Platform\Database\Migration\Migration;
class VisiosoftModuleAdvsCreateAdNoteField extends Migration
{
protected $stream = [
'slug' => 'advs',
'title_column' => 'ad_note',
'translatable' => true,
];
protected $fields = [
'ad_note' => [
'type' => 'anomaly.field_type.textarea',
'config' => [
'required' => false,
'translatable' => true,
]
],
];
protected $assignments = [
'ad_note'
];
}

View File

@ -1,26 +0,0 @@
<?php
use Anomaly\Streams\Platform\Database\Migration\Migration;
class VisiosoftModuleAdvsCreateLastNotificationField extends Migration
{
protected $stream = [
'slug' => 'advs',
'title_column' => 'notificated_at',
];
protected $fields = [
'notificated_at' => [
'type' => 'anomaly.field_type.datetime',
'config' => [
'required' => false,
]
],
];
protected $assignments = [
'notificated_at'
];
}

View File

@ -1,27 +0,0 @@
<?php
use Anomaly\Streams\Platform\Database\Migration\Migration;
class VisiosoftModuleAdvsCreateMinOrderLimitField extends Migration
{
protected $stream = [
'slug' => 'advs',
'title_column' => 'min_order_limit',
];
protected $fields = [
'min_order_limit' => [
'type' => 'anomaly.field_type.integer',
'config' => [
'default_value' => 0,
'required' => false
],
],
];
protected $assignments = [
'min_order_limit'
];
}

View File

@ -1,24 +0,0 @@
<?php
use Anomaly\Streams\Platform\Database\Migration\Migration;
class VisiosoftModuleAdvsCreateTagsField extends Migration
{
protected $stream = [
'slug' => 'advs',
'title_column' => 'tags',
];
protected $fields = [
'tags' => [
'type' => 'anomaly.field_type.tags',
],
];
protected $assignments = [
'tags'
];
}

View File

@ -1,30 +0,0 @@
<?php
use Anomaly\Streams\Platform\Database\Migration\Migration;
class VisiosoftModuleAdvsCreateSeoFields extends Migration
{
protected $stream = [
'slug' => 'advs',
];
protected $fields = [
'seo_title' => [
'type' => 'anomaly.field_type.text',
],
'seo_description' => [
'type' => 'anomaly.field_type.text',
],
];
protected $assignments = [
'seo_title' => [
'translatable' => true
],
'seo_description' => [
'translatable' => true
],
];
}

View File

@ -1,37 +0,0 @@
<?php
use \Anomaly\Streams\Platform\Database\Migration\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class VisiosoftModuleAdvsUpdatePriceDigitLength extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::table('advs_advs', function (Blueprint $table) {
$table->decimal('price', 11, 4)->change();
$table->decimal('standard_price', 11, 4)->change();
$table->decimal('old_price', 11, 4)->change();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::table('advs_advs', function (Blueprint $table) {
$table->decimal('price', 11, 2)->change();
$table->decimal('standard_price', 11, 2)->change();
$table->decimal('old_price', 11, 2)->change();
});
}
}

View File

@ -1,62 +0,0 @@
<?php
use Anomaly\Streams\Platform\Assignment\Contract\AssignmentRepositoryInterface;
use \Anomaly\Streams\Platform\Database\Migration\Migration;
use Anomaly\Streams\Platform\Field\Contract\FieldRepositoryInterface;
use Anomaly\Streams\Platform\Stream\Contract\StreamRepositoryInterface;
class VisiosoftModuleAdvsAddEidsFieldsToUser extends Migration
{
public function up()
{
$streamRepository = app(StreamRepositoryInterface::class);
$fieldRepository = app(FieldRepositoryInterface::class);
$assignmentRepository = app(AssignmentRepositoryInterface::class);
$stream = $streamRepository->findBySlugAndNamespace('users', 'users');
if ($stream) {
$fields = [
[
'name' => 'Eids Auth Code',
'namespace' => 'users',
'slug' => 'eids_auth_code',
'type' => 'anomaly.field_type.text',
'locked' => 0
],
[
'name' => 'Is Eids Verified',
'namespace' => 'users',
'slug' => 'is_eids_verified',
'type' => 'anomaly.field_type.boolean',
'locked' => 0
],
];
foreach ($fields as $field) {
$checkField = $fieldRepository->findBySlugAndNamespace($field['slug'], 'users');
if (!$checkField) {
$field = $fieldRepository->create($field);
$assignmentRepository->create([
'stream_id' => $stream->id,
'field_id' => $field->id
]);
}
}
}
}
public function down()
{
if ($field = $this->fields()->findBySlugAndNamespace('eids_auth_code', 'users')) {
$field->delete();
}
if ($field = $this->fields()->findBySlugAndNamespace('is_eids_verified', 'users')) {
$field->delete();
}
}
}

View File

@ -1,29 +0,0 @@
<?php
return [
'advs' => [
'read',
'write',
'delete',
],
'productoptions' => [
'read',
'write',
'delete',
],
'productoptions_value' => [
'read',
'write',
'delete',
],
'option_configuration' => [
'read',
'write',
'delete',
],
'status' => [
'read',
'write',
'delete',
],
];

View File

@ -1,5 +0,0 @@
<?php
return [
];

View File

@ -1,142 +0,0 @@
<?php
return [
'monitoring' => [
'stacked' => true,
'tabs' => [
'general' => [
'title' => 'visiosoft.module.advs::section.general',
'fields' => [
'favicon',
'market_place',
'show_lang_url',
'iban_numbers',
'google_statistic_code',
'body_custom_space',
'ogImage',
'free_currencyconverterapi_key',
'hide_price_categories',
'tcmb_exchange_url',
'enabled_currencies',
'hide_ad_cat',
'showDetailedAddress',
'translatable_slug'
],
],
'ads' => [
'title' => 'visiosoft.module.advs::section.ads',
'fields' => [
'extend_ad',
'preview_mode',
'show_gifs_listing_main_pages',
'show_finish_and_publish_date',
'latest-limit',
'popular_ads_limit',
'ads_image_limit',
'default_view_type',
'show_price_to_members_only',
'price_area_hidden',
'hide_listing_standard_price',
'hide_zero_price',
'auto_approve',
'estimated_pending_time',
'default_published_time',
'default_GET',
'get_categories',
'listing_page_image',
'show_ads_count',
'show_subcats_mobile',
'update_publish_at'
],
],
'ads_detail' => [
'title' => 'visiosoft.module.advs::section.ads_detail',
'fields' => [
'ads_date_hidden',
'hide_seller_info',
'hide_seller_info_by_category',
]
],
'create_ad' => [
'title' => 'visiosoft.module.advs::section.create_ad',
'fields' => [
'is_changeable_slug',
'hide_contact_created_at',
'show_tax_field',
'detailed_product_options',
'steps_color',
'create_ad_button_color',
'hide_standard_price_field',
'title_length',
'show_ad_note',
'is_desc_required',
'is_image_required',
'hide_options_field',
'hide_village_field',
'make_all_fields_required',
'make_map_required',
'show_breadcrumb_when_creating_ad',
'show_post_ad_agreement',
'show_input_flag',
'show_order_note',
'show_min_order_limit',
'add_ad_tags',
'is_country_required',
'is_city_required',
'is_district_required',
'is_neighborhood_required',
'show_seo_title',
'show_seo_description',
],
],
'ads_image' => [
'title' => 'visiosoft.module.advs::section.ads_image',
'fields' => [
'watermark',
'image_resize_backend',
'full_image_width',
'full_image_height',
'medium_image_width',
'medium_image_height',
'thumbnail_width',
'thumbnail_height',
'add_canvas',
'image_canvas_width',
'image_canvas_height',
'watermark_type',
'watermark_text',
'watermark_image',
'watermark_position',
],
],
'user' => [
'title' => 'visiosoft.module.advs::section.user',
'fields' => [
'register_email_field', 'only_email_login'
],
],
'filter' => [
'title' => 'visiosoft.module.advs::section.filter',
'fields' => [
'hide_filter_section', 'hide_price_filter', 'hide_date_filter', 'hide_photo_filter', 'hide_map_filter',
'hide_listing_header', 'user_filter_limit', 'hide_out_of_stock_products_without_listing', 'location_data_type_first'
, 'location_data_type_second'
],
],
'translations' => [
'title' => 'visiosoft.module.advs::section.translations',
'fields' => [
'lang_switcher_for_browser',
'override_text',
],
],
'eids' => [
'title' => "Eids",
'fields' => [
'is_eids_verification_required',
'eids_verification_url'
]
]
],
],
];

View File

@ -1,661 +0,0 @@
<?php
return [
'register_email_field' => [
'type' => 'anomaly.field_type.boolean',
'config' => [
'default_value' => true,
],
],
'only_email_login' => [
'type' => 'anomaly.field_type.boolean',
'config' => [
'default_value' => false,
],
],
'latest-limit' => [
'type' => 'anomaly.field_type.integer',
'config' => [
'min' => 1,
'default_value' => 5,
],
],
'default_view_type' => [
'type' => 'anomaly.field_type.select',
'config' => [
'options' => ['list' => 'List', 'table' => 'Table', 'map' => 'Map', 'gallery' => 'Gallery'],
'default_value' => 'list',
]
],
'hide_zero_price' => [
'type' => 'anomaly.field_type.boolean',
'config' => [
'default_value' => false,
],
],
'auto_approve' => [
'type' => 'anomaly.field_type.boolean',
'bind' => 'adv.auto_approve',
'env' => 'ADV_AUTO_APPROVE',
'config' => [
'default_value' => true,
],
],
'estimated_pending_time' => [
'type' => 'anomaly.field_type.integer',
'config' => [
'default_value' => 6,
],
],
'default_published_time' => [
'type' => 'anomaly.field_type.integer',
'bind' => 'adv.default_published_time',
'env' => 'ADV_PUBLISH_TIME',
'required' => true,
'config' => [
'default_value' => 10,
],
],
'iban_numbers' => [
'type' => 'anomaly.field_type.wysiwyg',
'bind' => 'adv.iban',
'env' => 'ADV_IBAN',
'config' => [
'default_value' => '<h3>TR00 0000 0000 0000 0000 0000 00</h3>',
],
],
'google_statistic_code' => [
'type' => 'anomaly.field_type.editor',
'bind' => 'adv.google_statistic_code',
'env' => 'ADV_GOOGLE_STATISTIC_CODE',
'config' => [
'default_value' => '',
],
],
'body_custom_space' => [
'type' => 'anomaly.field_type.editor',
'bind' => 'adv.body_custom_space',
'env' => 'ADV_BODY_CUSTOM_SPACE',
'config' => [
'default_value' => '',
],
],
'logo' => [
'type' => 'anomaly.field_type.file',
'bind' => 'adv.logo',
'env' => 'ADV_LOGO',
'config' => [
'folders' => ["images"],
'mode' => 'upload',
]
],
'ogImage' => [
'type' => 'anomaly.field_type.file',
'bind' => 'adv.ogImage',
'env' => 'ADV_OG_IMAGE',
'config' => [
'folders' => ["images"],
'mode' => 'upload',
]
],
'free_currencyconverterapi_key' => [
"type" => "anomaly.field_type.text",
'bind' => 'adv.free_currencyconverterapi_key',
'env' => 'ADV_CURRENCY_CONVERT_API_KEY',
'config' => [
"default_value" => "1eea72940f3868c77420"
]
],
'hide_price_categories' => [
'type' => 'anomaly.field_type.checkboxes',
'config' => [
'options' => function (\Visiosoft\CatsModule\Category\Contract\CategoryRepositoryInterface $categoryRepository) {
return $categoryRepository->getMainCategories()->pluck('name', 'id')->all();
},
],
],
'default_GET' => [
'type' => 'anomaly.field_type.boolean',
'bind' => 'adv.default_GET',
'env' => 'ADV_GET',
'config' => [
'default_value' => 0,
],
],
'listing_page_image' => [
'type' => 'anomaly.field_type.file',
'bind' => 'adv.listing_page_image',
'env' => 'ADV_LISTING_PAGE_IMAGE',
'config' => [
'folders' => ["adv_listing_page"],
'mode' => 'upload',
]
],
'hide_standard_price_field' => [
'type' => 'anomaly.field_type.boolean',
'config' => [
'default_value' => false,
]
],
'hide_options_field' => [
'type' => 'anomaly.field_type.boolean',
'config' => [
'default_value' => false,
'mode' => 'checkbox'
]
],
'hide_village_field' => [
'type' => 'anomaly.field_type.boolean',
'config' => [
'default_value' => false,
'mode' => 'checkbox'
]
],
'make_all_fields_required' => [
'type' => 'anomaly.field_type.boolean',
'config' => [
'default_value' => false,
'mode' => 'checkbox'
]
],
'make_map_required' => [
'type' => 'anomaly.field_type.boolean',
'config' => [
'default_value' => false,
'mode' => 'checkbox'
]
],
'hide_listing_standard_price' => [
'type' => 'anomaly.field_type.boolean',
'config' => [
'default_value' => false,
'mode' => 'checkbox'
]
],
'price_area_hidden' => [
'type' => 'anomaly.field_type.boolean',
'config' => [
'default_value' => false,
]
],
'enabled_currencies' => [
'bind' => 'streams::currencies.enabled',
'env' => 'ADV_ENABLED_CURRENCIES',
'type' => 'anomaly.field_type.checkboxes',
'required' => true,
'config' => [
'mode' => 'tags',
'default_value' => function () {
return [config('streams::currencies.default')];
},
'options' => function () {
$array = config('streams::currencies.supported');
$cur = array();
foreach ($array as $key => $value) {
$cur[$key] = $value['name'];
}
return $cur;
},
],
],
'market_place' => [
'type' => 'anomaly.field_type.boolean',
'config' => [
'default_value' => true,
],
],
'hide_price_filter' => [
'type' => 'anomaly.field_type.boolean',
'config' => [
'default_value' => false,
]
],
'hide_date_filter' => [
'type' => 'anomaly.field_type.boolean',
'config' => [
'default_value' => false,
]
],
'hide_photo_filter' => [
'type' => 'anomaly.field_type.boolean',
'config' => [
'default_value' => false,
]
],
'hide_map_filter' => [
'type' => 'anomaly.field_type.boolean',
'config' => [
'default_value' => false,
]
],
'show_lang_url' => [
'type' => 'anomaly.field_type.boolean',
'config' => [
'default_value' => false,
]
],
'popular_ads_limit' => [
'type' => 'anomaly.field_type.integer',
'config' => [
'default_value' => 15,
],
],
//Image Settings
'image_resize_backend' => [
'type' => 'anomaly.field_type.boolean',
'config' => [
'default_value' => true,
],
],
'full_image_width' => [
'type' => 'anomaly.field_type.integer',
'config' => [
'default_value' => 800,
],
],
'full_image_height' => [
'type' => 'anomaly.field_type.integer',
'config' => [
'default_value' => 600,
],
],
'medium_image_width' => [
'type' => 'anomaly.field_type.integer',
'config' => [
'default_value' => 600,
],
],
'medium_image_height' => [
'type' => 'anomaly.field_type.integer',
'config' => [
'default_value' => 400,
],
],
'thumbnail_width' => [
'type' => 'anomaly.field_type.integer',
'config' => [
'default_value' => 270,
],
],
'thumbnail_height' => [
'type' => 'anomaly.field_type.integer',
'config' => [
'default_value' => 180,
],
],
'add_canvas' => [
'type' => 'anomaly.field_type.boolean',
'config' => [
'default_value' => true,
],
],
'image_canvas_width' => [
'type' => 'anomaly.field_type.integer',
'config' => [
'default_value' => 800,
],
],
'image_canvas_height' => [
'type' => 'anomaly.field_type.integer',
'config' => [
'default_value' => 600,
],
],
'watermark' => [
'type' => 'anomaly.field_type.boolean',
'config' => [
'default_value' => false,
]
],
'watermark_type' => [
'type' => 'anomaly.field_type.select',
'bind' => 'adv.watermark_type',
'env' => 'ADV_WATERMARK_TYPE',
'required' => true,
'config' => [
'options' => ['image' => 'Image', 'text' => 'Text'],
'default_value' => 'text',
]
],
'watermark_text' => [
'type' => 'anomaly.field_type.text',
'bind' => 'adv.watermark_text',
'env' => 'ADV_WATERMARK_TEXT',
],
'watermark_image' => [
'type' => 'anomaly.field_type.file',
'bind' => 'adv.watermark_image',
'env' => 'ADV_WATERMARK_IMAGE',
],
'watermark_position' => [
'type' => 'anomaly.field_type.select',
'bind' => 'adv.watermark_position',
'env' => 'ADV_WATERMARK_POSITION',
'required' => true,
'config' => [
'options' => ['top-right' => 'visiosoft.module.advs::setting.top_right', 'top-left' => 'visiosoft.module.advs::setting.top_left', 'bottom-right' => 'visiosoft.module.advs::setting.bottom_right',
'bottom-left' => 'visiosoft.module.advs::setting.bottom_left', 'center' => 'visiosoft.module.advs::setting.middle'],
'default_value' => 'top-right',
]
],
'user_filter_limit' => [
'type' => 'anomaly.field_type.integer',
'config' => [
'default_value' => 5,
],
],
'show_breadcrumb_when_creating_ad' => [
'type' => 'anomaly.field_type.boolean',
'config' => [
'default_value' => true,
'mode' => 'checkbox'
],
],
'show_ads_count' => [
'type' => 'anomaly.field_type.boolean',
'config' => [
'default_value' => true,
'mode' => 'checkbox'
],
],
'show_post_ad_agreement' => [
'type' => 'anomaly.field_type.boolean',
'config' => [
'default_value' => false,
'mode' => 'checkbox'
],
],
'override_text' => [
'type' => 'anomaly.field_type.tags',
'bind' => 'override_text',
'env' => 'OVERRIDE_TEXT',
],
'steps_color' => [
"type" => "anomaly.field_type.colorpicker",
"config" => [
"default_value" => '#209579',
]
],
'create_ad_button_color' => [
"type" => "anomaly.field_type.colorpicker",
"config" => [
"default_value" => '#00a651',
]
],
'ads_image_limit' => [
"type" => "anomaly.field_type.integer",
"config" => [
"default_value" => 25
]
],
'lang_switcher_for_browser' => [
'type' => 'anomaly.field_type.boolean',
'bind' => 'advs.lang_switcher_for_browser',
'env' => 'LANG_SWITCHER_FOR_BROWSER',
],
'get_categories' => [
'type' => 'anomaly.field_type.checkboxes',
'config' => [
'options' => function (\Visiosoft\CatsModule\Category\Contract\CategoryRepositoryInterface $categoryRepository) {
return $categoryRepository->getMainCategories()->pluck('name', 'id')->all();
},
],
],
'favicon' => [
'type' => 'anomaly.field_type.file',
],
'ads_date_hidden' => [
'type' => 'anomaly.field_type.boolean',
'config' => [
'default_value' => false,
]
],
'hide_listing_header' => [
'type' => 'anomaly.field_type.boolean',
'config' => [
'default_value' => false,
]
],
'hide_filter_section' => [
'type' => 'anomaly.field_type.boolean',
'config' => [
'default_value' => false,
]
],
'hide_seller_info' => [
'type' => 'anomaly.field_type.boolean',
'config' => [
'default_value' => false,
]
],
'hide_seller_info_by_category' => [
'type' => 'anomaly.field_type.checkboxes',
'config' => [
'mode' => 'tags',
'options' => function () {
return app(\Visiosoft\CatsModule\Category\Contract\CategoryRepositoryInterface::class)->getMainCategories()->pluck('name', 'id');
},
],
],
'detailed_product_options' => [
'type' => 'anomaly.field_type.boolean',
'config' => [
'default_value' => true,
]
],
'show_subcats_mobile' => [
'type' => 'anomaly.field_type.boolean',
'config' => [
'default_value' => false,
]
],
'show_price_to_members_only' => [
'type' => 'anomaly.field_type.boolean',
'config' => [
'default_value' => false,
]
],
'hide_ad_cat' => [
'type' => 'anomaly.field_type.boolean',
'config' => [
'default_value' => false,
]
],
'show_finish_and_publish_date' => [
'type' => 'anomaly.field_type.boolean',
'config' => [
'default_value' => false,
],
],
'show_tax_field' => [
'type' => 'anomaly.field_type.boolean',
'config' => [
'default_value' => false,
],
],
'hide_contact_created_at' => [
'type' => 'anomaly.field_type.boolean',
'config' => [
'default_value' => false,
]
],
'show_input_flag' => [
'type' => 'anomaly.field_type.boolean',
'config' => [
'default_value' => false,
]
],
'hide_out_of_stock_products_without_listing' => [
'type' => 'anomaly.field_type.boolean',
'config' => [
'default_value' => false,
]
],
'preview_mode' => [
'type' => 'anomaly.field_type.boolean',
'bind' => 'adv.preview_mode',
'config' => [
'default_value' => true,
],
],
'show_order_note' => [
'type' => 'anomaly.field_type.boolean',
'config' => [
'default_value' => true,
],
],
'extend_ad' => [
'type' => 'anomaly.field_type.boolean',
'config' => [
'default_value' => true,
],
],
'title_length' => [
'type' => 'anomaly.field_type.integer',
'config' => [
'default_value' => 255
]
],
'is_desc_required' => [
'type' => 'anomaly.field_type.boolean',
'config' => [
'default_value' => false,
],
],
'is_image_required' => [
'type' => 'anomaly.field_type.boolean',
'config' => [
'default_value' => true,
],
],
'show_ad_note' => [
'type' => 'anomaly.field_type.boolean',
'config' => [
'default_value' => false,
],
],
'show_min_order_limit' => [
'type' => 'anomaly.field_type.boolean',
'config' => [
'default_value' => false,
],
],
'showDetailedAddress' => [
'type' => 'anomaly.field_type.boolean',
'config' => [
'default_value' => true,
]
],
'location_data_type_first' => [
'type' => 'anomaly.field_type.select',
'config' => [
'options' => [
'country' => 'visiosoft.module.advs::field.country.name',
'city' => 'visiosoft.module.advs::field.city.name',
'district' => 'visiosoft.module.advs::field.district.name',
'neighborhood' => 'visiosoft.module.advs::field.neighborhood.name',
],
'default_value' => 'country'
]
],
'location_data_type_second' => [
'type' => 'anomaly.field_type.select',
'config' => [
'options' => [
'country' => 'visiosoft.module.advs::field.country.name',
'city' => 'visiosoft.module.advs::field.city.name',
'district' => 'visiosoft.module.advs::field.district.name',
'neighborhood' => 'visiosoft.module.advs::field.neighborhood.name',
],
'default_value' => 'city'
]
],
'update_publish_at' => [
'type' => 'anomaly.field_type.boolean',
'config' => [
'default_value' => false
]
],
'show_gifs_listing_main_pages' => [
'type' => 'anomaly.field_type.boolean',
'config' => [
'default_value' => true
]
],
'add_ad_tags' => [
'type' => 'anomaly.field_type.boolean',
'config' => [
'default_value' => false
]
],
'is_changeable_slug' => [
'type' => 'anomaly.field_type.boolean',
'bind' => "advs::is_changeable_slug",
'config' => [
'default_value' => false
]
],
'translatable_slug' => [
'type' => 'anomaly.field_type.boolean',
'config' => [
'default_value' => false
]
],
'is_country_required' => [
'type' => 'anomaly.field_type.boolean',
'config' => [
'default_value' => false
]
],
'is_city_required' => [
'type' => 'anomaly.field_type.boolean',
'config' => [
'default_value' => false
]
],
'is_district_required' => [
'type' => 'anomaly.field_type.boolean',
'config' => [
'default_value' => false
]
],
'is_neighborhood_required' => [
'type' => 'anomaly.field_type.boolean',
'config' => [
'default_value' => false
]
],
'show_seo_title' => [
'type' => 'anomaly.field_type.boolean',
'config' => [
'default_value' => false
]
],
'show_seo_description' => [
'type' => 'anomaly.field_type.boolean',
'config' => [
'default_value' => false
]
],
'is_eids_verification_required' => [
'type' => 'anomaly.field_type.boolean',
'config' => [
'default_value' => false
]
],
'eids_verification_url' => [
'type' => 'anomaly.field_type.text',
'placeholder' => "https://eids.ticaret.gov.tr/oturum?firmaKodu=test-firma-kodu"
]
];

View File

@ -1,3 +0,0 @@
select[name=filter_user] + .select2 {
min-width: 20rem;
}

View File

@ -1,46 +0,0 @@
@media only screen and (min-width: 1004px) and (max-width: 1366px) {
.advs-desc {
width: 200px;
}
}
@media only screen and (min-width: 1367px) {
.advs-desc {
overflow: hidden;
display: flex;
-webkit-line-clamp: 1;
white-space: nowrap;
width: 300px;
padding-right: 10px;
}
.advs-name {
width: 20%;
overflow: hidden;
word-wrap: break-word;
white-space: pre-line;
text-overflow: ellipsis;
-webkit-line-clamp: 1;
}
.advs-status {
width: 5%;
}
.advs-cat1 , advs-country , .advs-currency , .advs-price {
width: 5%;
}
}
/* Admin filter */
.select2-container--default .select2-selection--single {
height: calc(2.5rem - 2px);
display: flex;
align-items: center;
border: 1px solid rgba(0, 0, 0, 0.15);
border-radius: 0.17rem;
}
.select2-container--default .select2-selection--single .select2-selection__arrow {
top: unset;
}
.navbar-collapse {
padding-left: 15px !important;
}

View File

@ -1,26 +0,0 @@
.ad-detail-tabs .nav-link.active {
background-color: #FFC106;
border-color: #ffc107 #ffc107 #ffc107;
}
.ad-price-standard {
color: #f00;
text-decoration: line-through;
}
.ad-price-standard-percentage {
background-color: #f00;
font-size: 16px;
}
/* Pending screen */
.pending-screen {
background-color: #f2f2f2;
color: #b31901;
}
.pending-screen img {
height: 7em;
}
.pending-screen p {
font-weight: 500;
}

View File

@ -1,9 +0,0 @@
.dropleft-edit {
right: 0;
top: 40%;
z-index: 5;
}
.dropleft-edit button {
transform: rotate(-90deg) translate(0, -100%);
transform-origin: 100% 0;
}

View File

@ -1,13 +0,0 @@
.cat-select {
border: none;
overflow-y: auto
}
.cat-select option {
border-top: 1px solid #f2f2f2;
padding: 15px 0 20px;
position: relative;
padding-left: 10px;
font-size: 16px;
color: #505050;
}

File diff suppressed because one or more lines are too long

View File

@ -1,784 +0,0 @@
/* Main styles */
html {
@media only screen and (min-width: 576px) {
font-size: 10px;
}
@media only screen and (min-width: 992px) {
font-size: 13.4736px;
}
@media only screen and (min-width: 1200px) {
font-size: 16px;
}
}
#main {
margin: 0;
.container {
@media only screen and (max-width: 575.98px) {
padding: 0;
}
}
}
p {
margin-bottom: 0;
}
ul {
list-style: none;
padding: 0;
margin: 0;
}
/* Filter */
#listFilterForm, #filterModal {
@media only screen and (min-width: 576px) {
width: 25%;
}
.filter-box {
background-color: #FCFCFC;
& > div {
&:first-child {
color: #373535;
font-weight: 500;
font-size: calc(17rem / 16);
svg {
width: calc(11rem / 16);
height: auto;
}
}
&:last-child {
max-height: 11rem;
label {
font-size: calc(14rem / 16);
}
}
}
}
/* Category */
#category {
background-color: #FCFCFC;
#categoryNav {
a {
border-bottom: calc(2rem / 16) solid #D7DEEC;
svg {
height: 1rem;
width: 1rem;
}
p {
color: #9FA4A4;
font-weight: 500;
font-size: calc(17rem / 16);
}
&.active {
border-bottom-color: #373535;
svg path {
fill: #373535;
}
p {
color: #373535;
}
}
}
}
#categoryList {
max-height: 24rem;
& > li {
margin-bottom: .4rem;
& > div {
div {
line-height: 1;
&.sub-cat {
margin-left: 1.65rem;
}
}
svg, img {
width: 1.15rem;
height: 1.15rem;
overflow: hidden;
object-fit: contain;
flex-shrink: 0;
}
a {
color: #183F8A;
font-size: calc(13rem / 16);
line-height: 1;
}
.sub-cat {
a {
font-size: calc(12rem / 16);
}
li {
margin-bottom: .25rem;
ul {
padding-left: .5rem;
margin-top: .25rem;
}
}
}
}
}
}
}
/* End Category */
/* Location */
#location {
button:not(.filter-modal-close) {
height: 2rem;
background: #fff;
color: #707070;
font-size: calc(12rem / 16);
padding: 0 1.25rem;
svg {
width: .48rem;
height: auto;
flex-shrink: 0;
}
}
}
/* End Location */
/* Price */
#price, .range-filter {
li {
& + & {
margin-left: 0.5em;
}
label {
display: inline-block;
padding: 0.15em;
color: #373535;
border: calc(1rem / 16) solid #E5E5E5;
font-size: calc(13rem / 16);
cursor: pointer;
}
input[type=radio] {
border: 0;
clip: rect(0, 0, 0, 0);
height: calc(1rem / 16);
overflow: hidden;
padding: 0;
position: absolute !important;
white-space: nowrap;
width: calc(1rem / 16);
&:checked + label {
background-color: #E5E5E5;
border: calc(1rem / 16) solid #E5E5E5;
font-weight: 500;
}
}
}
.range-input-wrapper {
::placeholder {
color: #DFDFDF;
opacity: 1;
}
:-ms-input-placeholder {
color: #DFDFDF;
}
::-ms-input-placeholder {
color: #DFDFDF;
}
input {
width: 5rem;
font-size: calc(14rem / 16);
}
}
}
/* End Price */
/* Map */
#mapFilter {
label {
font-size: calc(14rem / 16);
}
}
/* End Map */
/* Keyword */
#keywordFilter, .text-filter {
input {
font-size: calc(14rem / 16);
}
}
/* End Keyword */
/* Filter submit */
#filterSubmit, #filterReset {
button {
background-color: #52C946;
font-size: calc(12rem / 16);
}
}
/* End Filter submit */
}
/* End Filter */
/* End Main styles */
#listingPage {
/* Breadcrumb */
#breadcrumb {
padding-left: .5rem;
div {
span {
margin-right: .2rem;
font-size: .8rem;
&:not(:last-child):after {
content: ">";
margin-left: .2rem;
}
}
}
.mobile-breadcrmub {
li {
display: inline;
}
}
}
/* End Breadcrumb */
#mainContainer {
margin-top: .75rem;
/* Listing container */
#listingContainer {
min-width: 0;
/* Page title */
#pageTitle {
p, a {
color: #8598AA;
}
p {
font-size: calc(14rem / 16);
}
a {
font-size: calc(14rem / 16);
svg {
height: .8rem;
width: auto;
}
}
}
/* End Page title */
/* Query bar */
#queryBar {
& > div {
width: 100%;
margin: calc(3rem / 16) calc(16rem / 16) calc(4rem / 16) 0;
& > span {
font-weight: 500;
color: #292d2e;
font-size: calc(13rem / 16);
}
}
a {
background-color: #eee;
font-size: calc(12rem / 16);
padding: calc(4rem / 16) calc(7rem / 16);
border-radius: calc(2rem / 16);
text-decoration: none;
max-width: calc(400rem / 16);
&:hover {
background-color: #e0e0e0;
}
span {
color: #666;
}
button {
height: calc(22rem / 17);
width: calc(22rem / 18);
background-color: #ec9c4a;
border-radius: calc(2rem / 16);
padding: 0;
&:focus {
outline: none;
}
}
svg {
flex-shrink: 0;
height: calc(6rem / 6);
width: calc(6rem / 12);
}
}
div:last-child {
a {
background-color: unset;
font-size: calc(10rem / 16);
padding: 0;
text-decoration: none;
color: #039;
&:hover {
text-decoration: underline;
span {
color: #444;
}
button {
background-color: #CD7D22;
}
}
}
}
}
/* End Query bar */
/* View types */
#viewTypes {
margin-bottom: .75rem;
ul {
background-color: #F0F2F4;
li {
font-size: calc(13rem / 16);
font-weight: 500;
&:not(:first-child) {
border-left: calc(1rem / 16) solid rgba(72, 154, 241, .33);
}
a {
color: #489AF1;
}
&.active {
a {
color: #707070;
}
}
}
}
& > div {
background-color: #F0F2F4;
padding: calc(5.5rem / 16) .5rem;
p {
font-size: calc(12rem / 16);
font-weight: 500;
color: #707070;
margin-right: .75rem;
}
svg {
width: auto;
height: .75rem;
}
a {
&.active {
svg path {
fill: #489AF1;
}
}
}
.dropdown {
button {
background: none;
&:after {
content: none;
}
}
.dropdown-item {
cursor: pointer;
}
}
}
}
/* End View types */
/* Listing */
#listingWrapper {
#listing {
table {
border-collapse: separate;
border-spacing: 0 .25rem;
thead {
tr {
th {
background-color: #3F475F;
font-weight: 400;
font-size: calc(12rem / 16);
padding: .2rem .5rem;
&.sortable {
cursor: pointer;
color: #adb4c9;
&:hover {
text-decoration: underline;
}
}
&:not(.sort-by) {
svg {
display: none;
}
}
&.sort-desc {
svg {
transform: scaleY(-1);
}
}
svg {
height: .5rem;
width: auto;
margin-left: .2rem;
}
&:first-child {
border-top-left-radius: .25rem;
}
&:last-child {
border-top-right-radius: .25rem;
}
}
}
}
tbody {
tr {
background-color: #F6F6F6;
&:hover {
.action-data > a {
visibility: visible;
}
}
td {
padding: .4rem .5rem;
& > a {
img {
width: 6.5rem;
height: 5rem;
object-fit: cover;
}
}
&:first-child {
width: 17%;
border-radius: .25rem 0 0 .25rem;
}
&:last-child {
border-radius: 0 .25rem .25rem 0;
}
.id-data {
font-size: calc(10rem / 16);
color: rgba(34, 34, 34, .29);
}
h6 {
font-size: calc(14rem / 16);
color: #489AF1;
}
.cat-data {
font-size: calc(13rem / 16);
color: rgba(34, 34, 34, .4);
}
.action-data {
color: #A1A1A1;
font-size: calc(10.7rem / 16);
& > a {
visibility: hidden;
color: #A1A1A1;
}
& > a.active {
visibility: visible;
svg {
path {
fill: #FFE900;
}
rect {
fill: #EDA862;
}
}
}
svg {
width: .45rem;
height: auto;
}
}
&.location-data, &.date-data {
font-size: calc(13rem / 16);
color: #707070;
}
&.price-data {
width: 20%;
color: #D33023;
font-weight: 700;
}
}
}
}
}
}
#gallerying {
.gallery-item-wrapper {
&:nth-child(odd) {
padding-right: .125rem;
}
&:nth-child(even) {
padding-left: .125rem;
}
&:hover {
.action-data > a {
visibility: visible !important;
}
}
.gallery-item {
background-color: #F6F6F6;
img {
width: 6.5rem;
height: 5rem;
object-fit: cover;
}
.action-data-wrapper {
.action-data {
margin-top: .7rem;
& > a {
visibility: hidden;
font-size: calc(8rem / 16);
color: #A1A1A1;
margin-bottom: .25rem;
svg {
width: calc(6rem / 16);
height: auto;
}
}
& > a.active {
visibility: visible;
svg {
path {
fill: #FFE900;
}
rect {
fill: #EDA862;
}
}
}
}
}
.id-data {
font-size: calc(10rem / 16);
color: #B8B8B8;
}
h6 {
font-size: calc(14rem / 16);
a {
color: #489AF1;
}
}
.cat-data {
font-size: calc(11rem / 16);
color: #A1A1A1;
}
.price-data {
color: #D33023;
font-weight: 700;
font-size: calc(15rem / 16);
}
.location-data {
margin-bottom: .15rem;
}
.location-data, .date-data {
color: #707070;
font-size: calc(12rem / 16);
}
}
}
}
.pagination {
overflow: auto;
}
}
/* End Listing */
/* Mobile Listing Nav */
#mobileListNav {
background-color: #F8F9FA;
& > .mobile-list-nav-item {
width: percentage(1/3);
font-size: calc(11rem / 16);
color: #4D5359;
svg {
height: 1.1rem;
width: auto;
}
}
.divider {
border-left: calc(1rem / 16) solid #E1E1E2;
height: 1.8rem;
}
}
/* Mobile Listing Nav */
/* Mobile Sub Cats Page (Opening with a setting)*/
.mobile-sub-cats {
top: 45px;
}
/* Mobile Sub Cats Page (Opening with a setting)*/
}
/* End Listing container */
}
}
#filterModal {
#modalListFilterForm {
form {
display: block !important;
}
}
}
#mobileListingPage {
#breadcrumb {
padding: .6rem 1rem;
ul {
font-size: calc(11rem / 16);
color: #8598AA;
li {
&:not(:first-child):before {
content: '>';
margin-left: .125rem;
}
a {
color: #8598AA;
}
}
}
}
#mobileListing {
.listing-item {
&:nth-child(odd) {
background-color: #F6F6F6;
}
img {
height: 5rem;
width: 7rem;
object-fit: cover;
}
div {
h6 {
font-size: calc(13rem / 16);
color: #393939;
}
p {
&:first-of-type {
color: #A1A1A1;
font-size: calc(10rem / 16);
}
&:last-of-type {
color: #1592E6;
font-size: calc(14rem / 16);
font-weight: 700;
}
}
}
}
}
}

View File

@ -1,356 +0,0 @@
.gm-style .gm-style-iw-d {
max-width: 150px !important;
}
#map {
height: 500px;
}
.table-classified .img-thumbnail {
max-height: 70px;
}
.table-classified .td-image {
max-width: 200px;
max-height: 100px;
}
@media only screen and (min-width: 768px) {
.list-classified .bg-light {
height: 100px;
}
}
.upper-list-banner {
min-height: 300px;
background-size: cover;
background-position: center;
}
.upper-list-banner img {
max-width: 125px;
max-height: 200px;
margin: auto;
margin-top: 10px;
}
.table-classified .td-image,
.table-classified .td-date {
min-width: 100px;
}
.table-classified .td-price {
min-width: 150px;
}
.table-classified .td-country,
.table-classified .td-subject {
min-width: 200px;
}
/* Mobile filter */
.mobile-list-action {
border: 1px solid #dee2e68a;
}
.mobile-list-action a {
font-size: 11px;
line-height: 22px;
text-align: center;
margin-top: -5px;
display: block;
color: #022543;
}
.mobile-list-action a:hover,
.mobile-list-action a:hover {
text-decoration: none;
}
.mobile-list-action a:after {
position: absolute;
width: 1px;
height: 33px;
top: 0;
right: 0;
content: '';
background: #c9c9c9;
}
.mobile-list-action div:last-child a:after {
content: none;
}
.mobile-list-action i {
font-size: 19px;
color: #a1a1a1;
}
.mobile-list-action div {
margin-top: 6px;
}
.edit-category-filter-modal {
top: 7px;
right: 14px;
}
.edit-category-filter-modal a {
text-decoration: none;
}
#categoryModal {
background-color: rgba(0, 0, 0, 0.8);
}
.category-select-mobile span {
right: 10px;
top: 6px;
}
#filterModal {
overflow-y: auto;
}
.result-text {
font-size: 13px;
}
.result-text h1 {
font-size: 13px;
margin: 0;
line-height: 1.5;
max-width: 330px;
}
.result-text span:last-child {
color: #8f0100;
font-weight: 500;
}
.result-text .filter-tabs > div {
margin: 3px 16px 4px 0;
}
.result-text .filter-tabs div > span {
font-weight: 500;
color: #292d2e;
}
.result-text .filter-tabs a {
background-color: #eee;
font-size: 12px;
padding: 4px 7px;
border-radius: 2px;
text-decoration: none;
max-width: 400px;
}
.result-text .filter-tabs div:last-child a {
background-color: unset;
font-size: 10px;
padding: 0;
text-decoration: none;
color: #039;
}
.result-text .filter-tabs div:last-child a:hover {
text-decoration: underline;
}
.result-text .filter-tabs a:hover {
background-color: #e0e0e0;
}
.result-text .filter-tabs a span {
color: #666;
}
.result-text .filter-tabs a:hover span {
color: #444;
}
.result-text .filter-tabs a:hover button {
background-color: #CD7D22;
}
.result-text .filter-tabs a button {
height: 12px;
width: 12px;
background-color: #EC9C4A;
border-radius: 2px;
}
.result-text .filter-tabs a button:focus {
outline: none;
}
.result-text .filter-tabs a svg {
flex-shrink: 0;
height: 6px;
width: 6px;
}
a.sort-by-open-dropdown:hover {
color: #8598AA !important;
}
.sort-by-selected-text {
font-size: 15px;
font-weight: 500;
color: #8598AA;
}
.list-view-type button {
background-color: unset;
}
.list-view-type button:focus {
outline: none;
}
.list-view-type button small {
font-weight: 500;
color: #8598AA;
}
.gallery-tn {
object-fit: cover;
}
#listFilterForm .card-header {
padding: 5px 0;
}
.card {
border: none;
}
.btn-link {
font-weight: bold;
}
.searchbut {
padding: 0px !important;
}
#main > div > nav {
padding-bottom: 10px !important;
}
.breadcrumb {
padding: 0px !important;
}
.subbreadcrumb small , .sort-by-selected-text{
color: black !important;
}
.img-thumbnail {
padding: 0px;
border: none;
}
.products-list p {
margin-top: 0;
margin-bottom: 0;
}
.navbar-collapse {
padding-left: 15px !important;
}
@media (max-width: 576px) {
.mobile-sub-cats {
width: 100vw;
height: 100vh;
background: #fff;
padding: 0 !important;
left: 0;
position: fixed;
z-index: 999;
display: flex !important;
flex-direction: column;
justify-content: start;
list-style: none;
}
.mobile-sub-cats {
background-color: #f3f0f0;
}
.mobile-sub-cats ul {
background-color: #fff;
overflow-y: scroll;
overflow-x: hidden;
padding-top: 10px;
margin-bottom: 50px;
width: 100%;
border-top: 1px solid #ccc;
}
.mobile-sub-cats .categories-list-li {
height: 48px;
line-height: 48px;
border-bottom: 1px solid #ccc;
padding: 0 15px;
}
.mobile-sub-cats .categories-list-li img {
object-fit: contain;
}
.mobile-sub-cats .categories-list-li .main-advs-count {
color: #1064bc !important;
}
.mobile-sub-cats .categories-list-li .advs-count{
font-weight: 200;
color: #bcbbbb !important;
}
.mobile-sub-cats .categories-list-li a {
margin-bottom: 10px;
width: 100%;
display: flex;
justify-content: space-between;
color: #000;
}
.mobile-sub-cats .categories-list-li i{
color: #bcbbbb !important;
}
.mobile-sub-cats .categories-list-li a span:first-child{
text-overflow: ellipsis;
overflow: hidden;
}
.mobile-sub-cats .show-all {
font-weight: bolder;
color: #1064bc !important;
}
}
.map_detail_btn{
margin-top: 10px;
outline: 0 !important;
box-shadow: none !important;
border:none !important;
}
.map_detail_btn:focus{
box-shadow: none !important;
border:none !important;
}
.map_subject{
font-size: 13px !important;
margin: 5px 0 !important;
}
.gm-ui-hover-effect{
outline: 0 !important;
}
.table-price{
width: fit-content;
margin: 0 auto;
}

View File

@ -1,360 +0,0 @@
/* Main styles */
html {
font-size: 12px;
@media only screen and (min-width: 576px) {
font-size: 7.5789px;
}
@media only screen and (min-width: 768px) {
font-size: 10.1052px;
}
@media only screen and (min-width: 992px) {
font-size: 13.4736px;
}
@media only screen and (min-width: 1200px) {
font-size: 16px;
}
}
label {
margin-bottom: 0;
}
/* End Main styles */
#pageTitle {
margin: 2rem 0;
@media only screen and (min-width: 576px) {
margin: 4rem 0;
}
h1 {
font-weight: 700;
}
h2 {
color: #707070;
font-size: calc(24rem / 16);
font-weight: 400;
}
}
#contactInfo {
background-color: #FFFFFF;
padding: 1.4rem 1rem 1.5rem;
@media only screen and (min-width: 576px) {
padding: 2.4rem 4rem 3rem;
}
h3 {
color: #6E5DDB;
font-size: calc(26rem / 16);
margin-bottom: 2rem;
}
#reachInfo {
font-family: "Lucida Grande", "LucidaGrande", Arial, sans-serif;
margin-bottom: 2rem;
p {
color: #4A4A4A;
font-size: 13px;
font-weight: bold;
}
div {
label {
color: #505050;
font-size: 14px;
font-weight: 400;
}
}
}
#contactSummary {
font-family: "Lucida Grande", "LucidaGrande", Arial, sans-serif;
margin-bottom: 1rem;
@media only screen and (min-width: 576px) {
margin-bottom: 2rem;
}
label {
font-size: 13px;
color: #000000;
width: 100%;
font-weight: 600;
margin-bottom: 1rem;
@media only screen and (min-width: 576px) {
width: 32.4%;
margin-bottom: 0;
}
input {
box-shadow: 0 calc(1rem / 16) calc(2rem / 16) rgba(0, 0, 0, .04);
font-size: 15px;
padding: 5px 10px;
color: #707070;
}
}
}
#editContact {
button {
color: #0075FF;
background: none;
font-size: 15px;
svg {
height: 1.08rem;
width: auto;
}
span {
margin-left: .75rem;
}
}
}
}
#mainInfo {
background-color: #FFFFFF;
padding: 1.4rem 3rem 2.3rem;
@media only screen and (min-width: 576px) {
padding: 2.4rem 4rem 4.3rem;
}
h3 {
color: #6E5DDB;
font-size: calc(26rem / 16);
margin-bottom: 2rem;
}
label {
font-family: "Lucida Grande", "LucidaGrande", Arial, sans-serif;
font-size: 13px;
color: #000000;
font-weight: bold;
input, textarea {
box-shadow: 0 calc(1rem / 16) calc(2rem / 16) rgba(0, 0, 0, .04);
font-size: 15px;
padding: 0.6rem 1.5rem;
color: #707070;
}
::placeholder{
opacity: 0.5;
}
}
#stockInput {
flex-wrap: wrap;
@media only screen and (min-width: 576px) {
flex-wrap: nowrap;
}
& > label {
width: 100%;
@media only screen and (min-width: 576px) {
width: 47.5%;
}
&:not(.d-none) + div {
top: .6rem;
}
&.d-none + div {
margin-bottom: .5rem;
}
}
div {
position: relative;
margin: 1rem 0;
@media only screen and (min-width: 576px) {
margin: 0;
width: 47.5%;
}
svg {
width: 2.2rem;
height: auto;
}
label {
position: relative;
top: .25rem;
font-weight: 500;
font-size: calc(16rem / 16);
}
}
}
#priceInput {
& > div {
::placeholder {
color: #B9C0CF;
opacity: 1;
}
:-ms-input-placeholder {
color: #B9C0CF;
}
::-ms-input-placeholder {
color: #B9C0CF;
}
input, select {
box-shadow: 0 calc(1rem / 16) calc(2rem / 16) rgba(0, 0, 0, .04);
font-size: 15px;
padding: 0.6rem 1.5rem;
color: #707070;
}
&:first-child {
input {
&.decimal-price {
width: 100px;
}
}
}
&:last-child {
width: 100%;
@media only screen and (min-width: 800px) {
width: 50%;
}
select {
padding: 0.7rem 1.5rem;
margin-left: 3px;
@media only screen and (min-width: 800px) {
width: 30%;
}
}
}
}
}
.min-order-limit {
input {
box-shadow: 0 calc(1rem / 16) calc(2rem / 16) rgba(0, 0, 0, 0.04);
font-size: 15px;
padding: 1.9rem 1.5rem;
color: #707070;
}
}
#simpleOptionsInput {
.select2-selection {
box-shadow: 0 calc(1rem / 16) calc(2rem / 16) rgba(0, 0, 0, .04);
font-size: calc(17rem / 16);
padding: 1.1rem 1.5rem;
color: #707070;
border: 0;
margin-top: 1rem;
.select2-selection__rendered {
padding: 0;
display: flex;
margin: 0;
flex-wrap: wrap;
.select2-selection__choice {
float: none;
}
.select2-search__field {
padding: 0;
}
}
}
}
}
.swal2-title {
max-width: 100% !important;
}
#configurationModal .form-group {
flex: 1 1 auto!important;
margin: 0 1rem 1rem 1rem;
}
.btn-configuration {
background-color: #0075FF;
padding: 0.5rem 2.5rem;
font-family: "Lucida Grande", "LucidaGrande", Arial, sans-serif;
font-size: 16px;
border-radius: .25rem;
border: 0;
color: #fff;
display: inline-flex;
align-items: center;
margin-bottom: 2rem;
&:hover,
&:active,
&:focus {
background-color: #004bad;
color: #fff;
}
svg {
width: 1.5rem;
height: auto;
}
}
.upload-photos-wrapper {
background-color: #FFFFFF;
.fa-spin {
position: absolute;
left: 50%;
font-size: 75px;
}
}
.row{
margin-right: 0;
margin-left: 0;
}
.breadcrumb{
background-color: #FFFFFF;
margin-left: 15px;
margin-right: 15px;
padding: 0.3rem 1rem;
font-size: 14px;
}
h5 {
font-family: "Lucida Grande", "LucidaGrande", Arial, sans-serif;
font-size: 18px;
}
.btn-group{
font-size: 10px;
}
.border, .redactor-layer, .dropzone, .form-control{
border-color: #bbbbbb!important;
}
.redactor-toolbar{
border: 1px solid #bbbbbb !important;
border-bottom: 0!important;
}
.checkboxes_container{
border: 1px solid #bbbbbb !important;
box-shadow: 0 0 0 0 !important;
}
.dropdown-text{
font-size: 14px;
}

Some files were not shown because too many files have changed in this diff Show More