Compare commits

...

4 Commits

13 changed files with 373 additions and 9 deletions

View File

@@ -146,7 +146,6 @@ class HomePageSettings extends SettingsPage
FileUpload::make('bg_video')
->label('Background Video')
->acceptedFileTypes(['video/mp4', 'video/webm', 'video/ogg'])
->maxSize(51200) // 50MB
->disk('public')
->directory('homepage-videos')
->required(),

View File

@@ -0,0 +1,110 @@
<?php
namespace App\Filament\Resources;
use App\Filament\Resources\ApplicationResource\Pages;
use App\Filament\Resources\ApplicationResource\RelationManagers;
use App\Models\Application;
use App\Models\Career;
use Filament\Forms;
use Filament\Forms\Form;
use Filament\Resources\Resource;
use Filament\Tables;
use Filament\Tables\Table;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\SoftDeletingScope;
class ApplicationResource extends Resource
{
protected static ?string $model = Application::class;
protected static ?string $navigationGroup = 'Careers';
protected static ?string $navigationIcon = 'heroicon-o-document-text';
public static function form(Form $form): Form
{
return $form
->schema([
Forms\Components\Select::make('career_id')
->label('Career')
->options(Career::all()->pluck('title', 'id'))
->searchable()
->required(),
Forms\Components\TextInput::make('name')
->required()
->maxLength(255),
Forms\Components\DatePicker::make('birthdate')
->required(),
Forms\Components\TextInput::make('email')
->email()
->required()
->maxLength(255),
Forms\Components\TextInput::make('phone_number')
->maxLength(255),
Forms\Components\FileUpload::make('resume_file')
->required()
->disk('public')
->directory('resumes')
->enableDownload()
->enableOpen(),
Forms\Components\RichEditor::make('cover_letter')
->columnSpan('full'),
]);
}
public static function table(Table $table): Table
{
return $table
->columns([
Tables\Columns\TextColumn::make('career.title')
->searchable()
->sortable(),
Tables\Columns\TextColumn::make('name')
->searchable(),
Tables\Columns\TextColumn::make('email')
->searchable(),
Tables\Columns\TextColumn::make('phone_number')
->searchable(),
Tables\Columns\TextColumn::make('birthdate')
->date()
->sortable(),
Tables\Columns\TextColumn::make('created_at')
->dateTime()
->sortable()
->toggleable(isToggledHiddenByDefault: true),
Tables\Columns\TextColumn::make('updated_at')
->dateTime()
->sortable()
->toggleable(isToggledHiddenByDefault: true),
])
->filters([
//
])
->actions([
Tables\Actions\EditAction::make(),
Tables\Actions\DeleteAction::make(),
])
->bulkActions([
Tables\Actions\BulkActionGroup::make([
Tables\Actions\DeleteBulkAction::make(),
]),
]);
}
public static function getRelations(): array
{
return [
//
];
}
public static function getPages(): array
{
return [
'index' => Pages\ListApplications::route('/'),
'create' => Pages\CreateApplication::route('/create'),
'edit' => Pages\EditApplication::route('/{record}/edit'),
];
}
}

View File

@@ -0,0 +1,12 @@
<?php
namespace App\Filament\Resources\ApplicationResource\Pages;
use App\Filament\Resources\ApplicationResource;
use Filament\Actions;
use Filament\Resources\Pages\CreateRecord;
class CreateApplication extends CreateRecord
{
protected static string $resource = ApplicationResource::class;
}

View File

@@ -0,0 +1,19 @@
<?php
namespace App\Filament\Resources\ApplicationResource\Pages;
use App\Filament\Resources\ApplicationResource;
use Filament\Actions;
use Filament\Resources\Pages\EditRecord;
class EditApplication extends EditRecord
{
protected static string $resource = ApplicationResource::class;
protected function getHeaderActions(): array
{
return [
Actions\DeleteAction::make(),
];
}
}

View File

@@ -0,0 +1,19 @@
<?php
namespace App\Filament\Resources\ApplicationResource\Pages;
use App\Filament\Resources\ApplicationResource;
use Filament\Actions;
use Filament\Resources\Pages\ListRecords;
class ListApplications extends ListRecords
{
protected static string $resource = ApplicationResource::class;
protected function getHeaderActions(): array
{
return [
Actions\CreateAction::make(),
];
}
}

View File

