Compare commits
15 Commits
453e8caa82
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
| bc56a1824f | |||
| 6405150dd2 | |||
| 1a3f82b22c | |||
| 0b6cbc8d9e | |||
| 834822e182 | |||
| e927a912e1 | |||
| 643ccd6d9e | |||
| 3e80ea4d5e | |||
| fe42967a74 | |||
| a1826ae53c | |||
| c7e01f404d | |||
| 0a3fdf347f | |||
| e97a80bfdb | |||
| dd167d9aaa | |||
| 8f36f7d715 |
1
.gitignore
vendored
1
.gitignore
vendored
@@ -22,3 +22,4 @@ yarn-error.log
|
||||
/.vscode
|
||||
/.zed
|
||||
**/.DS_Store
|
||||
IntelephenseHelper.php
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
|
||||
namespace App\Filament\Pages;
|
||||
|
||||
use App\Models\UserRole;
|
||||
use App\Settings\AboutSettings;
|
||||
use Filament\Forms\Components\FileUpload;
|
||||
use Filament\Forms\Components\Grid;
|
||||
@@ -223,7 +224,7 @@ class AboutPageSettings extends SettingsPage
|
||||
|
||||
public static function getNavigationGroup(): ?string
|
||||
{
|
||||
return __('CMS');
|
||||
return __('About US');
|
||||
}
|
||||
|
||||
public static function getNavigationLabel(): string
|
||||
@@ -245,4 +246,14 @@ class AboutPageSettings extends SettingsPage
|
||||
{
|
||||
return 'Manage the content sections of the About Us page.';
|
||||
}
|
||||
}
|
||||
|
||||
public static function canAccess(): bool
|
||||
{
|
||||
return auth()->user()->canManageSettings();
|
||||
}
|
||||
|
||||
public static function canView(): bool
|
||||
{
|
||||
return auth()->user()->role === UserRole::ADMIN || auth()->user()->role === UserRole::MANAGER;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
|
||||
namespace App\Filament\Pages;
|
||||
|
||||
use App\Models\UserRole;
|
||||
use App\Settings\ContactSettings;
|
||||
use Filament\Forms\Components\Section;
|
||||
use Filament\Forms\Components\Textarea;
|
||||
@@ -12,7 +13,7 @@ use Illuminate\Contracts\Support\Htmlable;
|
||||
|
||||
class ContactPageSettings extends SettingsPage
|
||||
{
|
||||
protected static ?string $navigationGroup = 'CMS';
|
||||
protected static ?string $navigationGroup = 'Contact';
|
||||
|
||||
protected static ?string $navigationIcon = 'heroicon-o-phone';
|
||||
|
||||
@@ -62,7 +63,7 @@ class ContactPageSettings extends SettingsPage
|
||||
|
||||
public static function getNavigationGroup(): ?string
|
||||
{
|
||||
return __('CMS');
|
||||
return __('Contact');
|
||||
}
|
||||
|
||||
public static function getNavigationLabel(): string
|
||||
@@ -84,4 +85,14 @@ class ContactPageSettings extends SettingsPage
|
||||
{
|
||||
return 'Manage the contact form details, contact information, and map embed.';
|
||||
}
|
||||
|
||||
public static function canAccess(): bool
|
||||
{
|
||||
return auth()->user()->canManageSettings();
|
||||
}
|
||||
|
||||
public static function canView(): bool
|
||||
{
|
||||
return auth()->user()->role === UserRole::ADMIN || auth()->user()->role === UserRole::MANAGER;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
|
||||
namespace App\Filament\Pages;
|
||||
|
||||
use App\Models\UserRole;
|
||||
use App\Settings\HomeSettings;
|
||||
use Filament\Forms\Components\FileUpload;
|
||||
use Filament\Forms\Components\Grid;
|
||||
@@ -292,4 +293,14 @@ class HomePageSettings extends SettingsPage
|
||||
{
|
||||
return 'Manage the homepage hero section, background video, and call-to-action content.';
|
||||
}
|
||||
|
||||
public static function canAccess(): bool
|
||||
{
|
||||
return auth()->user()->canManageSettings();
|
||||
}
|
||||
|
||||
public static function canView(): bool
|
||||
{
|
||||
return auth()->user()->role === UserRole::ADMIN || auth()->user()->role === UserRole::MANAGER;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
|
||||
namespace App\Filament\Pages;
|
||||
|
||||
use App\Models\UserRole;
|
||||
use App\Settings\CtaSettings;
|
||||
use Filament\Forms;
|
||||
use Filament\Forms\Components\FileUpload;
|
||||
@@ -42,4 +43,14 @@ class ManageCtaSettings extends SettingsPage
|
||||
->columnSpan('full'),
|
||||
]);
|
||||
}
|
||||
|
||||
public static function canAccess(): bool
|
||||
{
|
||||
return auth()->user()->canManageSettings();
|
||||
}
|
||||
|
||||
public static function canView(): bool
|
||||
{
|
||||
return auth()->user()->role === UserRole::ADMIN || auth()->user()->role === UserRole::MANAGER;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
|
||||
namespace App\Filament\Pages;
|
||||
|
||||
use App\Models\UserRole;
|
||||
use App\Settings\PortfolioSettings;
|
||||
use Filament\Forms\Components\FileUpload;
|
||||
use Filament\Forms\Components\Grid;
|
||||
@@ -108,4 +109,14 @@ class ManagePortfolio extends SettingsPage
|
||||
{
|
||||
return 'Manage the portfolio section content, including items, categories, and titles.';
|
||||
}
|
||||
|
||||
public static function canAccess(): bool
|
||||
{
|
||||
return auth()->user()->canManageSettings();
|
||||
}
|
||||
|
||||
public static function canView(): bool
|
||||
{
|
||||
return auth()->user()->role === UserRole::ADMIN || auth()->user()->role === UserRole::MANAGER;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
|
||||
namespace App\Filament\Pages;
|
||||
|
||||
use App\Models\UserRole;
|
||||
use App\Settings\SiteSettings;
|
||||
use Filament\Forms;
|
||||
use Filament\Forms\Form;
|
||||
@@ -168,4 +169,14 @@ class ManageSite extends SettingsPage
|
||||
{
|
||||
return 'Manage your website\'s general configuration';
|
||||
}
|
||||
|
||||
public static function canAccess(): bool
|
||||
{
|
||||
return auth()->user()->canManageSettings();
|
||||
}
|
||||
|
||||
public static function canView(): bool
|
||||
{
|
||||
return auth()->user()->role === UserRole::ADMIN || auth()->user()->role === UserRole::MANAGER;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
|
||||
namespace App\Filament\Pages;
|
||||
|
||||
use App\Models\UserRole;
|
||||
use App\Settings\SiteSocialSettings;
|
||||
use Filament\Forms;
|
||||
use Filament\Forms\Form;
|
||||
@@ -77,4 +78,14 @@ class ManageSiteSocialSettings extends SettingsPage
|
||||
{
|
||||
return 'Manage your social media profiles and sharing options';
|
||||
}
|
||||
|
||||
public static function canAccess(): bool
|
||||
{
|
||||
return auth()->user()->canManageSettings();
|
||||
}
|
||||
|
||||
public static function canView(): bool
|
||||
{
|
||||
return auth()->user()->role === UserRole::ADMIN || auth()->user()->role === UserRole::MANAGER;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
|
||||
namespace App\Filament\Pages;
|
||||
|
||||
use App\Models\UserRole;
|
||||
use App\Settings\SolutionSettings;
|
||||
use Filament\Forms\Components\FileUpload;
|
||||
use Filament\Forms\Components\Grid;
|
||||
@@ -376,4 +377,14 @@ class ManageSolutions extends SettingsPage
|
||||
{
|
||||
return 'Manage the solutions section content, including individual solution items.';
|
||||
}
|
||||
|
||||
public static function canAccess(): bool
|
||||
{
|
||||
return auth()->user()->canManageSettings();
|
||||
}
|
||||
|
||||
public static function canView(): bool
|
||||
{
|
||||
return auth()->user()->role === UserRole::ADMIN || auth()->user()->role === UserRole::MANAGER;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
|
||||
namespace App\Filament\Pages;
|
||||
|
||||
use App\Models\UserRole;
|
||||
use App\Settings\SuccessSettings;
|
||||
use Filament\Forms\Components\FileUpload;
|
||||
use Filament\Forms\Components\Grid;
|
||||
@@ -113,4 +114,14 @@ class ManageSuccess extends SettingsPage
|
||||
{
|
||||
return 'Manage the success section content, including text, button, and skill bars.';
|
||||
}
|
||||
|
||||
public static function canAccess(): bool
|
||||
{
|
||||
return auth()->user()->canManageSettings();
|
||||
}
|
||||
|
||||
public static function canView(): bool
|
||||
{
|
||||
return auth()->user()->role === UserRole::ADMIN || auth()->user()->role === UserRole::MANAGER;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -5,6 +5,7 @@ namespace App\Filament\Resources;
|
||||
use App\Filament\Resources\ApplicationResource\Pages;
|
||||
use App\Models\Application;
|
||||
use App\Models\Career;
|
||||
use App\Models\UserRole;
|
||||
use Filament\Forms;
|
||||
use Filament\Forms\Form;
|
||||
use Filament\Resources\Resource;
|
||||
@@ -104,4 +105,9 @@ class ApplicationResource extends Resource
|
||||
'edit' => Pages\EditApplication::route('/{record}/edit'),
|
||||
];
|
||||
}
|
||||
|
||||
public static function canViewAny(): bool
|
||||
{
|
||||
return auth()->user()->role === UserRole::ADMIN || auth()->user()->role === UserRole::MANAGER;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -13,6 +13,7 @@ use Filament\Resources\Resource;
|
||||
use Filament\Tables;
|
||||
use Filament\Tables\Columns\ImageColumn;
|
||||
use Filament\Tables\Table;
|
||||
use Illuminate\Database\Eloquent\Builder;
|
||||
|
||||
class AuthorResource extends Resource
|
||||
{
|
||||
@@ -20,7 +21,7 @@ class AuthorResource extends Resource
|
||||
|
||||
protected static ?string $navigationIcon = 'heroicon-o-users';
|
||||
|
||||
protected static ?string $navigationGroup = 'News';
|
||||
protected static ?string $navigationGroup = 'News & Stories';
|
||||
|
||||
public static function form(Form $form): Form
|
||||
{
|
||||
@@ -91,4 +92,34 @@ class AuthorResource extends Resource
|
||||
'edit' => Pages\EditAuthor::route('/{record}/edit'),
|
||||
];
|
||||
}
|
||||
|
||||
public static function canViewAny(): bool
|
||||
{
|
||||
return auth()->user()->can('view-authors');
|
||||
}
|
||||
|
||||
public static function canCreate(): bool
|
||||
{
|
||||
return auth()->user()->can('view-authors');
|
||||
}
|
||||
|
||||
public static function canEdit(mixed $record): bool
|
||||
{
|
||||
return auth()->user()->can('view-authors');
|
||||
}
|
||||
|
||||
public static function canDelete(mixed $record): bool
|
||||
{
|
||||
return auth()->user()->can('view-authors');
|
||||
}
|
||||
|
||||
public static function canDeleteAny(): bool
|
||||
{
|
||||
return auth()->user()->can('view-authors');
|
||||
}
|
||||
|
||||
public static function getEloquentQuery(): Builder
|
||||
{
|
||||
return parent::getEloquentQuery()->withoutGlobalScopes();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4,6 +4,7 @@ namespace App\Filament\Resources;
|
||||
|
||||
use App\Filament\Resources\BrandResource\Pages;
|
||||
use App\Models\Brand;
|
||||
use App\Models\UserRole;
|
||||
use Filament\Forms\Components\FileUpload;
|
||||
use Filament\Forms\Components\TextInput;
|
||||
use Filament\Forms\Components\Toggle;
|
||||
@@ -21,7 +22,7 @@ class BrandResource extends Resource
|
||||
|
||||
protected static ?string $navigationIcon = 'heroicon-o-tag';
|
||||
|
||||
protected static ?string $navigationGroup = 'Brands';
|
||||
protected static ?string $navigationGroup = 'Home';
|
||||
|
||||
public static function form(Form $form): Form
|
||||
{
|
||||
@@ -79,4 +80,9 @@ class BrandResource extends Resource
|
||||
'index' => Pages\ManageBrands::route('/'),
|
||||
];
|
||||
}
|
||||
|
||||
public static function canViewAny(): bool
|
||||
{
|
||||
return auth()->user()->role === UserRole::ADMIN || auth()->user()->role === UserRole::MANAGER;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -5,6 +5,7 @@ namespace App\Filament\Resources;
|
||||
use App\Filament\Resources\CareerResource\Pages;
|
||||
use App\Filament\Resources\CareerResource\RelationManagers;
|
||||
use App\Models\Career;
|
||||
use App\Models\UserRole;
|
||||
use Filament\Forms;
|
||||
use Filament\Forms\Components\Repeater;
|
||||
use Filament\Forms\Components\Textarea;
|
||||
@@ -117,4 +118,9 @@ class CareerResource extends Resource
|
||||
'edit' => Pages\EditCareer::route('/{record}/edit'),
|
||||
];
|
||||
}
|
||||
|
||||
public static function canViewAny(): bool
|
||||
{
|
||||
return auth()->user()->role === UserRole::ADMIN || auth()->user()->role === UserRole::MANAGER;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4,6 +4,7 @@ namespace App\Filament\Resources;
|
||||
|
||||
use App\Filament\Resources\CommentResource\Pages;
|
||||
use App\Models\Comment;
|
||||
use App\Models\UserRole;
|
||||
use Filament\Forms;
|
||||
use Filament\Forms\Components\RichEditor;
|
||||
use Filament\Forms\Components\Select;
|
||||
@@ -19,7 +20,7 @@ class CommentResource extends Resource
|
||||
|
||||
protected static ?string $navigationIcon = 'heroicon-o-chat-bubble-bottom-center-text';
|
||||
|
||||
protected static ?string $navigationGroup = 'News';
|
||||
protected static ?string $navigationGroup = 'News & Stories';
|
||||
|
||||
public static function form(Form $form): Form
|
||||
{
|
||||
@@ -93,4 +94,9 @@ class CommentResource extends Resource
|
||||
'edit' => Pages\EditComment::route('/{record}/edit'),
|
||||
];
|
||||
}
|
||||
|
||||
public static function canViewAny(): bool
|
||||
{
|
||||
return auth()->user()->role === UserRole::ADMIN || auth()->user()->role === UserRole::MANAGER;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -5,6 +5,7 @@ namespace App\Filament\Resources;
|
||||
use App\Filament\Resources\InternshipResource\Pages;
|
||||
use App\Filament\Resources\InternshipResource\RelationManagers;
|
||||
use App\Models\Internship;
|
||||
use App\Models\UserRole;
|
||||
use Filament\Forms;
|
||||
use Filament\Forms\Components\Repeater;
|
||||
use Filament\Forms\Components\Textarea;
|
||||
@@ -18,7 +19,7 @@ class InternshipResource extends Resource
|
||||
{
|
||||
protected static ?string $model = Internship::class;
|
||||
|
||||
protected static ?string $navigationGroup = 'Internships';
|
||||
protected static ?string $navigationGroup = 'Careers';
|
||||
|
||||
protected static ?string $navigationIcon = 'heroicon-o-academic-cap';
|
||||
|
||||
@@ -120,4 +121,9 @@ class InternshipResource extends Resource
|
||||
'edit' => Pages\EditInternship::route('/{record}/edit'),
|
||||
];
|
||||
}
|
||||
|
||||
public static function canViewAny(): bool
|
||||
{
|
||||
return auth()->user()->role === UserRole::ADMIN || auth()->user()->role === UserRole::MANAGER;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -16,6 +16,7 @@ use Filament\Resources\Resource;
|
||||
use Filament\Tables;
|
||||
use Filament\Tables\Columns\ImageColumn;
|
||||
use Filament\Tables\Table;
|
||||
use Illuminate\Database\Eloquent\Builder;
|
||||
use Illuminate\Support\Str;
|
||||
|
||||
class NewsResource extends Resource
|
||||
@@ -24,7 +25,7 @@ class NewsResource extends Resource
|
||||
|
||||
protected static ?string $navigationIcon = 'heroicon-o-newspaper';
|
||||
|
||||
protected static ?string $navigationGroup = 'News';
|
||||
protected static ?string $navigationGroup = 'News & Stories';
|
||||
|
||||
public static function form(Form $form): Form
|
||||
{
|
||||
@@ -123,4 +124,34 @@ class NewsResource extends Resource
|
||||
'edit' => Pages\EditNews::route('/{record}/edit'),
|
||||
];
|
||||
}
|
||||
|
||||
public static function canViewAny(): bool
|
||||
{
|
||||
return auth()->user()->can('manage-news-and-success');
|
||||
}
|
||||
|
||||
public static function canCreate(): bool
|
||||
{
|
||||
return auth()->user()->can('manage-news-and-success');
|
||||
}
|
||||
|
||||
public static function canEdit(mixed $record): bool
|
||||
{
|
||||
return auth()->user()->can('manage-news-and-success');
|
||||
}
|
||||
|
||||
public static function canDelete(mixed $record): bool
|
||||
{
|
||||
return auth()->user()->can('manage-news-and-success');
|
||||
}
|
||||
|
||||
public static function canDeleteAny(): bool
|
||||
{
|
||||
return auth()->user()->can('manage-news-and-success');
|
||||
}
|
||||
|
||||
public static function getEloquentQuery(): Builder
|
||||
{
|
||||
return parent::getEloquentQuery()->withoutGlobalScopes();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4,6 +4,7 @@ namespace App\Filament\Resources;
|
||||
|
||||
use App\Filament\Resources\SolutionResource\Pages;
|
||||
use App\Models\Solution;
|
||||
use App\Models\UserRole;
|
||||
use Filament\Forms;
|
||||
use Filament\Forms\Form;
|
||||
use Filament\Resources\Resource;
|
||||
@@ -17,7 +18,7 @@ class SolutionResource extends Resource
|
||||
|
||||
protected static ?string $navigationIcon = 'heroicon-o-light-bulb';
|
||||
|
||||
protected static ?string $navigationGroup = 'Solutions';
|
||||
protected static ?string $navigationGroup = 'Our Solutions';
|
||||
|
||||
public static function form(Form $form): Form
|
||||
{
|
||||
@@ -27,7 +28,8 @@ class SolutionResource extends Resource
|
||||
->required()
|
||||
->maxLength(255)
|
||||
->reactive()
|
||||
->afterStateUpdated(fn (string $operation, $state, Forms\Set $set) => $operation === 'create' ? $set('slug', Str::slug($state)) : null),
|
||||
->afterStateUpdated(fn (string $operation, $state, Forms\Set $set) => $operation === 'create' ? $set('slug', Str::slug($state)) : null)
|
||||
->debounce('1000ms'),
|
||||
|
||||
Forms\Components\TextInput::make('slug')
|
||||
->required()
|
||||
@@ -48,6 +50,34 @@ class SolutionResource extends Resource
|
||||
->columnSpanFull()
|
||||
->createItemButtonLabel('Add Bullet Point')
|
||||
->defaultItems(1),
|
||||
Forms\Components\Repeater::make('downloads')
|
||||
->schema([
|
||||
Forms\Components\TextInput::make('title')
|
||||
->label('Download Title')
|
||||
->required(false),
|
||||
Forms\Components\FileUpload::make('file')
|
||||
->label('Download File')
|
||||
->required(false)
|
||||
->disk('public')
|
||||
->directory('solution-downloads'),
|
||||
])
|
||||
->columns(1)
|
||||
->columnSpanFull()
|
||||
->createItemButtonLabel('Add Download Item')
|
||||
->defaultItems(1),
|
||||
Forms\Components\Repeater::make('faqs')
|
||||
->schema([
|
||||
Forms\Components\TextInput::make('question')
|
||||
->label('Question')
|
||||
->required(),
|
||||
Forms\Components\RichEditor::make('answer')
|
||||
->label('Answer')
|
||||
->required(),
|
||||
])
|
||||
->columns(1)
|
||||
->columnSpanFull()
|
||||
->createItemButtonLabel('Add FAQ')
|
||||
->defaultItems(1),
|
||||
Forms\Components\RichEditor::make('description')
|
||||
->required()
|
||||
->columnSpanFull(),
|
||||
@@ -100,4 +130,9 @@ class SolutionResource extends Resource
|
||||
'edit' => Pages\EditSolution::route('/{record}/edit'),
|
||||
];
|
||||
}
|
||||
|
||||
public static function canViewAny(): bool
|
||||
{
|
||||
return auth()->user()->role === UserRole::ADMIN || auth()->user()->role === UserRole::MANAGER;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -14,6 +14,7 @@ use Filament\Resources\Resource;
|
||||
use Filament\Tables;
|
||||
use Filament\Tables\Columns\ImageColumn;
|
||||
use Filament\Tables\Table;
|
||||
use Illuminate\Database\Eloquent\Builder;
|
||||
use Illuminate\Support\Str;
|
||||
|
||||
class SuccessResource extends Resource
|
||||
@@ -22,7 +23,7 @@ class SuccessResource extends Resource
|
||||
|
||||
protected static ?string $navigationIcon = 'heroicon-o-bookmark-square';
|
||||
|
||||
protected static ?string $navigationGroup = 'Success Stories';
|
||||
protected static ?string $navigationGroup = 'News & Stories';
|
||||
|
||||
public static function form(Form $form): Form
|
||||
{
|
||||
@@ -112,4 +113,34 @@ class SuccessResource extends Resource
|
||||
'edit' => Pages\EditSuccess::route('/{record}/edit'),
|
||||
];
|
||||
}
|
||||
|
||||
public static function canViewAny(): bool
|
||||
{
|
||||
return auth()->user()->can('manage-news-and-success');
|
||||
}
|
||||
|
||||
public static function canCreate(): bool
|
||||
{
|
||||
return auth()->user()->can('manage-news-and-success');
|
||||
}
|
||||
|
||||
public static function canEdit(mixed $record): bool
|
||||
{
|
||||
return auth()->user()->can('manage-news-and-success');
|
||||
}
|
||||
|
||||
public static function canDelete(mixed $record): bool
|
||||
{
|
||||
return auth()->user()->can('manage-news-and-success');
|
||||
}
|
||||
|
||||
public static function canDeleteAny(): bool
|
||||
{
|
||||
return auth()->user()->can('manage-news-and-success');
|
||||
}
|
||||
|
||||
public static function getEloquentQuery(): Builder
|
||||
{
|
||||
return parent::getEloquentQuery()->withoutGlobalScopes();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,22 +3,17 @@
|
||||
namespace App\Filament\Resources;
|
||||
|
||||
use App\Filament\Resources\TeamMemberResource\Pages;
|
||||
use App\Filament\Resources\TeamMemberResource\RelationManagers;
|
||||
use App\Models\TeamMember;
|
||||
use App\Models\UserRole;
|
||||
use Filament\Forms\Components\FileUpload;
|
||||
use Filament\Forms\Components\Textarea;
|
||||
use Filament\Forms\Components\TextInput;
|
||||
use Filament\Forms\Form;
|
||||
use Filament\Resources\Resource;
|
||||
use Filament\Tables;
|
||||
use Filament\Tables\Actions\ActionGroup;
|
||||
use Filament\Tables\Actions\DeleteAction;
|
||||
use Filament\Tables\Actions\EditAction;
|
||||
use Filament\Tables\Columns\ImageColumn;
|
||||
use Filament\Tables\Columns\TextColumn;
|
||||
use Filament\Tables\Table;
|
||||
use Illuminate\Database\Eloquent\Builder;
|
||||
use Illuminate\Database\Eloquent\SoftDeletingScope;
|
||||
|
||||
class TeamMemberResource extends Resource
|
||||
{
|
||||
@@ -26,7 +21,7 @@ class TeamMemberResource extends Resource
|
||||
|
||||
protected static ?string $navigationIcon = 'heroicon-o-users';
|
||||
|
||||
protected static ?string $navigationGroup = 'CMS';
|
||||
protected static ?string $navigationGroup = 'About US';
|
||||
|
||||
public static function form(Form $form): Form
|
||||
{
|
||||
@@ -91,4 +86,9 @@ class TeamMemberResource extends Resource
|
||||
'edit' => Pages\EditTeamMember::route('/{record}/edit'),
|
||||
];
|
||||
}
|
||||
|
||||
public static function canViewAny(): bool
|
||||
{
|
||||
return auth()->user()->role === UserRole::ADMIN || auth()->user()->role === UserRole::MANAGER;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,7 +3,6 @@
|
||||
namespace App\Filament\Resources\TeamMemberResource\Pages;
|
||||
|
||||
use App\Filament\Resources\TeamMemberResource;
|
||||
use Filament\Actions;
|
||||
use Filament\Resources\Pages\CreateRecord;
|
||||
|
||||
class CreateTeamMember extends CreateRecord
|
||||
|
||||
33
app/Http/Middleware/SetLocale.php
Normal file
33
app/Http/Middleware/SetLocale.php
Normal file
@@ -0,0 +1,33 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Middleware;
|
||||
|
||||
use Closure;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\App;
|
||||
use Illuminate\Support\Facades\Session;
|
||||
use Symfony\Component\HttpFoundation\Response;
|
||||
|
||||
class SetLocale
|
||||
{
|
||||
/**
|
||||
* Handle an incoming request.
|
||||
*
|
||||
* @param \Closure(\Illuminate\Http\Request): (\Symfony\Component\HttpFoundation\Response) $next
|
||||
*/
|
||||
public function handle(Request $request, Closure $next): Response
|
||||
{
|
||||
$locale = $request->query('lang');
|
||||
|
||||
if ($locale && in_array($locale, config('app.available_locales'))) {
|
||||
App::setLocale($locale);
|
||||
Session::put('locale', $locale);
|
||||
} elseif (Session::has('locale')) {
|
||||
App::setLocale(Session::get('locale'));
|
||||
} else {
|
||||
App::setLocale(config('app.fallback_locale', 'en'));
|
||||
}
|
||||
|
||||
return $next($request);
|
||||
}
|
||||
}
|
||||
@@ -15,9 +15,13 @@ class Solution extends Model
|
||||
'slug',
|
||||
'title_description',
|
||||
'bullets',
|
||||
'downloads',
|
||||
'faqs',
|
||||
];
|
||||
|
||||
protected $casts = [
|
||||
'bullets' => 'array',
|
||||
'downloads' => 'array',
|
||||
'faqs' => 'array',
|
||||
];
|
||||
}
|
||||
|
||||
@@ -2,6 +2,13 @@
|
||||
|
||||
namespace App\Models;
|
||||
|
||||
enum UserRole: string
|
||||
{
|
||||
case ADMIN = 'admin';
|
||||
case MANAGER = 'manager';
|
||||
case NEWS_WRITER = 'news_writer';
|
||||
}
|
||||
|
||||
// use Illuminate\Contracts\Auth\MustVerifyEmail;
|
||||
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
||||
use Illuminate\Foundation\Auth\User as Authenticatable;
|
||||
@@ -21,6 +28,7 @@ class User extends Authenticatable
|
||||
'name',
|
||||
'email',
|
||||
'password',
|
||||
'role',
|
||||
];
|
||||
|
||||
/**
|
||||
@@ -43,6 +51,12 @@ class User extends Authenticatable
|
||||
return [
|
||||
'email_verified_at' => 'datetime',
|
||||
'password' => 'hashed',
|
||||
'role' => UserRole::class,
|
||||
];
|
||||
}
|
||||
|
||||
public function canManageSettings(): bool
|
||||
{
|
||||
return $this->role === UserRole::ADMIN || $this->role === UserRole::MANAGER;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -5,6 +5,8 @@ namespace App\Providers\Filament;
|
||||
use App\Filament\Pages\HomePageSettings;
|
||||
use App\Filament\Pages\ManageCtaSettings;
|
||||
use App\Filament\Resources\ApplicationResource;
|
||||
use App\Models\User;
|
||||
use App\Models\UserRole;
|
||||
use Filament\Http\Middleware\Authenticate;
|
||||
use Filament\Http\Middleware\DisableBladeIconComponents;
|
||||
use Filament\Http\Middleware\DispatchServingFilamentEvent;
|
||||
@@ -19,7 +21,9 @@ use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken;
|
||||
use Illuminate\Routing\Middleware\SubstituteBindings;
|
||||
use Illuminate\Session\Middleware\AuthenticateSession;
|
||||
use Illuminate\Session\Middleware\StartSession;
|
||||
use Illuminate\Support\Facades\Gate;
|
||||
use Illuminate\View\Middleware\ShareErrorsFromSession;
|
||||
use Filament\SpatieLaravelTranslatablePlugin;
|
||||
|
||||
class PanelPanelProvider extends PanelProvider
|
||||
{
|
||||
@@ -30,9 +34,20 @@ class PanelPanelProvider extends PanelProvider
|
||||
->id('panel')
|
||||
->path('panel')
|
||||
->login()
|
||||
->profile()
|
||||
->colors([
|
||||
'primary' => Color::Amber,
|
||||
])
|
||||
->navigationGroups([
|
||||
'Home',
|
||||
'About US',
|
||||
'Our Solutions',
|
||||
'News & Stories',
|
||||
'Careers',
|
||||
'Contact',
|
||||
'Settings',
|
||||
'Activities',
|
||||
])
|
||||
->discoverResources(in: app_path('Filament/Resources'), for: 'App\\Filament\\Resources')
|
||||
->discoverPages(in: app_path('Filament/Pages'), for: 'App\\Filament\\Pages')
|
||||
->pages([
|
||||
@@ -43,7 +58,6 @@ class PanelPanelProvider extends PanelProvider
|
||||
->discoverWidgets(in: app_path('Filament/Widgets'), for: 'App\\Filament\\Widgets')
|
||||
->widgets([
|
||||
Widgets\AccountWidget::class,
|
||||
Widgets\FilamentInfoWidget::class,
|
||||
])
|
||||
->middleware([
|
||||
EncryptCookies::class,
|
||||
@@ -62,6 +76,33 @@ class PanelPanelProvider extends PanelProvider
|
||||
->resources([
|
||||
config('filament-logger.activity_resource'),
|
||||
ApplicationResource::class,
|
||||
]);
|
||||
])
|
||||
->plugin(
|
||||
SpatieLaravelTranslatablePlugin::make()
|
||||
->defaultLocales(['en', 'ru', 'tk'])
|
||||
);
|
||||
}
|
||||
|
||||
public function boot(): void
|
||||
{
|
||||
Gate::before(function (User $user, string $ability) {
|
||||
if ($user->role === UserRole::ADMIN) {
|
||||
return true;
|
||||
}
|
||||
|
||||
return null;
|
||||
});
|
||||
|
||||
Gate::define('view-activity-logs', function (User $user) {
|
||||
return $user->role === UserRole::ADMIN;
|
||||
});
|
||||
|
||||
Gate::define('manage-news-and-success', function (User $user) {
|
||||
return $user->role === UserRole::NEWS_WRITER || $user->role === UserRole::ADMIN || $user->role === UserRole::MANAGER;
|
||||
});
|
||||
|
||||
Gate::define('view-authors', function (User $user) {
|
||||
return $user->role === UserRole::NEWS_WRITER || $user->role === UserRole::ADMIN || $user->role === UserRole::MANAGER;
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -8,35 +8,50 @@ class AboutSettings extends Settings
|
||||
{
|
||||
// Our Story Section
|
||||
public string $our_story_title;
|
||||
|
||||
public string $our_story_subtitle;
|
||||
|
||||
public string $our_story_paragraph_one;
|
||||
|
||||
public string $our_story_paragraph_two;
|
||||
|
||||
public string $our_story_paragraph_three;
|
||||
|
||||
public string $our_story_button_text;
|
||||
|
||||
public string $our_story_button_url;
|
||||
|
||||
public string $our_story_video_poster;
|
||||
|
||||
public string $our_story_video_source;
|
||||
|
||||
// Our Journey Section
|
||||
public string $our_journey_title;
|
||||
|
||||
public string $our_journey_subtitle;
|
||||
|
||||
public array $our_journey_milestones; // [{year: 2010, title: "Start Company", description: "...", image: "..."}]
|
||||
|
||||
// Company Structure Section
|
||||
public string $company_structure_title;
|
||||
|
||||
public string $company_structure_subtitle;
|
||||
|
||||
public string $company_structure_director_name;
|
||||
|
||||
public string $company_structure_advisor_name;
|
||||
|
||||
public array $company_structure_departments; // [{name: "HSE", person: "Michael Brown"}]
|
||||
|
||||
// Our Facilities Section
|
||||
public string $our_facilities_title;
|
||||
public string $our_facilities_subtitle;
|
||||
public array $our_facilities_locations; // [{name: "Headquarters", location: "...", description: "...", image: "...", tags: ["R&D Labs"]}]
|
||||
|
||||
public string $our_facilities_subtitle;
|
||||
|
||||
public array $our_facilities_locations; // [{name: "Headquarters", location: "...", description: "...", image: "...", tags: ["R&D Labs"]}]
|
||||
|
||||
public static function group(): string
|
||||
{
|
||||
return 'cms_aboutpage';
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -12,6 +12,9 @@ return Application::configure(basePath: dirname(__DIR__))
|
||||
)
|
||||
->withMiddleware(function (Middleware $middleware) {
|
||||
//
|
||||
$middleware->web(append: [
|
||||
\App\Http\Middleware\SetLocale::class,
|
||||
]);
|
||||
})
|
||||
->withExceptions(function (Exceptions $exceptions) {
|
||||
//
|
||||
|
||||
@@ -9,8 +9,10 @@
|
||||
"php": "^8.2",
|
||||
"filament/filament": "^3.3",
|
||||
"filament/spatie-laravel-settings-plugin": "^3.2",
|
||||
"filament/spatie-laravel-translatable-plugin": "^3.2",
|
||||
"laravel/framework": "^12.0",
|
||||
"laravel/tinker": "^2.10.1",
|
||||
"spatie/laravel-translatable": "^6.11",
|
||||
"z3d0x/filament-logger": "^0.8.0"
|
||||
},
|
||||
"require-dev": {
|
||||
|
||||
661
composer.lock
generated
661
composer.lock
generated
File diff suppressed because it is too large
Load Diff
@@ -84,6 +84,19 @@ return [
|
||||
|
||||
'faker_locale' => env('APP_FAKER_LOCALE', 'en_US'),
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Application Available Locales
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| The application locales that are available for your application.
|
||||
|
|
||||
*/
|
||||
|
||||
'available_locales' => [
|
||||
'en', 'ru', 'tk'
|
||||
],
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Encryption Key
|
||||
|
||||
101
config/filament.php
Normal file
101
config/filament.php
Normal file
@@ -0,0 +1,101 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Broadcasting
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| By uncommenting the Laravel Echo configuration, you may connect Filament
|
||||
| to any Pusher-compatible websockets server.
|
||||
|
|
||||
| This will allow your users to receive real-time notifications.
|
||||
|
|
||||
*/
|
||||
|
||||
'broadcasting' => [
|
||||
|
||||
// 'echo' => [
|
||||
// 'broadcaster' => 'pusher',
|
||||
// 'key' => env('VITE_PUSHER_APP_KEY'),
|
||||
// 'cluster' => env('VITE_PUSHER_APP_CLUSTER'),
|
||||
// 'wsHost' => env('VITE_PUSHER_HOST'),
|
||||
// 'wsPort' => env('VITE_PUSHER_PORT'),
|
||||
// 'wssPort' => env('VITE_PUSHER_PORT'),
|
||||
// 'authEndpoint' => '/broadcasting/auth',
|
||||
// 'disableStats' => true,
|
||||
// 'encrypted' => true,
|
||||
// 'forceTLS' => true,
|
||||
// ],
|
||||
|
||||
],
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Default Filesystem Disk
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| This is the storage disk Filament will use to store files. You may use
|
||||
| any of the disks defined in the `config/filesystems.php`.
|
||||
|
|
||||
*/
|
||||
|
||||
'default_filesystem_disk' => env('FILAMENT_FILESYSTEM_DISK', 'public'),
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Assets Path
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| This is the directory where Filament's assets will be published to. It
|
||||
| is relative to the `public` directory of your Laravel application.
|
||||
|
|
||||
| After changing the path, you should run `php artisan filament:assets`.
|
||||
|
|
||||
*/
|
||||
|
||||
'assets_path' => null,
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Cache Path
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| This is the directory that Filament will use to store cache files that
|
||||
| are used to optimize the registration of components.
|
||||
|
|
||||
| After changing the path, you should run `php artisan filament:cache-components`.
|
||||
|
|
||||
*/
|
||||
|
||||
'cache_path' => base_path('bootstrap/cache/filament'),
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Livewire Loading Delay
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| This sets the delay before loading indicators appear.
|
||||
|
|
||||
| Setting this to 'none' makes indicators appear immediately, which can be
|
||||
| desirable for high-latency connections. Setting it to 'default' applies
|
||||
| Livewire's standard 200ms delay.
|
||||
|
|
||||
*/
|
||||
|
||||
'livewire_loading_delay' => 'default',
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| System Route Prefix
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| This is the prefix used for the system routes that Filament registers,
|
||||
| such as the routes for downloading exports and failed import rows.
|
||||
|
|
||||
*/
|
||||
|
||||
'system_route_prefix' => 'filament',
|
||||
|
||||
];
|
||||
@@ -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
|
||||
{
|
||||
/**
|
||||
* Run the migrations.
|
||||
*/
|
||||
public function up(): void
|
||||
{
|
||||
Schema::table('solutions', function (Blueprint $table) {
|
||||
$table->json('downloads')->nullable()->after('bullets');
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Reverse the migrations.
|
||||
*/
|
||||
public function down(): void
|
||||
{
|
||||
Schema::table('solutions', function (Blueprint $table) {
|
||||
$table->dropColumn('downloads');
|
||||
});
|
||||
}
|
||||
};
|
||||
@@ -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
|
||||
{
|
||||
/**
|
||||
* Run the migrations.
|
||||
*/
|
||||
public function up(): void
|
||||
{
|
||||
Schema::table('solutions', function (Blueprint $table) {
|
||||
$table->json('faqs')->nullable()->after('downloads');
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Reverse the migrations.
|
||||
*/
|
||||
public function down(): void
|
||||
{
|
||||
Schema::table('solutions', function (Blueprint $table) {
|
||||
$table->dropColumn('faqs');
|
||||
});
|
||||
}
|
||||
};
|
||||
@@ -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
|
||||
{
|
||||
/**
|
||||
* Run the migrations.
|
||||
*/
|
||||
public function up(): void
|
||||
{
|
||||
Schema::table('users', function (Blueprint $table) {
|
||||
$table->string('role')->default('news_writer')->nullable();
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Reverse the migrations.
|
||||
*/
|
||||
public function down(): void
|
||||
{
|
||||
Schema::table('users', function (Blueprint $table) {
|
||||
$table->dropColumn('role');
|
||||
});
|
||||
}
|
||||
};
|
||||
@@ -3,6 +3,7 @@
|
||||
namespace Database\Seeders;
|
||||
|
||||
use App\Models\User;
|
||||
use App\Models\UserRole;
|
||||
use Illuminate\Database\Seeder;
|
||||
|
||||
class UsersTableSeeder extends Seeder
|
||||
@@ -16,6 +17,7 @@ class UsersTableSeeder extends Seeder
|
||||
'name' => 'nurmuhammet',
|
||||
'email' => 'nurmuhammet@mail.com',
|
||||
'password' => bcrypt('payload10'),
|
||||
'role' => UserRole::ADMIN,
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
64
lang/en.json
Normal file
64
lang/en.json
Normal file
@@ -0,0 +1,64 @@
|
||||
{
|
||||
"Home": "Home",
|
||||
"About Us": "About Us",
|
||||
"Our solutions": "Our solutions",
|
||||
"News & Stories": "News & Stories",
|
||||
"News": "News",
|
||||
"Success Stories": "Success Stories",
|
||||
"Careers": "Careers",
|
||||
"Career Opportunities": "Career Opportunities",
|
||||
"Internships": "Internships",
|
||||
"Contact": "Contact",
|
||||
"Get Started": "Get Started",
|
||||
"Apply for": "Apply for",
|
||||
"Close": "Close",
|
||||
"Name": "Name",
|
||||
"Birthdate": "Birthdate",
|
||||
"Email": "Email",
|
||||
"Phone Number": "Phone Number",
|
||||
"Resume (PDF, DOC, DOCX)": "Resume (PDF, DOC, DOCX)",
|
||||
"Cover Letter (Optional)": "Cover Letter (Optional)",
|
||||
"Submit Application": "Submit Application",
|
||||
"Location": "Location",
|
||||
"Salary": "Salary",
|
||||
"Per monthly": "Per monthly",
|
||||
"Error": "Error",
|
||||
"An error occurred. Please try again.": "An error occurred. Please try again.",
|
||||
"Gujurly Inžener logo": "Gujurly Inžener logo",
|
||||
"Gujurly Inžener": "Gujurly Inžener",
|
||||
"Address": "Address",
|
||||
"Quick links": "Quick links",
|
||||
"Support": "Support",
|
||||
"Terms & Conditions": "Terms & Conditions",
|
||||
"Privacy Policy": "Privacy Policy",
|
||||
"|": "|",
|
||||
"Mode": "Mode",
|
||||
"Light": "Light",
|
||||
"Dark": "Dark",
|
||||
"Language": "Language",
|
||||
"Read Our News": "Read Our News",
|
||||
"Read More": "Read More",
|
||||
"No news found...": "No news found...",
|
||||
"Comments": "Comments",
|
||||
"No comments yet": "No comments yet",
|
||||
"Post Comment": "Post Comment",
|
||||
"Required fields are marked": "Required fields are marked",
|
||||
"Full Name": "Full Name",
|
||||
"Title": "Title",
|
||||
"Type your comments....": "Type your comments....",
|
||||
"Submit Comment": "Submit Comment",
|
||||
"Recent Blog": "Recent Blog",
|
||||
"Phone": "Phone",
|
||||
"Email Address": "Email Address",
|
||||
"Location:": "Location:",
|
||||
"Salary:": "Salary:",
|
||||
"Description": "Description",
|
||||
"Responsibilities and Qualifications": "Responsibilities and Qualifications",
|
||||
"Apply for this Career": "Apply for this Career",
|
||||
"For general application, send your resume at": "For general application, send your resume at",
|
||||
"Apply Now": "Apply Now",
|
||||
"No careers found...": "No careers found...",
|
||||
"Search Here": "Search Here",
|
||||
"Recent Success Stories": "Recent Success Stories",
|
||||
"No internships found...": "No internships found..."
|
||||
}
|
||||
20
lang/en/auth.php
Normal file
20
lang/en/auth.php
Normal file
@@ -0,0 +1,20 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Authentication Language Lines
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| The following language lines are used during authentication for various
|
||||
| messages that we need to display to the user. You are free to modify
|
||||
| these language lines according to your application's requirements.
|
||||
|
|
||||
*/
|
||||
|
||||
'failed' => 'These credentials do not match our records.',
|
||||
'password' => 'The provided password is incorrect.',
|
||||
'throttle' => 'Too many login attempts. Please try again in :seconds seconds.',
|
||||
|
||||
];
|
||||
19
lang/en/pagination.php
Normal file
19
lang/en/pagination.php
Normal file
@@ -0,0 +1,19 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Pagination Language Lines
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| The following language lines are used by the paginator library to build
|
||||
| the simple pagination links. You are free to change them to anything
|
||||
| you want to customize your views to better match your application.
|
||||
|
|
||||
*/
|
||||
|
||||
'previous' => '« Previous',
|
||||
'next' => 'Next »',
|
||||
|
||||
];
|
||||
22
lang/en/passwords.php
Normal file
22
lang/en/passwords.php
Normal file
@@ -0,0 +1,22 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Password Reset Language Lines
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| The following language lines are the default lines which match reasons
|
||||
| that are given by the password broker for a password update attempt
|
||||
| outcome such as failure due to an invalid password / reset token.
|
||||
|
|
||||
*/
|
||||
|
||||
'reset' => 'Your password has been reset.',
|
||||
'sent' => 'We have emailed your password reset link.',
|
||||
'throttled' => 'Please wait before retrying.',
|
||||
'token' => 'This password reset token is invalid.',
|
||||
'user' => "We can't find a user with that email address.",
|
||||
|
||||
];
|
||||
198
lang/en/validation.php
Normal file
198
lang/en/validation.php
Normal file
@@ -0,0 +1,198 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Validation Language Lines
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| The following language lines contain the default error messages used by
|
||||
| the validator class. Some of these rules have multiple versions such
|
||||
| as the size rules. Feel free to tweak each of these messages here.
|
||||
|
|
||||
*/
|
||||
|
||||
'accepted' => 'The :attribute field must be accepted.',
|
||||
'accepted_if' => 'The :attribute field must be accepted when :other is :value.',
|
||||
'active_url' => 'The :attribute field must be a valid URL.',
|
||||
'after' => 'The :attribute field must be a date after :date.',
|
||||
'after_or_equal' => 'The :attribute field must be a date after or equal to :date.',
|
||||
'alpha' => 'The :attribute field must only contain letters.',
|
||||
'alpha_dash' => 'The :attribute field must only contain letters, numbers, dashes, and underscores.',
|
||||
'alpha_num' => 'The :attribute field must only contain letters and numbers.',
|
||||
'any_of' => 'The :attribute field is invalid.',
|
||||
'array' => 'The :attribute field must be an array.',
|
||||
'ascii' => 'The :attribute field must only contain single-byte alphanumeric characters and symbols.',
|
||||
'before' => 'The :attribute field must be a date before :date.',
|
||||
'before_or_equal' => 'The :attribute field must be a date before or equal to :date.',
|
||||
'between' => [
|
||||
'array' => 'The :attribute field must have between :min and :max items.',
|
||||
'file' => 'The :attribute field must be between :min and :max kilobytes.',
|
||||
'numeric' => 'The :attribute field must be between :min and :max.',
|
||||
'string' => 'The :attribute field must be between :min and :max characters.',
|
||||
],
|
||||
'boolean' => 'The :attribute field must be true or false.',
|
||||
'can' => 'The :attribute field contains an unauthorized value.',
|
||||
'confirmed' => 'The :attribute field confirmation does not match.',
|
||||
'contains' => 'The :attribute field is missing a required value.',
|
||||
'current_password' => 'The password is incorrect.',
|
||||
'date' => 'The :attribute field must be a valid date.',
|
||||
'date_equals' => 'The :attribute field must be a date equal to :date.',
|
||||
'date_format' => 'The :attribute field must match the format :format.',
|
||||
'decimal' => 'The :attribute field must have :decimal decimal places.',
|
||||
'declined' => 'The :attribute field must be declined.',
|
||||
'declined_if' => 'The :attribute field must be declined when :other is :value.',
|
||||
'different' => 'The :attribute field and :other must be different.',
|
||||
'digits' => 'The :attribute field must be :digits digits.',
|
||||
'digits_between' => 'The :attribute field must be between :min and :max digits.',
|
||||
'dimensions' => 'The :attribute field has invalid image dimensions.',
|
||||
'distinct' => 'The :attribute field has a duplicate value.',
|
||||
'doesnt_end_with' => 'The :attribute field must not end with one of the following: :values.',
|
||||
'doesnt_start_with' => 'The :attribute field must not start with one of the following: :values.',
|
||||
'email' => 'The :attribute field must be a valid email address.',
|
||||
'ends_with' => 'The :attribute field must end with one of the following: :values.',
|
||||
'enum' => 'The selected :attribute is invalid.',
|
||||
'exists' => 'The selected :attribute is invalid.',
|
||||
'extensions' => 'The :attribute field must have one of the following extensions: :values.',
|
||||
'file' => 'The :attribute field must be a file.',
|
||||
'filled' => 'The :attribute field must have a value.',
|
||||
'gt' => [
|
||||
'array' => 'The :attribute field must have more than :value items.',
|
||||
'file' => 'The :attribute field must be greater than :value kilobytes.',
|
||||
'numeric' => 'The :attribute field must be greater than :value.',
|
||||
'string' => 'The :attribute field must be greater than :value characters.',
|
||||
],
|
||||
'gte' => [
|
||||
'array' => 'The :attribute field must have :value items or more.',
|
||||
'file' => 'The :attribute field must be greater than or equal to :value kilobytes.',
|
||||
'numeric' => 'The :attribute field must be greater than or equal to :value.',
|
||||
'string' => 'The :attribute field must be greater than or equal to :value characters.',
|
||||
],
|
||||
'hex_color' => 'The :attribute field must be a valid hexadecimal color.',
|
||||
'image' => 'The :attribute field must be an image.',
|
||||
'in' => 'The selected :attribute is invalid.',
|
||||
'in_array' => 'The :attribute field must exist in :other.',
|
||||
'in_array_keys' => 'The :attribute field must contain at least one of the following keys: :values.',
|
||||
'integer' => 'The :attribute field must be an integer.',
|
||||
'ip' => 'The :attribute field must be a valid IP address.',
|
||||
'ipv4' => 'The :attribute field must be a valid IPv4 address.',
|
||||
'ipv6' => 'The :attribute field must be a valid IPv6 address.',
|
||||
'json' => 'The :attribute field must be a valid JSON string.',
|
||||
'list' => 'The :attribute field must be a list.',
|
||||
'lowercase' => 'The :attribute field must be lowercase.',
|
||||
'lt' => [
|
||||
'array' => 'The :attribute field must have less than :value items.',
|
||||
'file' => 'The :attribute field must be less than :value kilobytes.',
|
||||
'numeric' => 'The :attribute field must be less than :value.',
|
||||
'string' => 'The :attribute field must be less than :value characters.',
|
||||
],
|
||||
'lte' => [
|
||||
'array' => 'The :attribute field must not have more than :value items.',
|
||||
'file' => 'The :attribute field must be less than or equal to :value kilobytes.',
|
||||
'numeric' => 'The :attribute field must be less than or equal to :value.',
|
||||
'string' => 'The :attribute field must be less than or equal to :value characters.',
|
||||
],
|
||||
'mac_address' => 'The :attribute field must be a valid MAC address.',
|
||||
'max' => [
|
||||
'array' => 'The :attribute field must not have more than :max items.',
|
||||
'file' => 'The :attribute field must not be greater than :max kilobytes.',
|
||||
'numeric' => 'The :attribute field must not be greater than :max.',
|
||||
'string' => 'The :attribute field must not be greater than :max characters.',
|
||||
],
|
||||
'max_digits' => 'The :attribute field must not have more than :max digits.',
|
||||
'mimes' => 'The :attribute field must be a file of type: :values.',
|
||||
'mimetypes' => 'The :attribute field must be a file of type: :values.',
|
||||
'min' => [
|
||||
'array' => 'The :attribute field must have at least :min items.',
|
||||
'file' => 'The :attribute field must be at least :min kilobytes.',
|
||||
'numeric' => 'The :attribute field must be at least :min.',
|
||||
'string' => 'The :attribute field must be at least :min characters.',
|
||||
],
|
||||
'min_digits' => 'The :attribute field must have at least :min digits.',
|
||||
'missing' => 'The :attribute field must be missing.',
|
||||
'missing_if' => 'The :attribute field must be missing when :other is :value.',
|
||||
'missing_unless' => 'The :attribute field must be missing unless :other is :value.',
|
||||
'missing_with' => 'The :attribute field must be missing when :values is present.',
|
||||
'missing_with_all' => 'The :attribute field must be missing when :values are present.',
|
||||
'multiple_of' => 'The :attribute field must be a multiple of :value.',
|
||||
'not_in' => 'The selected :attribute is invalid.',
|
||||
'not_regex' => 'The :attribute field format is invalid.',
|
||||
'numeric' => 'The :attribute field must be a number.',
|
||||
'password' => [
|
||||
'letters' => 'The :attribute field must contain at least one letter.',
|
||||
'mixed' => 'The :attribute field must contain at least one uppercase and one lowercase letter.',
|
||||
'numbers' => 'The :attribute field must contain at least one number.',
|
||||
'symbols' => 'The :attribute field must contain at least one symbol.',
|
||||
'uncompromised' => 'The given :attribute has appeared in a data leak. Please choose a different :attribute.',
|
||||
],
|
||||
'present' => 'The :attribute field must be present.',
|
||||
'present_if' => 'The :attribute field must be present when :other is :value.',
|
||||
'present_unless' => 'The :attribute field must be present unless :other is :value.',
|
||||
'present_with' => 'The :attribute field must be present when :values is present.',
|
||||
'present_with_all' => 'The :attribute field must be present when :values are present.',
|
||||
'prohibited' => 'The :attribute field is prohibited.',
|
||||
'prohibited_if' => 'The :attribute field is prohibited when :other is :value.',
|
||||
'prohibited_if_accepted' => 'The :attribute field is prohibited when :other is accepted.',
|
||||
'prohibited_if_declined' => 'The :attribute field is prohibited when :other is declined.',
|
||||
'prohibited_unless' => 'The :attribute field is prohibited unless :other is in :values.',
|
||||
'prohibits' => 'The :attribute field prohibits :other from being present.',
|
||||
'regex' => 'The :attribute field format is invalid.',
|
||||
'required' => 'The :attribute field is required.',
|
||||
'required_array_keys' => 'The :attribute field must contain entries for: :values.',
|
||||
'required_if' => 'The :attribute field is required when :other is :value.',
|
||||
'required_if_accepted' => 'The :attribute field is required when :other is accepted.',
|
||||
'required_if_declined' => 'The :attribute field is required when :other is declined.',
|
||||
'required_unless' => 'The :attribute field is required unless :other is in :values.',
|
||||
'required_with' => 'The :attribute field is required when :values is present.',
|
||||
'required_with_all' => 'The :attribute field is required when :values are present.',
|
||||
'required_without' => 'The :attribute field is required when :values is not present.',
|
||||
'required_without_all' => 'The :attribute field is required when none of :values are present.',
|
||||
'same' => 'The :attribute field must match :other.',
|
||||
'size' => [
|
||||
'array' => 'The :attribute field must contain :size items.',
|
||||
'file' => 'The :attribute field must be :size kilobytes.',
|
||||
'numeric' => 'The :attribute field must be :size.',
|
||||
'string' => 'The :attribute field must be :size characters.',
|
||||
],
|
||||
'starts_with' => 'The :attribute field must start with one of the following: :values.',
|
||||
'string' => 'The :attribute field must be a string.',
|
||||
'timezone' => 'The :attribute field must be a valid timezone.',
|
||||
'unique' => 'The :attribute has already been taken.',
|
||||
'uploaded' => 'The :attribute failed to upload.',
|
||||
'uppercase' => 'The :attribute field must be uppercase.',
|
||||
'url' => 'The :attribute field must be a valid URL.',
|
||||
'ulid' => 'The :attribute field must be a valid ULID.',
|
||||
'uuid' => 'The :attribute field must be a valid UUID.',
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Custom Validation Language Lines
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| Here you may specify custom validation messages for attributes using the
|
||||
| convention "attribute.rule" to name the lines. This makes it quick to
|
||||
| specify a specific custom language line for a given attribute rule.
|
||||
|
|
||||
*/
|
||||
|
||||
'custom' => [
|
||||
'attribute-name' => [
|
||||
'rule-name' => 'custom-message',
|
||||
],
|
||||
],
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Custom Validation Attributes
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| The following language lines are used to swap our attribute placeholder
|
||||
| with something more reader friendly such as "E-Mail Address" instead
|
||||
| of "email". This simply helps us make our message more expressive.
|
||||
|
|
||||
*/
|
||||
|
||||
'attributes' => [],
|
||||
|
||||
];
|
||||
64
lang/ru.json
Normal file
64
lang/ru.json
Normal file
@@ -0,0 +1,64 @@
|
||||
{
|
||||
"Home": "Главная",
|
||||
"About Us": "О нас",
|
||||
"Our solutions": "Наши решения",
|
||||
"News & Stories": "Новости и Истории",
|
||||
"News": "Новости",
|
||||
"Success Stories": "Истории успеха",
|
||||
"Careers": "Карьера",
|
||||
"Career Opportunities": "Карьерные возможности",
|
||||
"Internships": "Стажировки",
|
||||
"Contact": "Контакты",
|
||||
"Get Started": "Начать",
|
||||
"Apply for": "Подать заявку на",
|
||||
"Close": "Закрыть",
|
||||
"Name": "Имя",
|
||||
"Birthdate": "Дата рождения",
|
||||
"Email": "Электронная почта",
|
||||
"Phone Number": "Номер телефона",
|
||||
"Resume (PDF, DOC, DOCX)": "Резюме (PDF, DOC, DOCX)",
|
||||
"Cover Letter (Optional)": "Сопроводительное письмо (необязательно)",
|
||||
"Submit Application": "Отправить заявку",
|
||||
"Location": "Местоположение",
|
||||
"Salary": "Зарплата",
|
||||
"Per monthly": "В месяц",
|
||||
"Error": "Ошибка",
|
||||
"An error occurred. Please try again.": "Произошла ошибка. Пожалуйста, попробуйте еще раз.",
|
||||
"Gujurly Inžener logo": "Логотип Gujurly Inžener",
|
||||
"Gujurly Inžener": "Gujurly Inžener",
|
||||
"Address": "Адрес",
|
||||
"Quick links": "Быстрые ссылки",
|
||||
"Support": "Поддержка",
|
||||
"Terms & Conditions": "Условия и положения",
|
||||
"Privacy Policy": "Политика конфиденциальности",
|
||||
"|": "|",
|
||||
"Mode": "Режим",
|
||||
"Light": "Светлый",
|
||||
"Dark": "Темный",
|
||||
"Language": "Язык",
|
||||
"Read Our News": "Читайте наши новости",
|
||||
"Read More": "Читать далее",
|
||||
"No news found...": "Новости не найдены...",
|
||||
"Comments": "Комментарии",
|
||||
"No comments yet": "Пока нет комментариев",
|
||||
"Post Comment": "Оставить комментарий",
|
||||
"Required fields are marked": "Обязательные поля помечены",
|
||||
"Full Name": "Полное имя",
|
||||
"Title": "Заголовок",
|
||||
"Type your comments....": "Напишите свои комментарии....",
|
||||
"Submit Comment": "Отправить комментарий",
|
||||
"Recent Blog": "Недавний блог",
|
||||
"Phone": "Телефон",
|
||||
"Email Address": "Адрес электронной почты",
|
||||
"Location:": "Местоположение:",
|
||||
"Salary:": "Зарплата:",
|
||||
"Description": "Описание",
|
||||
"Responsibilities and Qualifications": "Обязанности и квалификация",
|
||||
"Apply for this Career": "Подать заявку на эту карьеру",
|
||||
"For general application, send your resume at": "Для общего заявления отправьте свое резюме по адресу",
|
||||
"Apply Now": "Подать сейчас",
|
||||
"No careers found...": "Вакансии не найдены...",
|
||||
"Search Here": "Искать здесь",
|
||||
"Recent Success Stories": "Недавние истории успеха",
|
||||
"No internships found...": "Стажировки не найдены..."
|
||||
}
|
||||
64
lang/tk.json
Normal file
64
lang/tk.json
Normal file
@@ -0,0 +1,64 @@
|
||||
{
|
||||
"Home": "Baş sahypa",
|
||||
"About Us": "Biz barada",
|
||||
"Our solutions": "Biziň çözgütlerimiz",
|
||||
"News & Stories": "Täzelikler we Hekaýalar",
|
||||
"News": "Täzelikler",
|
||||
"Success Stories": "Üstünlik hekaýalary",
|
||||
"Careers": "Kariýera",
|
||||
"Career Opportunities": "Kariýera mümkinçilikleri",
|
||||
"Internships": "Hünär öwrenmek",
|
||||
"Contact": "Habarlaşmak",
|
||||
"Get Started": "Başlamak",
|
||||
"Apply for": "Üçin ýüz tutmak",
|
||||
"Close": "Ýapmak",
|
||||
"Name": "Ady",
|
||||
"Birthdate": "Doglan senesi",
|
||||
"Email": "Elektron poçta",
|
||||
"Phone Number": "Telefon belgisi",
|
||||
"Resume (PDF, DOC, DOCX)": "Rezüme (PDF, DOC, DOCX)",
|
||||
"Cover Letter (Optional)": "Goşmaça hat (islege görä)",
|
||||
"Submit Application": "Arza ibermek",
|
||||
"Location": "Ýerleşýän ýeri",
|
||||
"Salary": "Aýlyk",
|
||||
"Per monthly": "Aýda",
|
||||
"Error": "Ýalňyşlyk",
|
||||
"An error occurred. Please try again.": "Ýalňyşlyk ýüze çykdy. Haýyş edýäris, täzeden synanyşyň.",
|
||||
"Gujurly Inžener logo": "Gujurly Inžener nyşany",
|
||||
"Gujurly Inžener": "Gujurly Inžener",
|
||||
"Address": "Salgy",
|
||||
"Quick links": "Çalt baglanyşyklar",
|
||||
"Support": "Goldaw",
|
||||
"Terms & Conditions": "Şertler we Düzgünler",
|
||||
"Privacy Policy": "Gizlinlik syýasaty",
|
||||
"|": "|",
|
||||
"Mode": "Režim",
|
||||
"Light": "Ýagty",
|
||||
"Dark": "Garaňky",
|
||||
"Language": "Dil",
|
||||
"Read Our News": "Täzeliklerimizi okaň",
|
||||
"Read More": "Doly okaň",
|
||||
"No news found...": "Täzelik tapylmady...",
|
||||
"Comments": "Teswirler",
|
||||
"No comments yet": "Heniz teswir ýok",
|
||||
"Post Comment": "Teswir goýmak",
|
||||
"Required fields are marked": "Zerur meýdanlar bellendi",
|
||||
"Full Name": "Doly ady",
|
||||
"Title": "Ady",
|
||||
"Type your comments....": "Teswirleriňizi ýazyň....",
|
||||
"Submit Comment": "Teswir ibermek",
|
||||
"Recent Blog": "Soňky blog",
|
||||
"Phone": "Telefon",
|
||||
"Email Address": "Elektron poçta salgysy",
|
||||
"Location:": "Ýerleşýän ýeri:",
|
||||
"Salary:": "Aýlyk:",
|
||||
"Description": "Beýany",
|
||||
"Responsibilities and Qualifications": "Jogapkärçilikler we Hünärler",
|
||||
"Apply for this Career": "Bu kariýera ýüz tutuň",
|
||||
"For general application, send your resume at": "Umumy arza üçin rezyumeňizi şu salga iberiň",
|
||||
"Apply Now": "Häzir ýüz tutuň",
|
||||
"No careers found...": "Kariýera tapylmady...",
|
||||
"Search Here": "Şu ýerde gözle",
|
||||
"Recent Success Stories": "Soňky üstünlik hekaýalary",
|
||||
"No internships found...": "Hünär öwrenmek tapylmady..."
|
||||
}
|
||||
@@ -492,6 +492,15 @@
|
||||
}
|
||||
});
|
||||
|
||||
// Language Switcher
|
||||
$('#language-switcher button').on('click', function (e) {
|
||||
$(this).addClass('active').siblings().removeClass('active');
|
||||
var lang = $(this).attr('data-lang');
|
||||
var currentUrl = new URL(window.location.href);
|
||||
currentUrl.searchParams.set('lang', lang);
|
||||
window.location.href = currentUrl.toString();
|
||||
});
|
||||
|
||||
///============= * Custom Cursor =============\\\
|
||||
var ball = document.getElementById("cursor-ball");
|
||||
var cursorText = document.getElementById("cursor-text");
|
||||
|
||||
@@ -6,6 +6,8 @@
|
||||
padding: 40px;
|
||||
border: 1px solid var(--border-color-2);
|
||||
border-radius: 10px;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
&-price {
|
||||
span {
|
||||
font-size: 18px;
|
||||
@@ -25,6 +27,7 @@
|
||||
margin-top: 35px;
|
||||
padding-top: 30px;
|
||||
border-top: 1px solid var(--border-color-2);
|
||||
flex-grow: 1;
|
||||
ul {
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
|
||||
@@ -2,8 +2,8 @@
|
||||
<div class="modal-dialog modal-lg">
|
||||
<div class="modal-content rounded-3">
|
||||
<div class="modal-header">
|
||||
<h5 class="modal-title" id="applicationModalLabel">Apply for <span id="jobTitle"></span></h5>
|
||||
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
|
||||
<h5 class="modal-title" id="applicationModalLabel">{{ __('Apply for') }} <span id="jobTitle"></span></h5>
|
||||
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="{{ __('Close') }}"></button>
|
||||
</div>
|
||||
<div class="modal-body">
|
||||
<h6 id="jobLocation"></h6>
|
||||
@@ -18,33 +18,33 @@
|
||||
@endif
|
||||
<div class="row">
|
||||
<div class="col-md-6 mb-3">
|
||||
<label for="name" class="form-label">Name <span> *</span></label>
|
||||
<label for="name" class="form-label">{{ __('Name') }} <span> *</span></label>
|
||||
<input type="text" class="form-control" id="name" name="name" required>
|
||||
</div>
|
||||
<div class="col-md-6 mb-3">
|
||||
<label for="birthdate" class="form-label">Birthdate <span> *</span></label>
|
||||
<label for="birthdate" class="form-label">{{ __('Birthdate') }} <span> *</span></label>
|
||||
<input type="date" class="form-control" id="birthdate" name="birthdate" required>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-md-6 mb-3">
|
||||
<label for="email" class="form-label">Email <span> *</span></label>
|
||||
<label for="email" class="form-label">{{ __('Email') }} <span> *</span></label>
|
||||
<input type="email" class="form-control" id="email" name="email" required>
|
||||
</div>
|
||||
<div class="col-md-6 mb-3">
|
||||
<label for="phone_number" class="form-label">Phone Number <span> *</span></label>
|
||||
<label for="phone_number" class="form-label">{{ __('Phone Number') }} <span> *</span></label>
|
||||
<input type="text" class="form-control" id="phone_number" name="phone_number" required>
|
||||
</div>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<label for="resume_file" class="form-label">Resume (PDF, DOC, DOCX) <span> *</span></label>
|
||||
<label for="resume_file" class="form-label">{{ __('Resume (PDF, DOC, DOCX)') }} <span> *</span></label>
|
||||
<input type="file" class="form-control" id="resume_file" name="resume_file" accept=".pdf,.doc,.docx" required>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<label for="cover_letter" class="form-label">Cover Letter (Optional)</label>
|
||||
<label for="cover_letter" class="form-label">{{ __('Cover Letter (Optional)') }}</label>
|
||||
<textarea class="form-control" id="cover_letter" name="cover_letter" rows="5"></textarea>
|
||||
</div>
|
||||
<button type="submit" class="btn btn-primary">Submit Application</button>
|
||||
<button type="submit" class="btn btn-primary">{{ __('Submit Application') }}</button>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
@@ -70,8 +70,8 @@
|
||||
|
||||
// Set dynamic values
|
||||
modalTitle.textContent = button.getAttribute('data-' + jobType + '-title');
|
||||
modalLocation.textContent = 'Location: ' + button.getAttribute('data-' + jobType + '-location');
|
||||
modalSalary.textContent = 'Salary: ' + button.getAttribute('data-' + jobType + '-salary') + ' / Per monthly';
|
||||
modalLocation.textContent = '{{ __('Location') }}: ' + button.getAttribute('data-' + jobType + '-location');
|
||||
modalSalary.textContent = '{{ __('Salary') }}: ' + button.getAttribute('data-' + jobType + '-salary') + ' / {{ __('Per monthly') }}';
|
||||
modalDescription.textContent = button.getAttribute('data-' + jobType + '-description');
|
||||
jobIdInput.value = jobId;
|
||||
|
||||
@@ -108,12 +108,12 @@
|
||||
modal.hide();
|
||||
form.reset();
|
||||
} else {
|
||||
alert('Error: ' + data.message);
|
||||
alert('{{ __('Error') }}: ' + data.message);
|
||||
}
|
||||
})
|
||||
.catch(error => {
|
||||
console.error('Error:', error);
|
||||
alert('An error occurred. Please try again.');
|
||||
console.error('{{ __('Error') }}:', error);
|
||||
alert('{{ __('An error occurred. Please try again.') }}');
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
@include('web.layouts.meta-tags')
|
||||
|
||||
<!-- Title of Site -->
|
||||
<title>@isset($title) {{ "{$title} |" }} @endisset {{ $settings->name }}</title>
|
||||
<title>@isset($title) {{ "{$title} " . __('|') . " " }} @endisset {{ $settings->name }}</title>
|
||||
|
||||
<!-- Favicons -->
|
||||
@include('web.layouts.favicons')
|
||||
|
||||
@@ -8,8 +8,8 @@
|
||||
<div class="col-lg-4 col-sm-6">
|
||||
<div class="footer__four-widget mr-40">
|
||||
<a href="/" class="logo align-items-center d-flex gap-2">
|
||||
<img src="/web/assets/img/logo-small.png" style="height: 35px;" alt="Gujurly Inžener logo">
|
||||
<span style="font-size: 2em;color: var(--text-heading-color);">Gujurly Inžener</span>
|
||||
<img src="/web/assets/img/logo-small.png" style="height: 35px;" alt="{{ __('Gujurly Inžener logo') }}">
|
||||
<span style="font-size: 2em;color: var(--text-heading-color);">{{ __('Gujurly Inžener') }}</span>
|
||||
</a>
|
||||
<h5>{{ $settings->footer_company_header }}</h5>
|
||||
</div>
|
||||
@@ -32,7 +32,7 @@
|
||||
<li><a href="{{ route('about-us.index') }}">{{ __('About Us') }}</a></li>
|
||||
<li><a href="{{ route('our-solutions.index') }}">{{ __('Our solutions') }}</a></li>
|
||||
<li><a href="{{ route('career.index') }}">{{ __('Career Opportunities') }}</a></li>
|
||||
<li><a href="{{ route('success.index') }}">{{ __('Success stories') }}</a></li>
|
||||
<li><a href="{{ route('success.index') }}">{{ __('Success Stories') }}</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
@@ -43,7 +43,7 @@
|
||||
<div class="footer-widget-menu">
|
||||
<ul>
|
||||
<li><a href="{{ route('terms') }}">{{ __('Terms & Conditions') }}</a></li>
|
||||
<li><a href="{{ route('privacy') }}">{{ __('Privacy policy') }}</a></li>
|
||||
<li><a href="{{ route('privacy') }}">{{ __('Privacy Policy') }}</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -8,8 +8,16 @@
|
||||
<div class="switch__tab-area-item">
|
||||
<h5>{{ __('Mode') }}</h5>
|
||||
<div class="switch__tab-area-item-button type-dark-mode">
|
||||
<button class="active" data-mode="light">{{ __('light') }}</button>
|
||||
<button data-mode="dark-mode">{{ __('dark') }}</button>
|
||||
<button class="active" data-mode="light">{{ __('Light') }}</button>
|
||||
<button data-mode="dark-mode">{{ __('Dark') }}</button>
|
||||
</div>
|
||||
</div>
|
||||
<div class="switch__tab-area-item">
|
||||
<h5>{{ __('Language') }}</h5>
|
||||
<div class="switch__tab-area-item-button type-language" id="language-switcher">
|
||||
<button class="{{ app()->getLocale() == 'en' ? 'active' : '' }}" data-lang="en">EN</button>
|
||||
<button class="{{ app()->getLocale() == 'ru' ? 'active' : '' }}" data-lang="ru">RU</button>
|
||||
<button class="{{ app()->getLocale() == 'tk' ? 'active' : '' }}" data-lang="tk">TK</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -295,10 +295,10 @@ body {
|
||||
<div class="row">
|
||||
<div class="col-xl-12">
|
||||
<div class="breadcrumb__area-content">
|
||||
<h2>About Us</h2>
|
||||
<h2>{{ __('About Us') }}</h2>
|
||||
<ul>
|
||||
<li><a href="/">Home</a><i class="fa-regular fa-angle-right"></i></li>
|
||||
<li>About Us</li>
|
||||
<li><a href="/">{{ __('Home') }}</a><i class="fa-regular fa-angle-right"></i></li>
|
||||
<li>{{ __('About Us') }}</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
@@ -345,7 +345,7 @@ body {
|
||||
<div class="aspect-video relative">
|
||||
<video class="w-full h-full object-cover" controls="" poster="{{ asset('storage/' . $aboutSettings->our_story_video_poster) }}">
|
||||
<source type="video/mp4" src="{{ asset('storage/' . $aboutSettings->our_story_video_source) }}" />
|
||||
Your browser does not support the video tag.
|
||||
{{ __('Your browser does not support the video tag.') }}
|
||||
</video>
|
||||
</div>
|
||||
</div>
|
||||
@@ -396,14 +396,14 @@ body {
|
||||
<div class="org-chart">
|
||||
<div class="flex justify-center mb-16">
|
||||
<div class="org-box org-box-director">
|
||||
<h3 class="font-bold text-lg">Director</h3>
|
||||
<h3 class="font-bold text-lg">{{ __('Director') }}</h3>
|
||||
<p class="text-sm text-gray-500">{{ $aboutSettings->company_structure_director_name }}</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="flex justify-center mb-16 relative">
|
||||
<div class="absolute top-[-60px] w-px h-[60px] bg-gray-300"></div>
|
||||
<div class="org-box org-box-advisor">
|
||||
<h3 class="font-bold text-lg">Technical Advisor</h3>
|
||||
<h3 class="font-bold text-lg">{{ __('Technical Advisor') }}</h3>
|
||||
<p class="text-sm text-gray-500">{{ $aboutSettings->company_structure_advisor_name }}</p>
|
||||
</div>
|
||||
</div>
|
||||
@@ -426,8 +426,8 @@ body {
|
||||
</section>
|
||||
<section class="mb-24">
|
||||
<div class="text-center max-w-3xl mx-auto mb-12">
|
||||
<h2 class="text-3xl md:text-4xl font-bold tracking-tight mb-4 bg-clip-text text-transparent bg-gradient-to-r from-teal-500 to-purple-600">Our Management</h2>
|
||||
<p class="text-lg text-gray-600">Meet the leadership team driving our vision forward</p>
|
||||
<h2 class="text-3xl md:text-4xl font-bold tracking-tight mb-4 bg-clip-text text-transparent bg-gradient-to-r from-teal-500 to-purple-600">{{ __('Our Management') }}</h2>
|
||||
<p class="text-lg text-gray-600">{{ __('Meet the leadership team driving our vision forward') }}</p>
|
||||
</div>
|
||||
<div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-8">
|
||||
@foreach (App\Models\TeamMember::all() as $member)
|
||||
|
||||
@@ -15,10 +15,10 @@
|
||||
<div class="row">
|
||||
<div class="col-xl-12">
|
||||
<div class="breadcrumb__area-content">
|
||||
<h2>Careers</h2>
|
||||
<h2>{{ __('Careers') }}</h2>
|
||||
<ul>
|
||||
<li><a href="/">Home</a><i class="fa-regular fa-angle-right"></i></li>
|
||||
<li>Careers</li>
|
||||
<li><a href="/">{{ __('Home') }}</a><i class="fa-regular fa-angle-right"></i></li>
|
||||
<li>{{ __('Careers') }}</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
@@ -30,14 +30,17 @@
|
||||
<div class="price__area section-padding">
|
||||
<div class="container">
|
||||
<div class="row">
|
||||
<div class="col-xl-12 mb-25 text-center">
|
||||
<h3 class="section-title">{{ __('For general application, send your resume at') }} career@gujurly.com</h3>
|
||||
</div>
|
||||
@forelse ($careers as $career)
|
||||
<div class="col-xl-4 col-md-6 xl-mb-25 wow fadeInUp" data-wow-delay=".4s">
|
||||
@forelse ($careers as $career)
|
||||
<div class="price__area-item">
|
||||
<div class="price__area-item-price">
|
||||
<span>{{ $career->title }}</span>
|
||||
<h3>{{ $career->location }}</h3>
|
||||
<h2>{{ $career->salary_per_month }} {{ $career->salary_currency }}</h2>
|
||||
<span>Per monthly</span>
|
||||
<span>{{ __('Per monthly') }}</span>
|
||||
</div>
|
||||
<div class="price__area-item-list">
|
||||
<ul>
|
||||
@@ -47,13 +50,13 @@
|
||||
</ul>
|
||||
</div>
|
||||
<div class="price__area-item-btn">
|
||||
<button type="button" class="build_button apply-now-button" data-bs-toggle="modal" data-bs-target="#applyInternshipModal" data-job-id="{{ $career->id }}" data-job-type="career" data-career-title="{{ $career->title }}" data-career-location="{{ $career->location }}" data-career-salary="{{ $career->salary_per_month }}" data-career-description="{{ $career->title_description }}">Apply Now<i class="flaticon-right-up"></i></button>
|
||||
<button type="button" class="build_button apply-now-button" data-bs-toggle="modal" data-bs-target="#applyInternshipModal" data-job-id="{{ $career->id }}" data-job-type="career" data-career-title="{{ $career->title }}" data-career-location="{{ $career->location }}" data-career-salary="{{ $career->salary_per_month }}" data-career-description="{{ $career->title_description }}">{{ __('Apply Now') }}<i class="flaticon-right-up"></i></button>
|
||||
</div>
|
||||
</div>
|
||||
@empty
|
||||
<span>No careers found...</span>
|
||||
@endforelse
|
||||
</div>
|
||||
@empty
|
||||
<span>{{ __('No careers found...') }}</span>
|
||||
@endforelse
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -83,8 +86,8 @@
|
||||
|
||||
// Set dynamic values
|
||||
modalTitle.textContent = button.getAttribute('data-' + jobType + '-title');
|
||||
modalLocation.textContent = 'Location: ' + button.getAttribute('data-' + jobType + '-location');
|
||||
modalSalary.textContent = 'Salary: ' + button.getAttribute('data-' + jobType + '-salary') + ' / Per monthly';
|
||||
modalLocation.textContent = '{{ __('Location') }}: ' + button.getAttribute('data-' + jobType + '-location');
|
||||
modalSalary.textContent = '{{ __('Salary') }}: ' + button.getAttribute('data-' + jobType + '-salary') + ' / {{ __('Per monthly') }}';
|
||||
modalDescription.textContent = button.getAttribute('data-' + jobType + '-description');
|
||||
jobIdInput.value = jobId;
|
||||
|
||||
@@ -121,12 +124,12 @@
|
||||
modal.hide();
|
||||
form.reset();
|
||||
} else {
|
||||
alert('Error: ' + data.message);
|
||||
alert('{{ __('Error') }}: ' + data.message);
|
||||
}
|
||||
})
|
||||
.catch(error => {
|
||||
console.error('Error:', error);
|
||||
alert('An error occurred. Please try again.');
|
||||
console.error('{{ __('Error') }}:', error);
|
||||
alert('{{ __('An error occurred. Please try again.') }}');
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
@@ -10,10 +10,10 @@
|
||||
<div class="row">
|
||||
<div class="col-xl-12">
|
||||
<div class="breadcrumb__area-content">
|
||||
<h2>Contact Us</h2>
|
||||
<h2>{{ __('Contact Us') }}</h2>
|
||||
<ul>
|
||||
<li><a href="/">Home</a><i class="fa-regular fa-angle-right"></i></li>
|
||||
<li>Contact Us</li>
|
||||
<li><a href="/">{{ __('Home') }}</a><i class="fa-regular fa-angle-right"></i></li>
|
||||
<li>{{ __('Contact Us') }}</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
@@ -38,7 +38,7 @@
|
||||
<i class="flaticon-phone"></i>
|
||||
</div>
|
||||
<div class="contact__area-left-contact-item-content">
|
||||
<span>Phone:</span>
|
||||
<span>{{ __('Phone') }}:</span>
|
||||
<h6><a href="tel:{{ $contactSettings->phone_number }}">{{ $contactSettings->phone_number }}</a></h6>
|
||||
</div>
|
||||
</div>
|
||||
@@ -47,7 +47,7 @@
|
||||
<i class="flaticon-email-3"></i>
|
||||
</div>
|
||||
<div class="contact__area-left-contact-item-content">
|
||||
<span>Email Address:</span>
|
||||
<span>{{ __('Email Address') }}:</span>
|
||||
<h6><a href="mailto:{{ $contactSettings->email_address }}">{{ $contactSettings->email_address }}</a></h6>
|
||||
</div>
|
||||
</div>
|
||||
@@ -56,7 +56,7 @@
|
||||
<i class="flaticon-location-1"></i>
|
||||
</div>
|
||||
<div class="contact__area-left-contact-item-content">
|
||||
<span>Location:</span>
|
||||
<span>{{ __('Location') }}:</span>
|
||||
<h6><a href="https://google.com/maps" target="_blank">{{ $contactSettings->location_address }}</a></h6>
|
||||
</div>
|
||||
</div>
|
||||
@@ -65,32 +65,32 @@
|
||||
</div>
|
||||
<div class="col-lg-7 wow fadeInRight" data-wow-delay=".4s">
|
||||
<div class="contact__area-form">
|
||||
<h4>Send Message</h4>
|
||||
<h4>{{ __('Send Message') }}</h4>
|
||||
<form action="#">
|
||||
<div class="row">
|
||||
<div class="col-md-6 mb-25">
|
||||
<div class="contact__form-area-item">
|
||||
<input type="text" name="name" placeholder="Full Name" required="required">
|
||||
<input type="text" name="name" placeholder="{{ __('Full Name') }}" required="required">
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-6 md-mb-25">
|
||||
<div class="contact__form-area-item">
|
||||
<input type="email" name="email" placeholder="Email Address" required="required">
|
||||
<input type="email" name="email" placeholder="{{ __('Email Address') }}" required="required">
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-12 mb-25">
|
||||
<div class="contact__form-area-item">
|
||||
<input type="text" name="subject" placeholder="Subject">
|
||||
<input type="text" name="subject" placeholder="{{ __('Subject') }}">
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-12 mb-25">
|
||||
<div class="contact__form-area-item">
|
||||
<textarea name="message" placeholder="Message"></textarea>
|
||||
<textarea name="message" placeholder="{{ __('Message') }}"></textarea>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-12">
|
||||
<div class="contact__form-area-item">
|
||||
<button class="build_button" type="submit">Submit Message <i class="flaticon-right-up"></i></button>
|
||||
<button class="build_button" type="submit">{{ __('Submit Message') }} <i class="flaticon-right-up"></i></button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -146,14 +146,14 @@
|
||||
</div>
|
||||
<div class="row mt-70 wow fadeInUp" data-wow-delay=".5s">
|
||||
<div class="col-xl-12">
|
||||
<div class="swiper services_four_slide data_cursor" data-cursor-text="Drag">
|
||||
<div class="swiper services_four_slide data_cursor" data-cursor-text="{{ __('Drag') }}">
|
||||
<div class="swiper-wrapper">
|
||||
@foreach($solutionSettings->solution_items as $item)
|
||||
<div class="swiper-slide">
|
||||
<div class="services__one-item">
|
||||
<i class="{{ $item['icon_class'] }}"></i>
|
||||
<h4><a href="{{ $item['link'] }}">{{ $item['title'] }}</a></h4>
|
||||
<a class="more_btn" href="{{ $item['link'] }}">Read More<i class="flaticon-right-up"></i></a>
|
||||
<a class="more_btn" href="{{ $item['link'] }}">{{ __('Read More') }}<i class="flaticon-right-up"></i></a>
|
||||
</div>
|
||||
</div>
|
||||
@endforeach
|
||||
@@ -315,8 +315,8 @@
|
||||
<div class="row mb-30">
|
||||
<div class="col-xl-12">
|
||||
<div class="blog__four-title t-center">
|
||||
<span class="subtitle wow fadeInLeft" data-wow-delay=".4s">News & Blog</span>
|
||||
<h2 class="title_split_anim">News</h2>
|
||||
<span class="subtitle wow fadeInLeft" data-wow-delay=".4s">{{ __('News & Blog') }}</span>
|
||||
<h2 class="title_split_anim">{{ __('News') }}</h2>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -334,8 +334,8 @@
|
||||
<div class="blog__four-item-content">
|
||||
<div class="meta">
|
||||
<ul>
|
||||
<li><a href="#"><i class="far fa-user"></i>{{ $news->author->name ?? 'Admin' }}</a></li>
|
||||
<li><a href="#"><i class="far fa-comment-dots"></i>Comments ({{ $news->comments->count() }})</a></li>
|
||||
<li><a href="#"><i class="far fa-user"></i>{{ $news->author->name ?? __('Admin') }}</a></li>
|
||||
<li><a href="#"><i class="far fa-comment-dots"></i>{{ __('Comments') }} ({{ $news->comments->count() }})</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
<h4><a href="{{ route('news.show', $news->slug) }}">{{ $news->title }}</a></h4>
|
||||
|
||||
@@ -15,10 +15,10 @@
|
||||
<div class="row">
|
||||
<div class="col-xl-12">
|
||||
<div class="breadcrumb__area-content">
|
||||
<h2>Internships</h2>
|
||||
<h2>{{ __('Internships') }}</h2>
|
||||
<ul>
|
||||
<li><a href="/">Home</a><i class="fa-regular fa-angle-right"></i></li>
|
||||
<li>Internships</li>
|
||||
<li><a href="/">{{ __('Home') }}</a><i class="fa-regular fa-angle-right"></i></li>
|
||||
<li>{{ __('Internships') }}</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
@@ -30,14 +30,17 @@
|
||||
<div class="price__area section-padding">
|
||||
<div class="container">
|
||||
<div class="row">
|
||||
<div class="col-xl-12 mb-25 text-center">
|
||||
<h3 class="section-title">{{ __('For general application, send your resume at') }} career@gujurly.com</h3>
|
||||
</div>
|
||||
@forelse ($internships as $internship)
|
||||
<div class="col-xl-4 col-md-6 xl-mb-25 wow fadeInUp" data-wow-delay=".4s">
|
||||
@forelse ($internships as $internship)
|
||||
<div class="price__area-item">
|
||||
<div class="price__area-item-price">
|
||||
<span>{{ $internship->title }}</span>
|
||||
<h3>{{ $internship->location }}</h3>
|
||||
<h2>{{ $internship->salary_per_month }} {{ $internship->salary_currency }}</h2>
|
||||
<span>Per monthly</span>
|
||||
<span>{{ __('Per monthly') }}</span>
|
||||
</div>
|
||||
<div class="price__area-item-list">
|
||||
<ul>
|
||||
@@ -47,13 +50,13 @@
|
||||
</ul>
|
||||
</div>
|
||||
<div class="price__area-item-btn">
|
||||
<button type="button" class="build_button apply-now-button" data-bs-toggle="modal" data-bs-target="#applyInternshipModal" data-job-id="{{ $internship->id }}" data-job-type="internship" data-internship-title="{{ $internship->title }}" data-internship-location="{{ $internship->location }}" data-internship-salary="{{ $internship->salary_per_month }}" data-internship-description="{{ $internship->title_description }}">Apply Now<i class="flaticon-right-up"></i></button>
|
||||
<button type="button" class="build_button apply-now-button" data-bs-toggle="modal" data-bs-target="#applyInternshipModal" data-job-id="{{ $internship->id }}" data-job-type="internship" data-internship-title="{{ $internship->title }}" data-internship-location="{{ $internship->location }}" data-internship-salary="{{ $internship->salary_per_month }}" data-internship-description="{{ $internship->title_description }}">{{ __('Apply Now') }}<i class="flaticon-right-up"></i></button>
|
||||
</div>
|
||||
</div>
|
||||
@empty
|
||||
<span>No internships found...</span>
|
||||
@endforelse
|
||||
</div>
|
||||
@empty
|
||||
<span>{{ __('No internships found...') }}</span>
|
||||
@endforelse
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -83,8 +86,8 @@
|
||||
|
||||
// Set dynamic values
|
||||
modalTitle.textContent = button.getAttribute('data-' + jobType + '-title');
|
||||
modalLocation.textContent = 'Location: ' + button.getAttribute('data-' + jobType + '-location');
|
||||
modalSalary.textContent = 'Salary: ' + button.getAttribute('data-' + jobType + '-salary') + ' / Per monthly';
|
||||
modalLocation.textContent = '{{ __('Location') }}: ' + button.getAttribute('data-' + jobType + '-location');
|
||||
modalSalary.textContent = '{{ __('Salary') }}: ' + button.getAttribute('data-' + jobType + '-salary') + ' / {{ __('Per monthly') }}';
|
||||
modalDescription.textContent = button.getAttribute('data-' + jobType + '-description');
|
||||
jobIdInput.value = jobId;
|
||||
|
||||
@@ -121,12 +124,12 @@
|
||||
modal.hide();
|
||||
form.reset();
|
||||
} else {
|
||||
alert('Error: ' + data.message);
|
||||
alert('{{ __('Error') }}: ' + data.message);
|
||||
}
|
||||
})
|
||||
.catch(error => {
|
||||
console.error('Error:', error);
|
||||
alert('An error occurred. Please try again.');
|
||||
console.error('{{ __('Error') }}:', error);
|
||||
alert('{{ __('An error occurred. Please try again.') }}');
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
@@ -7,10 +7,10 @@
|
||||
<div class="row">
|
||||
<div class="col-xl-12">
|
||||
<div class="breadcrumb__area-content">
|
||||
<h2>News</h2>
|
||||
<h2>{{ __('News') }}</h2>
|
||||
<ul>
|
||||
<li><a href="/">Home</a><i class="fa-regular fa-angle-right"></i></li>
|
||||
<li>News</li>
|
||||
<li><a href="/">{{ __('Home') }}</a><i class="fa-regular fa-angle-right"></i></li>
|
||||
<li>{{ __('News') }}</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
@@ -24,7 +24,7 @@
|
||||
<div class="row">
|
||||
<div class="col-xl-12">
|
||||
<div class="section-title text-center pb-50">
|
||||
<h2 class="pb-3">Read Our News</h2>
|
||||
<h2 class="pb-3">{{ __('Read Our News') }}</h2>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -40,13 +40,13 @@
|
||||
</div>
|
||||
<div class="blog__one-item-content">
|
||||
<h4><a href="{{ route('news.show', $news->slug) }}">{{ $news->title }}</a></h4>
|
||||
<a class="more_btn" href="{{ route('news.show', $news->slug) }}">Read More<i class="flaticon-right-up"></i></a>
|
||||
<a class="more_btn" href="{{ route('news.show', $news->slug) }}">{{ __('Read More') }}<i class="flaticon-right-up"></i></a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@empty
|
||||
<div class="col-12">
|
||||
<div class="alert alert-info">No news found...</div>
|
||||
<div class="alert alert-info">{{ __('No news found...') }}</div>
|
||||
</div>
|
||||
@endforelse
|
||||
</div>
|
||||
|
||||
@@ -9,8 +9,8 @@
|
||||
<div class="breadcrumb__area-content">
|
||||
<h2>{{ $news->title }}</h2>
|
||||
<ul>
|
||||
<li><a href="{{ route('home') }}">Home</a><i class="fa-regular fa-angle-right"></i></li>
|
||||
<li><a href="{{ route('news.index') }}">News</a><i class="fa-regular fa-angle-right"></i></li>
|
||||
<li><a href="{{ route('home') }}">{{ __('Home') }}</a><i class="fa-regular fa-angle-right"></i></li>
|
||||
<li><a href="{{ route('news.index') }}">{{ __('News') }}</a><i class="fa-regular fa-angle-right"></i></li>
|
||||
<li>{{ $news->title }}</li>
|
||||
</ul>
|
||||
</div>
|
||||
@@ -39,7 +39,7 @@
|
||||
</div>
|
||||
</div>
|
||||
<div class="blog__details-area-comment mt-40">
|
||||
<h3 class="mb-30">Comments ({{ $news->comments->count() }})</h3>
|
||||
<h3 class="mb-30">{{ __('Comments') }} ({{ $news->comments->count() }})</h3>
|
||||
@forelse ($news->comments as $comment)
|
||||
<div class="blog__details-area-comment-item">
|
||||
<div class="blog__details-area-comment-item-comment">
|
||||
@@ -54,35 +54,35 @@
|
||||
</div>
|
||||
</div>
|
||||
@empty
|
||||
<p>No comments yet</p>
|
||||
<p>{{ __('No comments yet') }}</p>
|
||||
@endforelse
|
||||
</div>
|
||||
<div class="blog__details-area-contact mt-60">
|
||||
<h3>Post Comment</h3>
|
||||
<p>Required fields are marked</p>
|
||||
<h3>{{ __('Post Comment') }}</h3>
|
||||
<p>{{ __('Required fields are marked') }}</p>
|
||||
<div class="blog__details-area-contact-form">
|
||||
<form action="{{ route('comments.store', $news->slug) }}" method="POST">
|
||||
@csrf
|
||||
<div class="row">
|
||||
<div class="col-sm-6 mt-25">
|
||||
<div class="blog__details-area-contact-form-item contact-item">
|
||||
<input type="text" name="author_name" placeholder="Full Name" required="required">
|
||||
<input type="text" name="author_name" placeholder="{{ __('Full Name') }}" required="required">
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-sm-6 mt-25">
|
||||
<div class="blog__details-area-contact-form-item contact-item">
|
||||
<input type="text" name="title" placeholder="Title" required="required">
|
||||
<input type="text" name="title" placeholder="{{ __('Title') }}" required="required">
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-sm-12 mt-25">
|
||||
<div class="blog__details-area-contact-form-item contact-item">
|
||||
<textarea name="message" placeholder="Type your comments...."></textarea>
|
||||
<textarea name="message" placeholder="{{ __('Type your comments....') }}"></textarea>
|
||||
<input type="hidden" name="news_id" value="{{ $news->id }}">
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-lg-12 mt-25">
|
||||
<div class="blog__details-area-contact-form-item">
|
||||
<button class="build_button" type="submit">Submit Comment<i class="flaticon-right-up"></i></button>
|
||||
<button class="build_button" type="submit">{{ __('Submit Comment') }}<i class="flaticon-right-up"></i></button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -95,7 +95,7 @@
|
||||
<div class="all__sidebar">
|
||||
|
||||
<div class="all__sidebar-item">
|
||||
<h4>Recent Blog</h4>
|
||||
<h4>{{ __('Recent Blog') }}</h4>
|
||||
<div class="all__sidebar-item-post dark_image">
|
||||
@foreach($recentNews as $news)
|
||||
<div class="post__item">
|
||||
|
||||
@@ -2,14 +2,14 @@
|
||||
|
||||
@section('content')
|
||||
<!-- Breadcrumb Area Start -->
|
||||
<div class="breadcrumb__area" style="background-image: url('assets/img/page/breadcrumb.jpg');">
|
||||
<div class="breadcrumb__area" style="background-image: url('/web/assets/img/page/breadcrumb.jpg');">
|
||||
<div class="container">
|
||||
<div class="row">
|
||||
<div class="col-xl-12">
|
||||
<div class="breadcrumb__area-content">
|
||||
<h2>Services Details</h2>
|
||||
<ul>
|
||||
<li><a href="index.html">Home</a><i class="fa-regular fa-angle-right"></i></li>
|
||||
<li><a href="/">Home</a><i class="fa-regular fa-angle-right"></i></li>
|
||||
<li>Services Details</li>
|
||||
</ul>
|
||||
</div>
|
||||
@@ -23,77 +23,54 @@
|
||||
<div class="container">
|
||||
<div class="row">
|
||||
<div class="col-lg-4">
|
||||
<div class="all__sidebar">
|
||||
<div class="all__sidebar">
|
||||
<div class="all__sidebar-item">
|
||||
<h4>Our Solutions</h4>
|
||||
<div class="all__sidebar-item-category">
|
||||
<h4>Downloads</h4>
|
||||
<div class="all__sidebar-item-download">
|
||||
<ul>
|
||||
<li><a href="services-details.html">Building Architecture<i class="flaticon-right-up"></i></a></li>
|
||||
<li><a href="services-details.html">Interior Design<i class="flaticon-right-up"></i></a></li>
|
||||
<li><a href="services-details.html">House Renovation<i class="flaticon-right-up"></i></a></li>
|
||||
<li><a href="services-details.html">Flooring Installation<i class="flaticon-right-up"></i></a></li>
|
||||
<li><a href="services-details.html">Foundation Repair<i class="flaticon-right-up"></i></a></li>
|
||||
@if ($solution->downloads && count($solution->downloads) > 0)
|
||||
@foreach ($solution->downloads as $download)
|
||||
@if (isset($download['title']) && isset($download['file']))
|
||||
<li><a href="{{ Storage::url($download['file']) }}">{{ $download['title'] }}<span class="fal fa-arrow-to-bottom"></span></a></li>
|
||||
@endif
|
||||
@endforeach
|
||||
@else
|
||||
<li>No downloads available...</li>
|
||||
@endif
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
<div class="all__sidebar-item-help mb-25" style="background-image: url('assets/img/page/cta-1.jpg');">
|
||||
<h3>Ready for Your Next Construction?</h3>
|
||||
<a class="build_button mt-20" href="contact.html">Get an Advice<i class="flaticon-right-up"></i></a>
|
||||
</div>
|
||||
<div class="all__sidebar-item">
|
||||
<h4>Download</h4>
|
||||
<div class="all__sidebar-item-download">
|
||||
<ul>
|
||||
<li><a href="#">Company Details<span class="fal fa-arrow-to-bottom"></span></a></li>
|
||||
<li><a href="#">Our Brochures<span class="fal fa-arrow-to-bottom"></span></a></li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-lg-8">
|
||||
<div class="services__details-area">
|
||||
<img src="assets/img/service/services-1.jpg" alt="image">
|
||||
<h3 class="mt-25 mb-20">Construction Planning</h3>
|
||||
<p class="mb-20">We pride ourselves on delivering high-quality construction services tailored to meet the unique needs of our clients. With years of experience in the industry, our team of skilled professionals is dedicated to bringing your vision to life. Whether you are looking to build a new structure, renovate an existing space, or need specialized construction services, we are here to help.</p>
|
||||
<p class="mb-25">With years of industry experience, our team handles every aspect of the construction process, your project runs smoothly and efficiently. We prioritize open communication, timely delivery, and quality workmanship to exceed your expectations. Trust us to provide innovative solutions that.</p>
|
||||
<h4 class="mb-20">Building with Unmatched Excellence</h4>
|
||||
<p>Transform your existing space with our renovation and remodeling services. Whether you want to update your kitchen, bathroom, or entire home, we bring innovative solutions to enhance your living space. Our team has extensive experience in commercial construction, including office buildings, retail spaces, and industrial facilities. We work closely with you to ensure your project align.</p>
|
||||
<div class="row mt-40 mb-40">
|
||||
<div class="col-sm-6 sm-mb-25">
|
||||
<img class="img_full" src="assets/img/portfolio/portfolio-5.jpg" alt="image">
|
||||
</div>
|
||||
<div class="col-sm-6">
|
||||
<img class="img_full" src="assets/img/portfolio/portfolio-8.jpg" alt="image">
|
||||
</div>
|
||||
</div>
|
||||
<p>We deliver exceptional construction services backed by years of experience. Our skilled team prioritizes quality, transparency, and client satisfaction. We utilize innovative techniques and sustainable practices, ensuring timely project completion. Trust us to bring your to life with unmatched craftsmanship</p>
|
||||
<ul class="services__details-area-list">
|
||||
<li><i class="flaticon-check-mark"></i>Our skilled professionals bring years of experience a</span></li>
|
||||
<li><i class="flaticon-check-mark"></i>We are the leading construction company in the industry.</span></li>
|
||||
<li><i class="flaticon-check-mark"></i>Our transparent pricing ensures no hidden fees or surprises.</span></li>
|
||||
<li><i class="flaticon-check-mark"></i>We adhere to strict safety standards on all job sites.</span></li>
|
||||
</ul>
|
||||
<h3>Commonly Asked Questions</h3>
|
||||
<h3 class="mt-25 mb-20">{{ $solution->title }}</h3>
|
||||
<p class="mb-20">{{ $solution->title_description }}</p>
|
||||
{!! $solution->description !!}
|
||||
@if (count($solution->bullets) > 0)
|
||||
<h4 class="mb-20 mt-40">Key Aspects of Our Solutions</h4>
|
||||
<ul class="services__details-area-list">
|
||||
@foreach ($solution->bullets as $bullet)
|
||||
@if (isset($bullet['bullet']))
|
||||
<li><i class="flaticon-check-mark"></i>{{ $bullet['bullet'] }}</li>
|
||||
@endif
|
||||
@endforeach
|
||||
</ul>
|
||||
@endif
|
||||
<h3>Frequently Asked Questions</h3>
|
||||
<div class="mt-30" id="accordionExample">
|
||||
<div class="faq-item">
|
||||
<h5 class="icon" data-bs-toggle="collapse" data-bs-target="#collapseOne">1. What services do you offer?</h5>
|
||||
<div id="collapseOne" class="faq-item-body collapse show" data-bs-parent="#accordionExample">
|
||||
<p>We offer a range of services including construction management, design-build solutions, renovations, and specialty contracting for both residential and commercial projects</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="faq-item">
|
||||
<h5 class="icon collapsed" data-bs-toggle="collapse" data-bs-target="#collapseTwo">2. Do you provide free estimates?</h5>
|
||||
<div id="collapseTwo" class="faq-item-body collapse" data-bs-parent="#accordionExample">
|
||||
<p>Yes, we offer free estimates for all potential projects. We assess your requirements and provide a detailed quote without any obligation</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="faq-item">
|
||||
<h5 class="icon collapsed" data-bs-toggle="collapse" data-bs-target="#collapseThree">3. Are you licensed and insured?</h5>
|
||||
<div id="collapseThree" class="faq-item-body collapse" data-bs-parent="#accordionExample">
|
||||
<p>Yes, we are fully licensed and insured to operate in our service areas. This ensures that your project is protected and complies with all local regulations</p>
|
||||
</div>
|
||||
</div>
|
||||
@if ($solution->faqs && count($solution->faqs) > 0)
|
||||
@foreach ($solution->faqs as $key => $faq)
|
||||
<div class="faq-item">
|
||||
<h5 class="icon {{ $key === 0 ? '' : 'collapsed' }}" data-bs-toggle="collapse" data-bs-target="#collapse{{ $key + 1 }}">{{ $key + 1 }}. {{ $faq['question'] }}</h5>
|
||||
<div id="collapse{{ $key + 1 }}" class="faq-item-body collapse {{ $key === 0 ? 'show' : '' }}" data-bs-parent="#accordionExample">
|
||||
<p>{!! $faq['answer'] !!}</p>
|
||||
</div>
|
||||
</div>
|
||||
@endforeach
|
||||
@else
|
||||
<p>No FAQs available.</p>
|
||||
@endif
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -7,10 +7,10 @@
|
||||
<div class="row">
|
||||
<div class="col-xl-12">
|
||||
<div class="breadcrumb__area-content">
|
||||
<h2>Success Stories</h2>
|
||||
<h2>{{ __('Success Stories') }}</h2>
|
||||
<ul>
|
||||
<li><a href="/">Home</a><i class="fa-regular fa-angle-right"></i></li>
|
||||
<li>Success Stories</li>
|
||||
<li><a href="/">{{ __('Home') }}</a><i class="fa-regular fa-angle-right"></i></li>
|
||||
<li>{{ __('Success Stories') }}</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
@@ -24,8 +24,8 @@
|
||||
<div class="row">
|
||||
<div class="col-xl-12">
|
||||
<div class="section-title text-center pb-50">
|
||||
<h2 class="pb-3">Our Success Stories</h2>
|
||||
<p>Discover inspiring narratives of triumph, growth, and achievement through our curated collection of success stories. Each story is a testament to dedication and hard work.</p>
|
||||
<h2 class="pb-3">{{ __('Our Success Stories') }}</h2>
|
||||
<p>{{ __('Discover inspiring narratives of triumph, growth, and achievement through our curated collection of success stories. Each story is a testament to dedication and hard work.') }}</p>
|
||||
</div>
|
||||
</div>
|
||||
@forelse ($allSuccesses as $success)
|
||||
@@ -39,13 +39,13 @@
|
||||
</div>
|
||||
<div class="blog__one-item-content">
|
||||
<h4><a href="{{ route('success.show', $success->slug) }}">{{ $success->title }}</a></h4>
|
||||
<a class="more_btn" href="{{ route('success.show', $success->slug) }}">Read More<i class="flaticon-right-up"></i></a>
|
||||
<a class="more_btn" href="{{ route('success.show', $success->slug) }}">{{ __('Read More') }}<i class="flaticon-right-up"></i></a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@empty
|
||||
<div class="col-12">
|
||||
<div class="alert alert-info">No success stories found...</div>
|
||||
<div class="alert alert-info">{{ __('No success stories found...') }}</div>
|
||||
</div>
|
||||
@endforelse
|
||||
</div>
|
||||
|
||||
@@ -9,8 +9,8 @@
|
||||
<div class="breadcrumb__area-content">
|
||||
<h2>{{ $success->title }}</h2>
|
||||
<ul>
|
||||
<li><a href="{{ route('home') }}">Home</a><i class="fa-regular fa-angle-right"></i></li>
|
||||
<li><a href="{{ route('success.index') }}">Success Stories</a><i class="fa-regular fa-angle-right"></i></li>
|
||||
<li><a href="{{ route('home') }}">{{ __('Home') }}</a><i class="fa-regular fa-angle-right"></i></li>
|
||||
<li><a href="{{ route('success.index') }}">{{ __('Success Stories') }}</a><i class="fa-regular fa-angle-right"></i></li>
|
||||
<li>{{ $success->title }}</li>
|
||||
</ul>
|
||||
</div>
|
||||
@@ -34,7 +34,7 @@
|
||||
<div class="all__sidebar">
|
||||
|
||||
<div class="all__sidebar-item">
|
||||
<h4>Recent Success Stories</h4>
|
||||
<h4>{{ __('Recent Success Stories') }}</h4>
|
||||
<div class="all__sidebar-item-post dark_image">
|
||||
@foreach($recentSuccesses as $success)
|
||||
<div class="post__item">
|
||||
|
||||
File diff suppressed because one or more lines are too long
@@ -11,6 +11,7 @@ use App\Http\Controllers\NewsPageController;
|
||||
use App\Http\Controllers\OurSolutionPageController;
|
||||
use App\Http\Controllers\Web\SuccessPageController;
|
||||
use Illuminate\Support\Facades\Route;
|
||||
use Illuminate\Support\Facades\Session;
|
||||
|
||||
// Homepage...
|
||||
Route::get('/', [HomePageController::class, 'index'])->name('home');
|
||||
@@ -48,3 +49,10 @@ Route::post('contact', [ContactPageController::class, 'store'])->name('contact.s
|
||||
// Legal pages...
|
||||
Route::get('terms-and-conditions', [LegalPageController::class, 'terms'])->name('terms');
|
||||
Route::get('privacy-and-policy', [LegalPageController::class, 'privacy'])->name('privacy');
|
||||
|
||||
// Language Switcher
|
||||
Route::get('locale/{locale}', function ($locale) {
|
||||
Session::put('locale', $locale);
|
||||
|
||||
return redirect()->back();
|
||||
})->name('locale.switch');
|
||||
|
||||
Reference in New Issue
Block a user