@@ -47,6 +47,10 @@ class CareerResource extends Resource
->numeric()
->label('Salary per month')
->maxLength(255),
Forms\Components\Select::make('salary_currency')
->options(getCurrencies())
->required()
->label('Salary currency'),
Repeater::make('bullets')
->schema([
TextInput::make('bullet')
@@ -71,6 +75,9 @@ class CareerResource extends Resource
Tables\Columns\TextColumn::make('salary_per_month')
->searchable()
->toggleable(isToggledHiddenByDefault: true),
Tables\Columns\TextColumn::make('salary_currency')
->searchable()
->toggleable(isToggledHiddenByDefault: true),
Tables\Columns\TextColumn::make('location')
->searchable(),
Tables\Columns\TextColumn::make('salary')

View File

@@ -16,3 +16,165 @@ function logDB(): void
Log::info($query->sql, $query->bindings, $query->time);
});
}
function getCurrencies(): array
{
return [
"AED" => "UAE dirham",
"AFN" => "Afghan afghani",
"ALL" => "Albanian lek",
"AMD" => "Armenian dram",
"ANG" => "Netherlands Antillean gulden",
"AOA" => "Angolan kwanza",
"ARS" => "Argentine peso",
"AUD" => "Australian dollar",
"AWG" => "Aruban florin",
"AZN" => "Azerbaijani manat",
"BAM" => "Bosnia and Herzegovina konvertibilna marka",
"BBD" => "Barbadian dollar",
"BDT" => "Bangladeshi taka",
"BGN" => "Bulgarian lev",
"BHD" => "Bahraini dinar",
"BIF" => "Burundi franc",
"BMD" => "Bermudian dollar",
"BND" => "Brunei dollar",
"BOB" => "Bolivian boliviano",
"BRL" => "Brazilian real",
"BSD" => "Bahamian dollar",
"BTN" => "Bhutanese ngultrum",
"BWP" => "Botswana pula",
"BYR" => "Belarusian ruble",
"BZD" => "Belize dollar",
"CAD" => "Canadian dollar",
"CDF" => "Congolese franc",
"CHF" => "Swiss franc",
"CLP" => "Chilean peso",
"CNY" => "Chinese/Yuan renminbi",
"COP" => "Colombian peso",
"CRC" => "Costa Rican colon",
"CUC" => "Cuban peso",
"CVE" => "Cape Verdean escudo",
"CZK" => "Czech koruna",
"DJF" => "Djiboutian franc",
"DKK" => "Danish krone",
"DOP" => "Dominican peso",
"DZD" => "Algerian dinar",
"EEK" => "Estonian kroon",
"EGP" => "Egyptian pound",
"ERN" => "Eritrean nakfa",
"ETB" => "Ethiopian birr",
"EUR" => "European Euro",
"FJD" => "Fijian dollar",
"FKP" => "Falkland Islands pound",
"GBP" => "British pound",
"GEL" => "Georgian lari",
"GHS" => "Ghanaian cedi",
"GIP" => "Gibraltar pound",
"GMD" => "Gambian dalasi",
"GNF" => "Guinean franc",
"GQE" => "Central African CFA franc",
"GTQ" => "Guatemalan quetzal",
"GYD" => "Guyanese dollar",
"HKD" => "Hong Kong dollar",
"HNL" => "Honduran lempira",
"HRK" => "Croatian kuna",
"HTG" => "Haitian gourde",
"HUF" => "Hungarian forint",
"IDR" => "Indonesian rupiah",
"ILS" => "Israeli new sheqel",
"INR" => "Indian rupee",
"IQD" => "Iraqi dinar",
"IRR" => "Iranian rial",
"ISK" => "Icelandic króna",
"JMD" => "Jamaican dollar",
"JOD" => "Jordanian dinar",
"JPY" => "Japanese yen",
"KES" => "Kenyan shilling",
"KGS" => "Kyrgyzstani som",
"KHR" => "Cambodian riel",
"KMF" => "Comorian franc",
"KPW" => "North Korean won",
"KRW" => "South Korean won",
"KWD" => "Kuwaiti dinar",
"KYD" => "Cayman Islands dollar",
"KZT" => "Kazakhstani tenge",
"LAK" => "Lao kip",
"LBP" => "Lebanese lira",
"LKR" => "Sri Lankan rupee",
"LRD" => "Liberian dollar",
"LSL" => "Lesotho loti",
"LTL" => "Lithuanian litas",
"LVL" => "Latvian lats",
"LYD" => "Libyan dinar",
"MAD" => "Moroccan dirham",
"MDL" => "Moldovan leu",
"MGA" => "Malagasy ariary",
"MKD" => "Macedonian denar",
"MMK" => "Myanma kyat",
"MNT" => "Mongolian tugrik",
"MOP" => "Macanese pataca",
"MRO" => "Mauritanian ouguiya",
"MUR" => "Mauritian rupee",
"MVR" => "Maldivian rufiyaa",
"MWK" => "Malawian kwacha",
"MXN" => "Mexican peso",
"MYR" => "Malaysian ringgit",
"MZM" => "Mozambican metical",
"NAD" => "Namibian dollar",
"NGN" => "Nigerian naira",
"NIO" => "Nicaraguan córdoba",
"NOK" => "Norwegian krone",
"NPR" => "Nepalese rupee",
"NZD" => "New Zealand dollar",
"OMR" => "Omani rial",
"PAB" => "Panamanian balboa",
"PEN" => "Peruvian nuevo sol",
"PGK" => "Papua New Guinean kina",
"PHP" => "Philippine peso",
"PKR" => "Pakistani rupee",
"PLN" => "Polish zloty",
"PYG" => "Paraguayan guarani",
"QAR" => "Qatari riyal",
"RON" => "Romanian leu",
"RSD" => "Serbian dinar",
"RUB" => "Russian ruble",
"SAR" => "Saudi riyal",
"SBD" => "Solomon Islands dollar",
"SCR" => "Seychellois rupee",
"SDG" => "Sudanese pound",
"SEK" => "Swedish krona",
"SGD" => "Singapore dollar",
"SHP" => "Saint Helena pound",
"SLL" => "Sierra Leonean leone",
"SOS" => "Somali shilling",
"SRD" => "Surinamese dollar",
"SYP" => "Syrian pound",
"SZL" => "Swazi lilangeni",
"THB" => "Thai baht",
"TJS" => "Tajikistani somoni",
"TMT" => "Turkmen manat",
"TND" => "Tunisian dinar",
"TRY" => "Turkish new lira",
"TTD" => "Trinidad and Tobago dollar",
"TWD" => "New Taiwan dollar",
"TZS" => "Tanzanian shilling",
"UAH" => "Ukrainian hryvnia",
"UGX" => "Ugandan shilling",
"USD" => "United States dollar",
"UYU" => "Uruguayan peso",
"UZS" => "Uzbekistani som",
"VEB" => "Venezuelan bolivar",
"VND" => "Vietnamese dong",
"VUV" => "Vanuatu vatu",
"WST" => "Samoan tala",
"XAF" => "Central African CFA franc",
"XCD" => "East Caribbean dollar",
"XDR" => "Special Drawing Rights",
"XOF" => "West African CFA franc",
"XPF" => "CFP franc",
"YER" => "Yemeni rial",
"ZAR" => "South African rand",
"ZMK" => "Zambian kwacha",
"ZWR" => "Zimbabwean dollar",
];
}

View File

@@ -15,7 +15,7 @@ class ApplicationController extends Controller
'birthdate' => 'required|date',
'resume_file' => 'required|file|mimes:pdf,doc,docx|max:2048',
'email' => 'required|email|max:255',
'phone_number' => 'required|string|max:20',
'phone_number' => 'required|string',
'cover_letter' => 'nullable|string',
]);
@@ -31,6 +31,8 @@ class ApplicationController extends Controller
'cover_letter' => $validatedData['cover_letter'] ?? null,
]);
return back()->with('success', 'Your application has been submitted successfully!');
return response()->json([
'message' => 'Your application has been submitted successfully!',
]);
}
}

View File

@@ -14,6 +14,7 @@ class Career extends Model
'salary_per_month',
'bullets',
'location',
'salary_currency',
];
protected $casts = [

View File

@@ -4,6 +4,7 @@ namespace App\Providers\Filament;
use App\Filament\Pages\HomePageSettings;
use App\Filament\Pages\ManageCtaSettings;
use App\Filament\Resources\ApplicationResource;
use Filament\Http\Middleware\Authenticate;
use Filament\Http\Middleware\DisableBladeIconComponents;
use Filament\Http\Middleware\DispatchServingFilamentEvent;
@@ -60,6 +61,7 @@ class PanelPanelProvider extends PanelProvider
])
->resources([
config('filament-logger.activity_resource'),
ApplicationResource::class,
]);
}
}

View File

@@ -0,0 +1,28 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::table('careers', function (Blueprint $table) {
$table->string('salary_currency')->nullable()->after('salary_per_month');
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::table('careers', function (Blueprint $table) {
$table->dropColumn('salary_currency');
});
}
};

View File

@@ -4,3 +4,4 @@
<meta name="keywords" content="{{ $settings->tagline }}">
<meta name="author" content="Webulgam">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="csrf-token" content="{{ csrf_token() }}">

View File

@@ -36,7 +36,8 @@
<div class="price__area-item-price">
<span>{{ $career->title }}</span>
<h3>{{ $career->location }}</h3>
<h2>{{ $career->salary_per_month }}<span>/Per monthly</span></h2>
<h2>{{ $career->salary_per_month }} {{ $career->salary_currency }}</h2>
<span>Per monthly</span>
</div>
<div class="price__area-item-list">
<ul>
@@ -79,22 +80,22 @@
<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</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</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</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)</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">
@@ -146,12 +147,13 @@
method: 'POST',
body: formData,
headers: {
'Accept': 'application/json',
'X-CSRF-TOKEN': document.querySelector('meta[name="csrf-token"]').getAttribute('content')
}
})
.then(response => response.json())
.then(data => {
if (data.success) {
if (data.message) {
alert(data.message);
var modal = bootstrap.Modal.getInstance(applicationModal);
modal.hide();