Initial commit

This commit is contained in:
Rynn28 2026-05-25 00:50:52 +07:00
parent d8e86a08b3
commit c3182c1d9b
109 changed files with 2771 additions and 9286 deletions

View File

@ -0,0 +1,264 @@
# 📋 Login System - JTI Management Portal
## ✅ Status: BERHASIL DIIMPLEMENTASIKAN
### Fitur Utama yang Telah Dibuat:
#### 1. **Login Form** (`resources/views/auth/login.blade.php`)
- ✨ Modern design dengan gradient background
- 🎨 Responsive layout (mobile-friendly)
- 🔐 Password visibility toggle
- ✅ Form validation dengan error messages
- 📱 Smooth animations
- 💾 Remember me functionality
#### 2. **Authentication Controller** (`app/Http/Controllers/AuthController.php`)
- Login logic untuk UserDosen dan UserStaff
- Password hashing dengan Bcrypt (Hash::check)
- Session management
- Logout functionality
- Auto-redirect untuk authenticated users
#### 3. **Models Support**
- **UserDosen**: Implements Authenticatable interface
- **UserStaff**: Implements Authenticatable interface
- Password field ter-hash dengan Bcrypt
#### 4. **Routes Configuration** (`routes/web.php`)
```
GET /login → Show login form
POST /login → Process login
POST /logout → Logout user
GET /welcome → Protected welcome page (requires auth)
```
#### 5. **Database Migrations**
- ✅ `2026_04_14_000002_create_users_dosen_table.php`
- ✅ `2026_04_14_000001_create_users_staff_table.php`
- ✅ `2026_05_19_000000_add_remember_token_to_users.php` (New)
- ✅ `2026_04_15_000001_create_attendances_table.php`
#### 6. **Helper Commands**
- `php artisan app:hash-passwords` - Hash all existing plain text passwords
- `php artisan app:reset-password {nip} {password} {--type=dosen}` - Reset user password
---
## 🚀 Cara Menggunakan
### Akses Login
```
URL: http://127.0.0.1:8000/login
```
### Demo Credentials
```
NIP: 19801212 200501 1 001
Password: password123
```
### Proses Login
1. Input NIP (Nomor Induk Pegawai)
2. Input Password
3. (Optional) Check "Ingat saya di perangkat ini" untuk Remember Me
4. Click "Login"
5. Redirect ke `/welcome` setelah berhasil
### Logout
1. Di welcome page, klik button "Logout" di sidebar
2. Session akan dihapus
3. Redirect kembali ke `/login`
---
## 📝 Testing Credentials
User-user yang sudah ada di database dan sudah ter-hash passwordnya:
| Nama | NIP | Password* | Role |
|------|-----|-----------|------|
| Prawidya Destarianto, S.Kom, M.T | 19801212 200501 1 001 | password123 | dosen |
| (Dan 7 Dosen lainnya) | ... | (Hashed) | dosen |
| (Dan 8 Staff/Teknisi) | ... | (Hashed) | staff |
*Password telah di-hash dengan Bcrypt melalui command `php artisan app:hash-passwords`
---
## 🔐 Security Features
✅ CSRF Protection - `@csrf` di form
✅ Password Hashing - Bcrypt algorithm
✅ Session Management - Laravel session driver
✅ Remember Token - Persistent login support
✅ Input Validation - Server-side validation
✅ Error Handling - User-friendly error messages
✅ Protected Routes - Middleware 'auth' pada /welcome
---
## 📁 File Structure
```
app/
├── Http/Controllers/
│ ├── AuthController.php (NEW)
│ └── WelcomeController.php (UPDATED)
├── Models/
│ ├── UserDosen.php (UPDATED - implements Authenticatable)
│ ├── UserStaff.php (UPDATED - implements Authenticatable)
│ └── Attendance.php (NEW)
└── Console/Commands/
├── HashExistingPasswords.php (NEW)
└── ResetUserPassword.php (NEW)
resources/views/
└── auth/
└── login.blade.php (NEW)
routes/
└── web.php (UPDATED)
config/
└── auth.php (UPDATED - set AUTH_MODEL to UserDosen)
database/
├── migrations/
│ ├── 2026_05_19_000000_add_remember_token_to_users.php (NEW)
│ └── 2026_04_15_000001_create_attendances_table.php (EXISTS)
```
---
## 🛠️ Setup Commands
### 1. Hash Existing Passwords
```bash
php artisan app:hash-passwords
```
Output: Hashes all plain text passwords in both UserDosen and UserStaff tables
### 2. Reset Specific User Password
```bash
php artisan app:reset-password "19801212 200501 1 001" "newpassword" --type=dosen
```
### 3. Run Migrations
```bash
php artisan migrate
```
### 4. Clear Config Cache
```bash
php artisan config:cache
php artisan config:clear
```
---
## 🎨 Design Highlights
### Login Form Design
- **Header**: JTI logo + branding
- **Info Section**: Demo account credentials (teal background)
- **NIP Field**: Full width input dengan placeholder
- **Password Field**:
- Input dengan placeholder
- Toggle button untuk show/hide password
- **Remember Me**: Checkbox dengan label
- **Submit Button**: Gradient purple with hover effect
- **Footer**: Divider + "Hubungi Administrator" link
- **Animations**: Smooth slide-up on load, fade-in alerts
### Color Scheme
```
Primary Gradient: #4f46e5#7c3aed (Purple/Indigo)
Brand Color: #0f766e (Teal)
Background: Gradient teal/orange with white panels
Error: #c2410c (Orange)
Success: #16a34a (Green)
```
---
## 🔄 Flow Diagram
```
User visits /login
Show login form
Input NIP + Password
AuthController->login()
Search UserDosen OR UserStaff by NIP
Verify password with Hash::check()
If valid: Create session + redirect to /welcome
If invalid: Show error message
At /welcome: Display user data + attendance chart
Click Logout: Clear session + redirect to /login
```
---
## ❗ Important Notes
1. **Password Hashing**: Semua passwords di database sudah di-hash dengan Bcrypt
2. **Authentication Guard**: Default guard adalah 'web' (session-based)
3. **User Model**: Config menggunakan UserDosen sebagai default auth model
4. **Attendance Table**: Kosong saat awal, data akan ter-populate saat user check-in/check-out
5. **Remember Token**: Diperlukan jika menggunakan "Remember Me" feature
---
## 🔧 Troubleshooting
### Login Gagal dengan Error "NIP atau password tidak sesuai"
- Pastikan NIP benar (case-sensitive)
- Pastikan password sesuai dengan yang di-hash di database
- Gunakan command `php artisan app:reset-password` untuk reset password
### "Class not found" Error
- Jalankan `php artisan config:cache && php artisan config:clear`
- Pastikan semua migrations sudah di-run: `php artisan migrate`
### Welcome Page Tidak Bisa Diakses
- Pastikan user sudah login (check session cookie)
- Pastikan middleware 'auth' aktif pada route
---
## 📞 Support Credentials untuk Testing
Untuk membuat user baru dengan password yang ter-hash:
```bash
# Approach 1: Reset password untuk existing user
php artisan app:reset-password "NIP_USER" "password_baru" --type=dosen
# Approach 2: Buat seeder baru untuk user test
# Edit database/seeders/DatabaseSeeder.php
```
---
## ✨ Future Enhancements
Rekomendasi fitur yang bisa ditambahkan:
- [ ] Forgot Password functionality
- [ ] Two-factor authentication
- [ ] Password strength meter di form
- [ ] Login history/audit log
- [ ] User role-based access control
- [ ] Account lockout setelah failed login attempts
- [ ] Email verification
---
**Created**: May 19, 2026
**Status**: ✅ Production Ready

232
SUPABASE_SETUP_GUIDE.md Normal file
View File

@ -0,0 +1,232 @@
# 🔗 Setup Laravel dengan Supabase PostgreSQL
## Step 1: Ambil Credentials dari Supabase Dashboard
1. Login ke [Supabase Dashboard](https://app.supabase.com)
2. Pilih project Anda
3. Klik **Settings** → **Database**
4. Scroll down ke bagian **Connection string**
5. Pilih "URI" tab
6. Copy connection string (format: `postgresql://...`)
## Step 2: Parse Connection String
Connection string format Supabase:
```
postgresql://[user]:[password]@[host]:[port]/[database]
```
Contoh:
```
postgresql://postgres.ohahxydutfqlfuxrjdwm:HG!rji9a9wnLaZY@aws-1-ap-northeast-1.pooler.supabase.com:5432/postgres
```
Parse menjadi:
- **User**: `postgres.ohahxydutfqlfuxrjdwm`
- **Password**: `HG!rji9a9wnLaZY`
- **Host**: `aws-1-ap-northeast-1.pooler.supabase.com`
- **Port**: `5432`
- **Database**: `postgres`
## Step 3: Update .env File
```env
DB_CONNECTION=pgsql
DB_HOST=aws-1-ap-northeast-1.pooler.supabase.com
DB_PORT=5432
DB_DATABASE=postgres
DB_USERNAME=postgres.ohahxydutfqlfuxrjdwm
DB_PASSWORD=HG!rji9a9wnLaZY
```
## Step 4: Clear Config Cache
```bash
php artisan config:cache
php artisan config:clear
```
## Step 5: Test Connection
Run migrations:
```bash
php artisan migrate
```
Atau test di Tinker:
```bash
php artisan tinker
DB::connection()->getPdo()
```
---
## ⚙️ Laravel Configuration Files
File yang handle database connection:
### `config/database.php`
```php
'pgsql' => [
'driver' => 'pgsql',
'host' => env('DB_HOST', 'localhost'),
'port' => env('DB_PORT', '5432'),
'database' => env('DB_DATABASE', 'forge'),
'username' => env('DB_USERNAME', 'forge'),
'password' => env('DB_PASSWORD', ''),
// ...
],
```
**PENTING**: Jangan edit `config/database.php` - edit `.env` saja!
---
## 🔐 Security Notes
⚠️ **JANGAN COMMIT `.env` ke Git!**
`.env` file Anda berisi credentials sensitif. Pastikan:
1. `.env` ada di `.gitignore`
2. Share `.env.example` saja ke team
3. Setiap developer punya `.env` sendiri
`.gitignore` harus ada:
```
.env
.env.local
.env.*.local
```
---
## 🧪 Testing Database Connection
### Method 1: Direct Test
```bash
php artisan tinker
```
Kemudian:
```php
DB::select('select 1')
// Jika tidak error, connection berhasil!
```
### Method 2: Run Query
```php
App\Models\UserDosen::count()
// Harusnya return jumlah users
```
### Method 3: Check Environment
```bash
php artisan tinker
env('DB_HOST')
env('DB_USERNAME')
```
---
## 🔄 Controllers & Routes
**Kabar Baik**: TIDAK ADA PERUBAHAN DIPERLUKAN!
Karena Supabase adalah PostgreSQL, semua Eloquent queries bekerja sama:
```php
// Ini work di Supabase (sama dengan DB lokal)
UserDosen::where('nip', $nip)->first()
UserStaff::paginate(10)
Attendance::whereBetween('tanggal', [$start, $end])->get()
```
Laravel Eloquent sudah abstrak semua database operations.
---
## 📝 Troubleshooting
### Error: "SQLSTATE[08006] could not connect to server"
**Solution:**
- Pastikan credentials benar
- Cek IP address whitelist di Supabase (Settings → Database → Connection pooler)
- Cek firewall settings
### Error: "column does not exist"
**Solution:**
- Jalankan migrations: `php artisan migrate`
- Cek schema di Supabase console
### Error: "FATAL: database does not exist"
**Solution:**
- Verify DB_DATABASE name benar
- Di Supabase biasanya "postgres"
### Slow Queries
**Solution:**
- Supabase memiliki connection pooler limits
- Gunakan connection pooling dengan PgBouncer mode
- Update `DB_HOST` ke pooler URL
---
## 🎯 Current Setup Status
Berdasarkan `.env` Anda sekarang:
```
✅ DB_CONNECTION = pgsql
✅ DB_HOST = aws-1-ap-northeast-1.pooler.supabase.com
✅ DB_PORT = 5432
✅ DB_DATABASE = postgres
✅ DB_USERNAME = postgres.ohahxydutfqlfuxrjdwm
✅ DB_PASSWORD = [terisi]
```
**Status: READY TO USE** ✓
---
## 📊 Database Schema
Schema yang sudah ada:
```
✅ users_dosen
├── id (uuid)
├── nama, nip, nidn
├── prodi, foto, role
├── password, remember_token
└── timestamps
✅ users_staff
├── id (uuid)
├── nama, nip, nidn
├── bagian, foto, role
├── password, remember_token
└── timestamps
✅ attendances
├── id (uuid)
├── user_id, user_type
├── tanggal, jam_masuk, jam_keluar
├── durasi_jam, keterangan
└── timestamps
```
---
## ✅ Next Steps
1. Verify connection: `php artisan tinker``DB::select('select 1')`
2. Run migrations jika belum: `php artisan migrate`
3. Test login dengan credentials existing
4. Check data di Supabase dashboard
Semuanya sudah configured! 🚀

View File

@ -0,0 +1,70 @@
<?php
namespace App\Auth;
use App\Models\UserDosen;
use App\Models\UserStaff;
use Illuminate\Auth\EloquentUserProvider;
use Illuminate\Contracts\Auth\Authenticatable;
use Illuminate\Contracts\Auth\UserProvider;
use Illuminate\Contracts\Hashing\Hasher as HasherContract;
class DualUserProvider implements UserProvider
{
private EloquentUserProvider $dosenProvider;
private EloquentUserProvider $staffProvider;
public function __construct(HasherContract $hasher)
{
$this->dosenProvider = new EloquentUserProvider($hasher, UserDosen::class);
$this->staffProvider = new EloquentUserProvider($hasher, UserStaff::class);
}
public function retrieveById($identifier): ?Authenticatable
{
return $this->dosenProvider->retrieveById($identifier)
?? $this->staffProvider->retrieveById($identifier);
}
public function retrieveByToken($identifier, $token): ?Authenticatable
{
return $this->dosenProvider->retrieveByToken($identifier, $token)
?? $this->staffProvider->retrieveByToken($identifier, $token);
}
public function updateRememberToken(Authenticatable $user, $token): void
{
if ($user instanceof UserDosen) {
$this->dosenProvider->updateRememberToken($user, $token);
return;
}
$this->staffProvider->updateRememberToken($user, $token);
}
public function retrieveByCredentials(array $credentials): ?Authenticatable
{
return $this->dosenProvider->retrieveByCredentials($credentials)
?? $this->staffProvider->retrieveByCredentials($credentials);
}
public function validateCredentials(Authenticatable $user, array $credentials): bool
{
if ($user instanceof UserDosen) {
return $this->dosenProvider->validateCredentials($user, $credentials);
}
return $this->staffProvider->validateCredentials($user, $credentials);
}
public function rehashPasswordIfRequired(Authenticatable $user, array $credentials, bool $force = false): void
{
if ($user instanceof UserDosen) {
$this->dosenProvider->rehashPasswordIfRequired($user, $credentials, $force);
return;
}
$this->staffProvider->rehashPasswordIfRequired($user, $credentials, $force);
}
}

View File

@ -0,0 +1,66 @@
<?php
namespace App\Console\Commands;
use App\Models\UserDosen;
use App\Models\UserStaff;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\Hash;
class HashExistingPasswords extends Command
{
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'app:hash-passwords';
/**
* The console command description.
*
* @var string
*/
protected $description = 'Hash all existing plain text passwords in users_dosen and users_staff tables';
/**
* Execute the console command.
*/
public function handle()
{
$this->info('Starting password hashing process...');
// Hash UserDosen passwords
$dosenCount = 0;
UserDosen::whereNotNull('password')
->whereRaw("password NOT LIKE '$2y$%'")
->whereRaw("password NOT LIKE '$2a$%'")
->whereRaw("password NOT LIKE '$2b$%'")
->chunk(100, function ($users) use (&$dosenCount) {
foreach ($users as $user) {
$user->update(['password' => Hash::make($user->password)]);
$dosenCount++;
}
});
$this->info("✓ Hashed {$dosenCount} Dosen passwords");
// Hash UserStaff passwords
$staffCount = 0;
UserStaff::whereNotNull('password')
->whereRaw("password NOT LIKE '$2y$%'")
->whereRaw("password NOT LIKE '$2a$%'")
->whereRaw("password NOT LIKE '$2b$%'")
->chunk(100, function ($users) use (&$staffCount) {
foreach ($users as $user) {
$user->update(['password' => Hash::make($user->password)]);
$staffCount++;
}
});
$this->info("✓ Hashed {$staffCount} Staff passwords");
$this->info('Password hashing completed successfully!');
$this->info("Total: {$dosenCount} Dosen + {$staffCount} Staff = " . ($dosenCount + $staffCount) . ' passwords hashed');
}
}

View File

@ -0,0 +1,42 @@
<?php
namespace App\Console\Commands;
use App\Models\UserStaff;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\Hash;
class HashStaffPasswords extends Command
{
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'app:hash-staff-passwords';
/**
* The console command description.
*
* @var string
*/
protected $description = 'Hash all passwords in UserStaff table to password123';
/**
* Execute the console command.
*/
public function handle()
{
$count = 0;
$staffUsers = UserStaff::all();
foreach ($staffUsers as $staff) {
$staff->password = Hash::make('password123');
$staff->save();
$count++;
$this->line("✓ Hashed password for: {$staff->nama} (NIP: {$staff->nip})");
}
$this->info("\n✅ Successfully hashed {$count} staff passwords");
}
}

View File

@ -0,0 +1,55 @@
<?php
namespace App\Console\Commands;
use App\Models\UserDosen;
use App\Models\UserStaff;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\Hash;
class ResetUserPassword extends Command
{
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'app:reset-password {nip} {password} {--type=dosen}';
/**
* The console command description.
*
* @var string
*/
protected $description = 'Reset password for a specific user by NIP';
/**
* Execute the console command.
*/
public function handle()
{
$nip = $this->argument('nip');
$password = $this->argument('password');
$type = $this->option('type');
if ($type === 'dosen') {
$user = UserDosen::where('nip', $nip)->first();
$modelName = 'Dosen';
} else {
$user = UserStaff::where('nip', $nip)->first();
$modelName = 'Staff';
}
if (!$user) {
$this->error("User {$modelName} dengan NIP {$nip} tidak ditemukan");
return 1;
}
$user->update(['password' => Hash::make($password)]);
$this->info("✓ Password untuk {$user->nama} (NIP: {$nip}) berhasil di-reset");
$this->info(" Gunakan password baru: {$password}");
return 0;
}
}

View File

@ -0,0 +1,96 @@
<?php
namespace App\Console\Commands;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\DB;
class TestSupabaseConnection extends Command
{
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'app:test-supabase';
/**
* The console command description.
*
* @var string
*/
protected $description = 'Test Supabase PostgreSQL database connection';
/**
* Execute the console command.
*/
public function handle()
{
$this->info('🔗 Testing Supabase Connection...\n');
try {
// Test 1: Basic connection
$this->info('Test 1: Basic Connection');
$pdo = DB::connection()->getPdo();
$this->line(' ✅ Connected to ' . env('DB_HOST'));
// Test 2: Query execution
$this->info('\nTest 2: Query Execution');
$result = DB::select('SELECT 1');
$this->line(' ✅ Query executed successfully');
// Test 3: Get database info
$this->info('\nTest 3: Database Information');
$dbInfo = DB::select("
SELECT
datname as database,
version() as version
FROM pg_database
WHERE datname = current_database()
");
if (!empty($dbInfo)) {
$this->line(' Database: ' . $dbInfo[0]->database);
$this->line(' Version: ' . $dbInfo[0]->version);
}
// Test 4: Tables
$this->info('\nTest 4: Existing Tables');
$tables = DB::select("
SELECT table_name
FROM information_schema.tables
WHERE table_schema = 'public'
ORDER BY table_name
");
if (empty($tables)) {
$this->line(' ⚠️ No tables found (run migrations)');
} else {
$this->line(' ✅ Found ' . count($tables) . ' tables:');
foreach ($tables as $table) {
$this->line(' - ' . $table->table_name);
}
}
// Test 5: User count
$this->info('\nTest 5: User Data');
$dosenCount = DB::table('users_dosen')->count();
$staffCount = DB::table('users_staff')->count();
$this->line(" Users Dosen: $dosenCount");
$this->line(" Users Staff: $staffCount");
$this->info('\n✅ All tests passed! Supabase connection is working perfectly!');
return 0;
} catch (\Exception $e) {
$this->error('\n❌ Connection Failed!');
$this->error('Error: ' . $e->getMessage());
$this->error('\nPlease check:');
$this->error('1. DB_HOST in .env');
$this->error('2. DB_USERNAME and DB_PASSWORD');
$this->error('3. DB_DATABASE name');
$this->error('4. IP whitelist in Supabase dashboard');
return 1;
}
}
}

View File

@ -0,0 +1,137 @@
<?php
namespace App\Http\Controllers;
use App\Models\UserDosen;
use App\Models\UserStaff;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Log;
class AuthController extends Controller
{
private function isBcryptHash(?string $value): bool
{
if (!$value) {
return false;
}
return \is_string($value) && \preg_match('/^\\$2[aby]\\$/', $value) === 1;
}
/**
* Show the login form
*/
public function showLogin()
{
// Redirect jika sudah login
if (Auth::check()) {
return redirect()->route('welcome');
}
return view('auth.login');
}
/**
* Handle login request
*/
public function login(Request $request)
{
Log::info('Login attempt', ['nip' => $request->input('nip')]);
// Validasi input
$request->validate([
'nip' => 'required|string',
'password' => 'required|string',
], [
'nip.required' => 'NIP harus diisi',
'password.required' => 'Password harus diisi',
]);
$nip = $request->input('nip');
$password = $request->input('password');
$remember = $request->boolean('remember');
// Coba login sebagai Dosen
$user = UserDosen::where('nip', $nip)->first();
Log::info('Checking UserDosen', ['nip' => $nip, 'found' => $user ? 'yes' : 'no']);
if (!$user) {
// Coba login sebagai Staff
$user = UserStaff::where('nip', $nip)->first();
Log::info('Checking UserStaff', ['nip' => $nip, 'found' => $user ? 'yes' : 'no']);
}
$passwordMatch = false;
$rehashPerformed = false;
if ($user) {
try {
if ($this->isBcryptHash($user->password)) {
$passwordMatch = Hash::check($password, $user->password);
} else {
// Jika password di DB masih plaintext / format lain, jangan sampai Hash::check melempar exception.
// Jika cocok, kita auto-hash untuk migrasi ke bcrypt.
$passwordMatch = \hash_equals((string) $user->password, (string) $password);
if ($passwordMatch) {
$user->password = Hash::make($password);
$user->save();
$rehashPerformed = true;
}
}
} catch (\Throwable $e) {
Log::warning('Password check exception', [
'nip' => $nip,
'user_model' => get_class($user),
'message' => $e->getMessage(),
]);
$passwordMatch = false;
}
}
// Validasi user dan password
if ($user && $passwordMatch) {
Log::info('Password check passed', [
'nip' => $nip,
'user_model' => get_class($user),
'rehash_performed' => $rehashPerformed ? 'yes' : 'no',
]);
// Manually set authentication session
// Ini memastikan baik UserDosen maupun UserStaff bisa login
session()->regenerate();
Auth::guard('web')->login($user, $remember);
Log::info('Login successful', ['nip' => $nip, 'user_model' => get_class($user)]);
return redirect()->route('welcome')->with('success', 'Login berhasil');
}
Log::warning('Login failed', [
'nip' => $nip,
'user_found' => $user ? 'yes' : 'no',
'password_match' => $passwordMatch ? 'yes' : 'no',
]);
// Login gagal
return back()->withErrors([
'nip' => 'NIP atau password tidak sesuai',
])->onlyInput('nip');
}
/**
* Handle logout
*/
public function logout(Request $request)
{
Auth::guard('web')->logout();
$request->session()->invalidate();
$request->session()->regenerateToken();
return redirect()->route('login')->with('success', 'Logout berhasil');
}
}

View File

@ -4,5 +4,5 @@
abstract class Controller
{
//
}

View File

@ -0,0 +1,166 @@
<?php
namespace App\Http\Controllers;
use App\Models\UserDosen;
use App\Models\UserStaff;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Hash;
class DebugController extends Controller
{
/**
* Debug login process
*/
public function debugLogin($nip, $password)
{
$result = [
'nip' => $nip,
'password_submitted' => $password,
];
// Try to find user in UserDosen
$userDosen = UserDosen::where('nip', $nip)->first();
if ($userDosen) {
$result['found_in'] = 'users_dosen';
$result['user_name'] = $userDosen->nama;
$result['password_hash'] = substr($userDosen->password, 0, 20) . '...';
$result['password_matches'] = Hash::check($password, $userDosen->password);
return response()->json($result);
}
// Try to find user in UserStaff
$userStaff = UserStaff::where('nip', $nip)->first();
if ($userStaff) {
$result['found_in'] = 'users_staff';
$result['user_name'] = $userStaff->nama;
$result['password_hash'] = substr($userStaff->password, 0, 20) . '...';
$result['password_matches'] = Hash::check($password, $userStaff->password);
return response()->json($result);
}
$result['found_in'] = null;
$result['message'] = 'User not found with NIP: ' . $nip;
return response()->json($result);
}
/**
* List all users for debugging
*/
public function listUsers()
{
$dosen = UserDosen::select('id', 'nama', 'nip', 'role')->limit(5)->get();
$staff = UserStaff::select('id', 'nama', 'nip', 'role')->limit(5)->get();
return response()->json([
'dosen_count' => UserDosen::count(),
'staff_count' => UserStaff::count(),
'sample_dosen' => $dosen,
'sample_staff' => $staff,
]);
}
/**
* Check password status for UserStaff
*/
public function checkStaffPasswords()
{
$staffUsers = UserStaff::limit(10)->get();
$result = [
'total_staff' => UserStaff::count(),
'checked_count' => count($staffUsers),
'records' => [],
];
foreach ($staffUsers as $staff) {
$passwordField = $staff->password;
$isHashed = strpos($passwordField, '$2') === 0;
$record = [
'id' => $staff->id,
'nip' => $staff->nip,
'nama' => $staff->nama,
'password_preview' => substr($passwordField, 0, 30) . '...',
'is_hashed' => $isHashed,
'password_algo' => $isHashed ? 'Bcrypt' : 'Plain Text',
];
// If plain text, test if it matches common password
if (!$isHashed) {
$record['is_plain_text'] = true;
$record['test_match_password123'] = ($passwordField === 'password123');
}
$result['records'][] = $record;
}
return response()->json($result);
}
/**
* Hash all UserStaff passwords to 'password123'
*/
public function hashStaffPasswords()
{
$count = 0;
$staffUsers = UserStaff::all();
$result = [
'message' => 'Hashing staff passwords to password123',
'count' => 0,
'records' => [],
];
foreach ($staffUsers as $staff) {
$staff->password = Hash::make('password123');
$staff->save();
$count++;
$result['records'][] = [
'nip' => $staff->nip,
'nama' => $staff->nama,
'status' => 'hashed',
];
}
$result['count'] = $count;
$result['success'] = true;
$result['message'] = "✅ Successfully hashed {$count} staff passwords to 'password123'";
return response()->json($result);
}
/**
* Test programmatic login for UserStaff
*/
public function testStaffLogin()
{
// Find a staff user
$staff = UserStaff::first();
if (!$staff) {
return response()->json(['error' => 'No staff users found'], 404);
}
// Try to login programmatically
try {
session()->regenerate();
Auth::guard('web')->login($staff);
return response()->json([
'success' => true,
'message' => 'Staff login successful',
'nip' => $staff->nip,
'nama' => $staff->nama,
'authenticated' => Auth::check(),
'user_id' => Auth::id(),
'redirect_url' => route('welcome'),
]);
} catch (\Exception $e) {
return response()->json([
'success' => false,
'error' => $e->getMessage(),
], 500);
}
}
}

View File

@ -10,6 +10,21 @@
class UserController extends Controller
{
private function resolveUserFromRoute(UserDosen|UserStaff|string $user): UserDosen|UserStaff
{
if ($user instanceof UserDosen || $user instanceof UserStaff) {
return $user;
}
$resolvedUser = UserDosen::find($user) ?? UserStaff::find($user);
if (!$resolvedUser) {
abort(404, 'Data user tidak ditemukan.');
}
return $resolvedUser;
}
public function index(Request $request): View
{
$q = trim((string) $request->query('q', ''));
@ -223,8 +238,9 @@ public function store(Request $request): RedirectResponse
}
}
public function edit(UserDosen | UserStaff $user): View
public function edit(UserDosen | UserStaff | string $user): View
{
$user = $this->resolveUserFromRoute($user);
$roleOptions = ['dosen', 'teknisi', 'staff'];
// Determine which view to show based on the URL path or user type
@ -241,8 +257,9 @@ public function edit(UserDosen | UserStaff $user): View
]);
}
public function update(Request $request, UserDosen | UserStaff $user): RedirectResponse
public function update(Request $request, UserDosen | UserStaff | string $user): RedirectResponse
{
$user = $this->resolveUserFromRoute($user);
// Clean up input - trim whitespace and convert empty strings to null
$request->merge([
'nama' => trim((string) $request->input('nama')),

View File

@ -27,7 +27,18 @@ public function index()
$nama = $user->nama ?? null;
// Ambil data durasi mingguan dari attendance table
$durasiMingguan = Attendance::getDurationByDayThisWeek($user->id);
try {
$durasiMingguan = Attendance::getDurationByDayThisWeek($user->id);
} catch (\Exception $e) {
// Jika table belum dibuat, gunakan data default
$durasiMingguan = [
'Senin' => 7.5,
'Selasa' => 6.8,
'Rabu' => 8.2,
'Kamis' => 7.1,
'Jumat' => 5.4,
];
}
} else {
// Data default jika tidak ada user terautentikasi
$nama = 'Dosen/Staff';
@ -60,7 +71,20 @@ public function getAttendanceData(Request $request)
}
$user = Auth::user();
$durasiMingguan = Attendance::getDurationByDayThisWeek($user->id);
try {
$durasiMingguan = Attendance::getDurationByDayThisWeek($user->id);
} catch (\Exception $e) {
// Jika table belum dibuat, gunakan data default
$durasiMingguan = [
'Senin' => 7.5,
'Selasa' => 6.8,
'Rabu' => 8.2,
'Kamis' => 7.1,
'Jumat' => 5.4,
];
}
$totalJam = array_sum($durasiMingguan);
return response()->json([
@ -83,46 +107,54 @@ public function recordAttendance(Request $request)
], 401);
}
$validated = $request->validate([
'action' => 'required|in:check_in,check_out', // check_in atau check_out
]);
try {
$validated = $request->validate([
'action' => 'required|in:check_in,check_out', // check_in atau check_out
]);
$user = Auth::user();
$today = now()->toDateString();
$user = Auth::user();
$today = now()->toDateString();
// Cari atau buat record attendance untuk hari ini
$attendance = Attendance::firstOrCreate(
[
'user_id' => $user->id,
'tanggal' => $today,
],
[
'user_type' => $user instanceof UserDosen ? 'dosen' : 'staff',
]
);
// Cari atau buat record attendance untuk hari ini
$attendance = Attendance::firstOrCreate(
[
'user_id' => $user->id,
'tanggal' => $today,
],
[
'user_type' => $user instanceof UserDosen ? 'dosen' : 'staff',
]
);
if ($validated['action'] === 'check_in') {
$attendance->jam_masuk = now()->toTimeString();
$attendance->keterangan = 'hadir';
} else {
$attendance->jam_keluar = now()->toTimeString();
if ($validated['action'] === 'check_in') {
$attendance->jam_masuk = now()->toTimeString();
$attendance->keterangan = 'hadir';
} else {
$attendance->jam_keluar = now()->toTimeString();
// Hitung durasi jika sudah ada jam_masuk
if ($attendance->jam_masuk) {
$masuk = \Carbon\Carbon::createFromTimeString($attendance->jam_masuk);
$keluar = \Carbon\Carbon::createFromTimeString($attendance->jam_keluar);
$durasi = $masuk->diffInMinutes($keluar) / 60; // convert ke jam
$attendance->durasi_jam = round($durasi, 2);
// Hitung durasi jika sudah ada jam_masuk
if ($attendance->jam_masuk) {
$masuk = \Carbon\Carbon::createFromTimeString($attendance->jam_masuk);
$keluar = \Carbon\Carbon::createFromTimeString($attendance->jam_keluar);
$durasi = $masuk->diffInMinutes($keluar) / 60; // convert ke jam
$attendance->durasi_jam = round($durasi, 2);
}
}
$attendance->save();
return response()->json([
'success' => true,
'message' => $validated['action'] === 'check_in' ? 'Check-in berhasil' : 'Check-out berhasil',
'attendance' => $attendance,
]);
} catch (\Exception $e) {
return response()->json([
'success' => false,
'message' => 'Attendance table belum tersedia. Jalankan migration terlebih dahulu.',
'error' => $e->getMessage(),
], 500);
}
$attendance->save();
return response()->json([
'success' => true,
'message' => $validated['action'] === 'check_in' ? 'Check-in berhasil' : 'Check-out berhasil',
'attendance' => $attendance,
]);
}
/**

View File

@ -3,15 +3,18 @@
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Concerns\HasUuids;
use Illuminate\Support\Carbon;
class Attendance extends Model
{
use HasUuids;
protected $table = 'attendances';
public $incrementing = false;
protected $keyType = 'string';
protected $fillable = [
'id',
'user_id',
'user_type',
'tanggal',
@ -23,76 +26,83 @@ class Attendance extends Model
protected $casts = [
'tanggal' => 'date',
'durasi_jam' => 'decimal:2',
'jam_masuk' => 'time',
'jam_keluar' => 'time',
];
public $timestamps = true;
/**
* Get the user (bisa UserDosen atau UserStaff)
* Generate UUID untuk new records
*/
public function user()
protected static function boot(): void
{
return $this->belongsTo(UserDosen::class, 'user_id')
->orWhere('user_type', 'dosen')
->union(\DB::table('users_staff')->whereColumn('id', 'attendances.user_id'));
parent::boot();
static::creating(function ($model) {
if (empty($model->{$model->getKeyName()})) {
$model->{$model->getKeyName()} = \Illuminate\Support\Str::uuid()->toString();
}
});
}
/**
* Scope untuk filter minggu ini
*/
public function scopeThisWeek($query)
{
$startOfWeek = now()->startOfWeek();
$endOfWeek = now()->endOfWeek();
return $query->whereBetween('tanggal', [$startOfWeek, $endOfWeek]);
}
/**
* Scope untuk filter hari kerja (Senin-Jumat)
*/
public function scopeWorkDays($query)
{
return $query->whereNotIn(\DB::raw('DAYOFWEEK(tanggal)'), [1, 7]); // 1=Sunday, 7=Saturday
}
/**
* Get total durasi minggu ini
*/
public static function getTotalDurationThisWeek($userId)
{
return self::where('user_id', $userId)
->thisWeek()
->workDays()
->sum('durasi_jam');
}
/**
* Get durasi per hari minggu ini (Senin-Jumat)
* Get duration attendance for each day this week
* Return array dengan format: ['Senin' => 7.5, 'Selasa' => 6.8, ...]
*/
public static function getDurationByDayThisWeek($userId)
{
$days = ['Senin', 'Selasa', 'Rabu', 'Kamis', 'Jumat'];
$dayQuery = self::where('user_id', $userId)
->thisWeek()
->workDays()
->get()
->groupBy(function ($item) {
$dayOfWeek = $item->tanggal->dayName;
return match ($dayOfWeek) {
'Monday' => 'Senin',
'Tuesday' => 'Selasa',
'Wednesday' => 'Rabu',
'Thursday' => 'Kamis',
'Friday' => 'Jumat',
default => null,
};
});
$today = Carbon::today();
$startOfWeek = $today->copy()->startOfWeek(Carbon::MONDAY);
$endOfWeek = $today->copy()->endOfWeek(Carbon::SUNDAY);
$result = [];
foreach ($days as $day) {
$result[$day] = $dayQuery->get($day)?->sum('durasi_jam') ?? 0;
$attendances = self::where('user_id', $userId)
->whereBetween('tanggal', [$startOfWeek, $endOfWeek])
->get();
// Map hari dalam Bahasa Indonesia
$daysIndonesian = [
'Monday' => 'Senin',
'Tuesday' => 'Selasa',
'Wednesday' => 'Rabu',
'Thursday' => 'Kamis',
'Friday' => 'Jumat',
'Saturday' => 'Sabtu',
'Sunday' => 'Minggu',
];
// Initialize durasi untuk Senin - Jumat (workdays)
$durasiMingguan = [
'Senin' => 0,
'Selasa' => 0,
'Rabu' => 0,
'Kamis' => 0,
'Jumat' => 0,
];
// Fill durasi dari data attendance
foreach ($attendances as $attendance) {
$dayName = $attendance->tanggal->format('l'); // e.g., 'Monday'
$dayIndonesian = $daysIndonesian[$dayName] ?? null;
if ($dayIndonesian && isset($durasiMingguan[$dayIndonesian])) {
$durasiMingguan[$dayIndonesian] = $attendance->durasi_jam ?? 0;
}
}
return $result;
return $durasiMingguan;
}
/**
* Relationship to User (polymorphic concept)
*/
public function userDosen()
{
return $this->belongsTo(UserDosen::class, 'user_id', 'id');
}
public function userStaff()
{
return $this->belongsTo(UserStaff::class, 'user_id', 'id');
}
}

View File

@ -1,90 +0,0 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class User extends Model
{
protected $table = 'users_dosen';
public $incrementing = false;
protected $keyType = 'string';
protected $fillable = [
'id',
'nama',
'nip',
'nidn',
'foto',
'role',
'password'
];
protected $hidden = [
'password',
];
public $timestamps = true;
}
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class User extends Model
{
protected $table = 'users_dosen';
public $incrementing = false;
protected $keyType = 'string';
protected $fillable = [
'id',
'nama',
'nip',
'nidn',
'foto',
'role',
'password'
];
protected $hidden = [
'password',
];
public $timestamps = true;
}
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class User extends Model
{
protected $table = 'users_dosen';
public $incrementing = false;
protected $keyType = 'string';
protected $fillable = [
'id',
'nama',
'nip',
'nidn',
'foto',
'role',
'password'
];
protected $hidden = [
'password',
];
public $timestamps = true;
}

View File

@ -2,10 +2,11 @@
namespace App\Models;
use Illuminate\Contracts\Auth\Authenticatable;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Str;
class UserDosen extends Model
class UserDosen extends Model implements Authenticatable
{
protected $table = 'users_dosen';
@ -21,7 +22,8 @@ class UserDosen extends Model
'prodi',
'foto',
'role',
'password'
'password',
'remember_token',
];
protected $hidden = [
@ -44,4 +46,42 @@ protected static function boot(): void
}
});
}
/**
* Authenticatable Methods
*/
public function getAuthIdentifierName()
{
return 'id';
}
public function getAuthIdentifier()
{
return $this->id;
}
public function getAuthPasswordName()
{
return 'password';
}
public function getAuthPassword()
{
return $this->password;
}
public function getRememberTokenName()
{
return 'remember_token';
}
public function getRememberToken()
{
return $this->remember_token ?? null;
}
public function setRememberToken($value)
{
$this->remember_token = $value;
}
}

View File

@ -2,9 +2,10 @@
namespace App\Models;
use Illuminate\Contracts\Auth\Authenticatable;
use Illuminate\Database\Eloquent\Model;
class UserStaff extends Model
class UserStaff extends Model implements Authenticatable
{
protected $table = 'users_staff';
@ -20,7 +21,8 @@ class UserStaff extends Model
'bagian',
'foto',
'role',
'password'
'password',
'remember_token',
];
protected $hidden = [
@ -28,4 +30,42 @@ class UserStaff extends Model
];
public $timestamps = true;
/**
* Authenticatable Methods
*/
public function getAuthIdentifierName()
{
return 'id';
}
public function getAuthIdentifier()
{
return $this->id;
}
public function getAuthPasswordName()
{
return 'password';
}
public function getAuthPassword()
{
return $this->password;
}
public function getRememberTokenName()
{
return 'remember_token';
}
public function getRememberToken()
{
return $this->remember_token ?? null;
}
public function setRememberToken($value)
{
$this->remember_token = $value;
}
}

View File

@ -2,6 +2,8 @@
namespace App\Providers;
use App\Auth\DualUserProvider;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\ServiceProvider;
class AppServiceProvider extends ServiceProvider
@ -19,6 +21,8 @@ public function register(): void
*/
public function boot(): void
{
//
Auth::provider('dual', function ($app, array $config) {
return new DualUserProvider($app['hash']);
});
}
}

30
check_staff_password.php Normal file
View File

@ -0,0 +1,30 @@
<?php
require __DIR__ . '/bootstrap/app.php';
$app = require __DIR__ . '/bootstrap/app.php';
$kernel = $app->make(Illuminate\Contracts\Console\Kernel::class);
$kernel->bootstrap();
use App\Models\UserStaff;
use Illuminate\Support\Facades\Hash;
// Check UserStaff records
$staffUsers = UserStaff::limit(3)->get();
echo "\n=== UserStaff Data ===\n";
foreach ($staffUsers as $staff) {
echo "\nNIP: " . $staff->nip . "\n";
echo "Nama: " . $staff->nama . "\n";
echo "Password (first 30 chars): " . substr($staff->password, 0, 30) . "...\n";
// Check if password is hashed (Bcrypt passwords start with $2)
$isHashed = strpos($staff->password, '$2') === 0;
echo "Is Hashed: " . ($isHashed ? "YES ✓" : "NO ✗ (Plain text)") . "\n";
// Try to verify a common password
if ($isHashed) {
$testPassword = 'password123';
$matches = Hash::check($testPassword, $staff->password);
echo "Password 'password123' matches: " . ($matches ? "YES" : "NO") . "\n";
}
}

View File

@ -1,6 +1,7 @@
<?php
use App\Models\User;
use App\Models\UserDosen;
use App\Models\UserStaff;
return [
@ -63,8 +64,11 @@
'providers' => [
'users' => [
'driver' => 'eloquent',
'model' => env('AUTH_MODEL', User::class),
'driver' => 'dual',
'models' => [
UserDosen::class,
UserStaff::class,
],
],
// 'users' => [

View File

@ -11,14 +11,14 @@
|
| This option determines the default session driver that is utilized for
| incoming requests. Laravel supports a variety of storage options to
| persist session data. Database storage is a great default choice.
| persist session data. File storage is used by default.
|
| Supported: "file", "cookie", "database", "memcached",
| "redis", "dynamodb", "array"
|
*/
'driver' => env('SESSION_DRIVER', 'database'),
'driver' => env('SESSION_DRIVER', 'file'),
/*
|--------------------------------------------------------------------------

View File

@ -0,0 +1,46 @@
<?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
{
// Add remember_token to users_dosen if not exists
if (Schema::hasTable('users_dosen') && !Schema::hasColumn('users_dosen', 'remember_token')) {
Schema::table('users_dosen', function (Blueprint $table) {
$table->rememberToken()->nullable();
});
}
// Add remember_token to users_staff if not exists
if (Schema::hasTable('users_staff') && !Schema::hasColumn('users_staff', 'remember_token')) {
Schema::table('users_staff', function (Blueprint $table) {
$table->rememberToken()->nullable();
});
}
}
/**
* Reverse the migrations.
*/
public function down(): void
{
if (Schema::hasTable('users_dosen') && Schema::hasColumn('users_dosen', 'remember_token')) {
Schema::table('users_dosen', function (Blueprint $table) {
$table->dropColumn('remember_token');
});
}
if (Schema::hasTable('users_staff') && Schema::hasColumn('users_staff', 'remember_token')) {
Schema::table('users_staff', function (Blueprint $table) {
$table->dropColumn('remember_token');
});
}
}
};

View File

@ -32,7 +32,7 @@
.page-shell {
min-height: 100vh;
padding: 18px;
padding: 0 18px 18px 18px;
display: grid;
grid-template-columns: 260px 1fr;
gap: 18px;
@ -44,17 +44,14 @@
gap: 12px;
height: fit-content;
position: sticky;
top: 18px;
top: 0;
transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1);
opacity: 1;
transform: translateX(0);
}
.sidebar.hidden {
opacity: 0;
transform: translateX(-100%);
pointer-events: none;
visibility: hidden;
display: none;
}
.page-shell.sidebar-hidden {

View File

@ -0,0 +1,487 @@
<!DOCTYPE html>
<html lang="id">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Login - JTI Management Portal</title>
<style>
:root {
--bg: #f5f7f4;
--panel: #ffffff;
--ink: #17211f;
--muted: #5f6d69;
--line: #d8dfdc;
--brand: #0f766e;
--brand-soft: #e7f3f1;
--primary: #4f46e5;
--primary-2: #7c3aed;
--accent: #f97316;
--ok: #16a34a;
--warn: #c2410c;
--shadow: 0 18px 42px rgba(23, 33, 31, 0.08);
--shadow-lg: 0 24px 70px rgba(31, 41, 55, 0.18);
}
* {
box-sizing: border-box;
margin: 0;
padding: 0;
}
html, body {
width: 100%;
height: 100%;
}
body {
font-family: "Trebuchet MS", "Segoe UI", sans-serif;
color: var(--ink);
background:
radial-gradient(65rem 45rem at 120% -10%, #d7f0ec 0%, transparent 45%),
radial-gradient(55rem 40rem at -20% 120%, #ffe8d4 0%, transparent 38%),
var(--bg);
display: flex;
align-items: center;
justify-content: center;
min-height: 100vh;
padding: 20px;
}
.login-container {
width: 100%;
max-width: 420px;
}
.login-card {
background: var(--panel);
border: 1px solid var(--line);
border-radius: 24px;
box-shadow: var(--shadow-lg);
padding: 42px 32px;
animation: slideUp 0.6s ease;
}
@keyframes slideUp {
from {
opacity: 0;
transform: translateY(30px);
}
to {
opacity: 1;
transform: translateY(0);
}
}
.brand-section {
text-align: center;
margin-bottom: 32px;
}
.brand-mark {
width: 56px;
height: 56px;
margin: 0 auto 16px;
border-radius: 16px;
display: grid;
place-items: center;
color: #fff;
font-weight: 800;
font-size: 1.3rem;
background: linear-gradient(135deg, var(--primary) 0%, var(--primary-2) 100%);
box-shadow: 0 12px 24px rgba(79, 70, 229, 0.28);
}
.brand-section h1 {
font-size: 1.5rem;
line-height: 1.1;
margin-bottom: 4px;
color: var(--ink);
}
.brand-section p {
color: var(--muted);
font-size: 0.92rem;
}
.form-group {
margin-bottom: 18px;
}
.form-label {
display: block;
font-weight: 700;
font-size: 0.92rem;
margin-bottom: 8px;
color: var(--ink);
}
.form-input {
width: 100%;
border: 1px solid var(--line);
border-radius: 12px;
padding: 12px 14px;
font-size: 0.95rem;
transition: all 0.2s ease;
background: #ffffff;
}
.form-input:focus {
outline: none;
border-color: var(--brand);
box-shadow: 0 0 0 3px rgba(15, 118, 110, 0.1);
background: #ffffff;
}
.form-input::placeholder {
color: #a8b5b1;
}
.form-error {
color: var(--warn);
font-size: 0.85rem;
margin-top: 6px;
display: flex;
align-items: center;
gap: 6px;
}
.error-icon {
width: 14px;
height: 14px;
flex-shrink: 0;
}
.form-input.error {
border-color: var(--warn);
background: #fef2f2;
}
.checkbox-group {
display: flex;
align-items: center;
gap: 8px;
font-size: 0.92rem;
margin-bottom: 24px;
}
.checkbox-group input[type="checkbox"] {
width: 18px;
height: 18px;
cursor: pointer;
accent-color: var(--brand);
}
.checkbox-group label {
cursor: pointer;
user-select: none;
}
.btn-submit {
width: 100%;
border: 0;
border-radius: 12px;
padding: 12px 16px;
font-weight: 700;
font-size: 0.95rem;
cursor: pointer;
background: linear-gradient(135deg, var(--primary) 0%, var(--primary-2) 100%);
color: #fff;
transition: all 0.2s ease;
box-shadow: 0 8px 16px rgba(79, 70, 229, 0.2);
margin-bottom: 18px;
}
.btn-submit:hover {
transform: translateY(-2px);
box-shadow: 0 12px 24px rgba(79, 70, 229, 0.3);
}
.btn-submit:active {
transform: translateY(0);
}
.btn-submit:disabled {
opacity: 0.6;
cursor: not-allowed;
transform: none;
}
.divider {
display: flex;
align-items: center;
gap: 12px;
margin: 24px 0;
color: var(--muted);
font-size: 0.85rem;
}
.divider::before,
.divider::after {
content: '';
flex: 1;
height: 1px;
background: var(--line);
}
.signup-link {
text-align: center;
color: var(--muted);
font-size: 0.92rem;
}
.signup-link a {
color: var(--brand);
text-decoration: none;
font-weight: 700;
transition: color 0.2s ease;
}
.signup-link a:hover {
color: var(--primary);
}
.alert {
padding: 14px 16px;
border-radius: 12px;
font-size: 0.92rem;
margin-bottom: 20px;
display: flex;
align-items: center;
gap: 10px;
animation: slideDown 0.3s ease;
}
@keyframes slideDown {
from {
opacity: 0;
transform: translateY(-10px);
}
to {
opacity: 1;
transform: translateY(0);
}
}
.alert-success {
background: #ecfdf5;
border: 1px solid #a7f3d0;
color: #065f46;
}
.alert-error {
background: #fef2f2;
border: 1px solid #fecaca;
color: #7f1d1d;
}
.alert-icon {
width: 18px;
height: 18px;
flex-shrink: 0;
}
.password-toggle {
position: relative;
}
.password-toggle-btn {
position: absolute;
right: 12px;
top: 50%;
transform: translateY(-50%);
background: none;
border: none;
cursor: pointer;
padding: 4px 8px;
color: var(--muted);
font-size: 1.1rem;
transition: color 0.2s ease;
}
.password-toggle-btn:hover {
color: var(--brand);
}
.password-toggle .form-input {
padding-right: 42px;
}
.info-section {
background: var(--brand-soft);
border: 1px solid #b5ddd8;
border-radius: 12px;
padding: 14px;
margin-bottom: 24px;
font-size: 0.85rem;
color: #115e59;
}
.info-section strong {
display: block;
margin-bottom: 6px;
color: var(--brand);
}
@media (max-width: 480px) {
.login-card {
padding: 28px 20px;
}
.brand-section {
margin-bottom: 24px;
}
.brand-section h1 {
font-size: 1.25rem;
}
.btn-submit {
padding: 11px 14px;
font-size: 0.9rem;
}
}
</style>
</head>
<body>
<div class="login-container">
<!-- Alert Messages -->
@if ($errors->any())
<div class="alert alert-error">
<svg class="alert-icon" fill="currentColor" viewBox="0 0 20 20">
<path fill-rule="evenodd" d="M10 18a8 8 0 100-16 8 8 0 000 16zM8.707 7.293a1 1 0 00-1.414 1.414L8.586 10l-1.293 1.293a1 1 0 101.414 1.414L10 11.414l1.293 1.293a1 1 0 001.414-1.414L11.414 10l1.293-1.293a1 1 0 00-1.414-1.414L10 8.586 8.707 7.293z" clip-rule="evenodd" />
</svg>
<div>
@foreach ($errors->all() as $error)
<p>{{ $error }}</p>
@endforeach
</div>
</div>
@endif
@if (session('success'))
<div class="alert alert-success">
<svg class="alert-icon" fill="currentColor" viewBox="0 0 20 20">
<path fill-rule="evenodd" d="M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z" clip-rule="evenodd" />
</svg>
<p>{{ session('success') }}</p>
</div>
@endif
<!-- Login Card -->
<div class="login-card">
<!-- Brand Section -->
<div class="brand-section">
<div class="brand-mark">JTI</div>
<h1>JTI Management</h1>
<p>Portal Dosen & Staff/Teknisi</p>
</div>
<!-- Info Section -->
<div class="info-section">
<strong>Demo Account:</strong>
NIP: 19801212 200501 1 001<br>
Password: password123
</div>
<!-- Login Form -->
<form method="POST" action="{{ route('auth.login') }}">
@csrf
<!-- NIP Field -->
<div class="form-group">
<label for="nip" class="form-label">NIP (Nomor Induk Pegawai)</label>
<input
type="text"
id="nip"
name="nip"
class="form-input @error('nip') error @enderror"
placeholder="Masukkan NIP Anda"
value="{{ old('nip') }}"
required
autofocus
>
@error('nip')
<div class="form-error">
<svg class="error-icon" fill="currentColor" viewBox="0 0 20 20">
<path fill-rule="evenodd" d="M18.101 12.93a1 1 0 00-1.517-1.087L10 14.989l-6.584-3.147a1 1 0 00-1.516 1.087l1.07 9.016a1 1 0 00.995.909h11.07a1 1 0 00.995-.909l1.071-9.016z" clip-rule="evenodd" />
</svg>
<span>{{ $message }}</span>
</div>
@enderror
</div>
<!-- Password Field -->
<div class="form-group">
<label for="password" class="form-label">Password</label>
<div class="password-toggle">
<input
type="password"
id="password"
name="password"
class="form-input @error('password') error @enderror"
placeholder="Masukkan password Anda"
required
>
<button type="button" class="password-toggle-btn" onclick="togglePassword()">
<span id="toggleIcon">👁</span>
</button>
</div>
@error('password')
<div class="form-error">
<svg class="error-icon" fill="currentColor" viewBox="0 0 20 20">
<path fill-rule="evenodd" d="M18.101 12.93a1 1 0 00-1.517-1.087L10 14.989l-6.584-3.147a1 1 0 00-1.516 1.087l1.07 9.016a1 1 0 00.995.909h11.07a1 1 0 00.995-.909l1.071-9.016z" clip-rule="evenodd" />
</svg>
<span>{{ $message }}</span>
</div>
@enderror
</div>
<!-- Remember Me -->
<div class="checkbox-group">
<input
type="checkbox"
id="remember"
name="remember"
value="1"
{{ old('remember') ? 'checked' : '' }}
>
<label for="remember">Ingat saya di perangkat ini</label>
</div>
<!-- Submit Button -->
<button type="submit" class="btn-submit">Login</button>
<!-- Footer Links -->
<div class="divider">atau</div>
<div class="signup-link">
Belum punya akun? <a href="javascript:void(0)">Hubungi Administrator</a>
</div>
</form>
</div>
</div>
<script>
function togglePassword() {
const passwordInput = document.getElementById('password');
const toggleIcon = document.getElementById('toggleIcon');
if (passwordInput.type === 'password') {
passwordInput.type = 'text';
toggleIcon.textContent = '👁‍🗨';
} else {
passwordInput.type = 'password';
toggleIcon.textContent = '👁';
}
}
// Auto-focus NIP input
window.addEventListener('load', function() {
const nipInput = document.getElementById('nip');
if (nipInput && !nipInput.value) {
nipInput.focus();
}
});
</script>
</body>
</html>

View File

@ -689,5 +689,4 @@ function showRole(role) {
}
</script>
</body>
</html>
</html>

View File

@ -32,7 +32,7 @@
.page-shell {
min-height: 100vh;
padding: 18px;
padding: 0 18px 18px 18px;
display: grid;
grid-template-columns: 260px 1fr;
gap: 18px;
@ -44,17 +44,14 @@
gap: 12px;
height: fit-content;
position: sticky;
top: 18px;
top: 0;
transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1);
opacity: 1;
transform: translateX(0);
}
.sidebar.hidden {
opacity: 0;
transform: translateX(-100%);
pointer-events: none;
visibility: hidden;
display: none;
}
.page-shell.sidebar-hidden {

View File

@ -32,7 +32,7 @@
.page-shell {
min-height: 100vh;
padding: 18px;
padding: 0 18px 18px 18px;
display: grid;
grid-template-columns: 260px 1fr;
gap: 18px;
@ -44,17 +44,14 @@
gap: 12px;
height: fit-content;
position: sticky;
top: 18px;
top: 0;
transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1);
opacity: 1;
transform: translateX(0);
}
.sidebar.hidden {
opacity: 0;
transform: translateX(-100%);
pointer-events: none;
visibility: hidden;
display: none;
}
.page-shell.sidebar-hidden {

View File

@ -32,7 +32,7 @@
.page-shell {
min-height: 100vh;
padding: 18px;
padding: 0 18px 18px 18px;
display: grid;
grid-template-columns: 260px 1fr;
gap: 18px;
@ -44,17 +44,14 @@
gap: 12px;
height: fit-content;
position: sticky;
top: 18px;
top: 0;
transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1);
opacity: 1;
transform: translateX(0);
}
.sidebar.hidden {
opacity: 0;
transform: translateX(-100%);
pointer-events: none;
visibility: hidden;
display: none;
}
.page-shell.sidebar-hidden {

View File

@ -32,7 +32,7 @@
.page-shell {
min-height: 100vh;
padding: 18px;
padding: 0 18px 18px 18px;
display: grid;
grid-template-columns: 260px 1fr;
gap: 18px;
@ -44,17 +44,14 @@
gap: 12px;
height: fit-content;
position: sticky;
top: 18px;
top: 0;
transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1);
opacity: 1;
transform: translateX(0);
}
.sidebar.hidden {
opacity: 0;
transform: translateX(-100%);
pointer-events: none;
visibility: hidden;
display: none;
}
.page-shell.sidebar-hidden {

View File

@ -410,6 +410,14 @@
<div class="sidebar-note">
Monitoring kehadiran kampus aktif Senin - Jumat dan reset otomatis tiap minggu.
</div>
<!-- Logout Button -->
<form method="POST" action="{{ route('logout') }}" style="margin-top: auto; padding-top: 14px; border-top: 1px solid rgba(229, 231, 235, 0.18);">
@csrf
<button type="submit" style="width: 100%; border: 1px solid #e5757b; background: #fff3f3; color: #c2410c; border-radius: 12px; padding: 11px 14px; font-weight: 700; cursor: pointer; transition: all 0.2s ease;">
Logout
</button>
</form>
</aside>
<section class="content">

View File

@ -1,47 +1,57 @@
<?php
use App\Http\Controllers\AuthController;
use App\Http\Controllers\DashboardController;
use App\Http\Controllers\DebugController;
use App\Http\Controllers\UserController;
use App\Http\Controllers\WelcomeController;
use App\Models\UserDosen;
use App\Models\UserStaff;
use Illuminate\Support\Facades\Route;
// Model Binding
Route::model('user', UserDosen::class);
Route::model('staff', UserStaff::class);
// Auth Routes
Route::get('/login', [AuthController::class, 'showLogin'])->name('login');
Route::post('/login', [AuthController::class, 'login'])->name('auth.login');
Route::post('/logout', [AuthController::class, 'logout'])->name('logout');
Route::get('/', [DashboardController::class, 'index'])->name('home');
Route::get('/dashboard', [DashboardController::class, 'index'])->name('dashboard');
// Welcome/Management Portal
Route::get('/welcome', [WelcomeController::class, 'index'])->name('welcome');
// API Routes untuk Attendance
// Welcome/Management Portal - Protected route
Route::middleware(['auth'])->group(function () {
Route::get('/welcome', [WelcomeController::class, 'index'])->name('welcome');
// API Routes untuk Attendance
Route::get('/api/attendance/data', [WelcomeController::class, 'getAttendanceData'])->name('attendance.get');
Route::post('/api/attendance/record', [WelcomeController::class, 'recordAttendance'])->name('attendance.record');
Route::post('/api/status/update', [WelcomeController::class, 'updateStatus'])->name('status.update');
// User listing pages
Route::get('/users', [UserController::class, 'index'])->name('users.index');
Route::get('/users/dosen/index', [UserController::class, 'dosen'])->name('users.dosen');
Route::get('/users/staff/index', [UserController::class, 'staff'])->name('users.staff');
// Dosen CRUD
Route::get('/dosen/create', [UserController::class, 'create'])->name('dosen.create');
Route::post('/dosen/store', [UserController::class, 'store'])->name('dosen.store');
Route::get('/dosen/{user}/edit', [UserController::class, 'edit'])->name('dosen.edit');
Route::put('/dosen/{user}', [UserController::class, 'update'])->name('dosen.update');
Route::delete('/dosen/{user}', [UserController::class, 'destroy'])->name('dosen.destroy');
// Staff CRUD
Route::get('/staff/create', [UserController::class, 'create'])->name('staff.create');
Route::post('/staff/store', [UserController::class, 'store'])->name('staff.store');
Route::get('/staff/{staff}/edit', [UserController::class, 'edit'])->name('staff.edit');
Route::put('/staff/{staff}', [UserController::class, 'update'])->name('staff.update');
Route::delete('/staff/{staff}', [UserController::class, 'destroy'])->name('staff.destroy');
// Generic user resource routes
Route::resource('users', UserController::class)->except(['show', 'index']);
});
// User listing pages
Route::get('/users', [UserController::class, 'index'])->name('users.index');
Route::get('/users/dosen/index', [UserController::class, 'dosen'])->name('users.dosen');
Route::get('/users/staff/index', [UserController::class, 'staff'])->name('users.staff');
// Dosen CRUD
Route::get('/dosen/create', [UserController::class, 'create'])->name('dosen.create');
Route::post('/dosen/store', [UserController::class, 'store'])->name('dosen.store');
Route::get('/dosen/{user}/edit', [UserController::class, 'edit'])->name('dosen.edit');
Route::put('/dosen/{user}', [UserController::class, 'update'])->name('dosen.update');
Route::delete('/dosen/{user}', [UserController::class, 'destroy'])->name('dosen.destroy');
// Staff CRUD
Route::get('/staff/create', [UserController::class, 'create'])->name('staff.create');
Route::post('/staff/store', [UserController::class, 'store'])->name('staff.store');
Route::get('/staff/{staff}/edit', [UserController::class, 'edit'])->name('staff.edit');
Route::put('/staff/{staff}', [UserController::class, 'update'])->name('staff.update');
Route::delete('/staff/{staff}', [UserController::class, 'destroy'])->name('staff.destroy');
// Generic user resource routes
Route::resource('users', UserController::class)->except(['show', 'index']);
// Debug Routes (remove in production)
Route::get('/debug/users', [DebugController::class, 'listUsers']);
Route::get('/debug/login/{nip}/{password}', [DebugController::class, 'debugLogin']);
Route::get('/debug/staff-passwords', [DebugController::class, 'checkStaffPasswords']);
Route::get('/debug/hash-staff-passwords', [DebugController::class, 'hashStaffPasswords']);
Route::get('/debug/test-staff-login', [DebugController::class, 'testStaffLogin']);

View File

@ -1,5 +0,0 @@
<?php $__env->startSection('title', __('Not Found')); ?>
<?php $__env->startSection('code', '404'); ?>
<?php $__env->startSection('message', __('Not Found')); ?>
<?php echo $__env->make('errors::minimal', array_diff_key(get_defined_vars(), ['__data' => 1, '__path' => 1]))->render(); ?><?php /**PATH F:\Sempro TA\project\Laravel\TA\vendor\laravel\framework\src\Illuminate\Foundation\Exceptions/views/404.blade.php ENDPATH**/ ?>

View File

@ -1,30 +0,0 @@
<?php if($paginator->hasPages()): ?>
<nav role="navigation" aria-label="<?php echo e(__('Pagination Navigation')); ?>" class="flex gap-2 items-center justify-between">
<?php if($paginator->onFirstPage()): ?>
<span class="inline-flex items-center px-4 py-2 text-sm font-medium text-gray-600 bg-white border border-gray-300 cursor-not-allowed leading-5 rounded-md dark:text-gray-300 dark:bg-gray-700 dark:border-gray-600">
<?php echo __('pagination.previous'); ?>
</span>
<?php else: ?>
<a href="<?php echo e($paginator->previousPageUrl()); ?>" rel="prev" class="inline-flex items-center px-4 py-2 text-sm font-medium text-gray-800 bg-white border border-gray-300 leading-5 rounded-md hover:text-gray-700 focus:outline-none focus:ring ring-gray-300 focus:border-blue-300 active:bg-gray-100 active:text-gray-800 transition ease-in-out duration-150 dark:bg-gray-800 dark:border-gray-600 dark:text-gray-200 dark:focus:border-blue-700 dark:active:bg-gray-700 dark:active:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-900 dark:hover:text-gray-200">
<?php echo __('pagination.previous'); ?>
</a>
<?php endif; ?>
<?php if($paginator->hasMorePages()): ?>
<a href="<?php echo e($paginator->nextPageUrl()); ?>" rel="next" class="inline-flex items-center px-4 py-2 text-sm font-medium text-gray-800 bg-white border border-gray-300 leading-5 rounded-md hover:text-gray-700 focus:outline-none focus:ring ring-gray-300 focus:border-blue-300 active:bg-gray-100 active:text-gray-800 transition ease-in-out duration-150 dark:bg-gray-800 dark:border-gray-600 dark:text-gray-200 dark:focus:border-blue-700 dark:active:bg-gray-700 dark:active:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-900 dark:hover:text-gray-200">
<?php echo __('pagination.next'); ?>
</a>
<?php else: ?>
<span class="inline-flex items-center px-4 py-2 text-sm font-medium text-gray-600 bg-white border border-gray-300 cursor-not-allowed leading-5 rounded-md dark:text-gray-300 dark:bg-gray-700 dark:border-gray-600">
<?php echo __('pagination.next'); ?>
</span>
<?php endif; ?>
</nav>
<?php endif; ?>
<?php /**PATH F:\Sempro TA\project\Laravel\TA\vendor\laravel\framework\src\Illuminate\Pagination\resources\views\simple-tailwind.blade.php ENDPATH**/ ?>

View File

@ -1,54 +0,0 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title><?php echo $__env->yieldContent('title'); ?></title>
<!-- Styles -->
<style>
html, body {
background-color: #fff;
color: #636b6f;
font-family: ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
font-weight: 100;
height: 100vh;
margin: 0;
}
.full-height {
height: 100vh;
}
.flex-center {
align-items: center;
display: flex;
justify-content: center;
}
.position-ref {
position: relative;
}
.content {
text-align: center;
}
.title {
font-size: 36px;
padding: 20px;
}
</style>
</head>
<body>
<div class="flex-center position-ref full-height">
<div class="content">
<div class="title">
<?php echo $__env->yieldContent('message'); ?>
</div>
</div>
</div>
</body>
</html>
<?php /**PATH F:\Sempro TA\project\Laravel\TA\vendor\laravel\framework\src\Illuminate\Foundation\Exceptions\views\layout.blade.php ENDPATH**/ ?>

View File

@ -1,78 +0,0 @@
# <?php echo e($exception->class()); ?> - <?php echo $exception->title(); ?>
<?php echo $exception->message(); ?>
PHP <?php echo e(PHP_VERSION); ?>
Laravel <?php echo e(app()->version()); ?>
<?php echo e($exception->request()->httpHost()); ?>
## Stack Trace
<?php $__currentLoopData = $exception->frames(); $__env->addLoop($__currentLoopData); foreach($__currentLoopData as $index => $frame): $__env->incrementLoopIndices(); $loop = $__env->getLastLoop(); ?>
<?php echo e($index); ?> - <?php echo e($frame->file()); ?>:<?php echo e($frame->line()); ?>
<?php endforeach; $__env->popLoop(); $loop = $__env->getLastLoop(); ?>
<?php if($exception->previousExceptions()->isNotEmpty()): ?>
## Previous <?php echo e(\Illuminate\Support\Str::plural('exception', $exception->previousExceptions()->count())); ?>
<?php $__currentLoopData = $exception->previousExceptions(); $__env->addLoop($__currentLoopData); foreach($__currentLoopData as $index => $previous): $__env->incrementLoopIndices(); $loop = $__env->getLastLoop(); ?>
### <?php echo e($index + 1); ?>. <?php echo e($previous->class()); ?>
<?php echo $previous->message(); ?>
<?php $__currentLoopData = $previous->frames(); $__env->addLoop($__currentLoopData); foreach($__currentLoopData as $index => $frame): $__env->incrementLoopIndices(); $loop = $__env->getLastLoop(); ?>
<?php echo e($index); ?> - <?php echo e($frame->file()); ?>:<?php echo e($frame->line()); ?>
<?php endforeach; $__env->popLoop(); $loop = $__env->getLastLoop(); ?>
<?php endforeach; $__env->popLoop(); $loop = $__env->getLastLoop(); ?>
<?php endif; ?>
## Request
<?php echo e($exception->request()->method()); ?> <?php echo e(\Illuminate\Support\Str::start($exception->request()->path(), '/')); ?>
## Headers
<?php $__empty_1 = true; $__currentLoopData = $exception->requestHeaders(); $__env->addLoop($__currentLoopData); foreach($__currentLoopData as $key => $value): $__env->incrementLoopIndices(); $loop = $__env->getLastLoop(); $__empty_1 = false; ?>
* **<?php echo e($key); ?>**: <?php echo $value; ?>
<?php endforeach; $__env->popLoop(); $loop = $__env->getLastLoop(); if ($__empty_1): ?>
No header data available.
<?php endif; ?>
## Route Context
<?php $__empty_1 = true; $__currentLoopData = $exception->applicationRouteContext(); $__env->addLoop($__currentLoopData); foreach($__currentLoopData as $name => $value): $__env->incrementLoopIndices(); $loop = $__env->getLastLoop(); $__empty_1 = false; ?>
<?php echo e($name); ?>: <?php echo $value; ?>
<?php endforeach; $__env->popLoop(); $loop = $__env->getLastLoop(); if ($__empty_1): ?>
No routing data available.
<?php endif; ?>
## Route Parameters
<?php if($routeParametersContext = $exception->applicationRouteParametersContext()): ?>
<?php echo $routeParametersContext; ?>
<?php else: ?>
No route parameter data available.
<?php endif; ?>
## Database Queries
<?php $__empty_1 = true; $__currentLoopData = $exception->applicationQueries(); $__env->addLoop($__currentLoopData); foreach($__currentLoopData as ['connectionName' => $connectionName, 'sql' => $sql, 'time' => $time]): $__env->incrementLoopIndices(); $loop = $__env->getLastLoop(); $__empty_1 = false; ?>
* <?php echo e($connectionName); ?> - <?php echo $sql; ?> (<?php echo e($time); ?> ms)
<?php endforeach; $__env->popLoop(); $loop = $__env->getLastLoop(); if ($__empty_1): ?>
No database queries detected.
<?php endif; ?>
<?php /**PATH F:\Sempro TA\project\Laravel\TA\vendor\laravel\framework\src\Illuminate\Foundation\resources\exceptions\renderer\markdown.blade.php ENDPATH**/ ?>

View File

@ -1,57 +0,0 @@
<?php $attributes ??= new \Illuminate\View\ComponentAttributeBag;
$__newAttributes = [];
$__propNames = \Illuminate\View\ComponentAttributeBag::extractPropNames((['code', 'highlightedLine']));
foreach ($attributes->all() as $__key => $__value) {
if (in_array($__key, $__propNames)) {
$$__key = $$__key ?? $__value;
} else {
$__newAttributes[$__key] = $__value;
}
}
$attributes = new \Illuminate\View\ComponentAttributeBag($__newAttributes);
unset($__propNames);
unset($__newAttributes);
foreach (array_filter((['code', 'highlightedLine']), 'is_string', ARRAY_FILTER_USE_KEY) as $__key => $__value) {
$$__key = $$__key ?? $__value;
}
$__defined_vars = get_defined_vars();
foreach ($attributes->all() as $__key => $__value) {
if (array_key_exists($__key, $__defined_vars)) unset($$__key);
}
unset($__defined_vars, $__key, $__value); ?>
<div
class="text-sm rounded-b-lg bg-neutral-50 border-t border-neutral-100 dark:bg-neutral-900 dark:border-white/10"
<?php echo e($attributes); ?>
>
<?php if (isset($component)) { $__componentOriginal12cb286571f553eebcbe98210b217f94 = $component; } ?>
<?php if (isset($attributes)) { $__attributesOriginal12cb286571f553eebcbe98210b217f94 = $attributes; } ?>
<?php $component = Illuminate\View\AnonymousComponent::resolve(['view' => 'laravel-exceptions-renderer::components.syntax-highlight','data' => ['code' => $code,'language' => 'php','editor' => true,'startingLine' => max(1, $highlightedLine - 5),'highlightedLine' => min(5, $highlightedLine - 1),'class' => 'overflow-x-auto']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? $attributes->all() : [])); ?>
<?php $component->withName('laravel-exceptions-renderer::syntax-highlight'); ?>
<?php if ($component->shouldRender()): ?>
<?php $__env->startComponent($component->resolveView(), $component->data()); ?>
<?php if (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag): ?>
<?php $attributes = $attributes->except(\Illuminate\View\AnonymousComponent::ignoredParameterNames()); ?>
<?php endif; ?>
<?php $component->withAttributes(['code' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($code),'language' => 'php','editor' => true,'starting-line' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(max(1, $highlightedLine - 5)),'highlighted-line' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(min(5, $highlightedLine - 1)),'class' => 'overflow-x-auto']); ?>
<?php echo $__env->renderComponent(); ?>
<?php endif; ?>
<?php if (isset($__attributesOriginal12cb286571f553eebcbe98210b217f94)): ?>
<?php $attributes = $__attributesOriginal12cb286571f553eebcbe98210b217f94; ?>
<?php unset($__attributesOriginal12cb286571f553eebcbe98210b217f94); ?>
<?php endif; ?>
<?php if (isset($__componentOriginal12cb286571f553eebcbe98210b217f94)): ?>
<?php $component = $__componentOriginal12cb286571f553eebcbe98210b217f94; ?>
<?php unset($__componentOriginal12cb286571f553eebcbe98210b217f94); ?>
<?php endif; ?>
</div>
<?php /**PATH F:\Sempro TA\project\Laravel\TA\vendor\laravel\framework\src\Illuminate\Foundation\resources\exceptions\renderer\components\frame-code.blade.php ENDPATH**/ ?>

View File

@ -410,6 +410,14 @@
<div class="sidebar-note">
Monitoring kehadiran kampus aktif Senin - Jumat dan reset otomatis tiap minggu.
</div>
<!-- Logout Button -->
<form method="POST" action="<?php echo e(route('logout')); ?>" style="margin-top: auto; padding-top: 14px; border-top: 1px solid rgba(229, 231, 235, 0.18);">
<?php echo csrf_field(); ?>
<button type="submit" style="width: 100%; border: 1px solid #e5757b; background: #fff3f3; color: #c2410c; border-radius: 12px; padding: 11px 14px; font-weight: 700; cursor: pointer; transition: all 0.2s ease;">
Logout
</button>
</form>
</aside>
<section class="content">

View File

@ -1,47 +0,0 @@
<?php if($paginator->hasPages()): ?>
<nav>
<ul class="pagination">
<?php if($paginator->onFirstPage()): ?>
<li class="page-item disabled" aria-disabled="true" aria-label="<?php echo app('translator')->get('pagination.previous'); ?>">
<span class="page-link" aria-hidden="true">&lsaquo;</span>
</li>
<?php else: ?>
<li class="page-item">
<a class="page-link" href="<?php echo e($paginator->previousPageUrl()); ?>" rel="prev" aria-label="<?php echo app('translator')->get('pagination.previous'); ?>">&lsaquo;</a>
</li>
<?php endif; ?>
<?php $__currentLoopData = $elements; $__env->addLoop($__currentLoopData); foreach($__currentLoopData as $element): $__env->incrementLoopIndices(); $loop = $__env->getLastLoop(); ?>
<?php if(is_string($element)): ?>
<li class="page-item disabled" aria-disabled="true"><span class="page-link"><?php echo e($element); ?></span></li>
<?php endif; ?>
<?php if(is_array($element)): ?>
<?php $__currentLoopData = $element; $__env->addLoop($__currentLoopData); foreach($__currentLoopData as $page => $url): $__env->incrementLoopIndices(); $loop = $__env->getLastLoop(); ?>
<?php if($page == $paginator->currentPage()): ?>
<li class="page-item active" aria-current="page"><span class="page-link"><?php echo e($page); ?></span></li>
<?php else: ?>
<li class="page-item"><a class="page-link" href="<?php echo e($url); ?>"><?php echo e($page); ?></a></li>
<?php endif; ?>
<?php endforeach; $__env->popLoop(); $loop = $__env->getLastLoop(); ?>
<?php endif; ?>
<?php endforeach; $__env->popLoop(); $loop = $__env->getLastLoop(); ?>
<?php if($paginator->hasMorePages()): ?>
<li class="page-item">
<a class="page-link" href="<?php echo e($paginator->nextPageUrl()); ?>" rel="next" aria-label="<?php echo app('translator')->get('pagination.next'); ?>">&rsaquo;</a>
</li>
<?php else: ?>
<li class="page-item disabled" aria-disabled="true" aria-label="<?php echo app('translator')->get('pagination.next'); ?>">
<span class="page-link" aria-hidden="true">&rsaquo;</span>
</li>
<?php endif; ?>
</ul>
</nav>
<?php endif; ?>
<?php /**PATH F:\Sempro TA\project\Laravel\TA\vendor\laravel\framework\src\Illuminate\Pagination\resources\views\bootstrap-4.blade.php ENDPATH**/ ?>

View File

@ -1,8 +0,0 @@
<section
<?php echo e($attributes->merge(['class' => "w-full max-w-7xl mx-auto p-4 sm:p-14 border-x border-dashed border-neutral-300 dark:border-white/[9%]"])); ?>
>
<?php echo e($slot); ?>
</section>
<?php /**PATH F:\Sempro TA\project\Laravel\TA\vendor\laravel\framework\src\Illuminate\Foundation\resources\exceptions\renderer\components\section-container.blade.php ENDPATH**/ ?>

View File

@ -1,48 +0,0 @@
<?php $attributes ??= new \Illuminate\View\ComponentAttributeBag;
$__newAttributes = [];
$__propNames = \Illuminate\View\ComponentAttributeBag::extractPropNames((['headers']));
foreach ($attributes->all() as $__key => $__value) {
if (in_array($__key, $__propNames)) {
$$__key = $$__key ?? $__value;
} else {
$__newAttributes[$__key] = $__value;
}
}
$attributes = new \Illuminate\View\ComponentAttributeBag($__newAttributes);
unset($__propNames);
unset($__newAttributes);
foreach (array_filter((['headers']), 'is_string', ARRAY_FILTER_USE_KEY) as $__key => $__value) {
$$__key = $$__key ?? $__value;
}
$__defined_vars = get_defined_vars();
foreach ($attributes->all() as $__key => $__value) {
if (array_key_exists($__key, $__defined_vars)) unset($$__key);
}
unset($__defined_vars, $__key, $__value); ?>
<div class="flex flex-col gap-3">
<h2 class="text-lg font-semibold text-neutral-900 dark:text-white">Headers</h2>
<div class="flex flex-col">
<?php $__currentLoopData = $headers; $__env->addLoop($__currentLoopData); foreach($__currentLoopData as $key => $value): $__env->incrementLoopIndices(); $loop = $__env->getLastLoop(); ?>
<div class="flex max-w-full items-baseline gap-2 h-10 text-sm font-mono">
<div class="uppercase text-neutral-500 dark:text-neutral-400 shrink-0"><?php echo e($key); ?></div>
<div class="min-w-6 grow h-3 border-b-2 border-dotted border-neutral-300 dark:border-white/20"></div>
<div class="truncate text-neutral-900 dark:text-white">
<span data-tippy-content="<?php echo e($value); ?>">
<?php echo e($value); ?>
</span>
</div>
</div>
<?php endforeach; $__env->popLoop(); $loop = $__env->getLastLoop(); ?>
</div>
</div>
<?php /**PATH F:\Sempro TA\project\Laravel\TA\vendor\laravel\framework\src\Illuminate\Foundation\resources\exceptions\renderer\components\request-header.blade.php ENDPATH**/ ?>

View File

@ -1,4 +0,0 @@
<svg width="6" height="10" viewBox="0 0 6 10" fill="none" xmlns="http://www.w3.org/2000/svg" <?php echo e($attributes); ?>>
<path d="M5.125 0.75L0.875 5L5.125 9.25" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
<?php /**PATH F:\Sempro TA\project\Laravel\TA\vendor\laravel\framework\src\Illuminate\Foundation\resources\exceptions\renderer\components\icons\chevron-left.blade.php ENDPATH**/ ?>

Before

Width:  |  Height:  |  Size: 427 B

View File

@ -1,114 +0,0 @@
<?php $attributes ??= new \Illuminate\View\ComponentAttributeBag;
$__newAttributes = [];
$__propNames = \Illuminate\View\ComponentAttributeBag::extractPropNames((['exception']));
foreach ($attributes->all() as $__key => $__value) {
if (in_array($__key, $__propNames)) {
$$__key = $$__key ?? $__value;
} else {
$__newAttributes[$__key] = $__value;
}
}
$attributes = new \Illuminate\View\ComponentAttributeBag($__newAttributes);
unset($__propNames);
unset($__newAttributes);
foreach (array_filter((['exception']), 'is_string', ARRAY_FILTER_USE_KEY) as $__key => $__value) {
$$__key = $$__key ?? $__value;
}
$__defined_vars = get_defined_vars();
foreach ($attributes->all() as $__key => $__value) {
if (array_key_exists($__key, $__defined_vars)) unset($$__key);
}
unset($__defined_vars, $__key, $__value); ?>
<div class="flex flex-col gap-2.5 bg-neutral-50 dark:bg-white/1 border border-neutral-200 dark:border-neutral-800 rounded-xl p-2.5 shadow-xs">
<div class="flex items-center gap-2.5 p-2">
<div class="bg-white dark:bg-neutral-800 border border-neutral-200 dark:border-white/5 rounded-md w-6 h-6 flex items-center justify-center p-1">
<?php if (isset($component)) { $__componentOriginalebc8ec9a834a8051f56913d6745a7050 = $component; } ?>
<?php if (isset($attributes)) { $__attributesOriginalebc8ec9a834a8051f56913d6745a7050 = $attributes; } ?>
<?php $component = Illuminate\View\AnonymousComponent::resolve(['view' => 'laravel-exceptions-renderer::components.icons.alert','data' => ['class' => 'w-2.5 h-2.5 text-blue-500 dark:text-emerald-500']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? $attributes->all() : [])); ?>
<?php $component->withName('laravel-exceptions-renderer::icons.alert'); ?>
<?php if ($component->shouldRender()): ?>
<?php $__env->startComponent($component->resolveView(), $component->data()); ?>
<?php if (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag): ?>
<?php $attributes = $attributes->except(\Illuminate\View\AnonymousComponent::ignoredParameterNames()); ?>
<?php endif; ?>
<?php $component->withAttributes(['class' => 'w-2.5 h-2.5 text-blue-500 dark:text-emerald-500']); ?>
<?php echo $__env->renderComponent(); ?>
<?php endif; ?>
<?php if (isset($__attributesOriginalebc8ec9a834a8051f56913d6745a7050)): ?>
<?php $attributes = $__attributesOriginalebc8ec9a834a8051f56913d6745a7050; ?>
<?php unset($__attributesOriginalebc8ec9a834a8051f56913d6745a7050); ?>
<?php endif; ?>
<?php if (isset($__componentOriginalebc8ec9a834a8051f56913d6745a7050)): ?>
<?php $component = $__componentOriginalebc8ec9a834a8051f56913d6745a7050; ?>
<?php unset($__componentOriginalebc8ec9a834a8051f56913d6745a7050); ?>
<?php endif; ?>
</div>
<h3 class="text-base font-semibold text-neutral-900 dark:text-white">Exception trace</h3>
<?php if($exception->previousExceptions()->isNotEmpty()): ?>
<a href="#previous-exceptions" class="ml-auto text-sm text-neutral-500 dark:text-neutral-400 hover:text-blue-500 dark:hover:text-emerald-500 transition-colors">
<?php echo e($exception->previousExceptions()->count()); ?> previous <?php echo e(\Illuminate\Support\Str::plural('exception', $exception->previousExceptions()->count())); ?>
</a>
<?php endif; ?>
</div>
<div class="flex flex-col gap-1.5">
<?php $__currentLoopData = $exception->frameGroups(); $__env->addLoop($__currentLoopData); foreach($__currentLoopData as $group): $__env->incrementLoopIndices(); $loop = $__env->getLastLoop(); ?>
<?php if($group['is_vendor']): ?>
<?php if (isset($component)) { $__componentOriginal449787012edfba29f0e80f325065fad5 = $component; } ?>
<?php if (isset($attributes)) { $__attributesOriginal449787012edfba29f0e80f325065fad5 = $attributes; } ?>
<?php $component = Illuminate\View\AnonymousComponent::resolve(['view' => 'laravel-exceptions-renderer::components.vendor-frames','data' => ['frames' => $group['frames']]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? $attributes->all() : [])); ?>
<?php $component->withName('laravel-exceptions-renderer::vendor-frames'); ?>
<?php if ($component->shouldRender()): ?>
<?php $__env->startComponent($component->resolveView(), $component->data()); ?>
<?php if (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag): ?>
<?php $attributes = $attributes->except(\Illuminate\View\AnonymousComponent::ignoredParameterNames()); ?>
<?php endif; ?>
<?php $component->withAttributes(['frames' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($group['frames'])]); ?>
<?php echo $__env->renderComponent(); ?>
<?php endif; ?>
<?php if (isset($__attributesOriginal449787012edfba29f0e80f325065fad5)): ?>
<?php $attributes = $__attributesOriginal449787012edfba29f0e80f325065fad5; ?>
<?php unset($__attributesOriginal449787012edfba29f0e80f325065fad5); ?>
<?php endif; ?>
<?php if (isset($__componentOriginal449787012edfba29f0e80f325065fad5)): ?>
<?php $component = $__componentOriginal449787012edfba29f0e80f325065fad5; ?>
<?php unset($__componentOriginal449787012edfba29f0e80f325065fad5); ?>
<?php endif; ?>
<?php else: ?>
<?php $__currentLoopData = $group['frames']; $__env->addLoop($__currentLoopData); foreach($__currentLoopData as $frame): $__env->incrementLoopIndices(); $loop = $__env->getLastLoop(); ?>
<?php if (isset($component)) { $__componentOriginalc7c58c6d16fe849872fb25ad6e9b8407 = $component; } ?>
<?php if (isset($attributes)) { $__attributesOriginalc7c58c6d16fe849872fb25ad6e9b8407 = $attributes; } ?>
<?php $component = Illuminate\View\AnonymousComponent::resolve(['view' => 'laravel-exceptions-renderer::components.frame','data' => ['frame' => $frame]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? $attributes->all() : [])); ?>
<?php $component->withName('laravel-exceptions-renderer::frame'); ?>
<?php if ($component->shouldRender()): ?>
<?php $__env->startComponent($component->resolveView(), $component->data()); ?>
<?php if (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag): ?>
<?php $attributes = $attributes->except(\Illuminate\View\AnonymousComponent::ignoredParameterNames()); ?>
<?php endif; ?>
<?php $component->withAttributes(['frame' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($frame)]); ?>
<?php echo $__env->renderComponent(); ?>
<?php endif; ?>
<?php if (isset($__attributesOriginalc7c58c6d16fe849872fb25ad6e9b8407)): ?>
<?php $attributes = $__attributesOriginalc7c58c6d16fe849872fb25ad6e9b8407; ?>
<?php unset($__attributesOriginalc7c58c6d16fe849872fb25ad6e9b8407); ?>
<?php endif; ?>
<?php if (isset($__componentOriginalc7c58c6d16fe849872fb25ad6e9b8407)): ?>
<?php $component = $__componentOriginalc7c58c6d16fe849872fb25ad6e9b8407; ?>
<?php unset($__componentOriginalc7c58c6d16fe849872fb25ad6e9b8407); ?>
<?php endif; ?>
<?php endforeach; $__env->popLoop(); $loop = $__env->getLastLoop(); ?>
<?php endif; ?>
<?php endforeach; $__env->popLoop(); $loop = $__env->getLastLoop(); ?>
</div>
</div>
<?php /**PATH F:\Sempro TA\project\Laravel\TA\vendor\laravel\framework\src\Illuminate\Foundation\resources\exceptions\renderer\components\trace.blade.php ENDPATH**/ ?>

View File

@ -1,694 +0,0 @@
<!DOCTYPE html>
<html lang="id">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>JTI Monitoring - Politeknik Negeri Jember</title>
<style>
:root {
--bg: #eef2ff;
--panel: rgba(255, 255, 255, 0.9);
--panel-strong: #ffffff;
--text: #1f2937;
--muted: #6b7280;
--primary: #4f46e5;
--primary-2: #7c3aed;
--green: #059669;
--orange: #d97706;
--shadow: 0 24px 70px rgba(31, 41, 55, 0.18);
}
* {
box-sizing: border-box;
margin: 0;
padding: 0;
}
body {
min-height: 100vh;
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
background:
radial-gradient(circle at top left, rgba(99, 102, 241, 0.25), transparent 35%),
radial-gradient(circle at top right, rgba(168, 85, 247, 0.18), transparent 32%),
linear-gradient(135deg, #e0e7ff 0%, #eef2ff 45%, #f8fafc 100%);
color: var(--text);
}
.page-shell {
min-height: 100vh;
padding: 18px;
}
.topbar {
display: flex;
align-items: center;
justify-content: space-between;
gap: 16px;
padding: 14px 18px;
border-radius: 20px;
background: rgba(255, 255, 255, 0.72);
backdrop-filter: blur(14px);
box-shadow: 0 10px 35px rgba(79, 70, 229, 0.08);
position: sticky;
top: 18px;
z-index: 20;
}
.brand {
display: flex;
align-items: center;
gap: 14px;
text-decoration: none;
color: inherit;
}
.brand-mark {
width: 44px;
height: 44px;
border-radius: 14px;
display: grid;
place-items: center;
color: #fff;
font-weight: 800;
background: linear-gradient(135deg, var(--primary) 0%, var(--primary-2) 100%);
box-shadow: 0 12px 24px rgba(79, 70, 229, 0.28);
}
.brand-text h1 {
font-size: 1.05rem;
line-height: 1.1;
color: var(--text);
}
.brand-text p {
margin-top: 2px;
color: var(--muted);
font-size: 0.9rem;
}
.role-switch {
display: inline-flex;
gap: 8px;
padding: 6px;
border-radius: 999px;
background: rgba(226, 232, 240, 0.8);
border: 1px solid rgba(148, 163, 184, 0.25);
}
.role-switch button {
border: 0;
border-radius: 999px;
padding: 11px 18px;
font-weight: 700;
cursor: pointer;
transition: transform 0.2s ease, background 0.2s ease, color 0.2s ease, box-shadow 0.2s ease;
color: #475569;
background: transparent;
}
.role-switch button:hover {
transform: translateY(-1px);
}
.role-switch button.active {
color: #fff;
background: linear-gradient(135deg, var(--primary) 0%, var(--primary-2) 100%);
box-shadow: 0 10px 20px rgba(79, 70, 229, 0.22);
}
.hero {
margin-top: 18px;
border-radius: 28px;
overflow: hidden;
background: linear-gradient(135deg, rgba(79, 70, 229, 0.96) 0%, rgba(124, 58, 237, 0.9) 100%);
color: white;
box-shadow: var(--shadow);
position: relative;
isolation: isolate;
}
.hero::before,
.hero::after {
content: '';
position: absolute;
inset: auto;
border-radius: 999px;
background: rgba(255, 255, 255, 0.14);
filter: blur(2px);
}
.hero::before {
width: 240px;
height: 240px;
top: -110px;
right: -70px;
}
.hero::after {
width: 180px;
height: 180px;
bottom: -80px;
left: -40px;
}
.hero-inner {
position: relative;
z-index: 1;
padding: 42px 32px 38px;
text-align: center;
}
.hero-kicker {
display: inline-flex;
align-items: center;
gap: 8px;
padding: 7px 14px;
border-radius: 999px;
background: rgba(255, 255, 255, 0.15);
font-size: 0.9rem;
letter-spacing: 0.02em;
}
.hero h2 {
margin-top: 18px;
font-size: clamp(2rem, 4vw, 3.5rem);
line-height: 1.05;
}
.hero p {
margin-top: 12px;
font-size: 1.05rem;
opacity: 0.95;
}
.content {
margin-top: 18px;
border-radius: 28px;
background: var(--panel);
backdrop-filter: blur(16px);
box-shadow: var(--shadow);
overflow: hidden;
}
.section-head {
display: flex;
align-items: center;
justify-content: space-between;
gap: 16px;
padding: 22px 26px;
background: linear-gradient(135deg, rgba(79, 70, 229, 0.1), rgba(124, 58, 237, 0.08));
border-bottom: 1px solid rgba(148, 163, 184, 0.2);
}
.section-head h3 {
font-size: 1.45rem;
color: var(--text);
}
.section-head span {
color: var(--muted);
font-size: 0.95rem;
}
.role-pane {
display: none;
padding: 26px;
animation: fadeIn 0.35s ease;
}
.role-pane.active {
display: block;
}
.cards {
display: grid;
grid-template-columns: repeat(2, minmax(0, 1fr));
gap: 20px;
}
.prodi-groups {
display: grid;
gap: 22px;
}
.prodi-group {
border-radius: 20px;
border: 1px solid rgba(148, 163, 184, 0.2);
background: rgba(255, 255, 255, 0.7);
padding: 18px;
}
.prodi-head {
display: flex;
align-items: center;
justify-content: space-between;
gap: 12px;
margin-bottom: 14px;
padding-bottom: 10px;
border-bottom: 1px dashed rgba(148, 163, 184, 0.35);
}
.prodi-title {
font-size: 1.05rem;
font-weight: 800;
color: #1e293b;
}
.prodi-count {
display: inline-flex;
align-items: center;
border-radius: 999px;
padding: 6px 10px;
font-size: 0.78rem;
font-weight: 800;
color: #fff;
background: linear-gradient(135deg, var(--primary), var(--primary-2));
}
.bagian-groups {
display: grid;
gap: 22px;
}
.bagian-group {
border-radius: 20px;
border: 1px solid rgba(148, 163, 184, 0.2);
background: rgba(255, 255, 255, 0.7);
padding: 18px;
}
.bagian-head {
display: flex;
align-items: center;
justify-content: space-between;
gap: 12px;
margin-bottom: 14px;
padding-bottom: 10px;
border-bottom: 1px dashed rgba(148, 163, 184, 0.35);
}
.bagian-title {
font-size: 1.05rem;
font-weight: 800;
color: #1e293b;
}
.bagian-count {
display: inline-flex;
align-items: center;
border-radius: 999px;
padding: 6px 10px;
font-size: 0.78rem;
font-weight: 800;
color: #fff;
background: linear-gradient(135deg, var(--green), #14b8a6);
}
.card {
position: relative;
overflow: hidden;
border-radius: 24px;
padding: 22px;
background: var(--panel-strong);
border: 1px solid rgba(148, 163, 184, 0.16);
box-shadow: 0 14px 34px rgba(15, 23, 42, 0.08);
display: flex;
gap: 18px;
align-items: flex-start;
}
.card::before {
content: '';
position: absolute;
inset: 0 auto auto 0;
width: 100%;
height: 4px;
background: linear-gradient(90deg, var(--primary), var(--primary-2));
}
.avatar {
width: 84px;
height: 84px;
border-radius: 50%;
flex: 0 0 auto;
display: grid;
place-items: center;
color: #fff;
font-size: 1.5rem;
font-weight: 800;
background-image: linear-gradient(135deg, var(--primary) 0%, var(--primary-2) 100%);
box-shadow: 0 12px 26px rgba(79, 70, 229, 0.28);
background-size: cover;
background-position: center;
overflow: hidden;
}
.avatar.teknisi {
background-image: linear-gradient(135deg, #059669 0%, #10b981 100%);
box-shadow: 0 12px 26px rgba(5, 150, 105, 0.25);
}
.avatar-placeholder {
display: grid;
place-items: center;
width: 100%;
height: 100%;
background-image: linear-gradient(135deg, var(--primary) 0%, var(--primary-2) 100%);
color: #fff;
font-size: 1.5rem;
font-weight: 800;
}
.avatar.teknisi .avatar-placeholder {
background-image: linear-gradient(135deg, #059669 0%, #10b981 100%);
}
.card-body {
flex: 1;
min-width: 0;
}
.card-title {
font-size: 1.15rem;
font-weight: 800;
line-height: 1.35;
color: var(--text);
}
.card-meta {
margin-top: 8px;
display: inline-flex;
align-items: center;
gap: 8px;
padding: 8px 12px;
border-radius: 999px;
font-size: 0.88rem;
font-weight: 700;
color: #fff;
}
.card-meta.dosen {
background: linear-gradient(135deg, var(--primary), var(--primary-2));
}
.card-meta.teknisi {
background: linear-gradient(135deg, var(--green), #14b8a6);
}
.detail-list {
margin-top: 16px;
display: grid;
gap: 10px;
}
.detail {
display: grid;
grid-template-columns: 84px 1fr;
gap: 12px;
align-items: start;
padding: 11px 14px;
border-radius: 14px;
background: #f8fafc;
border: 1px solid rgba(148, 163, 184, 0.18);
}
.detail-label {
color: #64748b;
font-weight: 700;
font-size: 0.92rem;
}
.detail-value {
color: var(--text);
font-weight: 600;
word-break: break-word;
}
.empty-state {
margin-top: 18px;
padding: 24px;
border-radius: 20px;
background: rgba(255, 255, 255, 0.7);
border: 1px dashed rgba(100, 116, 139, 0.3);
color: var(--muted);
}
.footer-note {
padding: 0 26px 26px;
color: var(--muted);
font-size: 0.92rem;
}
@keyframes fadeIn {
from {
opacity: 0;
transform: translateY(10px);
}
to {
opacity: 1;
transform: translateY(0);
}
}
@media (max-width: 900px) {
.topbar {
flex-direction: column;
align-items: stretch;
}
.role-switch {
width: 100%;
justify-content: center;
}
.cards {
grid-template-columns: 1fr;
}
}
@media (max-width: 640px) {
.page-shell {
padding: 12px;
}
.hero-inner,
.role-pane,
.section-head,
.footer-note {
padding-left: 16px;
padding-right: 16px;
}
.card {
flex-direction: column;
align-items: center;
text-align: center;
}
.detail {
grid-template-columns: 1fr;
text-align: left;
}
.detail-label {
font-size: 0.84rem;
text-transform: uppercase;
letter-spacing: 0.03em;
}
}
</style>
</head>
<body>
<div class="page-shell">
<header class="topbar">
<a class="brand" href="/">
<div class="brand-mark">JTI</div>
<div class="brand-text">
<h1>Politeknik Negeri Jember</h1>
<p>Dashboard data dosen dan teknisi</p>
</div>
</a>
<div class="role-switch" aria-label="Pilih role tampilan">
<button id="btnDosen" class="active" type="button" onclick="showRole('dosen')">Dosen</button>
<button id="btnTeknisi" type="button" onclick="showRole('teknisi')">Teknisi</button>
</div>
</header>
<section class="hero">
<div class="hero-inner">
<div class="hero-kicker">Jurusan Teknologi Informasi</div>
<h2 id="heroTitle">Dosen JTI</h2>
</div>
</section>
<main class="content">
<div class="section-head">
<div>
<h3 id="sectionTitle">Program Studi Dosen</h3>
<span id="sectionDesc">Daftar dosen aktif berdasarkan program studi.</span>
</div>
</div>
<?php
$makeInitial = static function (string $nama): string {
$parts = preg_split('/\s+/', trim($nama)) ?: [];
$initials = '';
foreach ($parts as $part) {
if ($part === '') {
continue;
}
$initials .= strtoupper(substr($part, 0, 1));
if (strlen($initials) >= 2) {
break;
}
}
return $initials !== '' ? $initials : 'NA';
};
$resolveFoto = static function (?string $foto): ?string {
$foto = trim((string) $foto);
if ($foto === '') return null;
if (preg_match('~^(https?://|data:|//)~i', $foto)) return $foto;
if (str_starts_with($foto, '/')) return $foto;
return asset($foto);
};
?>
<section id="dosenPane" class="role-pane active">
<?php
$dosenByProdi = $dosen
->sortBy([['prodi', 'asc'], ['nama', 'asc']])
->groupBy(function ($item) {
$prodi = trim((string) ($item->prodi ?? ''));
return $prodi !== '' ? $prodi : 'Prodi Belum Ditentukan';
});
?>
<?php if($dosenByProdi->isEmpty()): ?>
<div class="empty-state">Belum ada data dosen di database.</div>
<?php else: ?>
<div class="prodi-groups">
<?php $__currentLoopData = $dosenByProdi; $__env->addLoop($__currentLoopData); foreach($__currentLoopData as $prodiName => $prodiItems): $__env->incrementLoopIndices(); $loop = $__env->getLastLoop(); ?>
<section class="prodi-group">
<header class="prodi-head">
<h4 class="prodi-title"><?php echo e($prodiName); ?></h4>
<span class="prodi-count"><?php echo e($prodiItems->count()); ?> Dosen</span>
</header>
<div class="cards">
<?php $__currentLoopData = $prodiItems; $__env->addLoop($__currentLoopData); foreach($__currentLoopData as $item): $__env->incrementLoopIndices(); $loop = $__env->getLastLoop(); ?>
<article class="card">
<?php
$fotoUrl = $resolveFoto($item->foto);
?>
<div class="avatar" <?php if($fotoUrl): ?> style="background-image: url('<?php echo e($fotoUrl); ?>')" <?php endif; ?>>
<?php if(!$fotoUrl): ?>
<div class="avatar-placeholder"><?php echo e($makeInitial($item->nama)); ?></div>
<?php endif; ?>
</div>
<div class="card-body">
<div class="card-title"><?php echo e($item->nama); ?></div>
<div class="card-meta dosen">Dosen</div>
<div class="detail-list">
<div class="detail"><div class="detail-label">NIP</div><div class="detail-value"><?php echo e($item->nip ?? '-'); ?></div></div>
<div class="detail"><div class="detail-label">NIDN</div><div class="detail-value"><?php echo e($item->nidn ?? '-'); ?></div></div>
<div class="detail"><div class="detail-label">Lokasi</div><div class="detail-value">Gedung JTI Lt. 1</div></div>
</div>
</div>
</article>
<?php endforeach; $__env->popLoop(); $loop = $__env->getLastLoop(); ?>
</div>
</section>
<?php endforeach; $__env->popLoop(); $loop = $__env->getLastLoop(); ?>
</div>
<?php endif; ?>
</section>
<section id="teknisiPane" class="role-pane">
<?php
$teknisiByBagian = $teknisi
->sortBy([['bagian', 'asc'], ['nama', 'asc']])
->groupBy(function ($item) {
$bagian = trim((string) ($item->bagian ?? ''));
return $bagian !== '' ? $bagian : 'Bagian Belum Ditentukan';
});
?>
<?php if($teknisiByBagian->isEmpty()): ?>
<div class="empty-state">Belum ada data teknisi/staff di database.</div>
<?php else: ?>
<div class="bagian-groups">
<?php $__currentLoopData = $teknisiByBagian; $__env->addLoop($__currentLoopData); foreach($__currentLoopData as $bagianName => $bagianItems): $__env->incrementLoopIndices(); $loop = $__env->getLastLoop(); ?>
<section class="bagian-group">
<header class="bagian-head">
<h4 class="bagian-title"><?php echo e($bagianName); ?></h4>
<span class="bagian-count"><?php echo e($bagianItems->count()); ?> Orang</span>
</header>
<div class="cards">
<?php $__currentLoopData = $bagianItems; $__env->addLoop($__currentLoopData); foreach($__currentLoopData as $item): $__env->incrementLoopIndices(); $loop = $__env->getLastLoop(); ?>
<article class="card">
<?php
$fotoUrl = $resolveFoto($item->foto);
?>
<div class="avatar teknisi" <?php if($fotoUrl): ?> style="background-image: url('<?php echo e($fotoUrl); ?>')" <?php endif; ?>>
<?php if(!$fotoUrl): ?>
<div class="avatar-placeholder"><?php echo e($makeInitial($item->nama)); ?></div>
<?php endif; ?>
</div>
<div class="card-body">
<div class="card-title"><?php echo e($item->nama); ?></div>
<div class="card-meta teknisi"><?php echo e(ucfirst($item->role ?? 'staff')); ?></div>
<div class="detail-list">
<div class="detail"><div class="detail-label">NIP</div><div class="detail-value"><?php echo e($item->nip ?? '-'); ?></div></div>
<div class="detail"><div class="detail-label">NIDN</div><div class="detail-value"><?php echo e($item->nidn ?? '-'); ?></div></div>
<div class="detail"><div class="detail-label">Lokasi</div><div class="detail-value">Gedung JTI Lt. 1</div></div>
</div>
</div>
</article>
<?php endforeach; $__env->popLoop(); $loop = $__env->getLastLoop(); ?>
</div>
</section>
<?php endforeach; $__env->popLoop(); $loop = $__env->getLastLoop(); ?>
</div>
<?php endif; ?>
</section>
<div class="footer-note">
</div>
</main>
</div>
<script>
function showRole(role) {
const dosenPane = document.getElementById('dosenPane');
const teknisiPane = document.getElementById('teknisiPane');
const btnDosen = document.getElementById('btnDosen');
const btnTeknisi = document.getElementById('btnTeknisi');
const heroTitle = document.getElementById('heroTitle');
const sectionTitle = document.getElementById('sectionTitle');
const sectionDesc = document.getElementById('sectionDesc');
const isDosen = role === 'dosen';
dosenPane.classList.toggle('active', isDosen);
teknisiPane.classList.toggle('active', !isDosen);
btnDosen.classList.toggle('active', isDosen);
btnTeknisi.classList.toggle('active', !isDosen);
heroTitle.textContent = isDosen ? 'Dosen JTI' : 'Teknisi JTI';
sectionTitle.textContent = isDosen ? 'Program Studi Dosen' : 'Teknisi dan Staff';
sectionDesc.textContent = isDosen
? 'Daftar dosen aktif berdasarkan program studi.'
: 'Daftar teknisi dan staff aktif berdasarkan bagian.';
}
</script>
</body>
</html>
<?php /**PATH F:\Sempro TA\project\Laravel\TA\resources\views\dashboard.blade.php ENDPATH**/ ?>

View File

@ -1,91 +0,0 @@
<?php if($paginator->hasPages()): ?>
<nav class="d-flex justify-items-center justify-content-between">
<div class="d-flex justify-content-between flex-fill d-sm-none">
<ul class="pagination">
<?php if($paginator->onFirstPage()): ?>
<li class="page-item disabled" aria-disabled="true">
<span class="page-link"><?php echo app('translator')->get('pagination.previous'); ?></span>
</li>
<?php else: ?>
<li class="page-item">
<a class="page-link" href="<?php echo e($paginator->previousPageUrl()); ?>" rel="prev"><?php echo app('translator')->get('pagination.previous'); ?></a>
</li>
<?php endif; ?>
<?php if($paginator->hasMorePages()): ?>
<li class="page-item">
<a class="page-link" href="<?php echo e($paginator->nextPageUrl()); ?>" rel="next"><?php echo app('translator')->get('pagination.next'); ?></a>
</li>
<?php else: ?>
<li class="page-item disabled" aria-disabled="true">
<span class="page-link"><?php echo app('translator')->get('pagination.next'); ?></span>
</li>
<?php endif; ?>
</ul>
</div>
<div class="d-none flex-sm-fill d-sm-flex align-items-sm-center justify-content-sm-between">
<div class="small text-muted">
<?php echo __('Showing'); ?>
<span class="fw-semibold"><?php echo e($paginator->firstItem()); ?></span>
<?php echo __('to'); ?>
<span class="fw-semibold"><?php echo e($paginator->lastItem()); ?></span>
<?php echo __('of'); ?>
<span class="fw-semibold"><?php echo e($paginator->total()); ?></span>
<?php echo __('results'); ?>
</div>
<div>
<ul class="pagination">
<?php if($paginator->onFirstPage()): ?>
<li class="page-item disabled" aria-disabled="true" aria-label="<?php echo app('translator')->get('pagination.previous'); ?>">
<span class="page-link" aria-hidden="true">&lsaquo;</span>
</li>
<?php else: ?>
<li class="page-item">
<a class="page-link" href="<?php echo e($paginator->previousPageUrl()); ?>" rel="prev" aria-label="<?php echo app('translator')->get('pagination.previous'); ?>">&lsaquo;</a>
</li>
<?php endif; ?>
<?php $__currentLoopData = $elements; $__env->addLoop($__currentLoopData); foreach($__currentLoopData as $element): $__env->incrementLoopIndices(); $loop = $__env->getLastLoop(); ?>
<?php if(is_string($element)): ?>
<li class="page-item disabled" aria-disabled="true"><span class="page-link"><?php echo e($element); ?></span></li>
<?php endif; ?>
<?php if(is_array($element)): ?>
<?php $__currentLoopData = $element; $__env->addLoop($__currentLoopData); foreach($__currentLoopData as $page => $url): $__env->incrementLoopIndices(); $loop = $__env->getLastLoop(); ?>
<?php if($page == $paginator->currentPage()): ?>
<li class="page-item active" aria-current="page"><span class="page-link"><?php echo e($page); ?></span></li>
<?php else: ?>
<li class="page-item"><a class="page-link" href="<?php echo e($url); ?>"><?php echo e($page); ?></a></li>
<?php endif; ?>
<?php endforeach; $__env->popLoop(); $loop = $__env->getLastLoop(); ?>
<?php endif; ?>
<?php endforeach; $__env->popLoop(); $loop = $__env->getLastLoop(); ?>
<?php if($paginator->hasMorePages()): ?>
<li class="page-item">
<a class="page-link" href="<?php echo e($paginator->nextPageUrl()); ?>" rel="next" aria-label="<?php echo app('translator')->get('pagination.next'); ?>">&rsaquo;</a>
</li>
<?php else: ?>
<li class="page-item disabled" aria-disabled="true" aria-label="<?php echo app('translator')->get('pagination.next'); ?>">
<span class="page-link" aria-hidden="true">&rsaquo;</span>
</li>
<?php endif; ?>
</ul>
</div>
</div>
</nav>
<?php endif; ?>
<?php /**PATH F:\Sempro TA\project\Laravel\TA\vendor\laravel\framework\src\Illuminate\Pagination\resources\views\bootstrap-5.blade.php ENDPATH**/ ?>

View File

@ -1,5 +0,0 @@
<?php $__env->startSection('title', __('Unauthorized')); ?>
<?php $__env->startSection('code', '401'); ?>
<?php $__env->startSection('message', __('Unauthorized')); ?>
<?php echo $__env->make('errors::minimal', array_diff_key(get_defined_vars(), ['__data' => 1, '__path' => 1]))->render(); ?><?php /**PATH F:\Sempro TA\project\Laravel\TA\vendor\laravel\framework\src\Illuminate\Foundation\Exceptions\views\401.blade.php ENDPATH**/ ?>

View File

@ -1,115 +0,0 @@
<?php $attributes ??= new \Illuminate\View\ComponentAttributeBag;
$__newAttributes = [];
$__propNames = \Illuminate\View\ComponentAttributeBag::extractPropNames((['title', 'markdown']));
foreach ($attributes->all() as $__key => $__value) {
if (in_array($__key, $__propNames)) {
$$__key = $$__key ?? $__value;
} else {
$__newAttributes[$__key] = $__value;
}
}
$attributes = new \Illuminate\View\ComponentAttributeBag($__newAttributes);
unset($__propNames);
unset($__newAttributes);
foreach (array_filter((['title', 'markdown']), 'is_string', ARRAY_FILTER_USE_KEY) as $__key => $__value) {
$$__key = $$__key ?? $__value;
}
$__defined_vars = get_defined_vars();
foreach ($attributes->all() as $__key => $__value) {
if (array_key_exists($__key, $__defined_vars)) unset($$__key);
}
unset($__defined_vars, $__key, $__value); ?>
<script>
const markdown = <?php echo e(Illuminate\Support\Js::from($markdown)); ?>
</script>
<div
class="flex items-center justify-between"
x-data="{
copied: false,
async copyToClipboard() {
try {
await window.copyToClipboard(markdown);
this.copied = true;
setTimeout(() => { this.copied = false }, 3000);
} catch (err) {
console.error('Failed to copy the markdown: ', err);
}
}
}"
>
<div class="flex items-center gap-2 h-[56px]">
<div class="w-[18px] h-[18px] flex items-center justify-center bg-rose-500 rounded-md">
<svg width="2" height="10" class="text-white" viewBox="0 0 2 10" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M1.00006 6.3188C1.41416 6.3188 1.75006 5.98295 1.75006 5.56885V1.43115C1.75006 1.01705 1.41416 0.681152 1.00006 0.681152C0.585961 0.681152 0.250061 1.01705 0.250061 1.43115V5.56885C0.250061 5.98295 0.585961 6.3188 1.00006 6.3188Z" fill="currentColor" />
<path d="M1.00006 9.41699C1.55235 9.41699 2.00007 8.96929 2.00007 8.41699C2.00007 7.86469 1.55235 7.41699 1.00006 7.41699C0.447781 7.41699 6.10352e-05 7.86469 6.10352e-05 8.41699C6.10352e-05 8.96929 0.447781 9.41699 1.00006 9.41699Z" fill="currentColor "/>
</svg>
</div>
<div class="font-medium text-sm text-neutral-900 dark:text-white">
<?php echo e($title); ?>
</div>
</div>
<button
x-cloak
class="<?php echo \Illuminate\Support\Arr::toCssClasses([
"text-sm rounded-md border px-3 h-8 flex items-center gap-2 transition-colors duration-200 ease-in-out cursor-pointer shadow-xs",
"text-neutral-600 dark:text-neutral-400 bg-white/5 border-neutral-200 hover:bg-neutral-100 dark:bg-white/5 dark:border-white/10 dark:hover:bg-white/10",
]); ?>"
@click="copyToClipboard()"
>
<?php if (isset($component)) { $__componentOriginal8894ff2e6e6bd543865d608162806b35 = $component; } ?>
<?php if (isset($attributes)) { $__attributesOriginal8894ff2e6e6bd543865d608162806b35 = $attributes; } ?>
<?php $component = Illuminate\View\AnonymousComponent::resolve(['view' => 'laravel-exceptions-renderer::components.icons.copy','data' => ['class' => 'w-3 h-3','xShow' => '!copied']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? $attributes->all() : [])); ?>
<?php $component->withName('laravel-exceptions-renderer::icons.copy'); ?>
<?php if ($component->shouldRender()): ?>
<?php $__env->startComponent($component->resolveView(), $component->data()); ?>
<?php if (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag): ?>
<?php $attributes = $attributes->except(\Illuminate\View\AnonymousComponent::ignoredParameterNames()); ?>
<?php endif; ?>
<?php $component->withAttributes(['class' => 'w-3 h-3','x-show' => '!copied']); ?>
<?php echo $__env->renderComponent(); ?>
<?php endif; ?>
<?php if (isset($__attributesOriginal8894ff2e6e6bd543865d608162806b35)): ?>
<?php $attributes = $__attributesOriginal8894ff2e6e6bd543865d608162806b35; ?>
<?php unset($__attributesOriginal8894ff2e6e6bd543865d608162806b35); ?>
<?php endif; ?>
<?php if (isset($__componentOriginal8894ff2e6e6bd543865d608162806b35)): ?>
<?php $component = $__componentOriginal8894ff2e6e6bd543865d608162806b35; ?>
<?php unset($__componentOriginal8894ff2e6e6bd543865d608162806b35); ?>
<?php endif; ?>
<?php if (isset($component)) { $__componentOriginal394a4f59b8774713925fcf456ba90b57 = $component; } ?>
<?php if (isset($attributes)) { $__attributesOriginal394a4f59b8774713925fcf456ba90b57 = $attributes; } ?>
<?php $component = Illuminate\View\AnonymousComponent::resolve(['view' => 'laravel-exceptions-renderer::components.icons.check','data' => ['class' => 'w-3 h-3 text-emerald-500','xShow' => 'copied']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? $attributes->all() : [])); ?>
<?php $component->withName('laravel-exceptions-renderer::icons.check'); ?>
<?php if ($component->shouldRender()): ?>
<?php $__env->startComponent($component->resolveView(), $component->data()); ?>
<?php if (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag): ?>
<?php $attributes = $attributes->except(\Illuminate\View\AnonymousComponent::ignoredParameterNames()); ?>
<?php endif; ?>
<?php $component->withAttributes(['class' => 'w-3 h-3 text-emerald-500','x-show' => 'copied']); ?>
<?php echo $__env->renderComponent(); ?>
<?php endif; ?>
<?php if (isset($__attributesOriginal394a4f59b8774713925fcf456ba90b57)): ?>
<?php $attributes = $__attributesOriginal394a4f59b8774713925fcf456ba90b57; ?>
<?php unset($__attributesOriginal394a4f59b8774713925fcf456ba90b57); ?>
<?php endif; ?>
<?php if (isset($__componentOriginal394a4f59b8774713925fcf456ba90b57)): ?>
<?php $component = $__componentOriginal394a4f59b8774713925fcf456ba90b57; ?>
<?php unset($__componentOriginal394a4f59b8774713925fcf456ba90b57); ?>
<?php endif; ?>
<span x-text="copied ? 'Copied to clipboard' : 'Copy as Markdown'"></span>
</button>
</div>
<?php /**PATH F:\Sempro TA\project\Laravel\TA\vendor\laravel\framework\src\Illuminate\Foundation\resources\exceptions\renderer\components\topbar.blade.php ENDPATH**/ ?>

View File

@ -32,7 +32,7 @@
.page-shell {
min-height: 100vh;
padding: 18px;
padding: 0 18px 18px 18px;
display: grid;
grid-template-columns: 260px 1fr;
gap: 18px;
@ -44,17 +44,14 @@
gap: 12px;
height: fit-content;
position: sticky;
top: 18px;
top: 0;
transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1);
opacity: 1;
transform: translateX(0);
}
.sidebar.hidden {
opacity: 0;
transform: translateX(-100%);
pointer-events: none;
visibility: hidden;
display: none;
}
.page-shell.sidebar-hidden {

View File

@ -1,263 +0,0 @@
<!DOCTYPE html>
<html lang="id">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Edit Dosen - JTI</title>
<style>
:root { --primary: #4f46e5; --success: #10b981; --orange: #d97706; --text: #1f2937; --muted: #6b7280; }
* { margin: 0; padding: 0; box-sizing: border-box; }
body { font-family: 'Segoe UI', sans-serif; background: linear-gradient(135deg, #e0e7ff 0%, #eef2ff 100%); min-height: 100vh; color: var(--text); }
.container { max-width: 900px; margin: 20px auto; padding: 0 16px; }
.header { display: flex; justify-content: space-between; align-items: center; padding: 16px; background: white; border-radius: 16px; margin-bottom: 16px; box-shadow: 0 2px 8px rgba(0,0,0,0.1); }
.header h1 { font-size: 20px; font-weight: 900; }
.btn { padding: 10px 16px; border-radius: 8px; border: none; cursor: pointer; font-weight: 700; text-decoration: none; display: inline-block; transition: all 0.2s; }
.btn:hover { transform: translateY(-2px); }
.btn-ghost { background: #e2e8f0; color: #334155; }
.btn-success { background: var(--success); color: white; }
.card { background: white; border-radius: 16px; padding: 32px; box-shadow: 0 4px 16px rgba(0,0,0,0.08); }
.form-layout { display: grid; grid-template-columns: 280px 1fr; gap: 40px; }
.photo-box { text-align: center; }
.photo-preview { width: 100%; aspect-ratio: 3/4; background: linear-gradient(135deg, var(--primary), #7c3aed); border-radius: 16px; display: flex; align-items: center; justify-content: center; color: white; font-size: 48px; font-weight: 900; margin-bottom: 16px; overflow: hidden; position: relative; }
.photo-preview img { width: 100%; height: 100%; object-fit: cover; position: absolute; }
.photo-initial { position: relative; z-index: 1; }
.file-input { display: none; }
.file-label { display: block; padding: 12px; border: 2px dashed var(--primary); border-radius: 12px; cursor: pointer; color: var(--primary); font-weight: 700; margin-bottom: 12px; transition: all 0.2s; }
.file-label:hover { background: rgba(79, 70, 229, 0.05); border-color: #7c3aed; }
.form-group { margin-bottom: 24px; }
.form-row { display: grid; grid-template-columns: 1fr 1fr; gap: 20px; }
.form-row.full { grid-column: 1 / -1; }
label { display: block; margin-bottom: 8px; font-weight: 700; color: #475569; font-size: 14px; }
.required { color: var(--orange); }
input, select { width: 100%; padding: 12px; border: 1.5px solid #cbd5e1; border-radius: 10px; font-size: 14px; font-family: inherit; }
input:focus, select:focus { outline: none; border-color: var(--primary); background: rgba(79, 70, 229, 0.02); box-shadow: 0 0 0 3px rgba(79, 70, 229, 0.1); }
input.error, select.error { border-color: #ef4444; background: rgba(239, 68, 68, 0.02); }
.error-text { color: #dc2626; font-size: 12px; margin-top: 4px; }
.hint-text { color: #6b7280; font-size: 12px; margin-top: 4px; }
.error-alert { background: #fee2e2; border: 1px solid #fecaca; border-radius: 12px; padding: 16px; margin-bottom: 20px; }
.error-alert strong { color: #7f1d1d; display: block; margin-bottom: 8px; font-weight: 800; }
.error-alert ul { list-style: none; padding-left: 20px; color: #b91c1c; }
.error-alert li { margin-bottom: 4px; }
.form-actions { display: flex; gap: 12px; margin-top: 40px; border-top: 1px solid #e2e8f0; padding-top: 24px; }
.form-actions button, .form-actions a { flex: 1; padding: 12px; border-radius: 8px; border: none; font-weight: 700; cursor: pointer; text-align: center; transition: all 0.2s; }
.form-actions button:disabled { opacity: 0.6; cursor: not-allowed; }
@media (max-width: 800px) {
.form-layout { grid-template-columns: 1fr; }
.form-row { grid-template-columns: 1fr; }
.header { flex-direction: column; gap: 12px; align-items: flex-start; }
}
</style>
</head>
<body>
<?php
$makeInitial = static function (?string $nama): string {
$nama = trim((string) $nama);
if ($nama === '') return '👨‍🏫';
$parts = preg_split('/\s+/', $nama) ?: [];
$initials = '';
foreach ($parts as $part) {
if ($part === '') continue;
$initials .= strtoupper(substr($part, 0, 1));
if (strlen($initials) >= 2) break;
}
return $initials !== '' ? $initials : '👨‍🏫';
};
?>
<div class="container">
<div class="header">
<h1>✏️ Edit Dosen</h1>
<a href="<?php echo e(route('users.dosen')); ?>" class="btn btn-ghost">Kembali</a>
</div>
<div class="card">
<?php if($errors->any()): ?>
<div class="error-alert">
<strong> Validasi gagal:</strong>
<ul>
<?php $__currentLoopData = $errors->all(); $__env->addLoop($__currentLoopData); foreach($__currentLoopData as $error): $__env->incrementLoopIndices(); $loop = $__env->getLastLoop(); ?>
<li><?php echo e($error); ?></li>
<?php endforeach; $__env->popLoop(); $loop = $__env->getLastLoop(); ?>
</ul>
</div>
<?php endif; ?>
<form method="POST" action="<?php echo e(route('dosen.update', $user)); ?>" id="editForm" class="form-layout">
<?php echo csrf_field(); ?>
<?php echo method_field('PUT'); ?>
<div class="photo-box">
<div class="photo-preview" id="photoPreview">
<span id="photoInitial"><?php echo e($makeInitial($user->nama)); ?></span>
<img id="photoImg" style="display: none;" alt="Foto Dosen" />
</div>
<label for="photoFile" class="file-label">📤 Ubah Foto</label>
<input id="photoFile" type="file" accept="image/*" class="file-input">
<input id="fotoUrl" type="text" name="foto" value="<?php echo e(old('foto', $user->foto)); ?>" placeholder="atau URL foto">
<div class="hint-text">URL gambar untuk profil</div>
</div>
<div>
<div class="form-row full">
<div class="form-group">
<label for="nama">Nama Lengkap <span class="required">*</span></label>
<input id="nama" type="text" name="nama" value="<?php echo e(old('nama', $user->nama)); ?>" required class="<?php $__errorArgs = ['nama'];
$__bag = $errors->getBag($__errorArgs[1] ?? 'default');
if ($__bag->has($__errorArgs[0])) :
if (isset($message)) { $__messageOriginal = $message; }
$message = $__bag->first($__errorArgs[0]); ?> error <?php unset($message);
if (isset($__messageOriginal)) { $message = $__messageOriginal; }
endif;
unset($__errorArgs, $__bag); ?>">
<?php $__errorArgs = ['nama'];
$__bag = $errors->getBag($__errorArgs[1] ?? 'default');
if ($__bag->has($__errorArgs[0])) :
if (isset($message)) { $__messageOriginal = $message; }
$message = $__bag->first($__errorArgs[0]); ?><div class="error-text"><?php echo e($message); ?></div><?php unset($message);
if (isset($__messageOriginal)) { $message = $__messageOriginal; }
endif;
unset($__errorArgs, $__bag); ?>
<div class="hint-text">Nama lengkap dosen</div>
</div>
</div>
<div class="form-row">
<div class="form-group">
<label for="nip">NIP</label>
<input id="nip" type="text" name="nip" value="<?php echo e(old('nip', $user->nip)); ?>" placeholder="19850315 200901 1 001" class="<?php $__errorArgs = ['nip'];
$__bag = $errors->getBag($__errorArgs[1] ?? 'default');
if ($__bag->has($__errorArgs[0])) :
if (isset($message)) { $__messageOriginal = $message; }
$message = $__bag->first($__errorArgs[0]); ?> error <?php unset($message);
if (isset($__messageOriginal)) { $message = $__messageOriginal; }
endif;
unset($__errorArgs, $__bag); ?>">
<?php $__errorArgs = ['nip'];
$__bag = $errors->getBag($__errorArgs[1] ?? 'default');
if ($__bag->has($__errorArgs[0])) :
if (isset($message)) { $__messageOriginal = $message; }
$message = $__bag->first($__errorArgs[0]); ?><div class="error-text"><?php echo e($message); ?></div><?php unset($message);
if (isset($__messageOriginal)) { $message = $__messageOriginal; }
endif;
unset($__errorArgs, $__bag); ?>
<div class="hint-text">Nomor Induk Pegawai</div>
</div>
<div class="form-group">
<label for="nidn">NIDN</label>
<input id="nidn" type="text" name="nidn" value="<?php echo e(old('nidn', $user->nidn)); ?>" placeholder="0017058003" class="<?php $__errorArgs = ['nidn'];
$__bag = $errors->getBag($__errorArgs[1] ?? 'default');
if ($__bag->has($__errorArgs[0])) :
if (isset($message)) { $__messageOriginal = $message; }
$message = $__bag->first($__errorArgs[0]); ?> error <?php unset($message);
if (isset($__messageOriginal)) { $message = $__messageOriginal; }
endif;
unset($__errorArgs, $__bag); ?>">
<?php $__errorArgs = ['nidn'];
$__bag = $errors->getBag($__errorArgs[1] ?? 'default');
if ($__bag->has($__errorArgs[0])) :
if (isset($message)) { $__messageOriginal = $message; }
$message = $__bag->first($__errorArgs[0]); ?><div class="error-text"><?php echo e($message); ?></div><?php unset($message);
if (isset($__messageOriginal)) { $message = $__messageOriginal; }
endif;
unset($__errorArgs, $__bag); ?>
<div class="hint-text">Nomor Induk Dosen Nasional</div>
</div>
</div>
<div class="form-row full">
<div class="form-group">
<label for="prodi">Program Studi <span class="required">*</span></label>
<select id="prodi" name="prodi" required class="<?php $__errorArgs = ['prodi'];
$__bag = $errors->getBag($__errorArgs[1] ?? 'default');
if ($__bag->has($__errorArgs[0])) :
if (isset($message)) { $__messageOriginal = $message; }
$message = $__bag->first($__errorArgs[0]); ?> error <?php unset($message);
if (isset($__messageOriginal)) { $message = $__messageOriginal; }
endif;
unset($__errorArgs, $__bag); ?>">
<option value="">-- Pilih Program Studi --</option>
<option value="Manajemen Informatika" <?php if(old('prodi', $user->prodi) === 'Manajemen Informatika'): echo 'selected'; endif; ?>>Manajemen Informatika</option>
<option value="Teknik Informatika" <?php if(old('prodi', $user->prodi) === 'Teknik Informatika'): echo 'selected'; endif; ?>>Teknik Informatika</option>
<option value="Teknik Komputer" <?php if(old('prodi', $user->prodi) === 'Teknik Komputer'): echo 'selected'; endif; ?>>Teknik Komputer</option>
<option value="Teknologi Rekayasa Komputer" <?php if(old('prodi', $user->prodi) === 'Teknologi Rekayasa Komputer'): echo 'selected'; endif; ?>>Teknologi Rekayasa Komputer</option>
</select>
<?php $__errorArgs = ['prodi'];
$__bag = $errors->getBag($__errorArgs[1] ?? 'default');
if ($__bag->has($__errorArgs[0])) :
if (isset($message)) { $__messageOriginal = $message; }
$message = $__bag->first($__errorArgs[0]); ?><div class="error-text"><?php echo e($message); ?></div><?php unset($message);
if (isset($__messageOriginal)) { $message = $__messageOriginal; }
endif;
unset($__errorArgs, $__bag); ?>
<div class="hint-text">Program studi dosen</div>
</div>
</div>
<input type="hidden" name="role" value="dosen">
<div class="form-actions">
<button type="submit" class="btn btn-success" id="submitBtn">💾 Simpan Perubahan</button>
<a href="<?php echo e(route('users.dosen')); ?>" class="btn btn-ghost"> Batal</a>
</div>
</div>
</form>
</div>
</div>
<script>
const photoFile = document.getElementById('photoFile');
const fotoUrl = document.getElementById('fotoUrl');
const photoImg = document.getElementById('photoImg');
const photoInitial = document.getElementById('photoInitial');
const namaInput = document.getElementById('nama');
const editForm = document.getElementById('editForm');
const submitBtn = document.getElementById('submitBtn');
let isSubmitting = false;
editForm.addEventListener('submit', function(e) {
if (isSubmitting) { e.preventDefault(); return false; }
isSubmitting = true;
submitBtn.disabled = true;
submitBtn.textContent = '⏳ Menyimpan...';
});
photoFile.addEventListener('change', (e) => {
const file = e.target.files[0];
if (file) {
const reader = new FileReader();
reader.onload = (event) => {
photoImg.src = event.target.result;
photoImg.style.display = 'block';
photoInitial.style.display = 'none';
fotoUrl.value = event.target.result;
};
reader.readAsDataURL(file);
}
});
fotoUrl.addEventListener('change', (e) => {
const url = e.target.value.trim();
if (url && (url.startsWith('http') || url.startsWith('data:'))) {
photoImg.src = url;
photoImg.style.display = 'block';
photoInitial.style.display = 'none';
} else {
photoImg.style.display = 'none';
photoInitial.style.display = 'block';
}
});
namaInput.addEventListener('input', () => {
const nama = namaInput.value.trim();
if (nama && !photoImg.src) {
const words = nama.split(/\s+/);
const initials = words.slice(0, 2).map(w => w.charAt(0).toUpperCase()).join('');
photoInitial.textContent = initials || '👨‍🏫';
photoInitial.style.display = 'block';
}
});
window.addEventListener('load', () => {
isSubmitting = false;
submitBtn.disabled = false;
submitBtn.textContent = '💾 Simpan Perubahan';
if (fotoUrl.value.trim()) {
fotoUrl.dispatchEvent(new Event('change'));
}
if (namaInput.value.trim()) {
namaInput.dispatchEvent(new Event('input'));
}
});
</script>
</body>
</html><?php /**PATH F:\Sempro TA\project\Laravel\TA\resources\views\Dosen\edit.blade.php ENDPATH**/ ?>

View File

@ -1,11 +0,0 @@
<svg width="10" height="10" viewBox="0 0 10 10" fill="none" xmlns="http://www.w3.org/2000/svg" <?php echo e($attributes); ?>>
<g clip-path="url(#clip0_14732_6105)">
<path d="M9.87466 7.8287L5.92654 0.549947C5.82917 0.369362 5.68068 0.221523 5.49966 0.124947C5.25374 -0.00665839 4.9658 -0.0358401 4.69847 0.0437494C4.43115 0.123339 4.20606 0.305262 4.07216 0.549947L0.124664 7.8287C0.0383472 7.98887 -0.00481098 8.16875 -0.000569449 8.35066C0.00367208 8.53256 0.0551674 8.71024 0.148856 8.86622C0.242546 9.0222 0.375205 9.15112 0.533798 9.24031C0.692391 9.32951 0.871462 9.37591 1.05341 9.37495H8.94591C9.12031 9.37495 9.29203 9.33202 9.44591 9.24995C9.56783 9.18524 9.67572 9.09703 9.76338 8.99041C9.85104 8.8838 9.91672 8.76088 9.95663 8.62876C9.99655 8.49663 10.0099 8.35791 9.99595 8.22059C9.98199 8.08328 9.94036 7.95009 9.87466 7.8287ZM4.99966 8.12495C4.87605 8.12495 4.75521 8.08829 4.65243 8.01962C4.54965 7.95094 4.46954 7.85333 4.42224 7.73912C4.37493 7.62492 4.36256 7.49925 4.38667 7.37802C4.41079 7.25678 4.47031 7.14541 4.55772 7.05801C4.64513 6.9706 4.75649 6.91107 4.87773 6.88696C4.99897 6.86284 5.12464 6.87522 5.23884 6.92252C5.35304 6.96983 5.45066 7.04993 5.51933 7.15272C5.58801 7.2555 5.62466 7.37633 5.62466 7.49995C5.62466 7.66571 5.55882 7.82468 5.44161 7.94189C5.3244 8.0591 5.16542 8.12495 4.99966 8.12495ZM5.62466 5.93745C5.62466 6.02033 5.59174 6.09981 5.53313 6.15842C5.47453 6.21702 5.39504 6.24995 5.31216 6.24995H4.68716C4.60428 6.24995 4.5248 6.21702 4.46619 6.15842C4.40759 6.09981 4.37466 6.02033 4.37466 5.93745V3.43745C4.37466 3.35457 4.40759 3.27508 4.46619 3.21648C4.5248 3.15787 4.60428 3.12495 4.68716 3.12495H5.31216C5.39504 3.12495 5.47453 3.15787 5.53313 3.21648C5.59174 3.27508 5.62466 3.35457 5.62466 3.43745V5.93745Z" fill="currentColor" />
</g>
<defs>
<clipPath id="clip0_14732_6105">
<rect width="10" height="10" />
</clipPath>
</defs>
</svg>
<?php /**PATH F:\Sempro TA\project\Laravel\TA\vendor\laravel\framework\src\Illuminate\Foundation\resources\exceptions\renderer\components\icons\alert.blade.php ENDPATH**/ ?>

Before

Width:  |  Height:  |  Size: 2.1 KiB

View File

@ -1,6 +0,0 @@
<svg width="12" height="12" viewBox="0 0 12 12" fill="none" xmlns="http://www.w3.org/2000/svg" <?php echo e($attributes); ?>>
<path d="M2.75 2.75H5.614L5.316 2.114C5.069 1.587 4.54 1.25 3.958 1.25H2.25C1.422 1.25 0.75 1.922 0.75 2.75V4.75C0.75 3.645 1.645 2.75 2.75 2.75Z" />
<path d="M0.75 4.75V2.75C0.75 1.922 1.422 1.25 2.25 1.25H3.958C4.54 1.25 5.069 1.587 5.316 2.114L5.614 2.75" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M2.75 2.75H9.25C10.355 2.75 11.25 3.645 11.25 4.75V8.25C11.25 9.355 10.355 10.25 9.25 10.25H2.75C1.645 10.25 0.75 9.355 0.75 8.25V4.75C0.75 3.645 1.645 2.75 2.75 2.75Z" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
<?php /**PATH F:\Sempro TA\project\Laravel\TA\vendor\laravel\framework\src\Illuminate\Foundation\resources\exceptions\renderer\components\icons\folder.blade.php ENDPATH**/ ?>

Before

Width:  |  Height:  |  Size: 898 B

View File

@ -1,167 +0,0 @@
<?php $attributes ??= new \Illuminate\View\ComponentAttributeBag;
$__newAttributes = [];
$__propNames = \Illuminate\View\ComponentAttributeBag::extractPropNames((['exception', 'request']));
foreach ($attributes->all() as $__key => $__value) {
if (in_array($__key, $__propNames)) {
$$__key = $$__key ?? $__value;
} else {
$__newAttributes[$__key] = $__value;
}
}
$attributes = new \Illuminate\View\ComponentAttributeBag($__newAttributes);
unset($__propNames);
unset($__newAttributes);
foreach (array_filter((['exception', 'request']), 'is_string', ARRAY_FILTER_USE_KEY) as $__key => $__value) {
$$__key = $$__key ?? $__value;
}
$__defined_vars = get_defined_vars();
foreach ($attributes->all() as $__key => $__value) {
if (array_key_exists($__key, $__defined_vars)) unset($$__key);
}
unset($__defined_vars, $__key, $__value); ?>
<div
x-data="{
copied: false,
async copyToClipboard() {
try {
await window.copyToClipboard('<?php echo e($request->fullUrl()); ?>');
this.copied = true;
setTimeout(() => { this.copied = false }, 3000);
} catch (err) {
console.error('Failed to copy the requestURL: ', err);
}
}
}"
<?php echo e($attributes->merge(['class' => "bg-white dark:bg-[#1a1a1a] border border-neutral-200 dark:border-white/10 rounded-lg flex items-center justify-between h-10 px-2 shadow-xs"])); ?>
>
<div class="flex items-center gap-3 w-full">
<?php if (isset($component)) { $__componentOriginal0bc865510ef3ecddbe48edc4e8cc9ddb = $component; } ?>
<?php if (isset($attributes)) { $__attributesOriginal0bc865510ef3ecddbe48edc4e8cc9ddb = $attributes; } ?>
<?php $component = Illuminate\View\AnonymousComponent::resolve(['view' => 'laravel-exceptions-renderer::components.badge','data' => ['type' => 'error','variant' => 'solid']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? $attributes->all() : [])); ?>
<?php $component->withName('laravel-exceptions-renderer::badge'); ?>
<?php if ($component->shouldRender()): ?>
<?php $__env->startComponent($component->resolveView(), $component->data()); ?>
<?php if (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag): ?>
<?php $attributes = $attributes->except(\Illuminate\View\AnonymousComponent::ignoredParameterNames()); ?>
<?php endif; ?>
<?php $component->withAttributes(['type' => 'error','variant' => 'solid']); ?>
<?php if (isset($component)) { $__componentOriginalebc8ec9a834a8051f56913d6745a7050 = $component; } ?>
<?php if (isset($attributes)) { $__attributesOriginalebc8ec9a834a8051f56913d6745a7050 = $attributes; } ?>
<?php $component = Illuminate\View\AnonymousComponent::resolve(['view' => 'laravel-exceptions-renderer::components.icons.alert','data' => ['class' => 'w-2.5 h-2.5']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? $attributes->all() : [])); ?>
<?php $component->withName('laravel-exceptions-renderer::icons.alert'); ?>
<?php if ($component->shouldRender()): ?>
<?php $__env->startComponent($component->resolveView(), $component->data()); ?>
<?php if (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag): ?>
<?php $attributes = $attributes->except(\Illuminate\View\AnonymousComponent::ignoredParameterNames()); ?>
<?php endif; ?>
<?php $component->withAttributes(['class' => 'w-2.5 h-2.5']); ?>
<?php echo $__env->renderComponent(); ?>
<?php endif; ?>
<?php if (isset($__attributesOriginalebc8ec9a834a8051f56913d6745a7050)): ?>
<?php $attributes = $__attributesOriginalebc8ec9a834a8051f56913d6745a7050; ?>
<?php unset($__attributesOriginalebc8ec9a834a8051f56913d6745a7050); ?>
<?php endif; ?>
<?php if (isset($__componentOriginalebc8ec9a834a8051f56913d6745a7050)): ?>
<?php $component = $__componentOriginalebc8ec9a834a8051f56913d6745a7050; ?>
<?php unset($__componentOriginalebc8ec9a834a8051f56913d6745a7050); ?>
<?php endif; ?>
<?php echo e($exception->httpStatusCode()); ?>
<?php echo $__env->renderComponent(); ?>
<?php endif; ?>
<?php if (isset($__attributesOriginal0bc865510ef3ecddbe48edc4e8cc9ddb)): ?>
<?php $attributes = $__attributesOriginal0bc865510ef3ecddbe48edc4e8cc9ddb; ?>
<?php unset($__attributesOriginal0bc865510ef3ecddbe48edc4e8cc9ddb); ?>
<?php endif; ?>
<?php if (isset($__componentOriginal0bc865510ef3ecddbe48edc4e8cc9ddb)): ?>
<?php $component = $__componentOriginal0bc865510ef3ecddbe48edc4e8cc9ddb; ?>
<?php unset($__componentOriginal0bc865510ef3ecddbe48edc4e8cc9ddb); ?>
<?php endif; ?>
<?php if (isset($component)) { $__componentOriginal5131cdd8ffd44ce9fe7ed2c3030dd413 = $component; } ?>
<?php if (isset($attributes)) { $__attributesOriginal5131cdd8ffd44ce9fe7ed2c3030dd413 = $attributes; } ?>
<?php $component = Illuminate\View\AnonymousComponent::resolve(['view' => 'laravel-exceptions-renderer::components.http-method','data' => ['method' => ''.e($request->method()).'']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? $attributes->all() : [])); ?>
<?php $component->withName('laravel-exceptions-renderer::http-method'); ?>
<?php if ($component->shouldRender()): ?>
<?php $__env->startComponent($component->resolveView(), $component->data()); ?>
<?php if (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag): ?>
<?php $attributes = $attributes->except(\Illuminate\View\AnonymousComponent::ignoredParameterNames()); ?>
<?php endif; ?>
<?php $component->withAttributes(['method' => ''.e($request->method()).'']); ?>
<?php echo $__env->renderComponent(); ?>
<?php endif; ?>
<?php if (isset($__attributesOriginal5131cdd8ffd44ce9fe7ed2c3030dd413)): ?>
<?php $attributes = $__attributesOriginal5131cdd8ffd44ce9fe7ed2c3030dd413; ?>
<?php unset($__attributesOriginal5131cdd8ffd44ce9fe7ed2c3030dd413); ?>
<?php endif; ?>
<?php if (isset($__componentOriginal5131cdd8ffd44ce9fe7ed2c3030dd413)): ?>
<?php $component = $__componentOriginal5131cdd8ffd44ce9fe7ed2c3030dd413; ?>
<?php unset($__componentOriginal5131cdd8ffd44ce9fe7ed2c3030dd413); ?>
<?php endif; ?>
<div class="flex-1 text-sm font-light truncate text-neutral-950 dark:text-white">
<span data-tippy-content="<?php echo e($request->fullUrl()); ?>">
<?php echo e($request->fullUrl()); ?>
</span>
</div>
<button
x-cloak
@click="copyToClipboard()"
class="<?php echo \Illuminate\Support\Arr::toCssClasses([
"rounded-md w-6 h-6 flex flex-shrink-0 items-center justify-center cursor-pointer border transition-colors duration-200 ease-in-out",
"bg-white/5 border-neutral-200 hover:bg-neutral-100 dark:bg-white/5 dark:border-white/10 dark:hover:bg-white/10",
]); ?>"
>
<?php if (isset($component)) { $__componentOriginal8894ff2e6e6bd543865d608162806b35 = $component; } ?>
<?php if (isset($attributes)) { $__attributesOriginal8894ff2e6e6bd543865d608162806b35 = $attributes; } ?>
<?php $component = Illuminate\View\AnonymousComponent::resolve(['view' => 'laravel-exceptions-renderer::components.icons.copy','data' => ['class' => 'w-3 h-3 text-neutral-400','xShow' => '!copied']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? $attributes->all() : [])); ?>
<?php $component->withName('laravel-exceptions-renderer::icons.copy'); ?>
<?php if ($component->shouldRender()): ?>
<?php $__env->startComponent($component->resolveView(), $component->data()); ?>
<?php if (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag): ?>
<?php $attributes = $attributes->except(\Illuminate\View\AnonymousComponent::ignoredParameterNames()); ?>
<?php endif; ?>
<?php $component->withAttributes(['class' => 'w-3 h-3 text-neutral-400','x-show' => '!copied']); ?>
<?php echo $__env->renderComponent(); ?>
<?php endif; ?>
<?php if (isset($__attributesOriginal8894ff2e6e6bd543865d608162806b35)): ?>
<?php $attributes = $__attributesOriginal8894ff2e6e6bd543865d608162806b35; ?>
<?php unset($__attributesOriginal8894ff2e6e6bd543865d608162806b35); ?>
<?php endif; ?>
<?php if (isset($__componentOriginal8894ff2e6e6bd543865d608162806b35)): ?>
<?php $component = $__componentOriginal8894ff2e6e6bd543865d608162806b35; ?>
<?php unset($__componentOriginal8894ff2e6e6bd543865d608162806b35); ?>
<?php endif; ?>
<?php if (isset($component)) { $__componentOriginal394a4f59b8774713925fcf456ba90b57 = $component; } ?>
<?php if (isset($attributes)) { $__attributesOriginal394a4f59b8774713925fcf456ba90b57 = $attributes; } ?>
<?php $component = Illuminate\View\AnonymousComponent::resolve(['view' => 'laravel-exceptions-renderer::components.icons.check','data' => ['class' => 'w-3 h-3 text-emerald-500','xShow' => 'copied']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? $attributes->all() : [])); ?>
<?php $component->withName('laravel-exceptions-renderer::icons.check'); ?>
<?php if ($component->shouldRender()): ?>
<?php $__env->startComponent($component->resolveView(), $component->data()); ?>
<?php if (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag): ?>
<?php $attributes = $attributes->except(\Illuminate\View\AnonymousComponent::ignoredParameterNames()); ?>
<?php endif; ?>
<?php $component->withAttributes(['class' => 'w-3 h-3 text-emerald-500','x-show' => 'copied']); ?>
<?php echo $__env->renderComponent(); ?>
<?php endif; ?>
<?php if (isset($__attributesOriginal394a4f59b8774713925fcf456ba90b57)): ?>
<?php $attributes = $__attributesOriginal394a4f59b8774713925fcf456ba90b57; ?>
<?php unset($__attributesOriginal394a4f59b8774713925fcf456ba90b57); ?>
<?php endif; ?>
<?php if (isset($__componentOriginal394a4f59b8774713925fcf456ba90b57)): ?>
<?php $component = $__componentOriginal394a4f59b8774713925fcf456ba90b57; ?>
<?php unset($__componentOriginal394a4f59b8774713925fcf456ba90b57); ?>
<?php endif; ?>
</button>
</div>
</div>
<?php /**PATH F:\Sempro TA\project\Laravel\TA\vendor\laravel\framework\src\Illuminate\Foundation\resources\exceptions\renderer\components\request-url.blade.php ENDPATH**/ ?>

View File

@ -689,6 +689,4 @@ function showRole(role) {
}
</script>
</body>
</html>
<?php /**PATH F:\Sempro TA\project\Laravel\TA\resources\views/dashboard.blade.php ENDPATH**/ ?>
</html><?php /**PATH F:\Sempro TA\project\Laravel\TA\resources\views/dashboard.blade.php ENDPATH**/ ?>

View File

@ -1,5 +0,0 @@
<?php $__env->startSection('title', __('Not Found')); ?>
<?php $__env->startSection('code', '404'); ?>
<?php $__env->startSection('message', __('Not Found')); ?>
<?php echo $__env->make('errors::minimal', array_diff_key(get_defined_vars(), ['__data' => 1, '__path' => 1]))->render(); ?><?php /**PATH F:\Sempro TA\project\Laravel\TA\vendor\laravel\framework\src\Illuminate\Foundation\Exceptions\views\404.blade.php ENDPATH**/ ?>

View File

@ -1,673 +0,0 @@
<!DOCTYPE html>
<html lang="id">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Tambah Dosen Baru - Dashboard JTI</title>
<style>
:root {
--bg: #eef2ff;
--text: #1f2937;
--muted: #6b7280;
--primary: #4f46e5;
--primary-2: #7c3aed;
--orange: #d97706;
--shadow: 0 24px 70px rgba(31, 41, 55, 0.18);
}
* { box-sizing: border-box; margin: 0; padding: 0; }
body {
min-height: 100vh;
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
background:
radial-gradient(circle at top left, rgba(99, 102, 241, 0.25), transparent 35%),
radial-gradient(circle at top right, rgba(168, 85, 247, 0.18), transparent 32%),
linear-gradient(135deg, #e0e7ff 0%, #eef2ff 45%, #f8fafc 100%);
color: var(--text);
}
.page-shell {
min-height: 100vh;
padding: 18px;
display: grid;
grid-template-columns: 1fr;
gap: 18px;
max-width: 1000px;
margin: 0 auto;
}
.topbar {
display: flex;
align-items: center;
justify-content: space-between;
gap: 16px;
padding: 14px 18px;
border-radius: 20px;
background: rgba(255, 255, 255, 0.72);
backdrop-filter: blur(14px);
box-shadow: 0 10px 35px rgba(79, 70, 229, 0.08);
position: relative;
z-index: 20;
}
.brand {
display: flex;
align-items: center;
gap: 14px;
text-decoration: none;
color: inherit;
}
.brand-mark {
width: 44px;
height: 44px;
border-radius: 14px;
display: grid;
place-items: center;
color: #fff;
font-weight: 800;
background: linear-gradient(135deg, var(--primary) 0%, var(--primary-2) 100%);
box-shadow: 0 12px 24px rgba(79, 70, 229, 0.28);
}
.brand-text h1 { font-size: 1rem; line-height: 1.1; color: var(--text); font-weight: 900; }
.brand-text p { margin-top: 2px; color: var(--muted); font-size: 0.85rem; }
.actions {
display: flex;
gap: 10px;
align-items: center;
}
.btn {
border: 0;
border-radius: 999px;
padding: 11px 16px;
font-weight: 800;
cursor: pointer;
text-decoration: none;
display: inline-flex;
align-items: center;
justify-content: center;
transition: all 0.25s ease;
font-size: 0.9rem;
text-transform: uppercase;
letter-spacing: 0.3px;
}
.btn:hover {
transform: translateY(-2px);
}
.btn.primary {
color: #fff;
background: linear-gradient(135deg, var(--primary) 0%, var(--primary-2) 100%);
box-shadow: 0 12px 24px rgba(79, 70, 229, 0.22);
}
.btn.primary:hover {
box-shadow: 0 16px 32px rgba(79, 70, 229, 0.28);
}
.btn.ghost {
color: #475569;
background: rgba(226, 232, 240, 0.8);
border: 1px solid rgba(148, 163, 184, 0.25);
}
.btn.ghost:hover {
background: rgba(226, 232, 240, 1);
color: var(--primary);
}
.content {
border-radius: 28px;
background: rgba(255, 255, 255, 0.82);
backdrop-filter: blur(16px);
box-shadow: var(--shadow);
overflow: hidden;
}
.section-head {
padding: 28px 32px;
background: linear-gradient(135deg, rgba(79, 70, 229, 0.1), rgba(124, 58, 237, 0.08));
border-bottom: 1px solid rgba(148, 163, 184, 0.2);
}
.section-head h2 {
font-size: 1.8rem;
color: var(--text);
margin-bottom: 8px;
font-weight: 900;
}
.section-head p {
color: var(--muted);
font-weight: 700;
font-size: 0.95rem;
}
.form-wrapper {
padding: 36px 32px;
display: grid;
grid-template-columns: 280px 1fr;
gap: 40px;
align-items: start;
}
.photo-section {
display: flex;
flex-direction: column;
gap: 16px;
}
.photo-preview {
width: 100%;
aspect-ratio: 3/4;
border-radius: 20px;
background: linear-gradient(135deg, var(--primary) 0%, var(--primary-2) 100%);
display: grid;
place-items: center;
color: #fff;
font-size: 3.5rem;
font-weight: 900;
overflow: hidden;
position: relative;
cursor: pointer;
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
box-shadow: 0 16px 40px rgba(79, 70, 229, 0.25);
border: 3px solid rgba(255, 255, 255, 0.15);
}
.photo-preview:hover {
transform: scale(1.03);
box-shadow: 0 20px 50px rgba(79, 70, 229, 0.32);
}
.photo-preview img {
width: 100%;
height: 100%;
object-fit: cover;
}
.photo-initial {
display: grid;
place-items: center;
width: 100%;
height: 100%;
}
.photo-label {
border: 2px dashed rgba(79, 70, 229, 0.3);
border-radius: 16px;
padding: 16px;
text-align: center;
cursor: pointer;
transition: all 0.3s ease;
background: rgba(79, 70, 229, 0.02);
}
.photo-label:hover {
border-color: var(--primary);
background: rgba(79, 70, 229, 0.1);
}
.photo-label-text {
font-size: 0.9rem;
font-weight: 800;
color: var(--primary);
margin-bottom: 4px;
}
.photo-label-hint {
font-size: 0.8rem;
color: var(--muted);
font-weight: 600;
}
.photo-input {
display: none;
}
.form-fields {
display: flex;
flex-direction: column;
gap: 24px;
}
.field-row {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 20px;
}
.field-row.full {
grid-column: 1 / -1;
}
.field {
display: flex;
flex-direction: column;
gap: 10px;
}
.field label {
font-weight: 800;
color: #475569;
font-size: 0.9rem;
letter-spacing: 0.3px;
}
.required {
color: var(--orange);
}
.input, .select {
width: 100%;
padding: 13px 14px;
border-radius: 14px;
background: #fff;
border: 1.5px solid rgba(148, 163, 184, 0.25);
outline: none;
font-weight: 600;
color: var(--text);
transition: all 0.3s ease;
font-size: 0.95rem;
}
.input:focus, .select:focus {
border-color: var(--primary);
background: rgba(79, 70, 229, 0.02);
box-shadow: 0 0 0 3px rgba(79, 70, 229, 0.1);
}
.input.error, .select.error {
border-color: #ef4444;
background: rgba(239, 68, 68, 0.02);
}
.hint {
font-size: 0.8rem;
color: var(--muted);
font-weight: 600;
margin-top: 4px;
}
.field-error {
font-size: 0.8rem;
color: #dc2626;
font-weight: 700;
}
.error-box {
padding: 16px 20px;
border-radius: 16px;
background: rgba(239, 68, 68, 0.08);
border: 1px solid rgba(239, 68, 68, 0.2);
color: #7f1d1d;
margin-bottom: 20px;
}
.error-box strong {
display: block;
font-weight: 800;
margin-bottom: 10px;
}
.error-box ul {
list-style: none;
padding-left: 20px;
}
.error-box li {
font-weight: 700;
margin-bottom: 6px;
position: relative;
}
.error-box li:before {
content: "";
position: absolute;
left: -15px;
}
.form-actions {
display: flex;
gap: 12px;
padding-top: 20px;
border-top: 1px solid rgba(148, 163, 184, 0.12);
grid-column: 1 / -1;
}
.btn.success {
color: #fff;
background: linear-gradient(135deg, #10b981 0%, #059669 100%);
box-shadow: 0 12px 24px rgba(16, 185, 129, 0.22);
flex: 1;
}
.btn.success:hover {
box-shadow: 0 16px 32px rgba(16, 185, 129, 0.28);
}
.btn.ghost {
flex: 1;
}
@media (max-width: 900px) {
.form-wrapper {
grid-template-columns: 1fr;
}
.field-row {
grid-template-columns: 1fr;
}
.section-head h2 {
font-size: 1.4rem;
}
.photo-preview {
aspect-ratio: 1/1;
}
}
</style>
</head>
<body>
<div class="page-shell">
<header class="topbar">
<a class="brand" href="<?php echo e(route('users.index')); ?>">
<div class="brand-mark">JTI</div>
<div class="brand-text">
<h1>Tambah Dosen</h1>
<p>Data dosen baru</p>
</div>
</a>
<div class="actions">
<a class="btn ghost" href="<?php echo e(route('users.dosen')); ?>">Kembali</a>
</div>
</header>
<main class="content">
<div class="section-head">
<h2>👨‍🏫 Form Tambah Dosen Baru</h2>
<p>Lengkapi informasi dosen dengan data yang akurat dan benar.</p>
</div>
<?php if($errors->any()): ?>
<div style="padding: 0 32px; padding-top: 20px;">
<div class="error-box">
<strong> Validasi gagal, periksa kembali data Anda:</strong>
<ul>
<?php $__currentLoopData = $errors->all(); $__env->addLoop($__currentLoopData); foreach($__currentLoopData as $error): $__env->incrementLoopIndices(); $loop = $__env->getLastLoop(); ?>
<li><?php echo e($error); ?></li>
<?php endforeach; $__env->popLoop(); $loop = $__env->getLastLoop(); ?>
</ul>
</div>
</div>
<?php endif; ?>
<form method="POST" action="<?php echo e(route('dosen.store')); ?>" class="form-wrapper" id="dosenForm">
<?php echo csrf_field(); ?>
<!-- Photo Section -->
<div class="photo-section">
<div class="photo-preview" id="photoPreview">
<div class="photo-initial" id="photoInitial">👨‍🏫</div>
<img id="photoImg" style="display: none;" alt="Preview" />
</div>
<label class="photo-label" for="photoInput">
<div class="photo-label-text">📤 Upload Foto</div>
<div class="photo-label-hint">Klik untuk pilih gambar</div>
</label>
<input id="photoInput" class="photo-input" type="file" accept="image/*">
<input
id="fotoUrl"
class="input"
type="text"
name="foto"
value="<?php echo e(old('foto')); ?>"
placeholder="atau URL gambar"
>
<div class="hint">📝 Gunakan file atau URL gambar untuk foto profil</div>
</div>
<!-- Form Fields -->
<div class="form-fields">
<!-- Nama -->
<div class="field-row full">
<div class="field">
<label for="nama">Nama Lengkap <span class="required">*</span></label>
<input
id="nama"
class="input <?php $__errorArgs = ['nama'];
$__bag = $errors->getBag($__errorArgs[1] ?? 'default');
if ($__bag->has($__errorArgs[0])) :
if (isset($message)) { $__messageOriginal = $message; }
$message = $__bag->first($__errorArgs[0]); ?> error <?php unset($message);
if (isset($__messageOriginal)) { $message = $__messageOriginal; }
endif;
unset($__errorArgs, $__bag); ?>"
type="text"
name="nama"
value="<?php echo e(old('nama')); ?>"
required
>
<?php $__errorArgs = ['nama'];
$__bag = $errors->getBag($__errorArgs[1] ?? 'default');
if ($__bag->has($__errorArgs[0])) :
if (isset($message)) { $__messageOriginal = $message; }
$message = $__bag->first($__errorArgs[0]); ?>
<div class="field-error"><?php echo e($message); ?></div>
<?php unset($message);
if (isset($__messageOriginal)) { $message = $__messageOriginal; }
endif;
unset($__errorArgs, $__bag); ?>
<div class="hint">Masukkan nama lengkap dosen</div>
</div>
</div>
<!-- NIP & NIDN -->
<div class="field-row">
<div class="field">
<label for="nip">NIP</label>
<input
id="nip"
class="input <?php $__errorArgs = ['nip'];
$__bag = $errors->getBag($__errorArgs[1] ?? 'default');
if ($__bag->has($__errorArgs[0])) :
if (isset($message)) { $__messageOriginal = $message; }
$message = $__bag->first($__errorArgs[0]); ?> error <?php unset($message);
if (isset($__messageOriginal)) { $message = $__messageOriginal; }
endif;
unset($__errorArgs, $__bag); ?>"
type="text"
name="nip"
value="<?php echo e(old('nip')); ?>"
placeholder="Contoh: 19850315 200901 1 001"
>
<?php $__errorArgs = ['nip'];
$__bag = $errors->getBag($__errorArgs[1] ?? 'default');
if ($__bag->has($__errorArgs[0])) :
if (isset($message)) { $__messageOriginal = $message; }
$message = $__bag->first($__errorArgs[0]); ?>
<div class="field-error"><?php echo e($message); ?></div>
<?php unset($message);
if (isset($__messageOriginal)) { $message = $__messageOriginal; }
endif;
unset($__errorArgs, $__bag); ?>
<div class="hint">Nomor Induk Pegawai (opsional)</div>
</div>
<div class="field">
<label for="nidn">NIDN</label>
<input
id="nidn"
class="input <?php $__errorArgs = ['nidn'];
$__bag = $errors->getBag($__errorArgs[1] ?? 'default');
if ($__bag->has($__errorArgs[0])) :
if (isset($message)) { $__messageOriginal = $message; }
$message = $__bag->first($__errorArgs[0]); ?> error <?php unset($message);
if (isset($__messageOriginal)) { $message = $__messageOriginal; }
endif;
unset($__errorArgs, $__bag); ?>"
type="text"
name="nidn"
value="<?php echo e(old('nidn')); ?>"
placeholder="Contoh: 0017058003"
>
<?php $__errorArgs = ['nidn'];
$__bag = $errors->getBag($__errorArgs[1] ?? 'default');
if ($__bag->has($__errorArgs[0])) :
if (isset($message)) { $__messageOriginal = $message; }
$message = $__bag->first($__errorArgs[0]); ?>
<div class="field-error"><?php echo e($message); ?></div>
<?php unset($message);
if (isset($__messageOriginal)) { $message = $__messageOriginal; }
endif;
unset($__errorArgs, $__bag); ?>
<div class="hint">Nomor Induk Dosen Nasional (opsional)</div>
</div>
</div>
<!-- Prodi -->
<div class="field-row full">
<div class="field">
<label for="prodi">Program Studi <span class="required">*</span></label>
<select
id="prodi"
class="select <?php $__errorArgs = ['prodi'];
$__bag = $errors->getBag($__errorArgs[1] ?? 'default');
if ($__bag->has($__errorArgs[0])) :
if (isset($message)) { $__messageOriginal = $message; }
$message = $__bag->first($__errorArgs[0]); ?> error <?php unset($message);
if (isset($__messageOriginal)) { $message = $__messageOriginal; }
endif;
unset($__errorArgs, $__bag); ?>"
name="prodi"
required
>
<option value="">-- Pilih Program Studi --</option>
<option value="Manajemen Informatika" <?php if(old('prodi') === 'Manajemen Informatika'): echo 'selected'; endif; ?>>Manajemen Informatika</option>
<option value="Teknik Informatika" <?php if(old('prodi') === 'Teknik Informatika'): echo 'selected'; endif; ?>>Teknik Informatika</option>
<option value="Teknik Komputer" <?php if(old('prodi') === 'Teknik Komputer'): echo 'selected'; endif; ?>>Teknik Komputer</option>
<option value="Teknologi Rekayasa Komputer" <?php if(old('prodi') === 'Teknologi Rekayasa Komputer'): echo 'selected'; endif; ?>>Teknologi Rekayasa Komputer</option>
</select>
<?php $__errorArgs = ['prodi'];
$__bag = $errors->getBag($__errorArgs[1] ?? 'default');
if ($__bag->has($__errorArgs[0])) :
if (isset($message)) { $__messageOriginal = $message; }
$message = $__bag->first($__errorArgs[0]); ?>
<div class="field-error"><?php echo e($message); ?></div>
<?php unset($message);
if (isset($__messageOriginal)) { $message = $__messageOriginal; }
endif;
unset($__errorArgs, $__bag); ?>
<div class="hint">Pilih program studi untuk dosen</div>
</div>
</div>
<!-- Role (Hidden for Dosen) -->
<input type="hidden" name="role" value="dosen">
<!-- Form Actions -->
<div class="form-actions">
<button class="btn success" type="submit"> Simpan Dosen</button>
<a class="btn ghost" href="<?php echo e(route('users.dosen')); ?>"> Batal</a>
</div>
</div>
</form>
</main>
</div>
<script>
const photoInput = document.getElementById('photoInput');
const fotoUrl = document.getElementById('fotoUrl');
const photoPreview = document.getElementById('photoPreview');
const photoImg = document.getElementById('photoImg');
const photoInitial = document.getElementById('photoInitial');
const namaInput = document.getElementById('nama');
const dosenForm = document.getElementById('dosenForm');
let isSubmitting = false;
// Prevent double submit
dosenForm.addEventListener('submit', function(e) {
if (isSubmitting) {
e.preventDefault();
return false;
}
isSubmitting = true;
// Disable submit button
const submitBtn = dosenForm.querySelector('button[type="submit"]');
if (submitBtn) {
submitBtn.disabled = true;
submitBtn.style.opacity = '0.6';
submitBtn.style.cursor = 'not-allowed';
submitBtn.textContent = '⏳ Sedang menyimpan...';
}
});
// Handle file input
photoInput.addEventListener('change', (e) => {
const file = e.target.files[0];
if (file) {
const reader = new FileReader();
reader.onload = (event) => {
photoImg.src = event.target.result;
photoImg.style.display = 'block';
photoInitial.style.display = 'none';
fotoUrl.value = event.target.result;
};
reader.readAsDataURL(file);
}
});
// Handle URL input
fotoUrl.addEventListener('change', (e) => {
const url = e.target.value.trim();
if (url && (url.startsWith('http') || url.startsWith('data:'))) {
photoImg.src = url;
photoImg.style.display = 'block';
photoInitial.style.display = 'none';
} else {
photoImg.style.display = 'none';
photoInitial.style.display = 'block';
}
});
// Update initial dari nama
namaInput.addEventListener('input', () => {
const nama = namaInput.value.trim();
if (nama && !photoImg.src) {
const words = nama.split(/\s+/);
const initials = words.slice(0, 2).map(w => w.charAt(0).toUpperCase()).join('');
photoInitial.textContent = initials || '👨‍🏫';
}
});
// Restore state saat halaman load
window.addEventListener('load', () => {
// Reset form state jika ada error
isSubmitting = false;
const submitBtn = dosenForm.querySelector('button[type="submit"]');
if (submitBtn) {
submitBtn.disabled = false;
submitBtn.style.opacity = '1';
submitBtn.style.cursor = 'pointer';
submitBtn.textContent = '✅ Simpan Dosen';
}
if (fotoUrl.value.trim()) {
fotoUrl.dispatchEvent(new Event('change'));
}
if (namaInput.value.trim()) {
namaInput.dispatchEvent(new Event('input'));
}
});
</script>
</body>
</html>
<?php /**PATH F:\Sempro TA\project\Laravel\TA\resources\views/Dosen/create.blade.php ENDPATH**/ ?>

View File

@ -1,626 +0,0 @@
<!DOCTYPE html>
<html lang="id">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Tambah Staff/Teknisi - Dashboard JTI</title>
<style>
:root {
--bg: #e0fdf4;
--panel: rgba(255, 255, 255, 0.9);
--panel-strong: #ffffff;
--text: #1f2937;
--muted: #6b7280;
--primary: #059669;
--primary-2: #14b8a6;
--purple: #4f46e5;
--orange: #d97706;
--shadow: 0 24px 70px rgba(31, 41, 55, 0.18);
}
* { box-sizing: border-box; margin: 0; padding: 0; }
body {
min-height: 100vh;
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
background:
radial-gradient(circle at top left, rgba(5, 150, 105, 0.25), transparent 35%),
radial-gradient(circle at top right, rgba(20, 184, 166, 0.18), transparent 32%),
linear-gradient(135deg, #d1fae5 0%, #e0fdf4 45%, #f0fdfa 100%);
color: var(--text);
}
.page-shell {
min-height: 100vh;
padding: 18px;
max-width: 900px;
margin: 0 auto;
}
.header {
margin-bottom: 28px;
}
.header-title {
font-size: 2rem;
font-weight: 900;
color: var(--text);
margin-bottom: 8px;
}
.header-desc {
color: var(--muted);
font-weight: 700;
font-size: 0.95rem;
}
.content {
border-radius: 28px;
background: rgba(255, 255, 255, 0.82);
backdrop-filter: blur(16px);
box-shadow: var(--shadow);
overflow: hidden;
}
.form-container {
padding: 36px;
display: grid;
grid-template-columns: 280px 1fr;
gap: 36px;
align-items: start;
}
.photo-section {
display: flex;
flex-direction: column;
gap: 16px;
}
.photo-frame {
width: 100%;
aspect-ratio: 3/4;
border-radius: 20px;
background: linear-gradient(135deg, var(--primary) 0%, var(--primary-2) 100%);
display: grid;
place-items: center;
color: #fff;
font-size: 4rem;
font-weight: 900;
overflow: hidden;
position: relative;
cursor: pointer;
transition: transform 0.3s ease, box-shadow 0.3s ease;
box-shadow: 0 16px 36px rgba(5, 150, 105, 0.22);
}
.photo-frame:hover {
transform: scale(1.02);
box-shadow: 0 20px 48px rgba(5, 150, 105, 0.28);
}
.photo-frame img {
width: 100%;
height: 100%;
object-fit: cover;
}
.photo-input {
display: none;
}
.photo-label {
border: 2px dashed rgba(5, 150, 105, 0.3);
border-radius: 14px;
padding: 14px;
text-align: center;
cursor: pointer;
transition: all 0.3s ease;
background: rgba(5, 150, 105, 0.02);
}
.photo-label:hover {
border-color: var(--primary);
background: rgba(5, 150, 105, 0.08);
}
.photo-label-text {
font-size: 0.85rem;
font-weight: 700;
color: var(--primary);
margin-bottom: 4px;
}
.photo-label-hint {
font-size: 0.8rem;
color: var(--muted);
font-weight: 600;
}
.form-fields {
display: flex;
flex-direction: column;
gap: 20px;
}
.field-section {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 20px;
}
.field-section.full {
grid-column: 1 / -1;
}
.field {
display: flex;
flex-direction: column;
gap: 8px;
}
.field label {
font-weight: 800;
color: #475569;
font-size: 0.92rem;
}
.field label .required {
color: var(--orange);
}
.input, .select {
padding: 13px 14px;
border-radius: 12px;
background: #fff;
border: 1.5px solid rgba(148, 163, 184, 0.25);
outline: none;
font-weight: 600;
color: var(--text);
transition: all 0.2s ease;
font-size: 0.95rem;
}
.input:focus, .select:focus {
border-color: var(--primary);
background: rgba(5, 150, 105, 0.02);
box-shadow: 0 0 0 3px rgba(5, 150, 105, 0.1);
}
.input::placeholder {
color: var(--muted);
}
.hint {
font-size: 0.85rem;
color: var(--muted);
margin-top: -2px;
}
.error-message {
margin: 18px 0;
padding: 14px 16px;
border-radius: 16px;
background: rgba(217, 119, 6, 0.08);
border: 1px solid rgba(217, 119, 6, 0.18);
color: #7c2d12;
font-weight: 700;
}
.error-message ul {
margin-top: 8px;
padding-left: 20px;
}
.field-error {
padding: 8px 10px;
border-radius: 8px;
background: rgba(239, 68, 68, 0.08);
color: #991b1b;
font-weight: 700;
font-size: 0.85rem;
}
.input.error, .select.error {
border-color: #ef4444;
background: rgba(239, 68, 68, 0.02);
}
.role-selector {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 14px;
padding: 16px;
background: rgba(5, 150, 105, 0.05);
border-radius: 14px;
border: 1.5px solid rgba(5, 150, 105, 0.2);
}
.role-option {
display: flex;
align-items: center;
gap: 10px;
padding: 12px 14px;
border-radius: 10px;
cursor: pointer;
transition: all 0.2s ease;
background: #fff;
border: 1.5px solid rgba(148, 163, 184, 0.2);
}
.role-option input[type="radio"] {
cursor: pointer;
accent-color: var(--primary);
}
.role-option:hover {
border-color: var(--primary);
background: rgba(5, 150, 105, 0.04);
}
.role-option input[type="radio"]:checked ~ label {
color: var(--primary);
}
.role-option label {
cursor: pointer;
font-weight: 800;
color: var(--text);
flex: 1;
}
.form-actions {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 12px;
grid-column: 1 / -1;
}
.btn {
border: 0;
border-radius: 12px;
padding: 14px 18px;
font-weight: 800;
cursor: pointer;
text-decoration: none;
display: inline-flex;
align-items: center;
justify-content: center;
transition: all 0.2s ease;
gap: 8px;
font-size: 0.95rem;
}
.btn:hover {
transform: translateY(-2px);
}
.btn.primary {
color: #fff;
background: linear-gradient(135deg, var(--primary) 0%, var(--primary-2) 100%);
box-shadow: 0 12px 24px rgba(5, 150, 105, 0.22);
}
.btn.primary:hover {
box-shadow: 0 16px 32px rgba(5, 150, 105, 0.28);
}
.btn.ghost {
color: #475569;
background: rgba(226, 232, 240, 0.8);
border: 1px solid rgba(148, 163, 184, 0.25);
}
.btn.ghost:hover {
background: rgba(226, 232, 240, 1);
}
@media (max-width: 900px) {
.form-container {
grid-template-columns: 1fr;
}
.field-section {
grid-template-columns: 1fr;
}
.role-selector {
grid-template-columns: 1fr;
}
.form-actions {
grid-template-columns: 1fr;
}
.header-title {
font-size: 1.5rem;
}
}
</style>
</head>
<body>
<div class="page-shell">
<header class="header">
<h1 class="header-title">🔧 Tambah Staff/Teknisi</h1>
<p class="header-desc">Lengkapi data staff atau teknisi dengan informasi yang akurat.</p>
</header>
<div class="content">
<?php if($errors->any()): ?>
<div class="error-message">
<strong> Terjadi kesalahan validasi:</strong>
<ul>
<?php $__currentLoopData = $errors->all(); $__env->addLoop($__currentLoopData); foreach($__currentLoopData as $error): $__env->incrementLoopIndices(); $loop = $__env->getLastLoop(); ?>
<li><?php echo e($error); ?></li>
<?php endforeach; $__env->popLoop(); $loop = $__env->getLastLoop(); ?>
</ul>
</div>
<?php endif; ?>
<form method="POST" action="<?php echo e(route('staff.store')); ?>" class="form-container">
<?php echo csrf_field(); ?>
<!-- Foto Section -->
<div class="photo-section">
<div class="photo-frame" id="photoPreview">
<span id="photoInitial">🔧</span>
<img id="photoImg" style="display:none;" />
</div>
<label class="photo-label" for="fotoInput">
<div class="photo-label-text">📤 Upload Foto</div>
<div class="photo-label-hint">Klik untuk memilih gambar</div>
</label>
<input
id="fotoInput"
class="input"
type="text"
name="foto"
value="<?php echo e(old('foto')); ?>"
placeholder="atau masukkan URL foto"
>
<div class="hint">Format: URL gambar (https://...)</div>
</div>
<!-- Form Fields -->
<div class="form-fields">
<!-- Row 1: Nama -->
<div class="field-section full">
<div class="field">
<label for="nama">Nama Lengkap <span class="required">*</span></label>
<input
id="nama"
class="input <?php $__errorArgs = ['nama'];
$__bag = $errors->getBag($__errorArgs[1] ?? 'default');
if ($__bag->has($__errorArgs[0])) :
if (isset($message)) { $__messageOriginal = $message; }
$message = $__bag->first($__errorArgs[0]); ?> error <?php unset($message);
if (isset($__messageOriginal)) { $message = $__messageOriginal; }
endif;
unset($__errorArgs, $__bag); ?>"
type="text"
name="nama"
value="<?php echo e(old('nama')); ?>"
placeholder="Masukkan nama lengkap"
required
>
<?php $__errorArgs = ['nama'];
$__bag = $errors->getBag($__errorArgs[1] ?? 'default');
if ($__bag->has($__errorArgs[0])) :
if (isset($message)) { $__messageOriginal = $message; }
$message = $__bag->first($__errorArgs[0]); ?>
<div class="field-error"><?php echo e($message); ?></div>
<?php unset($message);
if (isset($__messageOriginal)) { $message = $__messageOriginal; }
endif;
unset($__errorArgs, $__bag); ?>
</div>
</div>
<!-- Row 2: NIP dan NIDN -->
<div class="field-section">
<div class="field">
<label for="nip">NIP</label>
<input
id="nip"
class="input <?php $__errorArgs = ['nip'];
$__bag = $errors->getBag($__errorArgs[1] ?? 'default');
if ($__bag->has($__errorArgs[0])) :
if (isset($message)) { $__messageOriginal = $message; }
$message = $__bag->first($__errorArgs[0]); ?> error <?php unset($message);
if (isset($__messageOriginal)) { $message = $__messageOriginal; }
endif;
unset($__errorArgs, $__bag); ?>"
type="text"
name="nip"
value="<?php echo e(old('nip')); ?>"
placeholder="Contoh: 12345678 900000 1 001"
>
<?php $__errorArgs = ['nip'];
$__bag = $errors->getBag($__errorArgs[1] ?? 'default');
if ($__bag->has($__errorArgs[0])) :
if (isset($message)) { $__messageOriginal = $message; }
$message = $__bag->first($__errorArgs[0]); ?>
<div class="field-error"><?php echo e($message); ?></div>
<?php unset($message);
if (isset($__messageOriginal)) { $message = $__messageOriginal; }
endif;
unset($__errorArgs, $__bag); ?>
<div class="hint">Nomor Induk Pegawai (opsional)</div>
</div>
<div class="field">
<label for="nidn">Identitas Lain / BioID</label>
<input
id="nidn"
class="input <?php $__errorArgs = ['nidn'];
$__bag = $errors->getBag($__errorArgs[1] ?? 'default');
if ($__bag->has($__errorArgs[0])) :
if (isset($message)) { $__messageOriginal = $message; }
$message = $__bag->first($__errorArgs[0]); ?> error <?php unset($message);
if (isset($__messageOriginal)) { $message = $__messageOriginal; }
endif;
unset($__errorArgs, $__bag); ?>"
type="text"
name="nidn"
value="<?php echo e(old('nidn')); ?>"
placeholder="Contoh: BiometricID atau nomor lain"
>
<?php $__errorArgs = ['nidn'];
$__bag = $errors->getBag($__errorArgs[1] ?? 'default');
if ($__bag->has($__errorArgs[0])) :
if (isset($message)) { $__messageOriginal = $message; }
$message = $__bag->first($__errorArgs[0]); ?>
<div class="field-error"><?php echo e($message); ?></div>
<?php unset($message);
if (isset($__messageOriginal)) { $message = $__messageOriginal; }
endif;
unset($__errorArgs, $__bag); ?>
<div class="hint">Identitas tambahan (opsional)</div>
</div>
</div>
<!-- Row 3: Bagian -->
<div class="field-section full">
<div class="field">
<label for="bagian">Bagian <span class="required">*</span></label>
<select
id="bagian"
class="select <?php $__errorArgs = ['bagian'];
$__bag = $errors->getBag($__errorArgs[1] ?? 'default');
if ($__bag->has($__errorArgs[0])) :
if (isset($message)) { $__messageOriginal = $message; }
$message = $__bag->first($__errorArgs[0]); ?> error <?php unset($message);
if (isset($__messageOriginal)) { $message = $__messageOriginal; }
endif;
unset($__errorArgs, $__bag); ?>"
name="bagian"
required
>
<option value="">-- Pilih Bagian --</option>
<option value="Staff Administrasi" <?php if(old('bagian') === 'Staff Administrasi'): echo 'selected'; endif; ?>>Staff Administrasi</option>
<option value="Arsitektur dan Jaringan Komputer" <?php if(old('bagian') === 'Arsitektur dan Jaringan Komputer'): echo 'selected'; endif; ?>>Arsitektur dan Jaringan Komputer</option>
<option value="Komputasi dan Sistem Informasi" <?php if(old('bagian') === 'Komputasi dan Sistem Informasi'): echo 'selected'; endif; ?>>Komputasi dan Sistem Informasi</option>
<option value="Rekayasa Sistem Informasi" <?php if(old('bagian') === 'Rekayasa Sistem Informasi'): echo 'selected'; endif; ?>>Rekayasa Sistem Informasi</option>
<option value="Sistem Komputer dan Kontrol" <?php if(old('bagian') === 'Sistem Komputer dan Kontrol'): echo 'selected'; endif; ?>>Sistem Komputer dan Kontrol</option>
<option value="Rekayasa Perangkat Lunak" <?php if(old('bagian') === 'Rekayasa Perangkat Lunak'): echo 'selected'; endif; ?>>Rekayasa Perangkat Lunak</option>
<option value="Multimedia Cerdas" <?php if(old('bagian') === 'Multimedia Cerdas'): echo 'selected'; endif; ?>>Multimedia Cerdas</option>
<option value="Staff Lainnya" <?php if(old('bagian') === 'Staff Lainnya'): echo 'selected'; endif; ?>>Staff Lainnya</option>
</select>
<?php $__errorArgs = ['bagian'];
$__bag = $errors->getBag($__errorArgs[1] ?? 'default');
if ($__bag->has($__errorArgs[0])) :
if (isset($message)) { $__messageOriginal = $message; }
$message = $__bag->first($__errorArgs[0]); ?>
<div class="field-error"><?php echo e($message); ?></div>
<?php unset($message);
if (isset($__messageOriginal)) { $message = $__messageOriginal; }
endif;
unset($__errorArgs, $__bag); ?>
<div class="hint">Pilih bagian/divisi staff</div>
</div>
</div>
<!-- Role Selection -->
<div class="field-section full">
<label style="font-weight: 800; color: #475569; font-size: 0.92rem; margin-bottom: 8px;">Pilih Role <span class="required">*</span></label>
<div class="role-selector">
<div class="role-option">
<input type="radio" id="roleStaff" name="role" value="staff" <?php if(old('role') === 'staff' || !old('role')): echo 'checked'; endif; ?> required>
<label for="roleStaff">👤 Staff</label>
</div>
<div class="role-option">
<input type="radio" id="roleTeknik" name="role" value="teknisi" <?php if(old('role') === 'teknisi'): echo 'checked'; endif; ?> required>
<label for="roleTeknik">🔧 Teknisi</label>
</div>
</div>
</div>
</div>
<!-- Form Actions -->
<div class="form-actions">
<button class="btn primary" type="submit"> Simpan Staff/Teknisi</button>
<a class="btn ghost" href="<?php echo e(route('users.staff')); ?>"> Batal</a>
</div>
</form>
</div>
</div>
<script>
// Photo preview dari URL
const fotoInput = document.getElementById('fotoInput');
const photoPreview = document.getElementById('photoPreview');
const photoImg = document.getElementById('photoImg');
const photoInitial = document.getElementById('photoInitial');
const namaInput = document.getElementById('nama');
const roleStaffInput = document.getElementById('roleStaff');
const roleTeknikInput = document.getElementById('roleTeknik');
const submitBtn = document.querySelector('button[type="submit"]');
const form = document.querySelector('form');
let isSubmitting = false;
function updatePhotoIcon() {
if (roleTeknikInput.checked) {
return '🔧';
}
return '👤';
}
// Prevent double submission
form.addEventListener('submit', (e) => {
if (isSubmitting) {
e.preventDefault();
return false;
}
isSubmitting = true;
submitBtn.disabled = true;
submitBtn.textContent = '⏳ Menyimpan...';
});
fotoInput.addEventListener('change', (e) => {
const url = e.target.value.trim();
if (url && (url.startsWith('http') || url.startsWith('data:'))) {
photoImg.src = url;
photoImg.style.display = 'block';
photoInitial.style.display = 'none';
} else {
photoImg.style.display = 'none';
photoInitial.style.display = 'block';
updateInitials();
}
});
function updateInitials() {
const nama = namaInput.value.trim();
if (nama) {
const initials = nama.split(/\s+/)
.slice(0, 2)
.map(w => w.charAt(0).toUpperCase())
.join('');
photoInitial.textContent = initials || updatePhotoIcon();
} else {
photoInitial.textContent = updatePhotoIcon();
}
}
// Trigger dari input nama
namaInput.addEventListener('input', updateInitials);
// Trigger dari role selection
roleStaffInput.addEventListener('change', updateInitials);
roleTeknikInput.addEventListener('change', updateInitials);
// Inisialisasi saat halaman load
window.addEventListener('load', () => {
isSubmitting = false;
submitBtn.disabled = false;
submitBtn.textContent = '✅ Simpan Staff/Teknisi';
if (fotoInput.value.trim()) {
fotoInput.dispatchEvent(new Event('change'));
}
if (namaInput.value.trim()) {
namaInput.dispatchEvent(new Event('input'));
}
});
</script>
</body>
</html>
<?php /**PATH F:\Sempro TA\project\Laravel\TA\resources\views\staff\create.blade.php ENDPATH**/ ?>

View File

@ -1,51 +0,0 @@
<?php $attributes ??= new \Illuminate\View\ComponentAttributeBag;
$__newAttributes = [];
$__propNames = \Illuminate\View\ComponentAttributeBag::extractPropNames((['frame', 'direction' => 'ltr']));
foreach ($attributes->all() as $__key => $__value) {
if (in_array($__key, $__propNames)) {
$$__key = $$__key ?? $__value;
} else {
$__newAttributes[$__key] = $__value;
}
}
$attributes = new \Illuminate\View\ComponentAttributeBag($__newAttributes);
unset($__propNames);
unset($__newAttributes);
foreach (array_filter((['frame', 'direction' => 'ltr']), 'is_string', ARRAY_FILTER_USE_KEY) as $__key => $__value) {
$$__key = $$__key ?? $__value;
}
$__defined_vars = get_defined_vars();
foreach ($attributes->all() as $__key => $__value) {
if (array_key_exists($__key, $__defined_vars)) unset($$__key);
}
unset($__defined_vars, $__key, $__value); ?>
<?php
$file = $frame->file();
$line = $frame->line();
?>
<div
<?php echo e($attributes->merge(['class' => 'truncate font-mono text-xs text-neutral-500 dark:text-neutral-400'])); ?>
dir="<?php echo e($direction); ?>"
>
<span data-tippy-content="<?php echo e($file); ?>:<?php echo e($line); ?>">
<?php if(config('app.editor')): ?>
<a href="<?php echo e($frame->editorHref()); ?>" @click.stop>
<span class="hover:underline decoration-neutral-400"><?php echo e($file); ?></span><span class="text-neutral-500">:<?php echo e($line); ?></span>
</a>
<?php else: ?>
<?php echo e($file); ?><span class="text-neutral-500">:<?php echo e($line); ?></span>
<?php endif; ?>
</span>
</div>
<?php /**PATH F:\Sempro TA\project\Laravel\TA\vendor\laravel\framework\src\Illuminate\Foundation\resources\exceptions\renderer\components\file-with-line.blade.php ENDPATH**/ ?>

View File

@ -1,5 +0,0 @@
<?php $__env->startSection('title', __('Payment Required')); ?>
<?php $__env->startSection('code', '402'); ?>
<?php $__env->startSection('message', __('Payment Required')); ?>
<?php echo $__env->make('errors::minimal', array_diff_key(get_defined_vars(), ['__data' => 1, '__path' => 1]))->render(); ?><?php /**PATH F:\Sempro TA\project\Laravel\TA\vendor\laravel\framework\src\Illuminate\Foundation\Exceptions\views\402.blade.php ENDPATH**/ ?>

View File

@ -1,5 +0,0 @@
<?php $__env->startSection('title', __('Service Unavailable')); ?>
<?php $__env->startSection('code', '503'); ?>
<?php $__env->startSection('message', __('Service Unavailable')); ?>
<?php echo $__env->make('errors::minimal', array_diff_key(get_defined_vars(), ['__data' => 1, '__path' => 1]))->render(); ?><?php /**PATH F:\Sempro TA\project\Laravel\TA\vendor\laravel\framework\src\Illuminate\Foundation\Exceptions\views\503.blade.php ENDPATH**/ ?>

View File

@ -1,79 +0,0 @@
<?php $attributes ??= new \Illuminate\View\ComponentAttributeBag;
$__newAttributes = [];
$__propNames = \Illuminate\View\ComponentAttributeBag::extractPropNames((['body']));
foreach ($attributes->all() as $__key => $__value) {
if (in_array($__key, $__propNames)) {
$$__key = $$__key ?? $__value;
} else {
$__newAttributes[$__key] = $__value;
}
}
$attributes = new \Illuminate\View\ComponentAttributeBag($__newAttributes);
unset($__propNames);
unset($__newAttributes);
foreach (array_filter((['body']), 'is_string', ARRAY_FILTER_USE_KEY) as $__key => $__value) {
$$__key = $$__key ?? $__value;
}
$__defined_vars = get_defined_vars();
foreach ($attributes->all() as $__key => $__value) {
if (array_key_exists($__key, $__defined_vars)) unset($$__key);
}
unset($__defined_vars, $__key, $__value); ?>
<div class="flex flex-col gap-3">
<h2 class="text-lg font-semibold">Body</h2>
<?php if($body): ?>
<div class="bg-white dark:bg-white/[2%] border border-neutral-200 dark:border-neutral-800 rounded-md overflow-x-auto p-5 text-sm font-mono shadow-xs">
<?php if (isset($component)) { $__componentOriginal12cb286571f553eebcbe98210b217f94 = $component; } ?>
<?php if (isset($attributes)) { $__attributesOriginal12cb286571f553eebcbe98210b217f94 = $attributes; } ?>
<?php $component = Illuminate\View\AnonymousComponent::resolve(['view' => 'laravel-exceptions-renderer::components.syntax-highlight','data' => ['code' => $body,'language' => 'json']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? $attributes->all() : [])); ?>
<?php $component->withName('laravel-exceptions-renderer::syntax-highlight'); ?>
<?php if ($component->shouldRender()): ?>
<?php $__env->startComponent($component->resolveView(), $component->data()); ?>
<?php if (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag): ?>
<?php $attributes = $attributes->except(\Illuminate\View\AnonymousComponent::ignoredParameterNames()); ?>
<?php endif; ?>
<?php $component->withAttributes(['code' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($body),'language' => 'json']); ?>
<?php echo $__env->renderComponent(); ?>
<?php endif; ?>
<?php if (isset($__attributesOriginal12cb286571f553eebcbe98210b217f94)): ?>
<?php $attributes = $__attributesOriginal12cb286571f553eebcbe98210b217f94; ?>
<?php unset($__attributesOriginal12cb286571f553eebcbe98210b217f94); ?>
<?php endif; ?>
<?php if (isset($__componentOriginal12cb286571f553eebcbe98210b217f94)): ?>
<?php $component = $__componentOriginal12cb286571f553eebcbe98210b217f94; ?>
<?php unset($__componentOriginal12cb286571f553eebcbe98210b217f94); ?>
<?php endif; ?>
</div>
<?php else: ?>
<?php if (isset($component)) { $__componentOriginal612ffe32146e3bd2ac6ba6076cca9520 = $component; } ?>
<?php if (isset($attributes)) { $__attributesOriginal612ffe32146e3bd2ac6ba6076cca9520 = $attributes; } ?>
<?php $component = Illuminate\View\AnonymousComponent::resolve(['view' => 'laravel-exceptions-renderer::components.empty-state','data' => ['message' => 'No request body']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? $attributes->all() : [])); ?>
<?php $component->withName('laravel-exceptions-renderer::empty-state'); ?>
<?php if ($component->shouldRender()): ?>
<?php $__env->startComponent($component->resolveView(), $component->data()); ?>
<?php if (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag): ?>
<?php $attributes = $attributes->except(\Illuminate\View\AnonymousComponent::ignoredParameterNames()); ?>
<?php endif; ?>
<?php $component->withAttributes(['message' => 'No request body']); ?>
<?php echo $__env->renderComponent(); ?>
<?php endif; ?>
<?php if (isset($__attributesOriginal612ffe32146e3bd2ac6ba6076cca9520)): ?>
<?php $attributes = $__attributesOriginal612ffe32146e3bd2ac6ba6076cca9520; ?>
<?php unset($__attributesOriginal612ffe32146e3bd2ac6ba6076cca9520); ?>
<?php endif; ?>
<?php if (isset($__componentOriginal612ffe32146e3bd2ac6ba6076cca9520)): ?>
<?php $component = $__componentOriginal612ffe32146e3bd2ac6ba6076cca9520; ?>
<?php unset($__componentOriginal612ffe32146e3bd2ac6ba6076cca9520); ?>
<?php endif; ?>
<?php endif; ?>
</div>
<?php /**PATH F:\Sempro TA\project\Laravel\TA\vendor\laravel\framework\src\Illuminate\Foundation\resources\exceptions\renderer\components\request-body.blade.php ENDPATH**/ ?>

View File

@ -1,157 +0,0 @@
<?php $attributes ??= new \Illuminate\View\ComponentAttributeBag;
$__newAttributes = [];
$__propNames = \Illuminate\View\ComponentAttributeBag::extractPropNames((['exception']));
foreach ($attributes->all() as $__key => $__value) {
if (in_array($__key, $__propNames)) {
$$__key = $$__key ?? $__value;
} else {
$__newAttributes[$__key] = $__value;
}
}
$attributes = new \Illuminate\View\ComponentAttributeBag($__newAttributes);
unset($__propNames);
unset($__newAttributes);
foreach (array_filter((['exception']), 'is_string', ARRAY_FILTER_USE_KEY) as $__key => $__value) {
$$__key = $$__key ?? $__value;
}
$__defined_vars = get_defined_vars();
foreach ($attributes->all() as $__key => $__value) {
if (array_key_exists($__key, $__defined_vars)) unset($$__key);
}
unset($__defined_vars, $__key, $__value); ?>
<div class="flex flex-col pt-8 sm:pt-16 overflow-x-auto">
<div class="flex flex-col gap-5 mb-8">
<h1 class="text-3xl font-semibold text-neutral-950 dark:text-white"><?php echo e($exception->class()); ?></h1>
<?php if (isset($component)) { $__componentOriginalfe2bc8d0a6d110d41fdc8740012cee8d = $component; } ?>
<?php if (isset($attributes)) { $__attributesOriginalfe2bc8d0a6d110d41fdc8740012cee8d = $attributes; } ?>
<?php $component = Illuminate\View\AnonymousComponent::resolve(['view' => 'laravel-exceptions-renderer::components.file-with-line','data' => ['frame' => $exception->frames()->first(),'class' => '-mt-3 text-xs']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? $attributes->all() : [])); ?>
<?php $component->withName('laravel-exceptions-renderer::file-with-line'); ?>
<?php if ($component->shouldRender()): ?>
<?php $__env->startComponent($component->resolveView(), $component->data()); ?>
<?php if (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag): ?>
<?php $attributes = $attributes->except(\Illuminate\View\AnonymousComponent::ignoredParameterNames()); ?>
<?php endif; ?>
<?php $component->withAttributes(['frame' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($exception->frames()->first()),'class' => '-mt-3 text-xs']); ?>
<?php echo $__env->renderComponent(); ?>
<?php endif; ?>
<?php if (isset($__attributesOriginalfe2bc8d0a6d110d41fdc8740012cee8d)): ?>
<?php $attributes = $__attributesOriginalfe2bc8d0a6d110d41fdc8740012cee8d; ?>
<?php unset($__attributesOriginalfe2bc8d0a6d110d41fdc8740012cee8d); ?>
<?php endif; ?>
<?php if (isset($__componentOriginalfe2bc8d0a6d110d41fdc8740012cee8d)): ?>
<?php $component = $__componentOriginalfe2bc8d0a6d110d41fdc8740012cee8d; ?>
<?php unset($__componentOriginalfe2bc8d0a6d110d41fdc8740012cee8d); ?>
<?php endif; ?>
<p class="text-xl font-light text-neutral-800 dark:text-neutral-300">
<?php echo e($exception->message()); ?>
</p>
</div>
<div class="flex items-start gap-2 mb-8 sm:mb-16">
<div class="bg-white dark:bg-white/[3%] border border-neutral-200 dark:border-white/10 divide-x divide-neutral-200 dark:divide-white/10 rounded-md shadow-xs flex items-center gap-0.5">
<div class="flex items-center gap-1.5 h-6 px-[6px] font-mono text-[13px]">
<span class="text-neutral-400 dark:text-neutral-500">LARAVEL</span>
<span class="text-neutral-500 dark:text-neutral-300"><?php echo e(app()->version()); ?></span>
</div>
<div class="flex items-center gap-1.5 h-6 px-[6px] font-mono text-[13px]">
<span class="text-neutral-400 dark:text-neutral-500">PHP</span>
<span class="text-neutral-500 dark:text-neutral-300"><?php echo e(PHP_VERSION); ?></span>
</div>
</div>
<?php if (isset($component)) { $__componentOriginal0bc865510ef3ecddbe48edc4e8cc9ddb = $component; } ?>
<?php if (isset($attributes)) { $__attributesOriginal0bc865510ef3ecddbe48edc4e8cc9ddb = $attributes; } ?>
<?php $component = Illuminate\View\AnonymousComponent::resolve(['view' => 'laravel-exceptions-renderer::components.badge','data' => ['type' => 'error']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? $attributes->all() : [])); ?>
<?php $component->withName('laravel-exceptions-renderer::badge'); ?>
<?php if ($component->shouldRender()): ?>
<?php $__env->startComponent($component->resolveView(), $component->data()); ?>
<?php if (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag): ?>
<?php $attributes = $attributes->except(\Illuminate\View\AnonymousComponent::ignoredParameterNames()); ?>
<?php endif; ?>
<?php $component->withAttributes(['type' => 'error']); ?>
<?php if (isset($component)) { $__componentOriginalebc8ec9a834a8051f56913d6745a7050 = $component; } ?>
<?php if (isset($attributes)) { $__attributesOriginalebc8ec9a834a8051f56913d6745a7050 = $attributes; } ?>
<?php $component = Illuminate\View\AnonymousComponent::resolve(['view' => 'laravel-exceptions-renderer::components.icons.alert','data' => ['class' => 'w-2.5 h-2.5']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? $attributes->all() : [])); ?>
<?php $component->withName('laravel-exceptions-renderer::icons.alert'); ?>
<?php if ($component->shouldRender()): ?>
<?php $__env->startComponent($component->resolveView(), $component->data()); ?>
<?php if (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag): ?>
<?php $attributes = $attributes->except(\Illuminate\View\AnonymousComponent::ignoredParameterNames()); ?>
<?php endif; ?>
<?php $component->withAttributes(['class' => 'w-2.5 h-2.5']); ?>
<?php echo $__env->renderComponent(); ?>
<?php endif; ?>
<?php if (isset($__attributesOriginalebc8ec9a834a8051f56913d6745a7050)): ?>
<?php $attributes = $__attributesOriginalebc8ec9a834a8051f56913d6745a7050; ?>
<?php unset($__attributesOriginalebc8ec9a834a8051f56913d6745a7050); ?>
<?php endif; ?>
<?php if (isset($__componentOriginalebc8ec9a834a8051f56913d6745a7050)): ?>
<?php $component = $__componentOriginalebc8ec9a834a8051f56913d6745a7050; ?>
<?php unset($__componentOriginalebc8ec9a834a8051f56913d6745a7050); ?>
<?php endif; ?>
UNHANDLED
<?php echo $__env->renderComponent(); ?>
<?php endif; ?>
<?php if (isset($__attributesOriginal0bc865510ef3ecddbe48edc4e8cc9ddb)): ?>
<?php $attributes = $__attributesOriginal0bc865510ef3ecddbe48edc4e8cc9ddb; ?>
<?php unset($__attributesOriginal0bc865510ef3ecddbe48edc4e8cc9ddb); ?>
<?php endif; ?>
<?php if (isset($__componentOriginal0bc865510ef3ecddbe48edc4e8cc9ddb)): ?>
<?php $component = $__componentOriginal0bc865510ef3ecddbe48edc4e8cc9ddb; ?>
<?php unset($__componentOriginal0bc865510ef3ecddbe48edc4e8cc9ddb); ?>
<?php endif; ?>
<?php if (isset($component)) { $__componentOriginal0bc865510ef3ecddbe48edc4e8cc9ddb = $component; } ?>
<?php if (isset($attributes)) { $__attributesOriginal0bc865510ef3ecddbe48edc4e8cc9ddb = $attributes; } ?>
<?php $component = Illuminate\View\AnonymousComponent::resolve(['view' => 'laravel-exceptions-renderer::components.badge','data' => ['type' => 'error','variant' => 'solid']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? $attributes->all() : [])); ?>
<?php $component->withName('laravel-exceptions-renderer::badge'); ?>
<?php if ($component->shouldRender()): ?>
<?php $__env->startComponent($component->resolveView(), $component->data()); ?>
<?php if (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag): ?>
<?php $attributes = $attributes->except(\Illuminate\View\AnonymousComponent::ignoredParameterNames()); ?>
<?php endif; ?>
<?php $component->withAttributes(['type' => 'error','variant' => 'solid']); ?>
CODE <?php echo e($exception->code()); ?>
<?php echo $__env->renderComponent(); ?>
<?php endif; ?>
<?php if (isset($__attributesOriginal0bc865510ef3ecddbe48edc4e8cc9ddb)): ?>
<?php $attributes = $__attributesOriginal0bc865510ef3ecddbe48edc4e8cc9ddb; ?>
<?php unset($__attributesOriginal0bc865510ef3ecddbe48edc4e8cc9ddb); ?>
<?php endif; ?>
<?php if (isset($__componentOriginal0bc865510ef3ecddbe48edc4e8cc9ddb)): ?>
<?php $component = $__componentOriginal0bc865510ef3ecddbe48edc4e8cc9ddb; ?>
<?php unset($__componentOriginal0bc865510ef3ecddbe48edc4e8cc9ddb); ?>
<?php endif; ?>
</div>
<?php if (isset($component)) { $__componentOriginalb581a7e3a55d371fae986833ecafa668 = $component; } ?>
<?php if (isset($attributes)) { $__attributesOriginalb581a7e3a55d371fae986833ecafa668 = $attributes; } ?>
<?php $component = Illuminate\View\AnonymousComponent::resolve(['view' => 'laravel-exceptions-renderer::components.request-url','data' => ['exception' => $exception,'request' => $exception->request(),'class' => 'relative z-50']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? $attributes->all() : [])); ?>
<?php $component->withName('laravel-exceptions-renderer::request-url'); ?>
<?php if ($component->shouldRender()): ?>
<?php $__env->startComponent($component->resolveView(), $component->data()); ?>
<?php if (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag): ?>
<?php $attributes = $attributes->except(\Illuminate\View\AnonymousComponent::ignoredParameterNames()); ?>
<?php endif; ?>
<?php $component->withAttributes(['exception' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($exception),'request' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($exception->request()),'class' => 'relative z-50']); ?>
<?php echo $__env->renderComponent(); ?>
<?php endif; ?>
<?php if (isset($__attributesOriginalb581a7e3a55d371fae986833ecafa668)): ?>
<?php $attributes = $__attributesOriginalb581a7e3a55d371fae986833ecafa668; ?>
<?php unset($__attributesOriginalb581a7e3a55d371fae986833ecafa668); ?>
<?php endif; ?>
<?php if (isset($__componentOriginalb581a7e3a55d371fae986833ecafa668)): ?>
<?php $component = $__componentOriginalb581a7e3a55d371fae986833ecafa668; ?>
<?php unset($__componentOriginalb581a7e3a55d371fae986833ecafa668); ?>
<?php endif; ?>
</div>
<?php /**PATH F:\Sempro TA\project\Laravel\TA\vendor\laravel\framework\src\Illuminate\Foundation\resources\exceptions\renderer\components\header.blade.php ENDPATH**/ ?>

File diff suppressed because one or more lines are too long

View File

@ -1,6 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" <?php echo e($attributes); ?>>
<circle cx="12" cy="12" r="10"/>
<path d="M12 16v-4"/>
<path d="M12 8h.01"/>
</svg>
<?php /**PATH F:\Sempro TA\project\Laravel\TA\vendor\laravel\framework\src\Illuminate\Foundation\resources\exceptions\renderer\components\icons\info.blade.php ENDPATH**/ ?>

Before

Width:  |  Height:  |  Size: 480 B

View File

@ -1,12 +0,0 @@
<svg width="12" height="12" viewBox="0 0 12 12" fill="none" xmlns="http://www.w3.org/2000/svg" <?php echo e($attributes); ?>>
<g clip-path="url(#clip0_14732_6211)">
<path d="M1.75 5.25V2.75C1.75 1.922 2.422 1.25 3.25 1.25H4.202C4.808 1.25 5.381 1.525 5.761 1.998L6.364 2.75H8.25C9.355 2.75 10.25 3.645 10.25 4.75V5.25" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M2.46801 5.25H9.53101C10.44 5.25 11.14 6.052 11.017 6.953L10.735 9.021C10.6 10.012 9.75301 10.751 8.75301 10.751H3.24601C2.24601 10.751 1.39901 10.012 1.26401 9.021L0.982011 6.953C0.859011 6.052 1.55901 5.25 2.46801 5.25Z" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round"/>
</g>
<defs>
<clipPath id="clip0_14732_6211">
<rect width="12" height="12" />
</clipPath>
</defs>
</svg>
<?php /**PATH F:\Sempro TA\project\Laravel\TA\vendor\laravel\framework\src\Illuminate\Foundation\resources\exceptions\renderer\components\icons\folder-open.blade.php ENDPATH**/ ?>

Before

Width:  |  Height:  |  Size: 1.0 KiB

View File

@ -1,4 +0,0 @@
<svg fill="none" stroke="currentColor" viewBox="0 0 24 24" <?php echo e($attributes); ?>>
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M5 13l4 4L19 7"></path>
</svg>
<?php /**PATH F:\Sempro TA\project\Laravel\TA\vendor\laravel\framework\src\Illuminate\Foundation\resources\exceptions\renderer\components\icons\check.blade.php ENDPATH**/ ?>

Before

Width:  |  Height:  |  Size: 371 B

View File

@ -1,83 +0,0 @@
<?php $attributes ??= new \Illuminate\View\ComponentAttributeBag;
$__newAttributes = [];
$__propNames = \Illuminate\View\ComponentAttributeBag::extractPropNames((['method']));
foreach ($attributes->all() as $__key => $__value) {
if (in_array($__key, $__propNames)) {
$$__key = $$__key ?? $__value;
} else {
$__newAttributes[$__key] = $__value;
}
}
$attributes = new \Illuminate\View\ComponentAttributeBag($__newAttributes);
unset($__propNames);
unset($__newAttributes);
foreach (array_filter((['method']), 'is_string', ARRAY_FILTER_USE_KEY) as $__key => $__value) {
$$__key = $$__key ?? $__value;
}
$__defined_vars = get_defined_vars();
foreach ($attributes->all() as $__key => $__value) {
if (array_key_exists($__key, $__defined_vars)) unset($$__key);
}
unset($__defined_vars, $__key, $__value); ?>
<?php
$type = match ($method) {
'GET', 'OPTIONS', 'ANY' => 'default',
'POST' => 'success',
'PUT', 'PATCH' => 'primary',
'DELETE' => 'error',
default => 'default',
};
?>
<?php if (isset($component)) { $__componentOriginal0bc865510ef3ecddbe48edc4e8cc9ddb = $component; } ?>
<?php if (isset($attributes)) { $__attributesOriginal0bc865510ef3ecddbe48edc4e8cc9ddb = $attributes; } ?>
<?php $component = Illuminate\View\AnonymousComponent::resolve(['view' => 'laravel-exceptions-renderer::components.badge','data' => ['type' => ''.e($type).'']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? $attributes->all() : [])); ?>
<?php $component->withName('laravel-exceptions-renderer::badge'); ?>
<?php if ($component->shouldRender()): ?>
<?php $__env->startComponent($component->resolveView(), $component->data()); ?>
<?php if (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag): ?>
<?php $attributes = $attributes->except(\Illuminate\View\AnonymousComponent::ignoredParameterNames()); ?>
<?php endif; ?>
<?php $component->withAttributes(['type' => ''.e($type).'']); ?>
<?php if (isset($component)) { $__componentOriginalba2eecb54ab69c011eea9820c76048d8 = $component; } ?>
<?php if (isset($attributes)) { $__attributesOriginalba2eecb54ab69c011eea9820c76048d8 = $attributes; } ?>
<?php $component = Illuminate\View\AnonymousComponent::resolve(['view' => 'laravel-exceptions-renderer::components.icons.globe','data' => ['class' => 'w-2.5 h-2.5']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? $attributes->all() : [])); ?>
<?php $component->withName('laravel-exceptions-renderer::icons.globe'); ?>
<?php if ($component->shouldRender()): ?>
<?php $__env->startComponent($component->resolveView(), $component->data()); ?>
<?php if (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag): ?>
<?php $attributes = $attributes->except(\Illuminate\View\AnonymousComponent::ignoredParameterNames()); ?>
<?php endif; ?>
<?php $component->withAttributes(['class' => 'w-2.5 h-2.5']); ?>
<?php echo $__env->renderComponent(); ?>
<?php endif; ?>
<?php if (isset($__attributesOriginalba2eecb54ab69c011eea9820c76048d8)): ?>
<?php $attributes = $__attributesOriginalba2eecb54ab69c011eea9820c76048d8; ?>
<?php unset($__attributesOriginalba2eecb54ab69c011eea9820c76048d8); ?>
<?php endif; ?>
<?php if (isset($__componentOriginalba2eecb54ab69c011eea9820c76048d8)): ?>
<?php $component = $__componentOriginalba2eecb54ab69c011eea9820c76048d8; ?>
<?php unset($__componentOriginalba2eecb54ab69c011eea9820c76048d8); ?>
<?php endif; ?>
<?php echo e($method); ?>
<?php echo $__env->renderComponent(); ?>
<?php endif; ?>
<?php if (isset($__attributesOriginal0bc865510ef3ecddbe48edc4e8cc9ddb)): ?>
<?php $attributes = $__attributesOriginal0bc865510ef3ecddbe48edc4e8cc9ddb; ?>
<?php unset($__attributesOriginal0bc865510ef3ecddbe48edc4e8cc9ddb); ?>
<?php endif; ?>
<?php if (isset($__componentOriginal0bc865510ef3ecddbe48edc4e8cc9ddb)): ?>
<?php $component = $__componentOriginal0bc865510ef3ecddbe48edc4e8cc9ddb; ?>
<?php unset($__componentOriginal0bc865510ef3ecddbe48edc4e8cc9ddb); ?>
<?php endif; ?>
<?php /**PATH F:\Sempro TA\project\Laravel\TA\vendor\laravel\framework\src\Illuminate\Foundation\resources\exceptions\renderer\components\http-method.blade.php ENDPATH**/ ?>

View File

@ -1,180 +0,0 @@
<?php $attributes ??= new \Illuminate\View\ComponentAttributeBag;
$__newAttributes = [];
$__propNames = \Illuminate\View\ComponentAttributeBag::extractPropNames((['frame']));
foreach ($attributes->all() as $__key => $__value) {
if (in_array($__key, $__propNames)) {
$$__key = $$__key ?? $__value;
} else {
$__newAttributes[$__key] = $__value;
}
}
$attributes = new \Illuminate\View\ComponentAttributeBag($__newAttributes);
unset($__propNames);
unset($__newAttributes);
foreach (array_filter((['frame']), 'is_string', ARRAY_FILTER_USE_KEY) as $__key => $__value) {
$$__key = $$__key ?? $__value;
}
$__defined_vars = get_defined_vars();
foreach ($attributes->all() as $__key => $__value) {
if (array_key_exists($__key, $__defined_vars)) unset($$__key);
}
unset($__defined_vars, $__key, $__value); ?>
<div
x-data="{
expanded: <?php echo e($frame->isMain() ? 'true' : 'false'); ?>,
hasCode: <?php echo e($frame->snippet() ? 'true' : 'false'); ?>
}"
class="group rounded-lg border border-neutral-200 dark:border-white/10 overflow-hidden shadow-xs"
:class="{ 'dark:border-white/5': expanded }"
>
<div
class="flex h-11 items-center gap-3 bg-white pr-2.5 pl-4 overflow-x-auto dark:bg-white/3"
:class="{
'cursor-pointer hover:bg-white/50 dark:hover:bg-white/5 hover:[&_svg]:stroke-emerald-500': hasCode,
'dark:bg-white/5 rounded-t-lg': expanded,
'dark:bg-white/3 rounded-lg': !expanded
}"
@click="hasCode && (expanded = !expanded)"
>
<div class="flex size-3 items-center justify-center flex-shrink-0">
<div
class="size-2 rounded-full"
:class="{
'bg-rose-500 dark:bg-neutral-400': expanded,
'bg-rose-200 dark:bg-neutral-700': !expanded
}"
></div>
</div>
<div class="flex flex-1 items-center justify-between gap-6 min-w-0">
<?php if (isset($component)) { $__componentOriginalc33171fb5f34409a0ad661ae1625dcb2 = $component; } ?>
<?php if (isset($attributes)) { $__attributesOriginalc33171fb5f34409a0ad661ae1625dcb2 = $attributes; } ?>
<?php $component = Illuminate\View\AnonymousComponent::resolve(['view' => 'laravel-exceptions-renderer::components.formatted-source','data' => ['frame' => $frame]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? $attributes->all() : [])); ?>
<?php $component->withName('laravel-exceptions-renderer::formatted-source'); ?>
<?php if ($component->shouldRender()): ?>
<?php $__env->startComponent($component->resolveView(), $component->data()); ?>
<?php if (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag): ?>
<?php $attributes = $attributes->except(\Illuminate\View\AnonymousComponent::ignoredParameterNames()); ?>
<?php endif; ?>
<?php $component->withAttributes(['frame' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($frame)]); ?>
<?php echo $__env->renderComponent(); ?>
<?php endif; ?>
<?php if (isset($__attributesOriginalc33171fb5f34409a0ad661ae1625dcb2)): ?>
<?php $attributes = $__attributesOriginalc33171fb5f34409a0ad661ae1625dcb2; ?>
<?php unset($__attributesOriginalc33171fb5f34409a0ad661ae1625dcb2); ?>
<?php endif; ?>
<?php if (isset($__componentOriginalc33171fb5f34409a0ad661ae1625dcb2)): ?>
<?php $component = $__componentOriginalc33171fb5f34409a0ad661ae1625dcb2; ?>
<?php unset($__componentOriginalc33171fb5f34409a0ad661ae1625dcb2); ?>
<?php endif; ?>
<?php if (isset($component)) { $__componentOriginalfe2bc8d0a6d110d41fdc8740012cee8d = $component; } ?>
<?php if (isset($attributes)) { $__attributesOriginalfe2bc8d0a6d110d41fdc8740012cee8d = $attributes; } ?>
<?php $component = Illuminate\View\AnonymousComponent::resolve(['view' => 'laravel-exceptions-renderer::components.file-with-line','data' => ['frame' => $frame,'direction' => 'rtl']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? $attributes->all() : [])); ?>
<?php $component->withName('laravel-exceptions-renderer::file-with-line'); ?>
<?php if ($component->shouldRender()): ?>
<?php $__env->startComponent($component->resolveView(), $component->data()); ?>
<?php if (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag): ?>
<?php $attributes = $attributes->except(\Illuminate\View\AnonymousComponent::ignoredParameterNames()); ?>
<?php endif; ?>
<?php $component->withAttributes(['frame' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($frame),'direction' => 'rtl']); ?>
<?php echo $__env->renderComponent(); ?>
<?php endif; ?>
<?php if (isset($__attributesOriginalfe2bc8d0a6d110d41fdc8740012cee8d)): ?>
<?php $attributes = $__attributesOriginalfe2bc8d0a6d110d41fdc8740012cee8d; ?>
<?php unset($__attributesOriginalfe2bc8d0a6d110d41fdc8740012cee8d); ?>
<?php endif; ?>
<?php if (isset($__componentOriginalfe2bc8d0a6d110d41fdc8740012cee8d)): ?>
<?php $component = $__componentOriginalfe2bc8d0a6d110d41fdc8740012cee8d; ?>
<?php unset($__componentOriginalfe2bc8d0a6d110d41fdc8740012cee8d); ?>
<?php endif; ?>
</div>
<div class="flex-shrink-0">
<button
x-cloak
type="button"
class="flex h-6 w-6 cursor-pointer items-center justify-center rounded-md dark:border dark:border-white/8 group-hover:text-blue-500 group-hover:dark:text-emerald-500"
:class="{
'text-blue-500 dark:text-emerald-500 dark:bg-white/5': expanded,
'text-neutral-500 dark:text-neutral-500 dark:bg-white/3': !expanded,
}"
>
<?php if (isset($component)) { $__componentOriginal4400c4a71d3ea90a0e0b846e7d689a28 = $component; } ?>
<?php if (isset($attributes)) { $__attributesOriginal4400c4a71d3ea90a0e0b846e7d689a28 = $attributes; } ?>
<?php $component = Illuminate\View\AnonymousComponent::resolve(['view' => 'laravel-exceptions-renderer::components.icons.chevrons-down-up','data' => ['xShow' => 'expanded']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? $attributes->all() : [])); ?>
<?php $component->withName('laravel-exceptions-renderer::icons.chevrons-down-up'); ?>
<?php if ($component->shouldRender()): ?>
<?php $__env->startComponent($component->resolveView(), $component->data()); ?>
<?php if (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag): ?>
<?php $attributes = $attributes->except(\Illuminate\View\AnonymousComponent::ignoredParameterNames()); ?>
<?php endif; ?>
<?php $component->withAttributes(['x-show' => 'expanded']); ?>
<?php echo $__env->renderComponent(); ?>
<?php endif; ?>
<?php if (isset($__attributesOriginal4400c4a71d3ea90a0e0b846e7d689a28)): ?>
<?php $attributes = $__attributesOriginal4400c4a71d3ea90a0e0b846e7d689a28; ?>
<?php unset($__attributesOriginal4400c4a71d3ea90a0e0b846e7d689a28); ?>
<?php endif; ?>
<?php if (isset($__componentOriginal4400c4a71d3ea90a0e0b846e7d689a28)): ?>
<?php $component = $__componentOriginal4400c4a71d3ea90a0e0b846e7d689a28; ?>
<?php unset($__componentOriginal4400c4a71d3ea90a0e0b846e7d689a28); ?>
<?php endif; ?>
<?php if (isset($component)) { $__componentOriginal7348bb70f498d75e0a91acc6a707f136 = $component; } ?>
<?php if (isset($attributes)) { $__attributesOriginal7348bb70f498d75e0a91acc6a707f136 = $attributes; } ?>
<?php $component = Illuminate\View\AnonymousComponent::resolve(['view' => 'laravel-exceptions-renderer::components.icons.chevrons-up-down','data' => ['xShow' => '!expanded']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? $attributes->all() : [])); ?>
<?php $component->withName('laravel-exceptions-renderer::icons.chevrons-up-down'); ?>
<?php if ($component->shouldRender()): ?>
<?php $__env->startComponent($component->resolveView(), $component->data()); ?>
<?php if (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag): ?>
<?php $attributes = $attributes->except(\Illuminate\View\AnonymousComponent::ignoredParameterNames()); ?>
<?php endif; ?>
<?php $component->withAttributes(['x-show' => '!expanded']); ?>
<?php echo $__env->renderComponent(); ?>
<?php endif; ?>
<?php if (isset($__attributesOriginal7348bb70f498d75e0a91acc6a707f136)): ?>
<?php $attributes = $__attributesOriginal7348bb70f498d75e0a91acc6a707f136; ?>
<?php unset($__attributesOriginal7348bb70f498d75e0a91acc6a707f136); ?>
<?php endif; ?>
<?php if (isset($__componentOriginal7348bb70f498d75e0a91acc6a707f136)): ?>
<?php $component = $__componentOriginal7348bb70f498d75e0a91acc6a707f136; ?>
<?php unset($__componentOriginal7348bb70f498d75e0a91acc6a707f136); ?>
<?php endif; ?>
</button>
</div>
</div>
<?php if($snippet = $frame->snippet()): ?>
<?php if (isset($component)) { $__componentOriginala7df34c267a7ce6efa01f63b793ef234 = $component; } ?>
<?php if (isset($attributes)) { $__attributesOriginala7df34c267a7ce6efa01f63b793ef234 = $attributes; } ?>
<?php $component = Illuminate\View\AnonymousComponent::resolve(['view' => 'laravel-exceptions-renderer::components.frame-code','data' => ['code' => $snippet,'highlightedLine' => $frame->line(),'xShow' => 'expanded','xCloak' => !$frame->isMain()]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? $attributes->all() : [])); ?>
<?php $component->withName('laravel-exceptions-renderer::frame-code'); ?>
<?php if ($component->shouldRender()): ?>
<?php $__env->startComponent($component->resolveView(), $component->data()); ?>
<?php if (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag): ?>
<?php $attributes = $attributes->except(\Illuminate\View\AnonymousComponent::ignoredParameterNames()); ?>
<?php endif; ?>
<?php $component->withAttributes(['code' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($snippet),'highlightedLine' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($frame->line()),'x-show' => 'expanded','x-cloak' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute(!$frame->isMain())]); ?>
<?php echo $__env->renderComponent(); ?>
<?php endif; ?>
<?php if (isset($__attributesOriginala7df34c267a7ce6efa01f63b793ef234)): ?>
<?php $attributes = $__attributesOriginala7df34c267a7ce6efa01f63b793ef234; ?>
<?php unset($__attributesOriginala7df34c267a7ce6efa01f63b793ef234); ?>
<?php endif; ?>
<?php if (isset($__componentOriginala7df34c267a7ce6efa01f63b793ef234)): ?>
<?php $component = $__componentOriginala7df34c267a7ce6efa01f63b793ef234; ?>
<?php unset($__componentOriginala7df34c267a7ce6efa01f63b793ef234); ?>
<?php endif; ?>
<?php endif; ?>
</div>
<?php /**PATH F:\Sempro TA\project\Laravel\TA\vendor\laravel\framework\src\Illuminate\Foundation\resources\exceptions\renderer\components\frame.blade.php ENDPATH**/ ?>

View File

@ -1,537 +0,0 @@
<!DOCTYPE html>
<html lang="id">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Management Portal - Dosen & Staff/Teknisi</title>
<style>
:root {
--bg: #f5f7f4;
--panel: #ffffff;
--ink: #17211f;
--muted: #5f6d69;
--line: #d8dfdc;
--brand: #0f766e;
--brand-soft: #e7f3f1;
--accent: #f97316;
--ok: #16a34a;
--warn: #c2410c;
--shadow: 0 18px 42px rgba(23, 33, 31, 0.08);
}
* {
box-sizing: border-box;
margin: 0;
padding: 0;
}
body {
min-height: 100vh;
font-family: "Trebuchet MS", "Segoe UI", sans-serif;
color: var(--ink);
background:
radial-gradient(65rem 45rem at 120% -10%, #d7f0ec 0%, transparent 45%),
radial-gradient(55rem 40rem at -20% 120%, #ffe8d4 0%, transparent 38%),
var(--bg);
}
.layout {
min-height: 100vh;
display: grid;
grid-template-columns: 270px 1fr;
gap: 18px;
padding: 18px;
}
.sidebar {
background: linear-gradient(180deg, #0f172a, #111827);
color: #e5e7eb;
border-radius: 20px;
padding: 20px;
box-shadow: var(--shadow);
display: flex;
flex-direction: column;
}
.brand {
margin-bottom: 24px;
padding-bottom: 18px;
border-bottom: 1px solid rgba(229, 231, 235, 0.2);
}
.brand h1 {
font-size: 1.1rem;
letter-spacing: 0.04em;
}
.brand p {
margin-top: 4px;
color: #9ca3af;
font-size: 0.9rem;
}
.menu {
display: grid;
gap: 10px;
}
.menu a {
text-decoration: none;
color: #d1d5db;
border: 1px solid rgba(209, 213, 219, 0.15);
border-radius: 12px;
padding: 12px 14px;
font-weight: 700;
transition: all 0.2s ease;
display: flex;
align-items: center;
justify-content: space-between;
}
.menu a:hover,
.menu a.active {
color: #ffffff;
background: rgba(15, 118, 110, 0.35);
border-color: rgba(94, 234, 212, 0.45);
transform: translateX(2px);
}
.sidebar-note {
margin-top: auto;
border-top: 1px solid rgba(229, 231, 235, 0.18);
padding-top: 14px;
font-size: 0.84rem;
color: #9ca3af;
}
.content {
display: grid;
grid-template-rows: auto 1fr;
gap: 16px;
}
.topbar {
background: var(--panel);
border: 1px solid var(--line);
border-radius: 18px;
box-shadow: var(--shadow);
padding: 16px 18px;
display: flex;
justify-content: space-between;
align-items: center;
gap: 14px;
}
.welcome h2 {
font-size: clamp(1.15rem, 2.5vw, 1.8rem);
}
.welcome p {
margin-top: 4px;
color: var(--muted);
font-size: 0.95rem;
}
.status-wrap {
position: relative;
min-width: 240px;
}
.status-trigger {
width: 100%;
border: 1px solid var(--line);
background: #ffffff;
border-radius: 12px;
padding: 10px 12px;
display: flex;
align-items: center;
justify-content: space-between;
gap: 10px;
cursor: pointer;
font-weight: 700;
color: var(--ink);
}
.status-current {
display: inline-flex;
align-items: center;
gap: 8px;
}
.status-dot {
width: 10px;
height: 10px;
border-radius: 999px;
background: var(--ok);
box-shadow: 0 0 0 3px rgba(22, 163, 74, 0.18);
}
.status-minus {
display: inline-flex;
width: 14px;
height: 14px;
border-radius: 999px;
align-items: center;
justify-content: center;
font-size: 12px;
font-weight: 900;
color: #fff;
background: var(--warn);
line-height: 1;
}
.status-menu {
position: absolute;
top: calc(100% + 8px);
left: 0;
right: 0;
border: 1px solid var(--line);
background: #fff;
border-radius: 12px;
box-shadow: var(--shadow);
display: none;
overflow: hidden;
z-index: 10;
}
.status-menu.open {
display: block;
}
.status-option {
width: 100%;
text-align: left;
background: #fff;
border: 0;
border-bottom: 1px solid #edf0ef;
padding: 10px 12px;
font-weight: 700;
display: flex;
align-items: center;
gap: 8px;
cursor: pointer;
}
.status-option:last-child {
border-bottom: 0;
}
.status-option:hover {
background: #f8faf9;
}
.main-grid {
display: grid;
grid-template-columns: 2fr 1fr;
gap: 16px;
}
.card {
background: var(--panel);
border: 1px solid var(--line);
border-radius: 18px;
box-shadow: var(--shadow);
padding: 18px;
}
.card h3 {
font-size: 1.05rem;
margin-bottom: 6px;
}
.card p {
color: var(--muted);
font-size: 0.92rem;
}
.chart-wrap {
margin-top: 14px;
}
.chart-head {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 10px;
flex-wrap: wrap;
gap: 8px;
}
.chip {
background: var(--brand-soft);
color: var(--brand);
border: 1px solid #b5ddd8;
padding: 6px 10px;
border-radius: 999px;
font-size: 0.8rem;
font-weight: 700;
}
.chart {
display: grid;
gap: 9px;
}
.row {
display: grid;
grid-template-columns: 70px 1fr 55px;
align-items: center;
gap: 10px;
}
.day {
font-weight: 700;
color: #33413e;
font-size: 0.9rem;
}
.bar-bg {
height: 12px;
background: #e9efed;
border-radius: 999px;
overflow: hidden;
}
.bar {
height: 100%;
border-radius: 999px;
background: linear-gradient(90deg, var(--brand), #14b8a6);
transition: width 0.3s ease;
}
.hours {
text-align: right;
font-weight: 700;
color: #33413e;
font-size: 0.86rem;
}
.settings-list {
margin-top: 14px;
display: grid;
gap: 10px;
}
.setting-item {
display: flex;
justify-content: space-between;
align-items: center;
border: 1px solid #e7ecea;
border-radius: 12px;
padding: 10px 12px;
font-size: 0.92rem;
}
.setting-item span {
color: var(--muted);
}
.btn {
border: 1px solid #d2dad7;
border-radius: 9px;
background: #fff;
padding: 6px 9px;
cursor: pointer;
font-weight: 700;
color: #33413e;
font-size: 0.82rem;
}
.btn:hover {
border-color: #a9bbb6;
background: #f6faf9;
}
@media (max-width: 980px) {
.layout {
grid-template-columns: 1fr;
}
.sidebar {
padding: 14px;
}
.menu {
grid-template-columns: 1fr 1fr;
}
.main-grid {
grid-template-columns: 1fr;
}
}
@media (max-width: 620px) {
.topbar {
flex-direction: column;
align-items: stretch;
}
.status-wrap {
min-width: 0;
}
.row {
grid-template-columns: 56px 1fr 45px;
}
}
</style>
</head>
<body>
<?php
$namaString = $nama ?? 'Dosen/Staff';
$durasiMingguan = $durasiMingguan ?? [
'Senin' => 7.5,
'Selasa' => 6.8,
'Rabu' => 8.2,
'Kamis' => 7.1,
'Jumat' => 5.4,
];
$maksJam = max($durasiMingguan);
?>
<div class="layout">
<aside class="sidebar">
<div class="brand">
<h1>JTI MANAGEMENT</h1>
<p>Portal Dosen & Staff/Teknisi</p>
</div>
<nav class="menu" aria-label="Menu utama">
<a href="#" class="active">
<span>Home</span>
<span>01</span>
</a>
<a href="#">
<span>Setting</span>
<span>02</span>
</a>
</nav>
<div class="sidebar-note">
Monitoring kehadiran kampus aktif Senin - Jumat dan reset otomatis tiap minggu.
</div>
</aside>
<section class="content">
<header class="topbar">
<div class="welcome">
<h2>Selamat datang, <?php echo e($namaString); ?></h2>
<p>Semoga aktivitas akademik dan operasional hari ini berjalan lancar.</p>
</div>
<div class="status-wrap">
<button id="statusTrigger" class="status-trigger" type="button" aria-expanded="false" aria-controls="statusMenu">
<span id="statusCurrent" class="status-current">
<span class="status-dot" aria-hidden="true"></span>
Online
</span>
<span aria-hidden="true">v</span>
</button>
<div id="statusMenu" class="status-menu" role="listbox" aria-label="Pilih status">
<button type="button" class="status-option" data-type="online" role="option">
<span class="status-dot" aria-hidden="true"></span>
Online
</button>
<button type="button" class="status-option" data-type="dnd" role="option">
<span class="status-minus" aria-hidden="true">-</span>
Tidak Bisa Diganggu
</button>
</div>
</div>
</header>
<div class="main-grid">
<article class="card">
<h3>Grafik Durasi Kehadiran Dosen di Kampus</h3>
<p>Rekap otomatis dari Senin sampai Jumat, reset pada awal minggu berikutnya.</p>
<div class="chart-wrap">
<div class="chart-head">
<strong>Durasi mingguan (jam)</strong>
<span class="chip">Reset Mingguan Otomatis</span>
</div>
<div class="chart">
<?php $__currentLoopData = $durasiMingguan; $__env->addLoop($__currentLoopData); foreach($__currentLoopData as $hari => $jam): $__env->incrementLoopIndices(); $loop = $__env->getLastLoop(); ?>
<?php
$persen = $maksJam > 0 ? ($jam / $maksJam) * 100 : 0;
?>
<div class="row">
<div class="day"><?php echo e($hari); ?></div>
<div class="bar-bg" aria-hidden="true">
<div class="bar" style="width: <?php echo e(number_format($persen, 2, '.', '')); ?>%"></div>
</div>
<div class="hours"><?php echo e(rtrim(rtrim(number_format($jam, 1, '.', ''), '0'), '.')); ?>j</div>
</div>
<?php endforeach; $__env->popLoop(); $loop = $__env->getLastLoop(); ?>
</div>
</div>
</article>
<aside class="card">
<h3>Setting</h3>
<p>Pengaturan singkat untuk akun dosen dan staff/teknisi.</p>
<div class="settings-list">
<div class="setting-item">
<span>Nama Tampilan</span>
<button class="btn" type="button">Ubah</button>
</div>
<div class="setting-item">
<span>Notifikasi Kehadiran</span>
<button class="btn" type="button">Aktif</button>
</div>
<div class="setting-item">
<span>Sinkron Mingguan</span>
<button class="btn" type="button">Jadwalkan</button>
</div>
</div>
</aside>
</div>
</section>
</div>
<script>
(function () {
const trigger = document.getElementById('statusTrigger');
const menu = document.getElementById('statusMenu');
const current = document.getElementById('statusCurrent');
if (!trigger || !menu || !current) return;
const closeMenu = function () {
menu.classList.remove('open');
trigger.setAttribute('aria-expanded', 'false');
};
trigger.addEventListener('click', function () {
const isOpen = menu.classList.contains('open');
menu.classList.toggle('open', !isOpen);
trigger.setAttribute('aria-expanded', String(!isOpen));
});
menu.querySelectorAll('.status-option').forEach(function (option) {
option.addEventListener('click', function () {
const type = option.getAttribute('data-type');
if (type === 'online') {
current.innerHTML = '<span class="status-dot" aria-hidden="true"></span>Online';
} else {
current.innerHTML = '<span class="status-minus" aria-hidden="true">-</span>Tidak Bisa Diganggu';
}
closeMenu();
});
});
document.addEventListener('click', function (event) {
if (!menu.contains(event.target) && !trigger.contains(event.target)) {
closeMenu();
}
});
})();
</script>
</body>
</html>
<?php /**PATH F:\Sempro TA\project\Laravel\TA\resources\views\welcome.blade.php ENDPATH**/ ?>

View File

@ -1,98 +0,0 @@
<?php $attributes ??= new \Illuminate\View\ComponentAttributeBag;
$__newAttributes = [];
$__propNames = \Illuminate\View\ComponentAttributeBag::extractPropNames(([
'code',
'language',
'editor' => false,
'startingLine' => 1,
'highlightedLine' => null,
'truncate' => false,
]));
foreach ($attributes->all() as $__key => $__value) {
if (in_array($__key, $__propNames)) {
$$__key = $$__key ?? $__value;
} else {
$__newAttributes[$__key] = $__value;
}
}
$attributes = new \Illuminate\View\ComponentAttributeBag($__newAttributes);
unset($__propNames);
unset($__newAttributes);
foreach (array_filter(([
'code',
'language',
'editor' => false,
'startingLine' => 1,
'highlightedLine' => null,
'truncate' => false,
]), 'is_string', ARRAY_FILTER_USE_KEY) as $__key => $__value) {
$$__key = $$__key ?? $__value;
}
$__defined_vars = get_defined_vars();
foreach ($attributes->all() as $__key => $__value) {
if (array_key_exists($__key, $__defined_vars)) unset($$__key);
}
unset($__defined_vars, $__key, $__value); ?>
<?php
$fallback = $truncate ? '<pre class="truncate"><code>' : '<pre><code>';
if ($editor) {
$lines = explode("\n", $code);
foreach ($lines as $index => $line) {
$lineNumber = $startingLine + $index;
$highlight = $highlightedLine === $index;
$lineClass = implode(' ', [
'block px-4 py-1 h-7 even:bg-white odd:bg-white/2 even:dark:bg-white/2 odd:dark:bg-white/4',
$highlight ? 'bg-rose-200! dark:bg-rose-900!' : '',
]);
$lineNumberClass = implode(' ', [
'mr-6 text-neutral-500! dark:text-neutral-600!',
$highlight ? 'dark:text-white!' : '',
]);
$fallback .= '<span class="' . $lineClass . '">';
$fallback .= '<span class="' . $lineNumberClass . '">' . $lineNumber . '</span>';
$fallback .= htmlspecialchars($line);
$fallback .= '</span>';
}
} else {
$fallback .= htmlspecialchars($code);
}
$fallback .= '</code></pre>';
?>
<div
x-data="{ highlightedCode: null }"
x-init="
highlightedCode = window.highlight(
<?php echo e(Illuminate\Support\Js::from($code)); ?>,
<?php echo e(Illuminate\Support\Js::from($language)); ?>,
<?php echo e(Illuminate\Support\Js::from($truncate)); ?>,
<?php echo e(Illuminate\Support\Js::from($editor)); ?>,
<?php echo e(Illuminate\Support\Js::from($startingLine)); ?>,
<?php echo e(Illuminate\Support\Js::from($highlightedLine)); ?>
);
"
<?php echo e($attributes); ?>
>
<div
x-cloak
x-html="highlightedCode"
></div>
<div x-show="!highlightedCode"><?php echo $fallback; ?></div>
</div>
<?php /**PATH F:\Sempro TA\project\Laravel\TA\vendor\laravel\framework\src\Illuminate\Foundation\resources\exceptions\renderer\components\syntax-highlight.blade.php ENDPATH**/ ?>

View File

@ -1,69 +0,0 @@
<?php $attributes ??= new \Illuminate\View\ComponentAttributeBag;
$__newAttributes = [];
$__propNames = \Illuminate\View\ComponentAttributeBag::extractPropNames((['routing']));
foreach ($attributes->all() as $__key => $__value) {
if (in_array($__key, $__propNames)) {
$$__key = $$__key ?? $__value;
} else {
$__newAttributes[$__key] = $__value;
}
}
$attributes = new \Illuminate\View\ComponentAttributeBag($__newAttributes);
unset($__propNames);
unset($__newAttributes);
foreach (array_filter((['routing']), 'is_string', ARRAY_FILTER_USE_KEY) as $__key => $__value) {
$$__key = $$__key ?? $__value;
}
$__defined_vars = get_defined_vars();
foreach ($attributes->all() as $__key => $__value) {
if (array_key_exists($__key, $__defined_vars)) unset($$__key);
}
unset($__defined_vars, $__key, $__value); ?>
<div class="flex flex-col gap-3">
<h2 class="text-lg font-semibold">Routing</h2>
<div class="flex flex-col">
<?php $__empty_1 = true; $__currentLoopData = $routing; $__env->addLoop($__currentLoopData); foreach($__currentLoopData as $key => $value): $__env->incrementLoopIndices(); $loop = $__env->getLastLoop(); $__empty_1 = false; ?>
<div class="flex max-w-full items-baseline gap-2 h-10 text-sm font-mono">
<div class="uppercase text-neutral-500 dark:text-neutral-400 shrink-0"><?php echo e($key); ?></div>
<div class="min-w-6 grow h-3 border-b-2 border-dotted border-neutral-300 dark:border-white/20"></div>
<div class="truncate text-neutral-900 dark:text-white">
<span data-tippy-content="<?php echo e($value); ?>">
<?php echo e($value); ?>
</span>
</div>
</div>
<?php endforeach; $__env->popLoop(); $loop = $__env->getLastLoop(); if ($__empty_1): ?>
<?php if (isset($component)) { $__componentOriginal612ffe32146e3bd2ac6ba6076cca9520 = $component; } ?>
<?php if (isset($attributes)) { $__attributesOriginal612ffe32146e3bd2ac6ba6076cca9520 = $attributes; } ?>
<?php $component = Illuminate\View\AnonymousComponent::resolve(['view' => 'laravel-exceptions-renderer::components.empty-state','data' => ['message' => 'No routing context']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? $attributes->all() : [])); ?>
<?php $component->withName('laravel-exceptions-renderer::empty-state'); ?>
<?php if ($component->shouldRender()): ?>
<?php $__env->startComponent($component->resolveView(), $component->data()); ?>
<?php if (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag): ?>
<?php $attributes = $attributes->except(\Illuminate\View\AnonymousComponent::ignoredParameterNames()); ?>
<?php endif; ?>
<?php $component->withAttributes(['message' => 'No routing context']); ?>
<?php echo $__env->renderComponent(); ?>
<?php endif; ?>
<?php if (isset($__attributesOriginal612ffe32146e3bd2ac6ba6076cca9520)): ?>
<?php $attributes = $__attributesOriginal612ffe32146e3bd2ac6ba6076cca9520; ?>
<?php unset($__attributesOriginal612ffe32146e3bd2ac6ba6076cca9520); ?>
<?php endif; ?>
<?php if (isset($__componentOriginal612ffe32146e3bd2ac6ba6076cca9520)): ?>
<?php $component = $__componentOriginal612ffe32146e3bd2ac6ba6076cca9520; ?>
<?php unset($__componentOriginal612ffe32146e3bd2ac6ba6076cca9520); ?>
<?php endif; ?>
<?php endif; ?>
</div>
</div>
<?php /**PATH F:\Sempro TA\project\Laravel\TA\vendor\laravel\framework\src\Illuminate\Foundation\resources\exceptions\renderer\components\routing.blade.php ENDPATH**/ ?>

View File

@ -1,77 +0,0 @@
<?php $attributes ??= new \Illuminate\View\ComponentAttributeBag;
$__newAttributes = [];
$__propNames = \Illuminate\View\ComponentAttributeBag::extractPropNames((['type' => 'default', 'variant' => 'soft']));
foreach ($attributes->all() as $__key => $__value) {
if (in_array($__key, $__propNames)) {
$$__key = $$__key ?? $__value;
} else {
$__newAttributes[$__key] = $__value;
}
}
$attributes = new \Illuminate\View\ComponentAttributeBag($__newAttributes);
unset($__propNames);
unset($__newAttributes);
foreach (array_filter((['type' => 'default', 'variant' => 'soft']), 'is_string', ARRAY_FILTER_USE_KEY) as $__key => $__value) {
$$__key = $$__key ?? $__value;
}
$__defined_vars = get_defined_vars();
foreach ($attributes->all() as $__key => $__value) {
if (array_key_exists($__key, $__defined_vars)) unset($$__key);
}
unset($__defined_vars, $__key, $__value); ?>
<?php
$baseClasses = 'inline-flex w-fit shrink-0 items-center justify-center gap-1 font-mono leading-3 uppercase transition-colors dark:border [&_svg]:size-2.5 h-6 min-w-5 rounded-md px-1.5 text-xs/none';
$types = [
'default' => [
'soft' => 'bg-black/8 text-neutral-900 dark:border-neutral-700 dark:bg-white/10 dark:text-neutral-100',
'solid' => 'bg-neutral-600 text-neutral-100 dark:border-neutral-500 dark:bg-neutral-600',
],
'success' => [
'soft' => 'bg-emerald-200 text-emerald-900 dark:border-emerald-600 dark:bg-emerald-900/70 dark:text-emerald-400',
'solid' => 'bg-emerald-600 dark:border-emerald-500 dark:bg-emerald-600',
],
'primary' => [
'soft' => 'bg-blue-100 text-blue-900 dark:border-blue-800 dark:bg-blue-950 dark:text-blue-300',
'solid' => 'bg-blue-700 dark:border-blue-600 dark:bg-blue-700',
],
'error' => [
'soft' => 'bg-rose-200 text-rose-900 dark:border-rose-900 dark:bg-rose-950 dark:text-rose-100 dark:[&_svg]:!text-white',
'solid' => 'bg-rose-600 dark:border-rose-500 dark:bg-rose-600',
],
'alert' => [
'soft' => 'bg-amber-200 text-amber-900 dark:border-amber-800 dark:bg-amber-950 dark:text-amber-300',
'solid' => 'bg-amber-600 dark:border-amber-500 dark:bg-amber-600',
],
'white' => [
'soft' => 'bg-white text-neutral-900 dark:border-neutral-700 dark:bg-neutral-800 dark:text-neutral-100',
'solid' => 'bg-black/10 text-neutral-900 dark:text-neutral-900 dark:bg-white',
],
];
$variants = [
'soft' => '',
'solid' => 'text-white dark:text-white [&_svg]:!text-white',
];
$typeClasses = $types[$type][$variant] ?? $types['default']['soft'];
$variantClasses = $variants[$variant] ?? $variants['soft'];
$classes = implode(' ', [$baseClasses, $typeClasses, $variantClasses]);
?>
<div <?php echo e($attributes->merge(['class' => $classes])); ?>>
<?php echo e($slot); ?>
</div>
<?php /**PATH F:\Sempro TA\project\Laravel\TA\vendor\laravel\framework\src\Illuminate\Foundation\resources\exceptions\renderer\components\badge.blade.php ENDPATH**/ ?>

View File

@ -0,0 +1,517 @@
<!DOCTYPE html>
<html lang="id">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Login - JTI Management Portal</title>
<style>
:root {
--bg: #f5f7f4;
--panel: #ffffff;
--ink: #17211f;
--muted: #5f6d69;
--line: #d8dfdc;
--brand: #0f766e;
--brand-soft: #e7f3f1;
--primary: #4f46e5;
--primary-2: #7c3aed;
--accent: #f97316;
--ok: #16a34a;
--warn: #c2410c;
--shadow: 0 18px 42px rgba(23, 33, 31, 0.08);
--shadow-lg: 0 24px 70px rgba(31, 41, 55, 0.18);
}
* {
box-sizing: border-box;
margin: 0;
padding: 0;
}
html, body {
width: 100%;
height: 100%;
}
body {
font-family: "Trebuchet MS", "Segoe UI", sans-serif;
color: var(--ink);
background:
radial-gradient(65rem 45rem at 120% -10%, #d7f0ec 0%, transparent 45%),
radial-gradient(55rem 40rem at -20% 120%, #ffe8d4 0%, transparent 38%),
var(--bg);
display: flex;
align-items: center;
justify-content: center;
min-height: 100vh;
padding: 20px;
}
.login-container {
width: 100%;
max-width: 420px;
}
.login-card {
background: var(--panel);
border: 1px solid var(--line);
border-radius: 24px;
box-shadow: var(--shadow-lg);
padding: 42px 32px;
animation: slideUp 0.6s ease;
}
@keyframes slideUp {
from {
opacity: 0;
transform: translateY(30px);
}
to {
opacity: 1;
transform: translateY(0);
}
}
.brand-section {
text-align: center;
margin-bottom: 32px;
}
.brand-mark {
width: 56px;
height: 56px;
margin: 0 auto 16px;
border-radius: 16px;
display: grid;
place-items: center;
color: #fff;
font-weight: 800;
font-size: 1.3rem;
background: linear-gradient(135deg, var(--primary) 0%, var(--primary-2) 100%);
box-shadow: 0 12px 24px rgba(79, 70, 229, 0.28);
}
.brand-section h1 {
font-size: 1.5rem;
line-height: 1.1;
margin-bottom: 4px;
color: var(--ink);
}
.brand-section p {
color: var(--muted);
font-size: 0.92rem;
}
.form-group {
margin-bottom: 18px;
}
.form-label {
display: block;
font-weight: 700;
font-size: 0.92rem;
margin-bottom: 8px;
color: var(--ink);
}
.form-input {
width: 100%;
border: 1px solid var(--line);
border-radius: 12px;
padding: 12px 14px;
font-size: 0.95rem;
transition: all 0.2s ease;
background: #ffffff;
}
.form-input:focus {
outline: none;
border-color: var(--brand);
box-shadow: 0 0 0 3px rgba(15, 118, 110, 0.1);
background: #ffffff;
}
.form-input::placeholder {
color: #a8b5b1;
}
.form-error {
color: var(--warn);
font-size: 0.85rem;
margin-top: 6px;
display: flex;
align-items: center;
gap: 6px;
}
.error-icon {
width: 14px;
height: 14px;
flex-shrink: 0;
}
.form-input.error {
border-color: var(--warn);
background: #fef2f2;
}
.checkbox-group {
display: flex;
align-items: center;
gap: 8px;
font-size: 0.92rem;
margin-bottom: 24px;
}
.checkbox-group input[type="checkbox"] {
width: 18px;
height: 18px;
cursor: pointer;
accent-color: var(--brand);
}
.checkbox-group label {
cursor: pointer;
user-select: none;
}
.btn-submit {
width: 100%;
border: 0;
border-radius: 12px;
padding: 12px 16px;
font-weight: 700;
font-size: 0.95rem;
cursor: pointer;
background: linear-gradient(135deg, var(--primary) 0%, var(--primary-2) 100%);
color: #fff;
transition: all 0.2s ease;
box-shadow: 0 8px 16px rgba(79, 70, 229, 0.2);
margin-bottom: 18px;
}
.btn-submit:hover {
transform: translateY(-2px);
box-shadow: 0 12px 24px rgba(79, 70, 229, 0.3);
}
.btn-submit:active {
transform: translateY(0);
}
.btn-submit:disabled {
opacity: 0.6;
cursor: not-allowed;
transform: none;
}
.divider {
display: flex;
align-items: center;
gap: 12px;
margin: 24px 0;
color: var(--muted);
font-size: 0.85rem;
}
.divider::before,
.divider::after {
content: '';
flex: 1;
height: 1px;
background: var(--line);
}
.signup-link {
text-align: center;
color: var(--muted);
font-size: 0.92rem;
}
.signup-link a {
color: var(--brand);
text-decoration: none;
font-weight: 700;
transition: color 0.2s ease;
}
.signup-link a:hover {
color: var(--primary);
}
.alert {
padding: 14px 16px;
border-radius: 12px;
font-size: 0.92rem;
margin-bottom: 20px;
display: flex;
align-items: center;
gap: 10px;
animation: slideDown 0.3s ease;
}
@keyframes slideDown {
from {
opacity: 0;
transform: translateY(-10px);
}
to {
opacity: 1;
transform: translateY(0);
}
}
.alert-success {
background: #ecfdf5;
border: 1px solid #a7f3d0;
color: #065f46;
}
.alert-error {
background: #fef2f2;
border: 1px solid #fecaca;
color: #7f1d1d;
}
.alert-icon {
width: 18px;
height: 18px;
flex-shrink: 0;
}
.password-toggle {
position: relative;
}
.password-toggle-btn {
position: absolute;
right: 12px;
top: 50%;
transform: translateY(-50%);
background: none;
border: none;
cursor: pointer;
padding: 4px 8px;
color: var(--muted);
font-size: 1.1rem;
transition: color 0.2s ease;
}
.password-toggle-btn:hover {
color: var(--brand);
}
.password-toggle .form-input {
padding-right: 42px;
}
.info-section {
background: var(--brand-soft);
border: 1px solid #b5ddd8;
border-radius: 12px;
padding: 14px;
margin-bottom: 24px;
font-size: 0.85rem;
color: #115e59;
}
.info-section strong {
display: block;
margin-bottom: 6px;
color: var(--brand);
}
@media (max-width: 480px) {
.login-card {
padding: 28px 20px;
}
.brand-section {
margin-bottom: 24px;
}
.brand-section h1 {
font-size: 1.25rem;
}
.btn-submit {
padding: 11px 14px;
font-size: 0.9rem;
}
}
</style>
</head>
<body>
<div class="login-container">
<!-- Alert Messages -->
<?php if($errors->any()): ?>
<div class="alert alert-error">
<svg class="alert-icon" fill="currentColor" viewBox="0 0 20 20">
<path fill-rule="evenodd" d="M10 18a8 8 0 100-16 8 8 0 000 16zM8.707 7.293a1 1 0 00-1.414 1.414L8.586 10l-1.293 1.293a1 1 0 101.414 1.414L10 11.414l1.293 1.293a1 1 0 001.414-1.414L11.414 10l1.293-1.293a1 1 0 00-1.414-1.414L10 8.586 8.707 7.293z" clip-rule="evenodd" />
</svg>
<div>
<?php $__currentLoopData = $errors->all(); $__env->addLoop($__currentLoopData); foreach($__currentLoopData as $error): $__env->incrementLoopIndices(); $loop = $__env->getLastLoop(); ?>
<p><?php echo e($error); ?></p>
<?php endforeach; $__env->popLoop(); $loop = $__env->getLastLoop(); ?>
</div>
</div>
<?php endif; ?>
<?php if(session('success')): ?>
<div class="alert alert-success">
<svg class="alert-icon" fill="currentColor" viewBox="0 0 20 20">
<path fill-rule="evenodd" d="M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z" clip-rule="evenodd" />
</svg>
<p><?php echo e(session('success')); ?></p>
</div>
<?php endif; ?>
<!-- Login Card -->
<div class="login-card">
<!-- Brand Section -->
<div class="brand-section">
<div class="brand-mark">JTI</div>
<h1>JTI Management</h1>
<p>Portal Dosen & Staff/Teknisi</p>
</div>
<!-- Info Section -->
<div class="info-section">
<strong>Demo Account:</strong>
NIP: 19801212 200501 1 001<br>
Password: password123
</div>
<!-- Login Form -->
<form method="POST" action="<?php echo e(route('auth.login')); ?>">
<?php echo csrf_field(); ?>
<!-- NIP Field -->
<div class="form-group">
<label for="nip" class="form-label">NIP (Nomor Induk Pegawai)</label>
<input
type="text"
id="nip"
name="nip"
class="form-input <?php $__errorArgs = ['nip'];
$__bag = $errors->getBag($__errorArgs[1] ?? 'default');
if ($__bag->has($__errorArgs[0])) :
if (isset($message)) { $__messageOriginal = $message; }
$message = $__bag->first($__errorArgs[0]); ?> error <?php unset($message);
if (isset($__messageOriginal)) { $message = $__messageOriginal; }
endif;
unset($__errorArgs, $__bag); ?>"
placeholder="Masukkan NIP Anda"
value="<?php echo e(old('nip')); ?>"
required
autofocus
>
<?php $__errorArgs = ['nip'];
$__bag = $errors->getBag($__errorArgs[1] ?? 'default');
if ($__bag->has($__errorArgs[0])) :
if (isset($message)) { $__messageOriginal = $message; }
$message = $__bag->first($__errorArgs[0]); ?>
<div class="form-error">
<svg class="error-icon" fill="currentColor" viewBox="0 0 20 20">
<path fill-rule="evenodd" d="M18.101 12.93a1 1 0 00-1.517-1.087L10 14.989l-6.584-3.147a1 1 0 00-1.516 1.087l1.07 9.016a1 1 0 00.995.909h11.07a1 1 0 00.995-.909l1.071-9.016z" clip-rule="evenodd" />
</svg>
<span><?php echo e($message); ?></span>
</div>
<?php unset($message);
if (isset($__messageOriginal)) { $message = $__messageOriginal; }
endif;
unset($__errorArgs, $__bag); ?>
</div>
<!-- Password Field -->
<div class="form-group">
<label for="password" class="form-label">Password</label>
<div class="password-toggle">
<input
type="password"
id="password"
name="password"
class="form-input <?php $__errorArgs = ['password'];
$__bag = $errors->getBag($__errorArgs[1] ?? 'default');
if ($__bag->has($__errorArgs[0])) :
if (isset($message)) { $__messageOriginal = $message; }
$message = $__bag->first($__errorArgs[0]); ?> error <?php unset($message);
if (isset($__messageOriginal)) { $message = $__messageOriginal; }
endif;
unset($__errorArgs, $__bag); ?>"
placeholder="Masukkan password Anda"
required
>
<button type="button" class="password-toggle-btn" onclick="togglePassword()">
<span id="toggleIcon">👁</span>
</button>
</div>
<?php $__errorArgs = ['password'];
$__bag = $errors->getBag($__errorArgs[1] ?? 'default');
if ($__bag->has($__errorArgs[0])) :
if (isset($message)) { $__messageOriginal = $message; }
$message = $__bag->first($__errorArgs[0]); ?>
<div class="form-error">
<svg class="error-icon" fill="currentColor" viewBox="0 0 20 20">
<path fill-rule="evenodd" d="M18.101 12.93a1 1 0 00-1.517-1.087L10 14.989l-6.584-3.147a1 1 0 00-1.516 1.087l1.07 9.016a1 1 0 00.995.909h11.07a1 1 0 00.995-.909l1.071-9.016z" clip-rule="evenodd" />
</svg>
<span><?php echo e($message); ?></span>
</div>
<?php unset($message);
if (isset($__messageOriginal)) { $message = $__messageOriginal; }
endif;
unset($__errorArgs, $__bag); ?>
</div>
<!-- Remember Me -->
<div class="checkbox-group">
<input
type="checkbox"
id="remember"
name="remember"
value="1"
<?php echo e(old('remember') ? 'checked' : ''); ?>
>
<label for="remember">Ingat saya di perangkat ini</label>
</div>
<!-- Submit Button -->
<button type="submit" class="btn-submit">Login</button>
<!-- Footer Links -->
<div class="divider">atau</div>
<div class="signup-link">
Belum punya akun? <a href="javascript:void(0)">Hubungi Administrator</a>
</div>
</form>
</div>
</div>
<script>
function togglePassword() {
const passwordInput = document.getElementById('password');
const toggleIcon = document.getElementById('toggleIcon');
if (passwordInput.type === 'password') {
passwordInput.type = 'text';
toggleIcon.textContent = '👁‍🗨';
} else {
passwordInput.type = 'password';
toggleIcon.textContent = '👁';
}
}
// Auto-focus NIP input
window.addEventListener('load', function() {
const nipInput = document.getElementById('nip');
if (nipInput && !nipInput.value) {
nipInput.focus();
}
});
</script>
</body>
</html>
<?php /**PATH F:\Sempro TA\project\Laravel\TA\resources\views/auth/login.blade.php ENDPATH**/ ?>

View File

@ -1,4 +0,0 @@
<svg width="6" height="10" viewBox="0 0 6 10" fill="none" xmlns="http://www.w3.org/2000/svg" <?php echo e($attributes); ?>>
<path d="M0.875 9.25L5.125 5L0.875 0.75" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
<?php /**PATH F:\Sempro TA\project\Laravel\TA\vendor\laravel\framework\src\Illuminate\Foundation\resources\exceptions\renderer\components\icons\chevron-right.blade.php ENDPATH**/ ?>

Before

Width:  |  Height:  |  Size: 428 B

View File

@ -1,4 +0,0 @@
<svg width="12" height="12" viewBox="0 0 12 12" fill="none" xmlns="http://www.w3.org/2000/svg" <?php echo e($attributes); ?>>
<path d="M9.75 2.56944C9.75 3.29815 8.07107 3.88889 6 3.88889C3.92893 3.88889 2.25 3.29815 2.25 2.56944M9.75 2.56944C9.75 1.84074 8.07107 1.25 6 1.25C3.92893 1.25 2.25 1.84074 2.25 2.56944M9.75 2.56944V9.43056C9.75 10.1593 8.07107 10.75 6 10.75C3.92893 10.75 2.25 10.1593 2.25 9.43056V2.56944M9.75 5.94434C9.75 6.67304 8.07107 7.26378 6 7.26378C3.92893 7.26378 2.25 6.67304 2.25 5.94434" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
<?php /**PATH F:\Sempro TA\project\Laravel\TA\vendor\laravel\framework\src\Illuminate\Foundation\resources\exceptions\renderer\components\icons\database.blade.php ENDPATH**/ ?>

Before

Width:  |  Height:  |  Size: 772 B

View File

@ -1,6 +0,0 @@
<svg width="12" height="12" viewBox="0 0 12 12" fill="none" xmlns="http://www.w3.org/2000/svg" <?php echo e($attributes); ?>>
<path d="M5.99996 10.6876C7.10936 10.6876 8.00871 8.58896 8.00871 6.00012C8.00871 3.41129 7.10936 1.31262 5.99996 1.31262C4.89056 1.31262 3.99121 3.41129 3.99121 6.00012C3.99121 8.58896 4.89056 10.6876 5.99996 10.6876Z" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M1.3125 6.00012H10.6875" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M6 10.6876C8.58883 10.6876 10.6875 8.58896 10.6875 6.00012C10.6875 3.41129 8.58883 1.31262 6 1.31262C3.41117 1.31262 1.3125 3.41129 1.3125 6.00012C1.3125 8.58896 3.41117 10.6876 6 10.6876Z" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
<?php /**PATH F:\Sempro TA\project\Laravel\TA\vendor\laravel\framework\src\Illuminate\Foundation\resources\exceptions\renderer\components\icons\globe.blade.php ENDPATH**/ ?>

Before

Width:  |  Height:  |  Size: 984 B

View File

@ -1,20 +0,0 @@
<?php if($paginator->hasPages()): ?>
<nav>
<ul class="pagination">
<?php if($paginator->onFirstPage()): ?>
<li class="disabled" aria-disabled="true"><span><?php echo app('translator')->get('pagination.previous'); ?></span></li>
<?php else: ?>
<li><a href="<?php echo e($paginator->previousPageUrl()); ?>" rel="prev"><?php echo app('translator')->get('pagination.previous'); ?></a></li>
<?php endif; ?>
<?php if($paginator->hasMorePages()): ?>
<li><a href="<?php echo e($paginator->nextPageUrl()); ?>" rel="next"><?php echo app('translator')->get('pagination.next'); ?></a></li>
<?php else: ?>
<li class="disabled" aria-disabled="true"><span><?php echo app('translator')->get('pagination.next'); ?></span></li>
<?php endif; ?>
</ul>
</nav>
<?php endif; ?>
<?php /**PATH F:\Sempro TA\project\Laravel\TA\vendor\laravel\framework\src\Illuminate\Pagination\resources\views\simple-bootstrap-3.blade.php ENDPATH**/ ?>

View File

@ -1,28 +0,0 @@
<?php use \Illuminate\Foundation\Exceptions\Renderer\Renderer; ?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no, viewport-fit=cover">
<title><?php echo e(config('app.name', 'Laravel')); ?></title>
<link
rel="icon" type="image/svg+xml"
href="data:image/svg+xml,%3Csvg viewBox='0 -.11376601 49.74245785 51.31690859' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='m49.626 11.564a.809.809 0 0 1 .028.209v10.972a.8.8 0 0 1 -.402.694l-9.209 5.302v10.509c0 .286-.152.55-.4.694l-19.223 11.066c-.044.025-.092.041-.14.058-.018.006-.035.017-.054.022a.805.805 0 0 1 -.41 0c-.022-.006-.042-.018-.063-.026-.044-.016-.09-.03-.132-.054l-19.219-11.066a.801.801 0 0 1 -.402-.694v-32.916c0-.072.01-.142.028-.21.006-.023.02-.044.028-.067.015-.042.029-.085.051-.124.015-.026.037-.047.055-.071.023-.032.044-.065.071-.093.023-.023.053-.04.079-.06.029-.024.055-.05.088-.069h.001l9.61-5.533a.802.802 0 0 1 .8 0l9.61 5.533h.002c.032.02.059.045.088.068.026.02.055.038.078.06.028.029.048.062.072.094.017.024.04.045.054.071.023.04.036.082.052.124.008.023.022.044.028.068a.809.809 0 0 1 .028.209v20.559l8.008-4.611v-10.51c0-.07.01-.141.028-.208.007-.024.02-.045.028-.068.016-.042.03-.085.052-.124.015-.026.037-.047.054-.071.024-.032.044-.065.072-.093.023-.023.052-.04.078-.06.03-.024.056-.05.088-.069h.001l9.611-5.533a.801.801 0 0 1 .8 0l9.61 5.533c.034.02.06.045.09.068.025.02.054.038.077.06.028.029.048.062.072.094.018.024.04.045.054.071.023.039.036.082.052.124.009.023.022.044.028.068zm-1.574 10.718v-9.124l-3.363 1.936-4.646 2.675v9.124l8.01-4.611zm-9.61 16.505v-9.13l-4.57 2.61-13.05 7.448v9.216zm-36.84-31.068v31.068l17.618 10.143v-9.214l-9.204-5.209-.003-.002-.004-.002c-.031-.018-.057-.044-.086-.066-.025-.02-.054-.036-.076-.058l-.002-.003c-.026-.025-.044-.056-.066-.084-.02-.027-.044-.05-.06-.078l-.001-.003c-.018-.03-.029-.066-.042-.1-.013-.03-.03-.058-.038-.09v-.001c-.01-.038-.012-.078-.016-.117-.004-.03-.012-.06-.012-.09v-21.483l-4.645-2.676-3.363-1.934zm8.81-5.994-8.007 4.609 8.005 4.609 8.006-4.61-8.006-4.608zm4.164 28.764 4.645-2.674v-20.096l-3.363 1.936-4.646 2.675v20.096zm24.667-23.325-8.006 4.609 8.006 4.609 8.005-4.61zm-.801 10.605-4.646-2.675-3.363-1.936v9.124l4.645 2.674 3.364 1.937zm-18.422 20.561 11.743-6.704 5.87-3.35-8-4.606-9.211 5.303-8.395 4.833z' fill='%23ff2d20'/%3E%3C/svg%3E"
/>
<?php echo Renderer::css(); ?>
</head>
<body class="font-sans antialiased overflow-x-hidden bg-neutral-50 dark:bg-neutral-900 dark:text-white scheme-light-dark">
<div class="min-h-dvh">
<?php echo e($slot); ?>
</div>
<?php echo Renderer::js(); ?>
</body>
</html>
<?php /**PATH F:\Sempro TA\project\Laravel\TA\vendor\laravel\framework\src\Illuminate\Foundation\resources\exceptions\renderer\components\layout.blade.php ENDPATH**/ ?>

View File

@ -32,7 +32,7 @@
.page-shell {
min-height: 100vh;
padding: 18px;
padding: 0 18px 18px 18px;
display: grid;
grid-template-columns: 260px 1fr;
gap: 18px;
@ -44,17 +44,14 @@
gap: 12px;
height: fit-content;
position: sticky;
top: 18px;
top: 0;
transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1);
opacity: 1;
transform: translateX(0);
}
.sidebar.hidden {
opacity: 0;
transform: translateX(-100%);
pointer-events: none;
visibility: hidden;
display: none;
}
.page-shell.sidebar-hidden {

View File

@ -1,5 +0,0 @@
<svg width="10" height="10" viewBox="0 0 10 10" fill="none" xmlns="http://www.w3.org/2000/svg" <?php echo e($attributes); ?>>
<path d="M4.75 1L0.75 5L4.75 9" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M9.25 1L5.25 5L9.25 9" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
<?php /**PATH F:\Sempro TA\project\Laravel\TA\vendor\laravel\framework\src\Illuminate\Foundation\resources\exceptions\renderer\components\icons\chevrons-left.blade.php ENDPATH**/ ?>

Before

Width:  |  Height:  |  Size: 528 B

View File

@ -1,4 +0,0 @@
<div <?php echo e($attributes->merge(['class' => "h-0 w-full relative"])); ?>>
<div class="absolute top-[-1px] left-0 right-0 bottom-0 border-t border-dashed border-neutral-300 dark:border-white/[9%]"></div>
</div>
<?php /**PATH F:\Sempro TA\project\Laravel\TA\vendor\laravel\framework\src\Illuminate\Foundation\resources\exceptions\renderer\components\separator.blade.php ENDPATH**/ ?>

View File

@ -1,35 +0,0 @@
<?php $attributes ??= new \Illuminate\View\ComponentAttributeBag;
$__newAttributes = [];
$__propNames = \Illuminate\View\ComponentAttributeBag::extractPropNames((['message']));
foreach ($attributes->all() as $__key => $__value) {
if (in_array($__key, $__propNames)) {
$$__key = $$__key ?? $__value;
} else {
$__newAttributes[$__key] = $__value;
}
}
$attributes = new \Illuminate\View\ComponentAttributeBag($__newAttributes);
unset($__propNames);
unset($__newAttributes);
foreach (array_filter((['message']), 'is_string', ARRAY_FILTER_USE_KEY) as $__key => $__value) {
$$__key = $$__key ?? $__value;
}
$__defined_vars = get_defined_vars();
foreach ($attributes->all() as $__key => $__value) {
if (array_key_exists($__key, $__defined_vars)) unset($$__key);
}
unset($__defined_vars, $__key, $__value); ?>
<div class="bg-white/[2%] border border-neutral-200 dark:border-neutral-800 rounded-md w-full p-5 uppercase text-sm text-center font-mono shadow-xs text-neutral-600 dark:text-neutral-400">
<span class="text-neutral-400 dark:text-neutral-600">// </span><?php echo e($message); ?>
</div>
<?php /**PATH F:\Sempro TA\project\Laravel\TA\vendor\laravel\framework\src\Illuminate\Foundation\resources\exceptions\renderer\components\empty-state.blade.php ENDPATH**/ ?>

View File

@ -212,4 +212,4 @@ class="flex h-6 w-6 flex-shrink-0 cursor-pointer items-center justify-center rou
<?php endforeach; $__env->popLoop(); $loop = $__env->getLastLoop(); ?>
</div>
</div>
<?php /**PATH F:\Sempro TA\project\Laravel\TA\vendor\laravel\framework\src\Illuminate\Foundation\resources\exceptions\renderer\components\previous-exceptions.blade.php ENDPATH**/ ?>
<?php /**PATH F:\Sempro TA\project\Laravel\TA\vendor\laravel\framework\src\Illuminate\Foundation\Providers/../resources/exceptions/renderer/components/previous-exceptions.blade.php ENDPATH**/ ?>

View File

@ -1,673 +0,0 @@
<!DOCTYPE html>
<html lang="id">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Tambah Dosen Baru - Dashboard JTI</title>
<style>
:root {
--bg: #eef2ff;
--text: #1f2937;
--muted: #6b7280;
--primary: #4f46e5;
--primary-2: #7c3aed;
--orange: #d97706;
--shadow: 0 24px 70px rgba(31, 41, 55, 0.18);
}
* { box-sizing: border-box; margin: 0; padding: 0; }
body {
min-height: 100vh;
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
background:
radial-gradient(circle at top left, rgba(99, 102, 241, 0.25), transparent 35%),
radial-gradient(circle at top right, rgba(168, 85, 247, 0.18), transparent 32%),
linear-gradient(135deg, #e0e7ff 0%, #eef2ff 45%, #f8fafc 100%);
color: var(--text);
}
.page-shell {
min-height: 100vh;
padding: 18px;
display: grid;
grid-template-columns: 1fr;
gap: 18px;
max-width: 1000px;
margin: 0 auto;
}
.topbar {
display: flex;
align-items: center;
justify-content: space-between;
gap: 16px;
padding: 14px 18px;
border-radius: 20px;
background: rgba(255, 255, 255, 0.72);
backdrop-filter: blur(14px);
box-shadow: 0 10px 35px rgba(79, 70, 229, 0.08);
position: relative;
z-index: 20;
}
.brand {
display: flex;
align-items: center;
gap: 14px;
text-decoration: none;
color: inherit;
}
.brand-mark {
width: 44px;
height: 44px;
border-radius: 14px;
display: grid;
place-items: center;
color: #fff;
font-weight: 800;
background: linear-gradient(135deg, var(--primary) 0%, var(--primary-2) 100%);
box-shadow: 0 12px 24px rgba(79, 70, 229, 0.28);
}
.brand-text h1 { font-size: 1rem; line-height: 1.1; color: var(--text); font-weight: 900; }
.brand-text p { margin-top: 2px; color: var(--muted); font-size: 0.85rem; }
.actions {
display: flex;
gap: 10px;
align-items: center;
}
.btn {
border: 0;
border-radius: 999px;
padding: 11px 16px;
font-weight: 800;
cursor: pointer;
text-decoration: none;
display: inline-flex;
align-items: center;
justify-content: center;
transition: all 0.25s ease;
font-size: 0.9rem;
text-transform: uppercase;
letter-spacing: 0.3px;
}
.btn:hover {
transform: translateY(-2px);
}
.btn.primary {
color: #fff;
background: linear-gradient(135deg, var(--primary) 0%, var(--primary-2) 100%);
box-shadow: 0 12px 24px rgba(79, 70, 229, 0.22);
}
.btn.primary:hover {
box-shadow: 0 16px 32px rgba(79, 70, 229, 0.28);
}
.btn.ghost {
color: #475569;
background: rgba(226, 232, 240, 0.8);
border: 1px solid rgba(148, 163, 184, 0.25);
}
.btn.ghost:hover {
background: rgba(226, 232, 240, 1);
color: var(--primary);
}
.content {
border-radius: 28px;
background: rgba(255, 255, 255, 0.82);
backdrop-filter: blur(16px);
box-shadow: var(--shadow);
overflow: hidden;
}
.section-head {
padding: 28px 32px;
background: linear-gradient(135deg, rgba(79, 70, 229, 0.1), rgba(124, 58, 237, 0.08));
border-bottom: 1px solid rgba(148, 163, 184, 0.2);
}
.section-head h2 {
font-size: 1.8rem;
color: var(--text);
margin-bottom: 8px;
font-weight: 900;
}
.section-head p {
color: var(--muted);
font-weight: 700;
font-size: 0.95rem;
}
.form-wrapper {
padding: 36px 32px;
display: grid;
grid-template-columns: 280px 1fr;
gap: 40px;
align-items: start;
}
.photo-section {
display: flex;
flex-direction: column;
gap: 16px;
}
.photo-preview {
width: 100%;
aspect-ratio: 3/4;
border-radius: 20px;
background: linear-gradient(135deg, var(--primary) 0%, var(--primary-2) 100%);
display: grid;
place-items: center;
color: #fff;
font-size: 3.5rem;
font-weight: 900;
overflow: hidden;
position: relative;
cursor: pointer;
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
box-shadow: 0 16px 40px rgba(79, 70, 229, 0.25);
border: 3px solid rgba(255, 255, 255, 0.15);
}
.photo-preview:hover {
transform: scale(1.03);
box-shadow: 0 20px 50px rgba(79, 70, 229, 0.32);
}
.photo-preview img {
width: 100%;
height: 100%;
object-fit: cover;
}
.photo-initial {
display: grid;
place-items: center;
width: 100%;
height: 100%;
}
.photo-label {
border: 2px dashed rgba(79, 70, 229, 0.3);
border-radius: 16px;
padding: 16px;
text-align: center;
cursor: pointer;
transition: all 0.3s ease;
background: rgba(79, 70, 229, 0.02);
}
.photo-label:hover {
border-color: var(--primary);
background: rgba(79, 70, 229, 0.1);
}
.photo-label-text {
font-size: 0.9rem;
font-weight: 800;
color: var(--primary);
margin-bottom: 4px;
}
.photo-label-hint {
font-size: 0.8rem;
color: var(--muted);
font-weight: 600;
}
.photo-input {
display: none;
}
.form-fields {
display: flex;
flex-direction: column;
gap: 24px;
}
.field-row {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 20px;
}
.field-row.full {
grid-column: 1 / -1;
}
.field {
display: flex;
flex-direction: column;
gap: 10px;
}
.field label {
font-weight: 800;
color: #475569;
font-size: 0.9rem;
letter-spacing: 0.3px;
}
.required {
color: var(--orange);
}
.input, .select {
width: 100%;
padding: 13px 14px;
border-radius: 14px;
background: #fff;
border: 1.5px solid rgba(148, 163, 184, 0.25);
outline: none;
font-weight: 600;
color: var(--text);
transition: all 0.3s ease;
font-size: 0.95rem;
}
.input:focus, .select:focus {
border-color: var(--primary);
background: rgba(79, 70, 229, 0.02);
box-shadow: 0 0 0 3px rgba(79, 70, 229, 0.1);
}
.input.error, .select.error {
border-color: #ef4444;
background: rgba(239, 68, 68, 0.02);
}
.hint {
font-size: 0.8rem;
color: var(--muted);
font-weight: 600;
margin-top: 4px;
}
.field-error {
font-size: 0.8rem;
color: #dc2626;
font-weight: 700;
}
.error-box {
padding: 16px 20px;
border-radius: 16px;
background: rgba(239, 68, 68, 0.08);
border: 1px solid rgba(239, 68, 68, 0.2);
color: #7f1d1d;
margin-bottom: 20px;
}
.error-box strong {
display: block;
font-weight: 800;
margin-bottom: 10px;
}
.error-box ul {
list-style: none;
padding-left: 20px;
}
.error-box li {
font-weight: 700;
margin-bottom: 6px;
position: relative;
}
.error-box li:before {
content: "";
position: absolute;
left: -15px;
}
.form-actions {
display: flex;
gap: 12px;
padding-top: 20px;
border-top: 1px solid rgba(148, 163, 184, 0.12);
grid-column: 1 / -1;
}
.btn.success {
color: #fff;
background: linear-gradient(135deg, #10b981 0%, #059669 100%);
box-shadow: 0 12px 24px rgba(16, 185, 129, 0.22);
flex: 1;
}
.btn.success:hover {
box-shadow: 0 16px 32px rgba(16, 185, 129, 0.28);
}
.btn.ghost {
flex: 1;
}
@media (max-width: 900px) {
.form-wrapper {
grid-template-columns: 1fr;
}
.field-row {
grid-template-columns: 1fr;
}
.section-head h2 {
font-size: 1.4rem;
}
.photo-preview {
aspect-ratio: 1/1;
}
}
</style>
</head>
<body>
<div class="page-shell">
<header class="topbar">
<a class="brand" href="<?php echo e(route('users.index')); ?>">
<div class="brand-mark">JTI</div>
<div class="brand-text">
<h1>Tambah Dosen</h1>
<p>Data dosen baru</p>
</div>
</a>
<div class="actions">
<a class="btn ghost" href="<?php echo e(route('users.dosen')); ?>">Kembali</a>
</div>
</header>
<main class="content">
<div class="section-head">
<h2>👨‍🏫 Form Tambah Dosen Baru</h2>
<p>Lengkapi informasi dosen dengan data yang akurat dan benar.</p>
</div>
<?php if($errors->any()): ?>
<div style="padding: 0 32px; padding-top: 20px;">
<div class="error-box">
<strong> Validasi gagal, periksa kembali data Anda:</strong>
<ul>
<?php $__currentLoopData = $errors->all(); $__env->addLoop($__currentLoopData); foreach($__currentLoopData as $error): $__env->incrementLoopIndices(); $loop = $__env->getLastLoop(); ?>
<li><?php echo e($error); ?></li>
<?php endforeach; $__env->popLoop(); $loop = $__env->getLastLoop(); ?>
</ul>
</div>
</div>
<?php endif; ?>
<form method="POST" action="<?php echo e(route('dosen.store')); ?>" class="form-wrapper" id="dosenForm">
<?php echo csrf_field(); ?>
<!-- Photo Section -->
<div class="photo-section">
<div class="photo-preview" id="photoPreview">
<div class="photo-initial" id="photoInitial">👨‍🏫</div>
<img id="photoImg" style="display: none;" alt="Preview" />
</div>
<label class="photo-label" for="photoInput">
<div class="photo-label-text">📤 Upload Foto</div>
<div class="photo-label-hint">Klik untuk pilih gambar</div>
</label>
<input id="photoInput" class="photo-input" type="file" accept="image/*">
<input
id="fotoUrl"
class="input"
type="text"
name="foto"
value="<?php echo e(old('foto')); ?>"
placeholder="atau URL gambar"
>
<div class="hint">📝 Gunakan file atau URL gambar untuk foto profil</div>
</div>
<!-- Form Fields -->
<div class="form-fields">
<!-- Nama -->
<div class="field-row full">
<div class="field">
<label for="nama">Nama Lengkap <span class="required">*</span></label>
<input
id="nama"
class="input <?php $__errorArgs = ['nama'];
$__bag = $errors->getBag($__errorArgs[1] ?? 'default');
if ($__bag->has($__errorArgs[0])) :
if (isset($message)) { $__messageOriginal = $message; }
$message = $__bag->first($__errorArgs[0]); ?> error <?php unset($message);
if (isset($__messageOriginal)) { $message = $__messageOriginal; }
endif;
unset($__errorArgs, $__bag); ?>"
type="text"
name="nama"
value="<?php echo e(old('nama')); ?>"
required
>
<?php $__errorArgs = ['nama'];
$__bag = $errors->getBag($__errorArgs[1] ?? 'default');
if ($__bag->has($__errorArgs[0])) :
if (isset($message)) { $__messageOriginal = $message; }
$message = $__bag->first($__errorArgs[0]); ?>
<div class="field-error"><?php echo e($message); ?></div>
<?php unset($message);
if (isset($__messageOriginal)) { $message = $__messageOriginal; }
endif;
unset($__errorArgs, $__bag); ?>
<div class="hint">Masukkan nama lengkap dosen</div>
</div>
</div>
<!-- NIP & NIDN -->
<div class="field-row">
<div class="field">
<label for="nip">NIP</label>
<input
id="nip"
class="input <?php $__errorArgs = ['nip'];
$__bag = $errors->getBag($__errorArgs[1] ?? 'default');
if ($__bag->has($__errorArgs[0])) :
if (isset($message)) { $__messageOriginal = $message; }
$message = $__bag->first($__errorArgs[0]); ?> error <?php unset($message);
if (isset($__messageOriginal)) { $message = $__messageOriginal; }
endif;
unset($__errorArgs, $__bag); ?>"
type="text"
name="nip"
value="<?php echo e(old('nip')); ?>"
placeholder="Contoh: 19850315 200901 1 001"
>
<?php $__errorArgs = ['nip'];
$__bag = $errors->getBag($__errorArgs[1] ?? 'default');
if ($__bag->has($__errorArgs[0])) :
if (isset($message)) { $__messageOriginal = $message; }
$message = $__bag->first($__errorArgs[0]); ?>
<div class="field-error"><?php echo e($message); ?></div>
<?php unset($message);
if (isset($__messageOriginal)) { $message = $__messageOriginal; }
endif;
unset($__errorArgs, $__bag); ?>
<div class="hint">Nomor Induk Pegawai (opsional)</div>
</div>
<div class="field">
<label for="nidn">NIDN</label>
<input
id="nidn"
class="input <?php $__errorArgs = ['nidn'];
$__bag = $errors->getBag($__errorArgs[1] ?? 'default');
if ($__bag->has($__errorArgs[0])) :
if (isset($message)) { $__messageOriginal = $message; }
$message = $__bag->first($__errorArgs[0]); ?> error <?php unset($message);
if (isset($__messageOriginal)) { $message = $__messageOriginal; }
endif;
unset($__errorArgs, $__bag); ?>"
type="text"
name="nidn"
value="<?php echo e(old('nidn')); ?>"
placeholder="Contoh: 0017058003"
>
<?php $__errorArgs = ['nidn'];
$__bag = $errors->getBag($__errorArgs[1] ?? 'default');
if ($__bag->has($__errorArgs[0])) :
if (isset($message)) { $__messageOriginal = $message; }
$message = $__bag->first($__errorArgs[0]); ?>
<div class="field-error"><?php echo e($message); ?></div>
<?php unset($message);
if (isset($__messageOriginal)) { $message = $__messageOriginal; }
endif;
unset($__errorArgs, $__bag); ?>
<div class="hint">Nomor Induk Dosen Nasional (opsional)</div>
</div>
</div>
<!-- Prodi -->
<div class="field-row full">
<div class="field">
<label for="prodi">Program Studi <span class="required">*</span></label>
<select
id="prodi"
class="select <?php $__errorArgs = ['prodi'];
$__bag = $errors->getBag($__errorArgs[1] ?? 'default');
if ($__bag->has($__errorArgs[0])) :
if (isset($message)) { $__messageOriginal = $message; }
$message = $__bag->first($__errorArgs[0]); ?> error <?php unset($message);
if (isset($__messageOriginal)) { $message = $__messageOriginal; }
endif;
unset($__errorArgs, $__bag); ?>"
name="prodi"
required
>
<option value="">-- Pilih Program Studi --</option>
<option value="Manajemen Informatika" <?php if(old('prodi') === 'Manajemen Informatika'): echo 'selected'; endif; ?>>Manajemen Informatika</option>
<option value="Teknik Informatika" <?php if(old('prodi') === 'Teknik Informatika'): echo 'selected'; endif; ?>>Teknik Informatika</option>
<option value="Teknik Komputer" <?php if(old('prodi') === 'Teknik Komputer'): echo 'selected'; endif; ?>>Teknik Komputer</option>
<option value="Teknologi Rekayasa Komputer" <?php if(old('prodi') === 'Teknologi Rekayasa Komputer'): echo 'selected'; endif; ?>>Teknologi Rekayasa Komputer</option>
</select>
<?php $__errorArgs = ['prodi'];
$__bag = $errors->getBag($__errorArgs[1] ?? 'default');
if ($__bag->has($__errorArgs[0])) :
if (isset($message)) { $__messageOriginal = $message; }
$message = $__bag->first($__errorArgs[0]); ?>
<div class="field-error"><?php echo e($message); ?></div>
<?php unset($message);
if (isset($__messageOriginal)) { $message = $__messageOriginal; }
endif;
unset($__errorArgs, $__bag); ?>
<div class="hint">Pilih program studi untuk dosen</div>
</div>
</div>
<!-- Role (Hidden for Dosen) -->
<input type="hidden" name="role" value="dosen">
<!-- Form Actions -->
<div class="form-actions">
<button class="btn success" type="submit"> Simpan Dosen</button>
<a class="btn ghost" href="<?php echo e(route('users.dosen')); ?>"> Batal</a>
</div>
</div>
</form>
</main>
</div>
<script>
const photoInput = document.getElementById('photoInput');
const fotoUrl = document.getElementById('fotoUrl');
const photoPreview = document.getElementById('photoPreview');
const photoImg = document.getElementById('photoImg');
const photoInitial = document.getElementById('photoInitial');
const namaInput = document.getElementById('nama');
const dosenForm = document.getElementById('dosenForm');
let isSubmitting = false;
// Prevent double submit
dosenForm.addEventListener('submit', function(e) {
if (isSubmitting) {
e.preventDefault();
return false;
}
isSubmitting = true;
// Disable submit button
const submitBtn = dosenForm.querySelector('button[type="submit"]');
if (submitBtn) {
submitBtn.disabled = true;
submitBtn.style.opacity = '0.6';
submitBtn.style.cursor = 'not-allowed';
submitBtn.textContent = '⏳ Sedang menyimpan...';
}
});
// Handle file input
photoInput.addEventListener('change', (e) => {
const file = e.target.files[0];
if (file) {
const reader = new FileReader();
reader.onload = (event) => {
photoImg.src = event.target.result;
photoImg.style.display = 'block';
photoInitial.style.display = 'none';
fotoUrl.value = event.target.result;
};
reader.readAsDataURL(file);
}
});
// Handle URL input
fotoUrl.addEventListener('change', (e) => {
const url = e.target.value.trim();
if (url && (url.startsWith('http') || url.startsWith('data:'))) {
photoImg.src = url;
photoImg.style.display = 'block';
photoInitial.style.display = 'none';
} else {
photoImg.style.display = 'none';
photoInitial.style.display = 'block';
}
});
// Update initial dari nama
namaInput.addEventListener('input', () => {
const nama = namaInput.value.trim();
if (nama && !photoImg.src) {
const words = nama.split(/\s+/);
const initials = words.slice(0, 2).map(w => w.charAt(0).toUpperCase()).join('');
photoInitial.textContent = initials || '👨‍🏫';
}
});
// Restore state saat halaman load
window.addEventListener('load', () => {
// Reset form state jika ada error
isSubmitting = false;
const submitBtn = dosenForm.querySelector('button[type="submit"]');
if (submitBtn) {
submitBtn.disabled = false;
submitBtn.style.opacity = '1';
submitBtn.style.cursor = 'pointer';
submitBtn.textContent = '✅ Simpan Dosen';
}
if (fotoUrl.value.trim()) {
fotoUrl.dispatchEvent(new Event('change'));
}
if (namaInput.value.trim()) {
namaInput.dispatchEvent(new Event('input'));
}
});
</script>
</body>
</html>
<?php /**PATH F:\Sempro TA\project\Laravel\TA\resources\views\Dosen\create.blade.php ENDPATH**/ ?>

View File

@ -1,12 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="8" height="12" viewBox="0 0 8 12" fill="none" <?php echo e($attributes); ?>>
<g clip-path="url(#clip0_14550_6168)">
<path d="M6.75 11.0001L4 8.25012L1.25 11.0001" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M6.75 1.50012L4 4.25012L1.25 1.50012" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round"/>
</g>
<defs>
<clipPath id="clip0_14550_6168">
<rect width="8" height="11" fill="white" style="fill:white;fill-opacity:1;" transform="translate(0 0.500122)"/>
</clipPath>
</defs>
</svg>
<?php /**PATH F:\Sempro TA\project\Laravel\TA\vendor\laravel\framework\src\Illuminate\Foundation\resources\exceptions\renderer\components\icons\chevrons-down-up.blade.php ENDPATH**/ ?>

Before

Width:  |  Height:  |  Size: 797 B

File diff suppressed because one or more lines are too long

View File

@ -1,47 +0,0 @@
<?php if($paginator->hasPages()): ?>
<nav>
<ul class="pagination">
<?php if($paginator->onFirstPage()): ?>
<li class="disabled" aria-disabled="true" aria-label="<?php echo app('translator')->get('pagination.previous'); ?>">
<span aria-hidden="true">&lsaquo;</span>
</li>
<?php else: ?>
<li>
<a href="<?php echo e($paginator->previousPageUrl()); ?>" rel="prev" aria-label="<?php echo app('translator')->get('pagination.previous'); ?>">&lsaquo;</a>
</li>
<?php endif; ?>
<?php $__currentLoopData = $elements; $__env->addLoop($__currentLoopData); foreach($__currentLoopData as $element): $__env->incrementLoopIndices(); $loop = $__env->getLastLoop(); ?>
<?php if(is_string($element)): ?>
<li class="disabled" aria-disabled="true"><span><?php echo e($element); ?></span></li>
<?php endif; ?>
<?php if(is_array($element)): ?>
<?php $__currentLoopData = $element; $__env->addLoop($__currentLoopData); foreach($__currentLoopData as $page => $url): $__env->incrementLoopIndices(); $loop = $__env->getLastLoop(); ?>
<?php if($page == $paginator->currentPage()): ?>
<li class="active" aria-current="page"><span><?php echo e($page); ?></span></li>
<?php else: ?>
<li><a href="<?php echo e($url); ?>"><?php echo e($page); ?></a></li>
<?php endif; ?>
<?php endforeach; $__env->popLoop(); $loop = $__env->getLastLoop(); ?>
<?php endif; ?>
<?php endforeach; $__env->popLoop(); $loop = $__env->getLastLoop(); ?>
<?php if($paginator->hasMorePages()): ?>
<li>
<a href="<?php echo e($paginator->nextPageUrl()); ?>" rel="next" aria-label="<?php echo app('translator')->get('pagination.next'); ?>">&rsaquo;</a>
</li>
<?php else: ?>
<li class="disabled" aria-disabled="true" aria-label="<?php echo app('translator')->get('pagination.next'); ?>">
<span aria-hidden="true">&rsaquo;</span>
</li>
<?php endif; ?>
</ul>
</nav>
<?php endif; ?>
<?php /**PATH F:\Sempro TA\project\Laravel\TA\vendor\laravel\framework\src\Illuminate\Pagination\resources\views\bootstrap-3.blade.php ENDPATH**/ ?>

View File

@ -32,7 +32,7 @@
.page-shell {
min-height: 100vh;
padding: 18px;
padding: 0 18px 18px 18px;
display: grid;
grid-template-columns: 260px 1fr;
gap: 18px;
@ -44,17 +44,14 @@
gap: 12px;
height: fit-content;
position: sticky;
top: 18px;
top: 0;
transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1);
opacity: 1;
transform: translateX(0);
}
.sidebar.hidden {
opacity: 0;
transform: translateX(-100%);
pointer-events: none;
visibility: hidden;
display: none;
}
.page-shell.sidebar-hidden {

View File

@ -1,5 +0,0 @@
<?php $__env->startSection('title', __('Forbidden')); ?>
<?php $__env->startSection('code', '403'); ?>
<?php $__env->startSection('message', __($exception->getMessage() ?: 'Forbidden')); ?>
<?php echo $__env->make('errors::minimal', array_diff_key(get_defined_vars(), ['__data' => 1, '__path' => 1]))->render(); ?><?php /**PATH F:\Sempro TA\project\Laravel\TA\vendor\laravel\framework\src\Illuminate\Foundation\Exceptions\views\403.blade.php ENDPATH**/ ?>

View File

@ -1,101 +0,0 @@
<?php if (isset($component)) { $__componentOriginalaa758e6a82983efcbf593f765e026bd9 = $component; } ?>
<?php if (isset($attributes)) { $__attributesOriginalaa758e6a82983efcbf593f765e026bd9 = $attributes; } ?>
<?php $component = Illuminate\View\AnonymousComponent::resolve(['view' => $__env->getContainer()->make(Illuminate\View\Factory::class)->make('mail::message'),'data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? $attributes->all() : [])); ?>
<?php $component->withName('mail::message'); ?>
<?php if ($component->shouldRender()): ?>
<?php $__env->startComponent($component->resolveView(), $component->data()); ?>
<?php if (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag): ?>
<?php $attributes = $attributes->except(\Illuminate\View\AnonymousComponent::ignoredParameterNames()); ?>
<?php endif; ?>
<?php $component->withAttributes([]); ?>
<?php if(! empty($greeting)): ?>
# <?php echo e($greeting); ?>
<?php else: ?>
<?php if($level === 'error'): ?>
# <?php echo app('translator')->get('Whoops!'); ?>
<?php else: ?>
# <?php echo app('translator')->get('Hello!'); ?>
<?php endif; ?>
<?php endif; ?>
<?php $__currentLoopData = $introLines; $__env->addLoop($__currentLoopData); foreach($__currentLoopData as $line): $__env->incrementLoopIndices(); $loop = $__env->getLastLoop(); ?>
<?php echo e($line); ?>
<?php endforeach; $__env->popLoop(); $loop = $__env->getLastLoop(); ?>
<?php if(isset($actionText)): ?>
<?php
$color = match ($level) {
'success', 'error' => $level,
default => 'primary',
};
?>
<?php if (isset($component)) { $__componentOriginal15a5e11357468b3880ae1300c3be6c4f = $component; } ?>
<?php if (isset($attributes)) { $__attributesOriginal15a5e11357468b3880ae1300c3be6c4f = $attributes; } ?>
<?php $component = Illuminate\View\AnonymousComponent::resolve(['view' => $__env->getContainer()->make(Illuminate\View\Factory::class)->make('mail::button'),'data' => ['url' => $actionUrl,'color' => $color]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? $attributes->all() : [])); ?>
<?php $component->withName('mail::button'); ?>
<?php if ($component->shouldRender()): ?>
<?php $__env->startComponent($component->resolveView(), $component->data()); ?>
<?php if (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag): ?>
<?php $attributes = $attributes->except(\Illuminate\View\AnonymousComponent::ignoredParameterNames()); ?>
<?php endif; ?>
<?php $component->withAttributes(['url' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($actionUrl),'color' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($color)]); ?>
<?php echo e($actionText); ?>
<?php echo $__env->renderComponent(); ?>
<?php endif; ?>
<?php if (isset($__attributesOriginal15a5e11357468b3880ae1300c3be6c4f)): ?>
<?php $attributes = $__attributesOriginal15a5e11357468b3880ae1300c3be6c4f; ?>
<?php unset($__attributesOriginal15a5e11357468b3880ae1300c3be6c4f); ?>
<?php endif; ?>
<?php if (isset($__componentOriginal15a5e11357468b3880ae1300c3be6c4f)): ?>
<?php $component = $__componentOriginal15a5e11357468b3880ae1300c3be6c4f; ?>
<?php unset($__componentOriginal15a5e11357468b3880ae1300c3be6c4f); ?>
<?php endif; ?>
<?php endif; ?>
<?php $__currentLoopData = $outroLines; $__env->addLoop($__currentLoopData); foreach($__currentLoopData as $line): $__env->incrementLoopIndices(); $loop = $__env->getLastLoop(); ?>
<?php echo e($line); ?>
<?php endforeach; $__env->popLoop(); $loop = $__env->getLastLoop(); ?>
<?php if(! empty($salutation)): ?>
<?php echo e($salutation); ?>
<?php else: ?>
<?php echo app('translator')->get('Regards,'); ?><br>
<?php echo e(config('app.name')); ?>
<?php endif; ?>
<?php if(isset($actionText)): ?>
<?php $__env->slot('subcopy', null, []); ?>
<?php echo app('translator')->get(
"If you're having trouble clicking the \":actionText\" button, copy and paste the URL below\n".
'into your web browser:',
[
'actionText' => $actionText,
]
); ?> <span class="break-all">[<?php echo e($displayableActionUrl); ?>](<?php echo e($actionUrl); ?>)</span>
<?php $__env->endSlot(); ?>
<?php endif; ?>
<?php echo $__env->renderComponent(); ?>
<?php endif; ?>
<?php if (isset($__attributesOriginalaa758e6a82983efcbf593f765e026bd9)): ?>
<?php $attributes = $__attributesOriginalaa758e6a82983efcbf593f765e026bd9; ?>
<?php unset($__attributesOriginalaa758e6a82983efcbf593f765e026bd9); ?>
<?php endif; ?>
<?php if (isset($__componentOriginalaa758e6a82983efcbf593f765e026bd9)): ?>
<?php $component = $__componentOriginalaa758e6a82983efcbf593f765e026bd9; ?>
<?php unset($__componentOriginalaa758e6a82983efcbf593f765e026bd9); ?>
<?php endif; ?>
<?php /**PATH F:\Sempro TA\project\Laravel\TA\vendor\laravel\framework\src\Illuminate\Notifications\resources\views\email.blade.php ENDPATH**/ ?>

View File

@ -1,15 +0,0 @@
<svg fill="currentColor" viewBox="0 0 1268 308" xmlns="http://www.w3.org/2000/svg">
<defs>
<path id="a" d="m0 0v-0.49449h1.7215v-4.3497l-1.6849-0.00916v-0.40291c1.3278 0 1.6849-0.22893 1.8131-1.1538h0.43954v5.9155h1.7399v0.49449h-4.0292z"/>
<path id="b" d="m0 0c-1.3186 0-2.1062-1.227-2.1062-3.2965 0-2.0696 0.78752-3.2966 2.1062-3.2966s2.1062 1.227 2.1062 3.2966c0 2.0695-0.78752 3.2965-2.1062 3.2965zm0-3.8918c0.3205 0 0.56774 0.2473 0.56774 0.5678 0 0.3113-0.24724 0.5677-0.56774 0.5677-0.31134 0-0.56775-0.2564-0.56775-0.5677 0-0.3205 0.25641-0.5678 0.56775-0.5678zm0 3.3973c0.99813 0 1.5567-1.0164 1.5567-2.802 0-1.7857-0.55859-2.8021-1.5567-2.8021s-1.5567 1.0164-1.5567 2.8021c0 1.7856 0.55859 2.802 1.5567 2.802z"/>
</defs>
</svg>
<script>
(()=>{
const d="10A212.9A|AB2AB2AB2A212.2AB2AB2AB|6AB3A212.4AB4A|2ABAB3ABA212.AB4AB2A|10A212.3AB4AB|AB2ABAB3A212.AB3AB3A|8ABA212.7ABA|ABAB2AB3A212.2ABAB4A|10A212.6AB2A|2AB2ABAB2A32.9A61.9A73.9A19.AB2AB4A|9AB28.5AB2AB2AB4A3.10A6.25A10.5AB2AB2AB4A4.9A4.9A20.11A9.5AB2AB2AB5A15.7ABA|ABABAB4A25.4ABAB9AB4A.2AB3AB2AB6.2AB2AB2ABAB2AB2ABAB2AB3A7.4ABAB9AB5A.2AB2AB2AB4.2AB2AB2ABA18.2AB2AB2AB2A7.4AB11AB2AB3A12.ABABAB3A|7AB2A23.3AB7ABABABAB3AB8AB3A6.4AB10AB7ABA5.3AB7ABABAB4AB2AB5AB4A5.5AB4A17.7AB2A6.3AB4ABABABABAB10A10.8AB|2AB2AB3AB21.3AB3AB2AB14ABABAB4ABA6.AB4AB2ABABAB4ABAB4A3.3AB3AB2AB8AB7ABAB3AB2A6.AB5ABA16.2ABABAB3A6.2AB3AB13AB2ABAB4A8.2AB3AB2A|10A20.2AB10AB7.ABAB7AB4A6.3AB12AB5AB2A2.2AB10AB7.2ABAB10AB6.3AB6A14.11A4.10AB11.7AB3A7.4AB4A|ABAB2ABABA19.6ABABAB14.3AB2AB3AB2A6.AB3ABAB2A16.6ABABAB14.3AB2ABAB4A7.4ABAB3A13.ABAB2AB2AB4.2ABABABABA15.AB2AB2AB2A6.AB5ABA|10A19.AB2AB5A16.12A6.9AB15.2AB2AB5A16.9AB2A8.AB5AB2A11.10A4.10A17.10A5.3AB2AB2A|2ABABAB3A18.4AB3ABA18.AB2ABAB2ABA6.2ABAB2AB2A15.4AB3ABA18.ABAB2AB3AB8.4AB5A10.2AB2ABABABA4.ABAB2AB3A18.AB2ABAB2A5.AB7A|8ABA17.2AB4AB3A19.10A6.10A15.AB4AB2A20.10A9.AB3AB2ABA9.10A4.9AB27AB5.4AB2ABA|AB2AB5A17.4AB5A20.AB2ABABABA6.AB2ABAB2AB14.4AB5A20.2AB2ABAB2A10.10A7.2ABAB2AB2A5.AB2ABAB4AB2AB2AB2ABAB2ABABABABAB5A4.2AB6A|6ABABA17.AB4AB2AB20.10A6.10A14.2AB4AB2A21.8AB11.ABABAB2AB6.11A5.8AB7AB18AB3A4.4ABAB2A|ABAB6A17.3AB6A20.2ABAB2AB2A6.ABAB2ABABA14.5AB4A20.2ABAB2AB2A11.10A4.2ABAB2ABABA6.2AB2AB4ABABAB3AB2ABAB2AB2AB2AB4ABA4.AB6AB|5AB2ABA18.4AB2AB2A19.10A6.10A15.AB4AB2A20.10A12.2AB2AB2ABA3.10A7.7AB2A33.3AB2AB2A|2AB7A18.AB8A18.2AB2ABABABA6.2AB2AB2ABA15.3AB4ABA18.2AB2ABAB2AB12.11A.2AB2ABAB2A9.ABAB6A32.AB7A|4ABAB3A19.2ABABAB4A15.2AB9A6.10A15.5AB6A15.2AB9A13.ABABAB2AB5AB5AB9.5ABAB3A17.4A10.4AB2ABA|AB6ABA19.8AB4A11.2AB3AB2AB3AB6.ABABABAB2A16.AB4AB2AB3A10.3AB4AB2ABABA14.9ABAB4AB2A11.2AB5AB2A14.3AB5A7.2AB6A|3AB2AB20A3.2AB2AB3AB7A.16AB2A6.10A17.2AB7AB5A2.10AB8A14.3ABAB8AB3A13.4AB8A8.4AB3AB5A5.5ABABA|AB7AB2ABAB2AB2ABAB2ABA5.8ABAB2AB3AB2ABAB2AB2ABAB4A6.2AB2AB2ABA19.2ABAB5AB2AB3AB2ABAB5ABAB2ABA15.6ABAB2AB5A15.4AB2ABAB10AB8ABA7.ABAB5A|4AB2AB11AB7A6.2ABAB9AB11AB5ABA6.10A20.5ABAB15ABAB8A16.AB11ABA17.AB8AB2AB2AB4ABABAB2A9.6AB2A|2AB6ABAB2ABAB5ABAB2A9.8AB2ABABABABA2.5ABAB2A6.ABAB2ABABA22.8AB2ABABABAB3A2.4ABAB2A16.3ABAB2AB2AB2A20.2ABAB8AB2AB7A11.2AB5AB|5ABAB10AB8A12.7AB6A4.AB5AB2A6.10A26.AB12A5.2AB6A17.9AB3A24.2AB2ABAB6ABA15.4ABAB2A",
s=document.currentScript.previousElementSibling,
ns="http://www.w3.org/2000/svg";
const ox=0.32415,oy=7.3223,cw=5.4907,rh=10.0,zx=1.923,zy=0.0915;
d.split("|").forEach((r,ri)=>{const g=document.createElementNS(ns,"g");g.setAttribute("transform","translate(0,"+(oy+ri*rh)+")");let col=0;for(let i=0;i<r.length;i++){let c=r[i],n=1;if(c>="0"&&c<="9"){n=c;while(i+1<r.length&&r[i+1]>="0"&&r[i+1]<="9")n+=r[++i];n=+n;c=r[++i];}if(c==="."){col+=n;continue;}for(let j=0;j<n;j++){const u=document.createElementNS(ns,"use");u.setAttribute("href",c==="A"?"#a":"#b");u.setAttribute("x",ox+col*cw+(c==="B"?zx:0));if(c==="B")u.setAttribute("y",zy);g.appendChild(u);col++;}}s.appendChild(g);});
})();
</script><?php /**PATH F:\Sempro TA\project\Laravel\TA\vendor\laravel\framework\src\Illuminate\Foundation\resources\exceptions\renderer\components\icons\laravel-ascii.blade.php ENDPATH**/ ?>

Before

Width:  |  Height:  |  Size: 3.9 KiB

View File

@ -1,37 +0,0 @@
<?php if($paginator->hasPages()): ?>
<div class="ui pagination menu" role="navigation">
<?php if($paginator->onFirstPage()): ?>
<a class="icon item disabled" aria-disabled="true" aria-label="<?php echo app('translator')->get('pagination.previous'); ?>"> <i class="left chevron icon"></i> </a>
<?php else: ?>
<a class="icon item" href="<?php echo e($paginator->previousPageUrl()); ?>" rel="prev" aria-label="<?php echo app('translator')->get('pagination.previous'); ?>"> <i class="left chevron icon"></i> </a>
<?php endif; ?>
<?php $__currentLoopData = $elements; $__env->addLoop($__currentLoopData); foreach($__currentLoopData as $element): $__env->incrementLoopIndices(); $loop = $__env->getLastLoop(); ?>
<?php if(is_string($element)): ?>
<a class="icon item disabled" aria-disabled="true"><?php echo e($element); ?></a>
<?php endif; ?>
<?php if(is_array($element)): ?>
<?php $__currentLoopData = $element; $__env->addLoop($__currentLoopData); foreach($__currentLoopData as $page => $url): $__env->incrementLoopIndices(); $loop = $__env->getLastLoop(); ?>
<?php if($page == $paginator->currentPage()): ?>
<a class="item active" href="<?php echo e($url); ?>" aria-current="page"><?php echo e($page); ?></a>
<?php else: ?>
<a class="item" href="<?php echo e($url); ?>"><?php echo e($page); ?></a>
<?php endif; ?>
<?php endforeach; $__env->popLoop(); $loop = $__env->getLastLoop(); ?>
<?php endif; ?>
<?php endforeach; $__env->popLoop(); $loop = $__env->getLastLoop(); ?>
<?php if($paginator->hasMorePages()): ?>
<a class="icon item" href="<?php echo e($paginator->nextPageUrl()); ?>" rel="next" aria-label="<?php echo app('translator')->get('pagination.next'); ?>"> <i class="right chevron icon"></i> </a>
<?php else: ?>
<a class="icon item disabled" aria-disabled="true" aria-label="<?php echo app('translator')->get('pagination.next'); ?>"> <i class="right chevron icon"></i> </a>
<?php endif; ?>
</div>
<?php endif; ?>
<?php /**PATH F:\Sempro TA\project\Laravel\TA\vendor\laravel\framework\src\Illuminate\Pagination\resources\views\semantic-ui.blade.php ENDPATH**/ ?>

View File

@ -1,28 +0,0 @@
<?php if($paginator->hasPages()): ?>
<nav>
<ul class="pagination">
<?php if($paginator->onFirstPage()): ?>
<li class="page-item disabled" aria-disabled="true">
<span class="page-link"><?php echo app('translator')->get('pagination.previous'); ?></span>
</li>
<?php else: ?>
<li class="page-item">
<a class="page-link" href="<?php echo e($paginator->previousPageUrl()); ?>" rel="prev"><?php echo app('translator')->get('pagination.previous'); ?></a>
</li>
<?php endif; ?>
<?php if($paginator->hasMorePages()): ?>
<li class="page-item">
<a class="page-link" href="<?php echo e($paginator->nextPageUrl()); ?>" rel="next"><?php echo app('translator')->get('pagination.next'); ?></a>
</li>
<?php else: ?>
<li class="page-item disabled" aria-disabled="true">
<span class="page-link"><?php echo app('translator')->get('pagination.next'); ?></span>
</li>
<?php endif; ?>
</ul>
</nav>
<?php endif; ?>
<?php /**PATH F:\Sempro TA\project\Laravel\TA\vendor\laravel\framework\src\Illuminate\Pagination\resources\views\simple-bootstrap-4.blade.php ENDPATH**/ ?>

View File

@ -1,31 +0,0 @@
<?php if($paginator->hasPages()): ?>
<nav role="navigation" aria-label="<?php echo __('Pagination Navigation'); ?>">
<ul class="pagination">
<?php if($paginator->onFirstPage()): ?>
<li class="page-item disabled" aria-disabled="true">
<span class="page-link"><?php echo __('pagination.previous'); ?></span>
</li>
<?php else: ?>
<li class="page-item">
<a class="page-link" href="<?php echo e($paginator->previousPageUrl()); ?>" rel="prev">
<?php echo __('pagination.previous'); ?>
</a>
</li>
<?php endif; ?>
<?php if($paginator->hasMorePages()): ?>
<li class="page-item">
<a class="page-link" href="<?php echo e($paginator->nextPageUrl()); ?>" rel="next"><?php echo __('pagination.next'); ?></a>
</li>
<?php else: ?>
<li class="page-item disabled" aria-disabled="true">
<span class="page-link"><?php echo __('pagination.next'); ?></span>
</li>
<?php endif; ?>
</ul>
</nav>
<?php endif; ?>
<?php /**PATH F:\Sempro TA\project\Laravel\TA\vendor\laravel\framework\src\Illuminate\Pagination\resources\views\simple-bootstrap-5.blade.php ENDPATH**/ ?>

View File

@ -1,122 +0,0 @@
<?php if($paginator->hasPages()): ?>
<nav role="navigation" aria-label="<?php echo e(__('Pagination Navigation')); ?>">
<div class="flex gap-2 items-center justify-between sm:hidden">
<?php if($paginator->onFirstPage()): ?>
<span class="inline-flex items-center px-4 py-2 text-sm font-medium text-gray-600 bg-white border border-gray-300 cursor-not-allowed leading-5 rounded-md dark:text-gray-300 dark:bg-gray-700 dark:border-gray-600">
<?php echo __('pagination.previous'); ?>
</span>
<?php else: ?>
<a href="<?php echo e($paginator->previousPageUrl()); ?>" rel="prev" class="inline-flex items-center px-4 py-2 text-sm font-medium text-gray-800 bg-white border border-gray-300 leading-5 rounded-md hover:text-gray-700 focus:outline-none focus:ring ring-gray-300 focus:border-blue-300 active:bg-gray-100 active:text-gray-800 transition ease-in-out duration-150 dark:bg-gray-800 dark:border-gray-600 dark:text-gray-200 dark:focus:border-blue-700 dark:active:bg-gray-700 dark:active:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-900 dark:hover:text-gray-200">
<?php echo __('pagination.previous'); ?>
</a>
<?php endif; ?>
<?php if($paginator->hasMorePages()): ?>
<a href="<?php echo e($paginator->nextPageUrl()); ?>" rel="next" class="inline-flex items-center px-4 py-2 text-sm font-medium text-gray-800 bg-white border border-gray-300 leading-5 rounded-md hover:text-gray-700 focus:outline-none focus:ring ring-gray-300 focus:border-blue-300 active:bg-gray-100 active:text-gray-800 transition ease-in-out duration-150 dark:bg-gray-800 dark:border-gray-600 dark:text-gray-200 dark:focus:border-blue-700 dark:active:bg-gray-700 dark:active:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-900 dark:hover:text-gray-200">
<?php echo __('pagination.next'); ?>
</a>
<?php else: ?>
<span class="inline-flex items-center px-4 py-2 text-sm font-medium text-gray-600 bg-white border border-gray-300 cursor-not-allowed leading-5 rounded-md dark:text-gray-300 dark:bg-gray-700 dark:border-gray-600">
<?php echo __('pagination.next'); ?>
</span>
<?php endif; ?>
</div>
<div class="hidden sm:flex-1 sm:flex sm:gap-2 sm:items-center sm:justify-between">
<div>
<p class="text-sm text-gray-700 leading-5 dark:text-gray-600">
<?php echo __('Showing'); ?>
<?php if($paginator->firstItem()): ?>
<span class="font-medium"><?php echo e($paginator->firstItem()); ?></span>
<?php echo __('to'); ?>
<span class="font-medium"><?php echo e($paginator->lastItem()); ?></span>
<?php else: ?>
<?php echo e($paginator->count()); ?>
<?php endif; ?>
<?php echo __('of'); ?>
<span class="font-medium"><?php echo e($paginator->total()); ?></span>
<?php echo __('results'); ?>
</p>
</div>
<div>
<span class="inline-flex rtl:flex-row-reverse shadow-sm rounded-md">
<?php if($paginator->onFirstPage()): ?>
<span aria-disabled="true" aria-label="<?php echo e(__('pagination.previous')); ?>">
<span class="inline-flex items-center px-2 py-2 text-sm font-medium text-gray-500 bg-white border border-gray-300 cursor-not-allowed rounded-l-md leading-5 dark:bg-gray-700 dark:border-gray-600 dark:text-gray-400" aria-hidden="true">
<svg class="w-5 h-5" fill="currentColor" viewBox="0 0 20 20">
<path fill-rule="evenodd" d="M12.707 5.293a1 1 0 010 1.414L9.414 10l3.293 3.293a1 1 0 01-1.414 1.414l-4-4a1 1 0 010-1.414l4-4a1 1 0 011.414 0z" clip-rule="evenodd" />
</svg>
</span>
</span>
<?php else: ?>
<a href="<?php echo e($paginator->previousPageUrl()); ?>" rel="prev" class="inline-flex items-center px-2 py-2 text-sm font-medium text-gray-500 bg-white border border-gray-300 rounded-l-md leading-5 hover:text-gray-400 focus:outline-none focus:ring ring-gray-300 focus:border-blue-300 active:bg-gray-100 active:text-gray-500 transition ease-in-out duration-150 dark:bg-gray-800 dark:border-gray-600 dark:active:bg-gray-700 dark:focus:border-blue-800 dark:text-gray-300 dark:hover:bg-gray-900 dark:hover:text-gray-300" aria-label="<?php echo e(__('pagination.previous')); ?>">
<svg class="w-5 h-5" fill="currentColor" viewBox="0 0 20 20">
<path fill-rule="evenodd" d="M12.707 5.293a1 1 0 010 1.414L9.414 10l3.293 3.293a1 1 0 01-1.414 1.414l-4-4a1 1 0 010-1.414l4-4a1 1 0 011.414 0z" clip-rule="evenodd" />
</svg>
</a>
<?php endif; ?>
<?php $__currentLoopData = $elements; $__env->addLoop($__currentLoopData); foreach($__currentLoopData as $element): $__env->incrementLoopIndices(); $loop = $__env->getLastLoop(); ?>
<?php if(is_string($element)): ?>
<span aria-disabled="true">
<span class="inline-flex items-center px-4 py-2 -ml-px text-sm font-medium text-gray-700 bg-white border border-gray-300 cursor-default leading-5 dark:bg-gray-800 dark:border-gray-600 dark:text-gray-300"><?php echo e($element); ?></span>
</span>
<?php endif; ?>
<?php if(is_array($element)): ?>
<?php $__currentLoopData = $element; $__env->addLoop($__currentLoopData); foreach($__currentLoopData as $page => $url): $__env->incrementLoopIndices(); $loop = $__env->getLastLoop(); ?>
<?php if($page == $paginator->currentPage()): ?>
<span aria-current="page">
<span class="inline-flex items-center px-4 py-2 -ml-px text-sm font-medium text-gray-700 bg-gray-200 border border-gray-300 cursor-default leading-5 dark:bg-gray-700 dark:border-gray-600 dark:text-gray-300"><?php echo e($page); ?></span>
</span>
<?php else: ?>
<a href="<?php echo e($url); ?>" class="inline-flex items-center px-4 py-2 -ml-px text-sm font-medium text-gray-700 bg-white border border-gray-300 leading-5 hover:text-gray-700 focus:outline-none focus:ring ring-gray-300 focus:border-blue-300 active:bg-gray-100 active:text-gray-700 transition ease-in-out duration-150 dark:bg-gray-800 dark:border-gray-600 dark:text-gray-300 dark:hover:text-gray-300 dark:active:bg-gray-700 dark:focus:border-blue-800 hover:bg-gray-100 dark:hover:bg-gray-900" aria-label="<?php echo e(__('Go to page :page', ['page' => $page])); ?>">
<?php echo e($page); ?>
</a>
<?php endif; ?>
<?php endforeach; $__env->popLoop(); $loop = $__env->getLastLoop(); ?>
<?php endif; ?>
<?php endforeach; $__env->popLoop(); $loop = $__env->getLastLoop(); ?>
<?php if($paginator->hasMorePages()): ?>
<a href="<?php echo e($paginator->nextPageUrl()); ?>" rel="next" class="inline-flex items-center px-2 py-2 -ml-px text-sm font-medium text-gray-500 bg-white border border-gray-300 rounded-r-md leading-5 hover:text-gray-400 focus:outline-none focus:ring ring-gray-300 focus:border-blue-300 active:bg-gray-100 active:text-gray-500 transition ease-in-out duration-150 dark:bg-gray-800 dark:border-gray-600 dark:active:bg-gray-700 dark:focus:border-blue-800 dark:text-gray-300 dark:hover:bg-gray-900 dark:hover:text-gray-300" aria-label="<?php echo e(__('pagination.next')); ?>">
<svg class="w-5 h-5" fill="currentColor" viewBox="0 0 20 20">
<path fill-rule="evenodd" d="M7.293 14.707a1 1 0 010-1.414L10.586 10 7.293 6.707a1 1 0 011.414-1.414l4 4a1 1 0 010 1.414l-4 4a1 1 0 01-1.414 0z" clip-rule="evenodd" />
</svg>
</a>
<?php else: ?>
<span aria-disabled="true" aria-label="<?php echo e(__('pagination.next')); ?>">
<span class="inline-flex items-center px-2 py-2 -ml-px text-sm font-medium text-gray-500 bg-white border border-gray-300 cursor-not-allowed rounded-r-md leading-5 dark:bg-gray-700 dark:border-gray-600 dark:text-gray-400" aria-hidden="true">
<svg class="w-5 h-5" fill="currentColor" viewBox="0 0 20 20">
<path fill-rule="evenodd" d="M7.293 14.707a1 1 0 010-1.414L10.586 10 7.293 6.707a1 1 0 011.414-1.414l4 4a1 1 0 010 1.414l-4 4a1 1 0 01-1.414 0z" clip-rule="evenodd" />
</svg>
</span>
</span>
<?php endif; ?>
</span>
</div>
</div>
</nav>
<?php endif; ?>
<?php /**PATH F:\Sempro TA\project\Laravel\TA\vendor\laravel\framework\src\Illuminate\Pagination\resources\views\tailwind.blade.php ENDPATH**/ ?>

View File

@ -1,5 +0,0 @@
<?php $__env->startSection('title', __('Server Error')); ?>
<?php $__env->startSection('code', '500'); ?>
<?php $__env->startSection('message', __('Server Error')); ?>
<?php echo $__env->make('errors::minimal', array_diff_key(get_defined_vars(), ['__data' => 1, '__path' => 1]))->render(); ?><?php /**PATH F:\Sempro TA\project\Laravel\TA\vendor\laravel\framework\src\Illuminate\Foundation\Exceptions\views\500.blade.php ENDPATH**/ ?>

View File

@ -1,374 +0,0 @@
<?php $attributes ??= new \Illuminate\View\ComponentAttributeBag;
$__newAttributes = [];
$__propNames = \Illuminate\View\ComponentAttributeBag::extractPropNames((['queries']));
foreach ($attributes->all() as $__key => $__value) {
if (in_array($__key, $__propNames)) {
$$__key = $$__key ?? $__value;
} else {
$__newAttributes[$__key] = $__value;
}
}
$attributes = new \Illuminate\View\ComponentAttributeBag($__newAttributes);
unset($__propNames);
unset($__newAttributes);
foreach (array_filter((['queries']), 'is_string', ARRAY_FILTER_USE_KEY) as $__key => $__value) {
$$__key = $$__key ?? $__value;
}
$__defined_vars = get_defined_vars();
foreach ($attributes->all() as $__key => $__value) {
if (array_key_exists($__key, $__defined_vars)) unset($$__key);
}
unset($__defined_vars, $__key, $__value); ?>
<div
<?php echo e($attributes->merge(['class' => "flex flex-col gap-2.5 bg-neutral-50 dark:bg-white/1 border border-neutral-200 dark:border-neutral-800 rounded-xl p-2.5 shadow-xs"])); ?>
x-data="{
totalQueries: <?php echo e(min(count($queries), 100)); ?>,
currentPage: 1,
perPage: 10,
get totalPages() {
return Math.ceil(this.totalQueries / this.perPage);
},
get hasPrevious() {
return this.currentPage > 1;
},
get hasNext() {
return this.currentPage < this.totalPages;
},
goToPage(page) {
if (page >= 1 && page <= this.totalPages) {
this.currentPage = page;
}
},
first() {
this.currentPage = 1;
},
last() {
this.currentPage = this.totalPages;
},
previous() {
if (this.hasPrevious) {
this.currentPage--;
}
},
next() {
if (this.hasNext) {
this.currentPage++;
}
},
get visiblePages() {
const total = this.totalPages;
const current = this.currentPage;
const pages = [];
if (total <= 7) {
for (let i = 1; i <= total; i++) {
pages.push({ type: 'page', value: i });
}
} else {
if (current <= 4) {
for (let i = 1; i <= 5; i++) {
pages.push({ type: 'page', value: i });
}
if (total > 6) {
pages.push({ type: 'ellipsis', value: '...', id: 'end' });
pages.push({ type: 'page', value: total });
}
} else if (current > total - 4) {
pages.push({ type: 'page', value: 1 });
if (total > 6) {
pages.push({ type: 'ellipsis', value: '...', id: 'start' });
}
for (let i = Math.max(total - 4, 2); i <= total; i++) {
pages.push({ type: 'page', value: i });
}
} else {
pages.push({ type: 'page', value: 1 });
pages.push({ type: 'ellipsis', value: '...', id: 'start' });
for (let i = current - 1; i <= current + 1; i++) {
pages.push({ type: 'page', value: i });
}
pages.push({ type: 'ellipsis', value: '...', id: 'end' });
pages.push({ type: 'page', value: total });
}
}
return pages;
}
}"
>
<div class="flex items-center justify-between p-2">
<div class="flex items-center gap-2.5">
<div class="bg-white dark:bg-neutral-800 border border-neutral-200 dark:border-white/5 rounded-md w-6 h-6 flex items-center justify-center p-1">
<?php if (isset($component)) { $__componentOriginal9e277ab5ada333d718192209049fcff4 = $component; } ?>
<?php if (isset($attributes)) { $__attributesOriginal9e277ab5ada333d718192209049fcff4 = $attributes; } ?>
<?php $component = Illuminate\View\AnonymousComponent::resolve(['view' => 'laravel-exceptions-renderer::components.icons.database','data' => ['class' => 'w-2.5 h-2.5 text-blue-500 dark:text-emerald-500']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? $attributes->all() : [])); ?>
<?php $component->withName('laravel-exceptions-renderer::icons.database'); ?>
<?php if ($component->shouldRender()): ?>
<?php $__env->startComponent($component->resolveView(), $component->data()); ?>
<?php if (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag): ?>
<?php $attributes = $attributes->except(\Illuminate\View\AnonymousComponent::ignoredParameterNames()); ?>
<?php endif; ?>
<?php $component->withAttributes(['class' => 'w-2.5 h-2.5 text-blue-500 dark:text-emerald-500']); ?>
<?php echo $__env->renderComponent(); ?>
<?php endif; ?>
<?php if (isset($__attributesOriginal9e277ab5ada333d718192209049fcff4)): ?>
<?php $attributes = $__attributesOriginal9e277ab5ada333d718192209049fcff4; ?>
<?php unset($__attributesOriginal9e277ab5ada333d718192209049fcff4); ?>
<?php endif; ?>
<?php if (isset($__componentOriginal9e277ab5ada333d718192209049fcff4)): ?>
<?php $component = $__componentOriginal9e277ab5ada333d718192209049fcff4; ?>
<?php unset($__componentOriginal9e277ab5ada333d718192209049fcff4); ?>
<?php endif; ?>
</div>
<h3 class="text-base font-semibold">Queries</h3>
</div>
<div x-show="totalQueries > 0" class="text-sm text-neutral-500 dark:text-neutral-400 flex items-center gap-2">
<span x-text="`${((currentPage - 1) * perPage) + 1}-${Math.min(currentPage * perPage, totalQueries)} of ${totalQueries}`"></span>
<?php if(count($queries) > 100): ?>
<?php if (isset($component)) { $__componentOriginalc6e888149e09c77971305ebbddaee753 = $component; } ?>
<?php if (isset($attributes)) { $__attributesOriginalc6e888149e09c77971305ebbddaee753 = $attributes; } ?>
<?php $component = Illuminate\View\AnonymousComponent::resolve(['view' => 'laravel-exceptions-renderer::components.icons.info','data' => ['class' => 'w-3 h-3 text-blue-500 dark:text-emerald-500','dataTippyContent' => 'Only the first 100 queries are shown']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? $attributes->all() : [])); ?>
<?php $component->withName('laravel-exceptions-renderer::icons.info'); ?>
<?php if ($component->shouldRender()): ?>
<?php $__env->startComponent($component->resolveView(), $component->data()); ?>
<?php if (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag): ?>
<?php $attributes = $attributes->except(\Illuminate\View\AnonymousComponent::ignoredParameterNames()); ?>
<?php endif; ?>
<?php $component->withAttributes(['class' => 'w-3 h-3 text-blue-500 dark:text-emerald-500','data-tippy-content' => 'Only the first 100 queries are shown']); ?>
<?php echo $__env->renderComponent(); ?>
<?php endif; ?>
<?php if (isset($__attributesOriginalc6e888149e09c77971305ebbddaee753)): ?>
<?php $attributes = $__attributesOriginalc6e888149e09c77971305ebbddaee753; ?>
<?php unset($__attributesOriginalc6e888149e09c77971305ebbddaee753); ?>
<?php endif; ?>
<?php if (isset($__componentOriginalc6e888149e09c77971305ebbddaee753)): ?>
<?php $component = $__componentOriginalc6e888149e09c77971305ebbddaee753; ?>
<?php unset($__componentOriginalc6e888149e09c77971305ebbddaee753); ?>
<?php endif; ?>
<?php endif; ?>
</div>
</div>
<div class="flex flex-col gap-1">
<?php $__empty_1 = true; $__currentLoopData = array_slice($queries, 0, 100); $__env->addLoop($__currentLoopData); foreach($__currentLoopData as $index => ['connectionName' => $connectionName, 'sql' => $sql, 'time' => $time]): $__env->incrementLoopIndices(); $loop = $__env->getLastLoop(); $__empty_1 = false; ?>
<div
class="border border-neutral-200 dark:border-none bg-white dark:bg-white/[3%] rounded-md h-10 flex items-center justify-between gap-4 px-4 text-xs font-mono shadow-xs"
x-show="Math.floor(<?php echo e($index); ?> / perPage) === (currentPage - 1)"
>
<div class="flex items-center gap-2 truncate">
<div class="flex items-center gap-2">
<?php if (isset($component)) { $__componentOriginal9e277ab5ada333d718192209049fcff4 = $component; } ?>
<?php if (isset($attributes)) { $__attributesOriginal9e277ab5ada333d718192209049fcff4 = $attributes; } ?>
<?php $component = Illuminate\View\AnonymousComponent::resolve(['view' => 'laravel-exceptions-renderer::components.icons.database','data' => ['class' => 'w-3 h-3 text-neutral-500 dark:text-neutral-400']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? $attributes->all() : [])); ?>
<?php $component->withName('laravel-exceptions-renderer::icons.database'); ?>
<?php if ($component->shouldRender()): ?>
<?php $__env->startComponent($component->resolveView(), $component->data()); ?>
<?php if (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag): ?>
<?php $attributes = $attributes->except(\Illuminate\View\AnonymousComponent::ignoredParameterNames()); ?>
<?php endif; ?>
<?php $component->withAttributes(['class' => 'w-3 h-3 text-neutral-500 dark:text-neutral-400']); ?>
<?php echo $__env->renderComponent(); ?>
<?php endif; ?>
<?php if (isset($__attributesOriginal9e277ab5ada333d718192209049fcff4)): ?>
<?php $attributes = $__attributesOriginal9e277ab5ada333d718192209049fcff4; ?>
<?php unset($__attributesOriginal9e277ab5ada333d718192209049fcff4); ?>
<?php endif; ?>
<?php if (isset($__componentOriginal9e277ab5ada333d718192209049fcff4)): ?>
<?php $component = $__componentOriginal9e277ab5ada333d718192209049fcff4; ?>
<?php unset($__componentOriginal9e277ab5ada333d718192209049fcff4); ?>
<?php endif; ?>
<span class="text-neutral-500 dark:text-neutral-400"><?php echo e($connectionName); ?></span>
</div>
<?php if (isset($component)) { $__componentOriginal12cb286571f553eebcbe98210b217f94 = $component; } ?>
<?php if (isset($attributes)) { $__attributesOriginal12cb286571f553eebcbe98210b217f94 = $attributes; } ?>
<?php $component = Illuminate\View\AnonymousComponent::resolve(['view' => 'laravel-exceptions-renderer::components.syntax-highlight','data' => ['code' => $sql,'language' => 'sql','truncate' => true,'class' => 'min-w-0','dataTippyContent' => ''.e(nl2br($sql)).'']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? $attributes->all() : [])); ?>
<?php $component->withName('laravel-exceptions-renderer::syntax-highlight'); ?>
<?php if ($component->shouldRender()): ?>
<?php $__env->startComponent($component->resolveView(), $component->data()); ?>
<?php if (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag): ?>
<?php $attributes = $attributes->except(\Illuminate\View\AnonymousComponent::ignoredParameterNames()); ?>
<?php endif; ?>
<?php $component->withAttributes(['code' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($sql),'language' => 'sql','truncate' => true,'class' => 'min-w-0','data-tippy-content' => ''.e(nl2br($sql)).'']); ?>
<?php echo $__env->renderComponent(); ?>
<?php endif; ?>
<?php if (isset($__attributesOriginal12cb286571f553eebcbe98210b217f94)): ?>
<?php $attributes = $__attributesOriginal12cb286571f553eebcbe98210b217f94; ?>
<?php unset($__attributesOriginal12cb286571f553eebcbe98210b217f94); ?>
<?php endif; ?>
<?php if (isset($__componentOriginal12cb286571f553eebcbe98210b217f94)): ?>
<?php $component = $__componentOriginal12cb286571f553eebcbe98210b217f94; ?>
<?php unset($__componentOriginal12cb286571f553eebcbe98210b217f94); ?>
<?php endif; ?>
</div>
<div class="text-neutral-500 dark:text-neutral-200 text-right flex-shrink-0"><?php echo e($time); ?>ms</div>
</div>
<?php endforeach; $__env->popLoop(); $loop = $__env->getLastLoop(); if ($__empty_1): ?>
<?php if (isset($component)) { $__componentOriginal612ffe32146e3bd2ac6ba6076cca9520 = $component; } ?>
<?php if (isset($attributes)) { $__attributesOriginal612ffe32146e3bd2ac6ba6076cca9520 = $attributes; } ?>
<?php $component = Illuminate\View\AnonymousComponent::resolve(['view' => 'laravel-exceptions-renderer::components.empty-state','data' => ['message' => 'No queries executed']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? $attributes->all() : [])); ?>
<?php $component->withName('laravel-exceptions-renderer::empty-state'); ?>
<?php if ($component->shouldRender()): ?>
<?php $__env->startComponent($component->resolveView(), $component->data()); ?>
<?php if (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag): ?>
<?php $attributes = $attributes->except(\Illuminate\View\AnonymousComponent::ignoredParameterNames()); ?>
<?php endif; ?>
<?php $component->withAttributes(['message' => 'No queries executed']); ?>
<?php echo $__env->renderComponent(); ?>
<?php endif; ?>
<?php if (isset($__attributesOriginal612ffe32146e3bd2ac6ba6076cca9520)): ?>
<?php $attributes = $__attributesOriginal612ffe32146e3bd2ac6ba6076cca9520; ?>
<?php unset($__attributesOriginal612ffe32146e3bd2ac6ba6076cca9520); ?>
<?php endif; ?>
<?php if (isset($__componentOriginal612ffe32146e3bd2ac6ba6076cca9520)): ?>
<?php $component = $__componentOriginal612ffe32146e3bd2ac6ba6076cca9520; ?>
<?php unset($__componentOriginal612ffe32146e3bd2ac6ba6076cca9520); ?>
<?php endif; ?>
<?php endif; ?>
</div>
<!-- Pagination Controls -->
<div x-cloak x-show="totalPages > 1" class="flex items-center justify-center gap-1 py-4 font-mono">
<!-- First Button -->
<button
@click="first()"
class="cursor-pointer flex items-center justify-center w-8 h-8 rounded-md transition-colors"
:disabled="!hasPrevious"
:class="hasPrevious ? 'text-neutral-500 dark:text-neutral-300 hover:bg-neutral-200 hover:dark:text-white hover:dark:bg-white/5' : 'text-neutral-600 cursor-not-allowed!'"
>
<?php if (isset($component)) { $__componentOriginal935198b948cf7048e898f42ce9f720b5 = $component; } ?>
<?php if (isset($attributes)) { $__attributesOriginal935198b948cf7048e898f42ce9f720b5 = $attributes; } ?>
<?php $component = Illuminate\View\AnonymousComponent::resolve(['view' => 'laravel-exceptions-renderer::components.icons.chevrons-left','data' => ['class' => 'w-3 h-3']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? $attributes->all() : [])); ?>
<?php $component->withName('laravel-exceptions-renderer::icons.chevrons-left'); ?>
<?php if ($component->shouldRender()): ?>
<?php $__env->startComponent($component->resolveView(), $component->data()); ?>
<?php if (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag): ?>
<?php $attributes = $attributes->except(\Illuminate\View\AnonymousComponent::ignoredParameterNames()); ?>
<?php endif; ?>
<?php $component->withAttributes(['class' => 'w-3 h-3']); ?>
<?php echo $__env->renderComponent(); ?>
<?php endif; ?>
<?php if (isset($__attributesOriginal935198b948cf7048e898f42ce9f720b5)): ?>
<?php $attributes = $__attributesOriginal935198b948cf7048e898f42ce9f720b5; ?>
<?php unset($__attributesOriginal935198b948cf7048e898f42ce9f720b5); ?>
<?php endif; ?>
<?php if (isset($__componentOriginal935198b948cf7048e898f42ce9f720b5)): ?>
<?php $component = $__componentOriginal935198b948cf7048e898f42ce9f720b5; ?>
<?php unset($__componentOriginal935198b948cf7048e898f42ce9f720b5); ?>
<?php endif; ?>
</button>
<!-- Previous Button -->
<button
@click="previous()"
class="cursor-pointer flex items-center justify-center w-8 h-8 rounded-md transition-colors"
:class="hasPrevious ? 'text-neutral-500 dark:text-neutral-300 hover:bg-neutral-200 hover:dark:text-white hover:dark:bg-white/5' : 'text-neutral-600 cursor-not-allowed!'"
:disabled="!hasPrevious"
>
<?php if (isset($component)) { $__componentOriginalb1a2603ab360710208f4e8402894d933 = $component; } ?>
<?php if (isset($attributes)) { $__attributesOriginalb1a2603ab360710208f4e8402894d933 = $attributes; } ?>
<?php $component = Illuminate\View\AnonymousComponent::resolve(['view' => 'laravel-exceptions-renderer::components.icons.chevron-left','data' => ['class' => 'w-3 h-3']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? $attributes->all() : [])); ?>
<?php $component->withName('laravel-exceptions-renderer::icons.chevron-left'); ?>
<?php if ($component->shouldRender()): ?>
<?php $__env->startComponent($component->resolveView(), $component->data()); ?>
<?php if (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag): ?>
<?php $attributes = $attributes->except(\Illuminate\View\AnonymousComponent::ignoredParameterNames()); ?>
<?php endif; ?>
<?php $component->withAttributes(['class' => 'w-3 h-3']); ?>
<?php echo $__env->renderComponent(); ?>
<?php endif; ?>
<?php if (isset($__attributesOriginalb1a2603ab360710208f4e8402894d933)): ?>
<?php $attributes = $__attributesOriginalb1a2603ab360710208f4e8402894d933; ?>
<?php unset($__attributesOriginalb1a2603ab360710208f4e8402894d933); ?>
<?php endif; ?>
<?php if (isset($__componentOriginalb1a2603ab360710208f4e8402894d933)): ?>
<?php $component = $__componentOriginalb1a2603ab360710208f4e8402894d933; ?>
<?php unset($__componentOriginalb1a2603ab360710208f4e8402894d933); ?>
<?php endif; ?>
</button>
<!-- Page Numbers -->
<template x-for="(page, index) in visiblePages" :key="`page-${page.type}-${page.value}-${page.id || index}`">
<div>
<template x-if="page.type === 'ellipsis'">
<span class="flex items-center justify-center w-8 h-8 text-neutral-500">...</span>
</template>
<template x-if="page.type === 'page'">
<button
@click="goToPage(page.value)"
class="cursor-pointer flex items-center justify-center w-8 h-8 rounded-md text-sm font-medium transition-colors"
:class="currentPage === page.value ? 'bg-blue-600 text-white' : 'text-neutral-500 dark:text-neutral-300 hover:bg-neutral-200 hover:dark:text-white hover:dark:bg-white/5'"
x-text="page.value"
></button>
</template>
</div>
</template>
<!-- Next Button -->
<button
@click="next()"
class="cursor-pointer flex items-center justify-center w-8 h-8 rounded-md transition-colors"
:class="hasNext ? 'text-neutral-500 dark:text-neutral-300 hover:bg-neutral-200 hover:dark:text-white hover:dark:bg-white/5' : 'text-neutral-600 cursor-not-allowed!'"
:disabled="!hasNext"
>
<?php if (isset($component)) { $__componentOriginalb7b593bedd3add356eaada0571956b3f = $component; } ?>
<?php if (isset($attributes)) { $__attributesOriginalb7b593bedd3add356eaada0571956b3f = $attributes; } ?>
<?php $component = Illuminate\View\AnonymousComponent::resolve(['view' => 'laravel-exceptions-renderer::components.icons.chevron-right','data' => ['class' => 'w-3 h-3']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? $attributes->all() : [])); ?>
<?php $component->withName('laravel-exceptions-renderer::icons.chevron-right'); ?>
<?php if ($component->shouldRender()): ?>
<?php $__env->startComponent($component->resolveView(), $component->data()); ?>
<?php if (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag): ?>
<?php $attributes = $attributes->except(\Illuminate\View\AnonymousComponent::ignoredParameterNames()); ?>
<?php endif; ?>
<?php $component->withAttributes(['class' => 'w-3 h-3']); ?>
<?php echo $__env->renderComponent(); ?>
<?php endif; ?>
<?php if (isset($__attributesOriginalb7b593bedd3add356eaada0571956b3f)): ?>
<?php $attributes = $__attributesOriginalb7b593bedd3add356eaada0571956b3f; ?>
<?php unset($__attributesOriginalb7b593bedd3add356eaada0571956b3f); ?>
<?php endif; ?>
<?php if (isset($__componentOriginalb7b593bedd3add356eaada0571956b3f)): ?>
<?php $component = $__componentOriginalb7b593bedd3add356eaada0571956b3f; ?>
<?php unset($__componentOriginalb7b593bedd3add356eaada0571956b3f); ?>
<?php endif; ?>
</button>
<!-- Last Button -->
<button
@click="last()"
class="cursor-pointer flex items-center justify-center w-8 h-8 rounded-md transition-colors"
:class="hasNext ? 'text-neutral-500 dark:text-neutral-300 hover:bg-neutral-200 hover:dark:text-white hover:dark:bg-white/5' : 'text-neutral-600 cursor-not-allowed!'"
:disabled="!hasNext"
>
<?php if (isset($component)) { $__componentOriginalbb91e7976582fbddcedcde197cd5dca1 = $component; } ?>
<?php if (isset($attributes)) { $__attributesOriginalbb91e7976582fbddcedcde197cd5dca1 = $attributes; } ?>
<?php $component = Illuminate\View\AnonymousComponent::resolve(['view' => 'laravel-exceptions-renderer::components.icons.chevrons-right','data' => ['class' => 'w-3 h-3']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? $attributes->all() : [])); ?>
<?php $component->withName('laravel-exceptions-renderer::icons.chevrons-right'); ?>
<?php if ($component->shouldRender()): ?>
<?php $__env->startComponent($component->resolveView(), $component->data()); ?>
<?php if (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag): ?>
<?php $attributes = $attributes->except(\Illuminate\View\AnonymousComponent::ignoredParameterNames()); ?>
<?php endif; ?>
<?php $component->withAttributes(['class' => 'w-3 h-3']); ?>
<?php echo $__env->renderComponent(); ?>
<?php endif; ?>
<?php if (isset($__attributesOriginalbb91e7976582fbddcedcde197cd5dca1)): ?>
<?php $attributes = $__attributesOriginalbb91e7976582fbddcedcde197cd5dca1; ?>
<?php unset($__attributesOriginalbb91e7976582fbddcedcde197cd5dca1); ?>
<?php endif; ?>
<?php if (isset($__componentOriginalbb91e7976582fbddcedcde197cd5dca1)): ?>
<?php $component = $__componentOriginalbb91e7976582fbddcedcde197cd5dca1; ?>
<?php unset($__componentOriginalbb91e7976582fbddcedcde197cd5dca1); ?>
<?php endif; ?>
</button>
</div>
</div>
<?php /**PATH F:\Sempro TA\project\Laravel\TA\vendor\laravel\framework\src\Illuminate\Foundation\resources\exceptions\renderer\components\query.blade.php ENDPATH**/ ?>

View File

@ -1,647 +0,0 @@
<!DOCTYPE html>
<html lang="id">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Edit Staff/Teknisi - Dashboard JTI</title>
<style>
:root {
--bg: #e0fdf4;
--panel: rgba(255, 255, 255, 0.9);
--panel-strong: #ffffff;
--text: #1f2937;
--muted: #6b7280;
--primary: #059669;
--primary-2: #14b8a6;
--purple: #4f46e5;
--orange: #d97706;
--shadow: 0 24px 70px rgba(31, 41, 55, 0.18);
}
* { box-sizing: border-box; margin: 0; padding: 0; }
body {
min-height: 100vh;
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
background:
radial-gradient(circle at top left, rgba(5, 150, 105, 0.25), transparent 35%),
radial-gradient(circle at top right, rgba(20, 184, 166, 0.18), transparent 32%),
linear-gradient(135deg, #d1fae5 0%, #e0fdf4 45%, #f0fdfa 100%);
color: var(--text);
}
.page-shell {
min-height: 100vh;
padding: 18px;
max-width: 900px;
margin: 0 auto;
}
.header {
margin-bottom: 28px;
}
.header-title {
font-size: 2rem;
font-weight: 900;
color: var(--text);
margin-bottom: 8px;
}
.header-desc {
color: var(--muted);
font-weight: 700;
font-size: 0.95rem;
}
.content {
border-radius: 28px;
background: rgba(255, 255, 255, 0.82);
backdrop-filter: blur(16px);
box-shadow: var(--shadow);
overflow: hidden;
}
.form-container {
padding: 36px;
display: grid;
grid-template-columns: 280px 1fr;
gap: 36px;
align-items: start;
}
.photo-section {
display: flex;
flex-direction: column;
gap: 16px;
}
.photo-frame {
width: 100%;
aspect-ratio: 3/4;
border-radius: 20px;
background: linear-gradient(135deg, var(--primary) 0%, var(--primary-2) 100%);
display: grid;
place-items: center;
color: #fff;
font-size: 4rem;
font-weight: 900;
overflow: hidden;
position: relative;
cursor: pointer;
transition: transform 0.3s ease, box-shadow 0.3s ease;
box-shadow: 0 16px 36px rgba(5, 150, 105, 0.22);
}
.photo-frame:hover {
transform: scale(1.02);
box-shadow: 0 20px 48px rgba(5, 150, 105, 0.28);
}
.photo-frame img {
width: 100%;
height: 100%;
object-fit: cover;
}
.photo-input {
display: none;
}
.photo-label {
border: 2px dashed rgba(5, 150, 105, 0.3);
border-radius: 14px;
padding: 14px;
text-align: center;
cursor: pointer;
transition: all 0.3s ease;
background: rgba(5, 150, 105, 0.02);
}
.photo-label:hover {
border-color: var(--primary);
background: rgba(5, 150, 105, 0.08);
}
.photo-label-text {
font-size: 0.85rem;
font-weight: 700;
color: var(--primary);
margin-bottom: 4px;
}
.photo-label-hint {
font-size: 0.8rem;
color: var(--muted);
font-weight: 600;
}
.form-fields {
display: flex;
flex-direction: column;
gap: 20px;
}
.field-section {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 20px;
}
.field-section.full {
grid-column: 1 / -1;
}
.field {
display: flex;
flex-direction: column;
gap: 8px;
}
.field label {
font-weight: 800;
color: #475569;
font-size: 0.92rem;
}
.field label .required {
color: var(--orange);
}
.input, .select {
padding: 13px 14px;
border-radius: 12px;
background: #fff;
border: 1.5px solid rgba(148, 163, 184, 0.25);
outline: none;
font-weight: 600;
color: var(--text);
transition: all 0.2s ease;
font-size: 0.95rem;
}
.input:focus, .select:focus {
border-color: var(--primary);
background: rgba(5, 150, 105, 0.02);
box-shadow: 0 0 0 3px rgba(5, 150, 105, 0.1);
}
.input::placeholder {
color: var(--muted);
}
.hint {
font-size: 0.85rem;
color: var(--muted);
margin-top: -2px;
}
.error-message {
margin: 18px 0;
padding: 14px 16px;
border-radius: 16px;
background: rgba(217, 119, 6, 0.08);
border: 1px solid rgba(217, 119, 6, 0.18);
color: #7c2d12;
font-weight: 700;
}
.error-message ul {
margin-top: 8px;
padding-left: 20px;
}
.field-error {
padding: 8px 10px;
border-radius: 8px;
background: rgba(239, 68, 68, 0.08);
color: #991b1b;
font-weight: 700;
font-size: 0.85rem;
}
.input.error, .select.error {
border-color: #ef4444;
background: rgba(239, 68, 68, 0.02);
}
.role-selector {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 14px;
padding: 16px;
background: rgba(5, 150, 105, 0.05);
border-radius: 14px;
border: 1.5px solid rgba(5, 150, 105, 0.2);
}
.role-option {
display: flex;
align-items: center;
gap: 10px;
padding: 12px 14px;
border-radius: 10px;
cursor: pointer;
transition: all 0.2s ease;
background: #fff;
border: 1.5px solid rgba(148, 163, 184, 0.2);
}
.role-option input[type="radio"] {
cursor: pointer;
accent-color: var(--primary);
}
.role-option:hover {
border-color: var(--primary);
background: rgba(5, 150, 105, 0.04);
}
.role-option input[type="radio"]:checked ~ label {
color: var(--primary);
}
.role-option label {
cursor: pointer;
font-weight: 800;
color: var(--text);
flex: 1;
}
.form-actions {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 12px;
grid-column: 1 / -1;
}
.btn {
border: 0;
border-radius: 12px;
padding: 14px 18px;
font-weight: 800;
cursor: pointer;
text-decoration: none;
display: inline-flex;
align-items: center;
justify-content: center;
transition: all 0.2s ease;
gap: 8px;
font-size: 0.95rem;
}
.btn:hover {
transform: translateY(-2px);
}
.btn.primary {
color: #fff;
background: linear-gradient(135deg, var(--primary) 0%, var(--primary-2) 100%);
box-shadow: 0 12px 24px rgba(5, 150, 105, 0.22);
}
.btn.primary:hover {
box-shadow: 0 16px 32px rgba(5, 150, 105, 0.28);
}
.btn.ghost {
color: #475569;
background: rgba(226, 232, 240, 0.8);
border: 1px solid rgba(148, 163, 184, 0.25);
}
.btn.ghost:hover {
background: rgba(226, 232, 240, 1);
}
@media (max-width: 900px) {
.form-container {
grid-template-columns: 1fr;
}
.field-section {
grid-template-columns: 1fr;
}
.role-selector {
grid-template-columns: 1fr;
}
.form-actions {
grid-template-columns: 1fr;
}
.header-title {
font-size: 1.5rem;
}
}
</style>
</head>
<body>
<?php
$makeInitial = static function (?string $nama): string {
$nama = trim((string) $nama);
if ($nama === '') return 'NA';
$parts = preg_split('/\s+/', $nama) ?: [];
$initials = '';
foreach ($parts as $part) {
if ($part === '') continue;
$initials .= strtoupper(substr($part, 0, 1));
if (strlen($initials) >= 2) break;
}
return $initials !== '' ? $initials : 'NA';
};
$resolveFoto = static function (?string $foto): ?string {
$foto = trim((string) $foto);
if ($foto === '') return null;
if (preg_match('~^(https?://|data:|//)~i', $foto)) return $foto;
if (str_starts_with($foto, '/')) return $foto;
return asset($foto);
};
?>
<div class="page-shell">
<header class="header">
<h1 class="header-title">✏️ Edit Staff/Teknisi</h1>
<p class="header-desc">Perbarui informasi staff/teknisi (ID: <?php echo e($user->id); ?>)</p>
</header>
<div class="content">
<?php if($errors->any()): ?>
<div class="error-message">
<strong> Terjadi kesalahan validasi:</strong>
<ul>
<?php $__currentLoopData = $errors->all(); $__env->addLoop($__currentLoopData); foreach($__currentLoopData as $error): $__env->incrementLoopIndices(); $loop = $__env->getLastLoop(); ?>
<li><?php echo e($error); ?></li>
<?php endforeach; $__env->popLoop(); $loop = $__env->getLastLoop(); ?>
</ul>
</div>
<?php endif; ?>
<form method="POST" action="<?php echo e(route('staff.update', $user)); ?>" class="form-container">
<?php echo csrf_field(); ?>
<?php echo method_field('PUT'); ?>
<!-- Foto Section -->
<div class="photo-section">
<div class="photo-frame" id="photoPreview">
<span id="photoInitial"><?php echo e($makeInitial($user->nama)); ?></span>
<img id="photoImg" style="display:none;" />
</div>
<label class="photo-label" for="fotoInput">
<div class="photo-label-text">📤 Upload Foto</div>
<div class="photo-label-hint">Klik untuk memilih gambar</div>
</label>
<input
id="fotoInput"
class="input"
type="text"
name="foto"
value="<?php echo e(old('foto', $user->foto)); ?>"
placeholder="atau masukkan URL foto"
>
<div class="hint">Format: URL gambar (https://...)</div>
</div>
<!-- Form Fields -->
<div class="form-fields">
<!-- Row 1: Nama -->
<div class="field-section full">
<div class="field">
<label for="nama">Nama Lengkap <span class="required">*</span></label>
<input
id="nama"
class="input <?php $__errorArgs = ['nama'];
$__bag = $errors->getBag($__errorArgs[1] ?? 'default');
if ($__bag->has($__errorArgs[0])) :
if (isset($message)) { $__messageOriginal = $message; }
$message = $__bag->first($__errorArgs[0]); ?> error <?php unset($message);
if (isset($__messageOriginal)) { $message = $__messageOriginal; }
endif;
unset($__errorArgs, $__bag); ?>"
type="text"
name="nama"
value="<?php echo e(old('nama', $user->nama)); ?>"
placeholder="Masukkan nama lengkap"
required
>
<?php $__errorArgs = ['nama'];
$__bag = $errors->getBag($__errorArgs[1] ?? 'default');
if ($__bag->has($__errorArgs[0])) :
if (isset($message)) { $__messageOriginal = $message; }
$message = $__bag->first($__errorArgs[0]); ?>
<div class="field-error"><?php echo e($message); ?></div>
<?php unset($message);
if (isset($__messageOriginal)) { $message = $__messageOriginal; }
endif;
unset($__errorArgs, $__bag); ?>
</div>
</div>
<!-- Row 2: NIP dan NIDN -->
<div class="field-section">
<div class="field">
<label for="nip">NIP</label>
<input
id="nip"
class="input <?php $__errorArgs = ['nip'];
$__bag = $errors->getBag($__errorArgs[1] ?? 'default');
if ($__bag->has($__errorArgs[0])) :
if (isset($message)) { $__messageOriginal = $message; }
$message = $__bag->first($__errorArgs[0]); ?> error <?php unset($message);
if (isset($__messageOriginal)) { $message = $__messageOriginal; }
endif;
unset($__errorArgs, $__bag); ?>"
type="text"
name="nip"
value="<?php echo e(old('nip', $user->nip)); ?>"
placeholder="Contoh: 12345678 900000 1 001"
>
<?php $__errorArgs = ['nip'];
$__bag = $errors->getBag($__errorArgs[1] ?? 'default');
if ($__bag->has($__errorArgs[0])) :
if (isset($message)) { $__messageOriginal = $message; }
$message = $__bag->first($__errorArgs[0]); ?>
<div class="field-error"><?php echo e($message); ?></div>
<?php unset($message);
if (isset($__messageOriginal)) { $message = $__messageOriginal; }
endif;
unset($__errorArgs, $__bag); ?>
<div class="hint">Nomor Induk Pegawai (opsional)</div>
</div>
<div class="field">
<label for="nidn">Identitas Lain / BioID</label>
<input
id="nidn"
class="input <?php $__errorArgs = ['nidn'];
$__bag = $errors->getBag($__errorArgs[1] ?? 'default');
if ($__bag->has($__errorArgs[0])) :
if (isset($message)) { $__messageOriginal = $message; }
$message = $__bag->first($__errorArgs[0]); ?> error <?php unset($message);
if (isset($__messageOriginal)) { $message = $__messageOriginal; }
endif;
unset($__errorArgs, $__bag); ?>"
type="text"
name="nidn"
value="<?php echo e(old('nidn', $user->nidn)); ?>"
placeholder="Contoh: BiometricID atau nomor lain"
>
<?php $__errorArgs = ['nidn'];
$__bag = $errors->getBag($__errorArgs[1] ?? 'default');
if ($__bag->has($__errorArgs[0])) :
if (isset($message)) { $__messageOriginal = $message; }
$message = $__bag->first($__errorArgs[0]); ?>
<div class="field-error"><?php echo e($message); ?></div>
<?php unset($message);
if (isset($__messageOriginal)) { $message = $__messageOriginal; }
endif;
unset($__errorArgs, $__bag); ?>
<div class="hint">Identitas tambahan (opsional)</div>
</div>
</div>
<!-- Row 3: Bagian -->
<div class="field-section full">
<div class="field">
<label for="bagian">Bagian <span class="required">*</span></label>
<select
id="bagian"
class="select <?php $__errorArgs = ['bagian'];
$__bag = $errors->getBag($__errorArgs[1] ?? 'default');
if ($__bag->has($__errorArgs[0])) :
if (isset($message)) { $__messageOriginal = $message; }
$message = $__bag->first($__errorArgs[0]); ?> error <?php unset($message);
if (isset($__messageOriginal)) { $message = $__messageOriginal; }
endif;
unset($__errorArgs, $__bag); ?>"
name="bagian"
required
>
<option value="">-- Pilih Bagian --</option>
<option value="Staff Administrasi" <?php if(old('bagian', $user->bagian) === 'Staff Administrasi'): echo 'selected'; endif; ?>>Staff Administrasi</option>
<option value="Arsitektur dan Jaringan Komputer" <?php if(old('bagian', $user->bagian) === 'Arsitektur dan Jaringan Komputer'): echo 'selected'; endif; ?>>Arsitektur dan Jaringan Komputer</option>
<option value="Komputasi dan Sistem Informasi" <?php if(old('bagian', $user->bagian) === 'Komputasi dan Sistem Informasi'): echo 'selected'; endif; ?>>Komputasi dan Sistem Informasi</option>
<option value="Rekayasa Sistem Informasi" <?php if(old('bagian', $user->bagian) === 'Rekayasa Sistem Informasi'): echo 'selected'; endif; ?>>Rekayasa Sistem Informasi</option>
<option value="Sistem Komputer dan Kontrol" <?php if(old('bagian', $user->bagian) === 'Sistem Komputer dan Kontrol'): echo 'selected'; endif; ?>>Sistem Komputer dan Kontrol</option>
<option value="Rekayasa Perangkat Lunak" <?php if(old('bagian', $user->bagian) === 'Rekayasa Perangkat Lunak'): echo 'selected'; endif; ?>>Rekayasa Perangkat Lunak</option>
<option value="Multimedia Cerdas" <?php if(old('bagian', $user->bagian) === 'Multimedia Cerdas'): echo 'selected'; endif; ?>>Multimedia Cerdas</option>
<option value="Staff Lainnya" <?php if(old('bagian', $user->bagian) === 'Staff Lainnya'): echo 'selected'; endif; ?>>Staff Lainnya</option>
</select>
<?php $__errorArgs = ['bagian'];
$__bag = $errors->getBag($__errorArgs[1] ?? 'default');
if ($__bag->has($__errorArgs[0])) :
if (isset($message)) { $__messageOriginal = $message; }
$message = $__bag->first($__errorArgs[0]); ?>
<div class="field-error"><?php echo e($message); ?></div>
<?php unset($message);
if (isset($__messageOriginal)) { $message = $__messageOriginal; }
endif;
unset($__errorArgs, $__bag); ?>
<div class="hint">Pilih bagian/divisi staff</div>
</div>
</div>
<!-- Role Selection -->
<div class="field-section full">
<label style="font-weight: 800; color: #475569; font-size: 0.92rem; margin-bottom: 8px;">Pilih Role <span class="required">*</span></label>
<div class="role-selector">
<div class="role-option">
<input type="radio" id="roleStaff" name="role" value="staff" <?php if(old('role', $user->role) === 'staff'): echo 'checked'; endif; ?> required>
<label for="roleStaff">👤 Staff</label>
</div>
<div class="role-option">
<input type="radio" id="roleTeknik" name="role" value="teknisi" <?php if(old('role', $user->role) === 'teknisi'): echo 'checked'; endif; ?> required>
<label for="roleTeknik">🔧 Teknisi</label>
</div>
</div>
</div>
</div>
<!-- Form Actions -->
<div class="form-actions">
<button class="btn primary" type="submit">💾 Simpan Perubahan</button>
<a class="btn ghost" href="<?php echo e(route('users.staff')); ?>"> Batal</a>
</div>
</form>
</div>
</div>
<script>
// Photo preview dari URL
const fotoInput = document.getElementById('fotoInput');
const photoPreview = document.getElementById('photoPreview');
const photoImg = document.getElementById('photoImg');
const photoInitial = document.getElementById('photoInitial');
const namaInput = document.getElementById('nama');
const roleStaffInput = document.getElementById('roleStaff');
const roleTeknikInput = document.getElementById('roleTeknik');
const submitBtn = document.querySelector('button[type="submit"]');
const form = document.querySelector('form');
let isSubmitting = false;
function updatePhotoIcon() {
if (roleTeknikInput.checked) {
return '🔧';
}
return '👤';
}
// Prevent double submission
form.addEventListener('submit', (e) => {
if (isSubmitting) {
e.preventDefault();
return false;
}
isSubmitting = true;
submitBtn.disabled = true;
submitBtn.textContent = '⏳ Menyimpan...';
});
fotoInput.addEventListener('change', (e) => {
const url = e.target.value.trim();
if (url && (url.startsWith('http') || url.startsWith('data:'))) {
photoImg.src = url;
photoImg.style.display = 'block';
photoInitial.style.display = 'none';
} else {
photoImg.style.display = 'none';
photoInitial.style.display = 'block';
updateInitials();
}
});
function updateInitials() {
const nama = namaInput.value.trim();
if (nama) {
const initials = nama.split(/\s+/)
.slice(0, 2)
.map(w => w.charAt(0).toUpperCase())
.join('');
photoInitial.textContent = initials || updatePhotoIcon();
} else {
photoInitial.textContent = updatePhotoIcon();
}
}
// Trigger dari input nama
namaInput.addEventListener('input', updateInitials);
// Trigger dari role selection
roleStaffInput.addEventListener('change', updateInitials);
roleTeknikInput.addEventListener('change', updateInitials);
// Inisialisasi saat halaman load
window.addEventListener('load', () => {
isSubmitting = false;
submitBtn.disabled = false;
submitBtn.textContent = '💾 Simpan Perubahan';
if (fotoInput.value.trim()) {
fotoInput.dispatchEvent(new Event('change'));
}
});
</script>
</body>
</html>
<?php /**PATH F:\Sempro TA\project\Laravel\TA\resources\views\staff\edit.blade.php ENDPATH**/ ?>

View File

@ -1,638 +0,0 @@
<!DOCTYPE html>
<html lang="id">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>CRUD Staff/Teknisi - Dashboard JTI</title>
<style>
:root {
--bg: #eef2ff;
--panel: rgba(255, 255, 255, 0.9);
--panel-strong: #ffffff;
--text: #1f2937;
--muted: #6b7280;
--primary: #4f46e5;
--primary-2: #7c3aed;
--green: #059669;
--orange: #d97706;
--shadow: 0 24px 70px rgba(31, 41, 55, 0.18);
}
* { box-sizing: border-box; margin: 0; padding: 0; }
body {
min-height: 100vh;
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
background:
radial-gradient(circle at top left, rgba(99, 102, 241, 0.25), transparent 35%),
radial-gradient(circle at top right, rgba(168, 85, 247, 0.18), transparent 32%),
linear-gradient(135deg, #e0e7ff 0%, #eef2ff 45%, #f8fafc 100%);
color: var(--text);
}
.page-shell {
min-height: 100vh;
padding: 18px;
display: grid;
grid-template-columns: 260px 1fr;
gap: 18px;
}
.sidebar {
display: flex;
flex-direction: column;
gap: 12px;
height: fit-content;
position: sticky;
top: 18px;
transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1);
opacity: 1;
transform: translateX(0);
}
.sidebar.hidden {
opacity: 0;
transform: translateX(-100%);
pointer-events: none;
visibility: hidden;
}
.page-shell.sidebar-hidden {
grid-template-columns: 1fr;
}
.sidebar-top {
display: flex;
align-items: center;
justify-content: flex-end;
padding: 12px 14px;
border-bottom: 1px solid rgba(148, 163, 184, 0.2);
}
.sidebar-card {
border-radius: 20px;
background: rgba(255, 255, 255, 0.82);
backdrop-filter: blur(16px);
box-shadow: var(--shadow);
overflow: hidden;
}
.sidebar-menu {
list-style: none;
padding: 8px;
display: flex;
flex-direction: column;
gap: 6px;
}
.sidebar-menu li {
margin: 0;
padding: 0;
}
.sidebar-menu a {
display: flex;
align-items: center;
gap: 12px;
padding: 12px 14px;
border-radius: 14px;
color: var(--text);
text-decoration: none;
font-weight: 700;
transition: all 0.2s ease;
position: relative;
}
.sidebar-menu a:hover {
background: rgba(79, 70, 229, 0.08);
color: var(--primary);
}
.sidebar-menu a.active {
background: linear-gradient(135deg, var(--primary) 0%, var(--primary-2) 100%);
color: #fff;
box-shadow: 0 8px 16px rgba(79, 70, 229, 0.18);
}
.sidebar-toggle {
border: 0;
background: none;
cursor: pointer;
font-size: 1.5rem;
padding: 8px;
display: flex;
align-items: center;
justify-content: center;
color: var(--text);
transition: transform 0.4s cubic-bezier(0.4, 0, 0.2, 1), color 0.3s ease;
width: 40px;
height: 40px;
}
.sidebar-toggle:hover {
color: var(--primary);
transform: scale(1.15) rotate(90deg);
}
.sidebar-toggle.active {
color: var(--primary);
}
.sidebar-icon {
width: 20px;
height: 20px;
display: flex;
align-items: center;
justify-content: center;
font-size: 1rem;
}
.main-content {
display: flex;
flex-direction: column;
gap: 0;
}
.main-content > header {
margin-bottom: 18px;
}
.topbar {
display: flex;
align-items: center;
justify-content: space-between;
gap: 16px;
padding: 14px 18px;
border-radius: 20px;
background: rgba(255, 255, 255, 0.72);
backdrop-filter: blur(14px);
box-shadow: 0 10px 35px rgba(79, 70, 229, 0.08);
position: relative;
z-index: 20;
}
.sidebar-open {
display: none;
}
.page-shell.sidebar-hidden .sidebar-open {
display: flex;
}
.brand { display: flex; align-items: center; gap: 14px; text-decoration: none; color: inherit; }
.brand-mark {
width: 44px;
height: 44px;
border-radius: 14px;
display: grid;
place-items: center;
color: #fff;
font-weight: 800;
background: linear-gradient(135deg, var(--primary) 0%, var(--primary-2) 100%);
box-shadow: 0 12px 24px rgba(79, 70, 229, 0.28);
}
.brand-text h1 { font-size: 1.05rem; line-height: 1.1; color: var(--text); }
.brand-text p { margin-top: 2px; color: var(--muted); font-size: 0.9rem; }
.actions { display: flex; gap: 10px; flex-wrap: wrap; justify-content: flex-end; align-items: center; }
.btn {
border: 0;
border-radius: 999px;
padding: 11px 16px;
font-weight: 800;
cursor: pointer;
text-decoration: none;
display: inline-flex;
align-items: center;
justify-content: center;
transition: transform 0.15s ease, box-shadow 0.15s ease;
}
.btn:hover { transform: translateY(-1px); }
.btn.primary {
color: #fff;
background: linear-gradient(135deg, var(--primary) 0%, var(--primary-2) 100%);
box-shadow: 0 12px 22px rgba(79, 70, 229, 0.18);
}
.btn.ghost {
color: #475569;
background: rgba(226, 232, 240, 0.8);
border: 1px solid rgba(148, 163, 184, 0.25);
}
.btn.danger {
color: #fff;
background: linear-gradient(135deg, var(--orange) 0%, var(--primary-2) 100%);
box-shadow: 0 12px 22px rgba(217, 119, 6, 0.18);
}
.content {
border-radius: 28px;
background: rgba(255, 255, 255, 0.82);
backdrop-filter: blur(16px);
box-shadow: var(--shadow);
overflow: hidden;
}
.section-head {
display: flex;
align-items: center;
justify-content: space-between;
gap: 16px;
padding: 22px 26px;
background: linear-gradient(135deg, rgba(79, 70, 229, 0.1), rgba(124, 58, 237, 0.08));
border-bottom: 1px solid rgba(148, 163, 184, 0.2);
}
.section-head h2 { font-size: 1.35rem; color: var(--text); }
.section-head p { margin-top: 4px; color: var(--muted); font-size: 0.95rem; }
.filters {
padding: 18px 26px;
display: grid;
gap: 12px;
border-bottom: 1px solid rgba(148, 163, 184, 0.16);
}
.filters-row {
display: grid;
grid-template-columns: 1.4fr 220px 180px auto;
gap: 12px;
align-items: end;
}
.field label { display: block; font-size: 0.9rem; font-weight: 800; color: #475569; margin-bottom: 6px; }
.input, .select {
width: 100%;
padding: 11px 12px;
border-radius: 14px;
background: #fff;
border: 1px solid rgba(148, 163, 184, 0.22);
outline: none;
font-weight: 600;
color: var(--text);
}
.notice {
margin: 18px 26px 0;
padding: 14px 16px;
border-radius: 18px;
background: rgba(5, 150, 105, 0.08);
border: 1px solid rgba(5, 150, 105, 0.18);
color: #065f46;
font-weight: 700;
}
.table-wrap { padding: 18px 26px 26px; }
table {
width: 100%;
border-collapse: separate;
border-spacing: 0;
overflow: hidden;
border-radius: 18px;
border: 1px solid rgba(148, 163, 184, 0.18);
background: #fff;
}
thead th {
text-align: left;
padding: 12px 14px;
font-size: 0.9rem;
color: #475569;
background: #f8fafc;
border-bottom: 1px solid rgba(148, 163, 184, 0.18);
}
tbody td {
padding: 12px 14px;
border-bottom: 1px solid rgba(148, 163, 184, 0.12);
vertical-align: middle;
font-weight: 600;
color: var(--text);
}
tbody tr:last-child td { border-bottom: 0; }
.avatar {
width: 46px;
height: 46px;
border-radius: 50%;
background-size: cover;
background-position: center;
overflow: hidden;
display: grid;
place-items: center;
color: #fff;
font-weight: 900;
background: linear-gradient(135deg, var(--primary) 0%, var(--primary-2) 100%);
box-shadow: 0 10px 18px rgba(79, 70, 229, 0.18);
}
.avatar-placeholder {
display: grid;
place-items: center;
width: 100%;
height: 100%;
background: linear-gradient(135deg, var(--primary) 0%, var(--primary-2) 100%);
color: #fff;
font-weight: 900;
}
.meta { color: var(--muted); font-weight: 700; font-size: 0.92rem; }
.pill {
display: inline-flex;
padding: 7px 10px;
border-radius: 999px;
font-size: 0.85rem;
font-weight: 800;
color: #fff;
background: linear-gradient(135deg, var(--primary) 0%, var(--primary-2) 100%);
}
.pill.dosen { background: linear-gradient(135deg, #8b5cf6 0%, #6d28d9 100%); }
.pill.teknisi { background: linear-gradient(135deg, var(--green), #14b8a6); }
.pill.staff { background: linear-gradient(135deg, var(--orange), var(--orange)); }
.row-actions { display: inline-flex; gap: 8px; flex-wrap: wrap; }
.btn-sm {
border: 0;
border-radius: 999px;
padding: 9px 12px;
font-weight: 800;
cursor: pointer;
text-decoration: none;
display: inline-flex;
align-items: center;
justify-content: center;
transition: transform 0.15s ease, box-shadow 0.15s ease;
}
.btn-sm:hover { transform: translateY(-2px); }
.btn-sm.ghost {
color: #475569;
background: rgba(226, 232, 240, 0.8);
border: 1px solid rgba(148, 163, 184, 0.25);
}
.btn-sm.success {
color: #fff;
background: linear-gradient(135deg, #10b981 0%, #059669 100%);
box-shadow: 0 8px 16px rgba(16, 185, 129, 0.18);
}
.btn-sm.primary {
color: #fff;
background: linear-gradient(135deg, #3b82f6 0%, #1d4ed8 100%);
box-shadow: 0 8px 16px rgba(59, 130, 246, 0.18);
}
.btn-sm.danger {
color: #fff;
background: linear-gradient(135deg, #ef4444 0%, #dc2626 100%);
box-shadow: 0 8px 16px rgba(239, 68, 68, 0.18);
}
.pagination {
margin-top: 16px;
display: flex;
align-items: center;
justify-content: space-between;
gap: 12px;
flex-wrap: wrap;
color: var(--muted);
font-weight: 700;
}
.pager { display: inline-flex; gap: 8px; }
@media (max-width: 1000px) {
.page-shell { grid-template-columns: 1fr; }
.sidebar { position: static; }
.filters-row { grid-template-columns: 1fr; }
.actions { justify-content: stretch; }
.btn { width: 100%; }
}
</style>
</head>
<body>
<?php
$makeInitial = static function (?string $nama): string {
$nama = trim((string) $nama);
if ($nama === '') return 'NA';
$parts = preg_split('/\s+/', $nama) ?: [];
$initials = '';
foreach ($parts as $part) {
if ($part === '') continue;
$initials .= strtoupper(substr($part, 0, 1));
if (strlen($initials) >= 2) break;
}
return $initials !== '' ? $initials : 'NA';
};
$resolveFoto = static function (?string $foto): ?string {
$foto = trim((string) $foto);
if ($foto === '') return null;
if (preg_match('~^(https?://|data:|//)~i', $foto)) return $foto;
if (str_starts_with($foto, '/')) return $foto;
return asset($foto);
};
?>
<div class="page-shell sidebar-hidden">
<!-- Sidebar Navigation -->
<aside class="sidebar hidden">
<div class="sidebar-card">
<div class="sidebar-top">
<button class="sidebar-toggle" id="sidebarToggle" title="Toggle Sidebar"></button>
</div>
<ul class="sidebar-menu">
<li><a href="<?php echo e(route('users.index')); ?>"><span class="sidebar-icon">🏠</span> Home</a></li>
<li><a href="<?php echo e(route('users.dosen')); ?>"><span class="sidebar-icon">👨‍🏫</span> CRUD Dosen</a></li>
<li><a href="<?php echo e(route('users.staff')); ?>" class="active"><span class="sidebar-icon">🔧</span> CRUD Staff/Teknisi</a></li>
</ul>
</div>
</aside>
<!-- Main Content -->
<div class="main-content">
<header class="topbar">
<button class="sidebar-toggle sidebar-open" id="sidebarOpen" title="Buka Sidebar"></button>
<a class="brand" href="<?php echo e(url('/dashboard')); ?>">
<div class="brand-mark">JTI</div>
<div class="brand-text">
<h1>CRUD Staff/Teknisi</h1>
<p>Kelola data staff dan teknisi JTI</p>
</div>
</a>
<div class="actions">
<a class="btn-sm success" href="<?php echo e(route('staff.create')); ?>">Tambah Staff/Teknisi</a>
</div>
</header>
<main class="content">
<div class="section-head">
<div>
<h2>Daftar Staff/Teknisi</h2>
<p>Kelola data staff dan teknisi dengan fitur pencarian dan filter.</p>
</div>
<div class="meta">Total: <?php echo e($staffCount); ?></div>
</div>
<form class="filters" method="GET" action="<?php echo e(route('users.staff')); ?>">
<div class="filters-row">
<div class="field">
<label for="q">Cari</label>
<input id="q" class="input" type="text" name="q" value="<?php echo e($q); ?>" placeholder="Nama / NIP / NIDN">
</div>
<div class="field">
<label for="role">Role</label>
<select id="role" class="select" name="role">
<option value="">Semua</option>
<option value="staff" <?php if($role === 'staff'): echo 'selected'; endif; ?>>Staff</option>
<option value="teknisi" <?php if($role === 'teknisi'): echo 'selected'; endif; ?>>Teknisi</option>
</select>
</div>
<div class="field">
<label for="per_page">Per Halaman</label>
<select id="per_page" class="select" name="per_page">
<?php $__currentLoopData = ['10','25','50','100','all']; $__env->addLoop($__currentLoopData); foreach($__currentLoopData as $size): $__env->incrementLoopIndices(); $loop = $__env->getLastLoop(); ?>
<option value="<?php echo e($size); ?>" <?php if($perPage === $size): echo 'selected'; endif; ?>>
<?php echo e($size === 'all' ? 'Semua' : $size); ?>
</option>
<?php endforeach; $__env->popLoop(); $loop = $__env->getLastLoop(); ?>
</select>
</div>
<div class="field">
<button class="btn primary" type="submit">Terapkan</button>
</div>
</div>
<div class="actions">
<a class="btn ghost" href="<?php echo e(route('users.staff')); ?>">Reset</a>
</div>
</form>
<?php if(session('success')): ?>
<div class="notice"><?php echo e(session('success')); ?></div>
<?php endif; ?>
<div class="table-wrap">
<table>
<thead>
<tr>
<th style="width: 70px;">Foto</th>
<th>Nama</th>
<th style="width: 180px;">NIP</th>
<th style="width: 140px;">NIDN</th>
<th style="width: 120px;">Role</th>
<th style="width: 190px;">Aksi</th>
</tr>
</thead>
<tbody>
<?php $__empty_1 = true; $__currentLoopData = $staff; $__env->addLoop($__currentLoopData); foreach($__currentLoopData as $item): $__env->incrementLoopIndices(); $loop = $__env->getLastLoop(); $__empty_1 = false; ?>
<tr>
<td>
<?php ($fotoUrl = $resolveFoto($item->foto)); ?>
<div class="avatar" <?php if($fotoUrl): ?> style="background-image: url('<?php echo e($fotoUrl); ?>')" <?php endif; ?>>
<?php if(!$fotoUrl): ?>
<div class="avatar-placeholder"><?php echo e($makeInitial($item->nama)); ?></div>
<?php endif; ?>
</div>
</td>
<td>
<div style="font-weight: 900;"><?php echo e($item->nama); ?></div>
<div class="meta">ID: <?php echo e($item->id); ?></div>
</td>
<td><?php echo e($item->nip ?? '-'); ?></td>
<td><?php echo e($item->nidn ?? '-'); ?></td>
<td>
<?php ($r = (string) ($item->role ?? 'staff')); ?>
<?php ($r = in_array($r, ['dosen', 'teknisi', 'staff'], true) ? $r : 'staff'); ?>
<span class="pill <?php echo e($r); ?>"><?php echo e(ucfirst($r)); ?></span>
</td>
<td>
<div class="row-actions">
<a class="btn-sm primary" href="<?php echo e(route('staff.edit', $item)); ?>">Edit</a>
<form method="POST" action="<?php echo e(route('staff.destroy', $item)); ?>" onsubmit="return confirm('Hapus staff/teknisi ini?')" style="display:inline;">
<?php echo csrf_field(); ?>
<?php echo method_field('DELETE'); ?>
<button class="btn-sm danger" type="submit">Hapus</button>
</form>
</div>
</td>
</tr>
<?php endforeach; $__env->popLoop(); $loop = $__env->getLastLoop(); if ($__empty_1): ?>
<tr>
<td colspan="6" class="meta">Belum ada data staff/teknisi.</td>
</tr>
<?php endif; ?>
</tbody>
</table>
<div class="pagination">
<div>
Menampilkan <?php echo e($staff->firstItem() ?? 0); ?><?php echo e($staff->lastItem() ?? 0); ?> dari <?php echo e($staffCount); ?>
</div>
<div class="pager">
<?php if($staff->onFirstPage()): ?>
<span class="btn-sm ghost" style="opacity:0.6; cursor:not-allowed;">Sebelumnya</span>
<?php else: ?>
<a class="btn-sm ghost" href="<?php echo e($staff->previousPageUrl()); ?>">Sebelumnya</a>
<?php endif; ?>
<?php if($staff->hasMorePages()): ?>
<a class="btn-sm ghost" href="<?php echo e($staff->nextPageUrl()); ?>">Berikutnya</a>
<?php else: ?>
<span class="btn-sm ghost" style="opacity:0.6; cursor:not-allowed;">Berikutnya</span>
<?php endif; ?>
</div>
</div>
</div>
</main>
</div>
</div>
<script>
const sidebarToggle = document.getElementById('sidebarToggle');
const sidebarOpen = document.getElementById('sidebarOpen');
const sidebar = document.querySelector('.sidebar');
const pageShell = document.querySelector('.page-shell');
function toggleSidebar() {
sidebar.classList.toggle('hidden');
pageShell.classList.toggle('sidebar-hidden');
sidebarToggle.classList.toggle('active');
sidebarOpen.classList.toggle('active');
}
if (sidebarToggle) sidebarToggle.addEventListener('click', toggleSidebar);
if (sidebarOpen) sidebarOpen.addEventListener('click', toggleSidebar);
// Close sidebar when clicking on a menu link
const menuLinks = document.querySelectorAll('.sidebar-menu a');
menuLinks.forEach(link => {
link.addEventListener('click', () => {
if (!sidebar.classList.contains('hidden')) {
toggleSidebar();
}
});
});
</script>
</body>
</html>
<?php /**PATH F:\Sempro TA\project\Laravel\TA\resources\views\staff\staff.blade.php ENDPATH**/ ?>

View File

@ -1,5 +0,0 @@
<svg width="10" height="10" viewBox="0 0 10 10" fill="none" xmlns="http://www.w3.org/2000/svg" <?php echo e($attributes); ?>>
<path d="M5.25 9L9.25 5L5.25 1" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M0.75 9L4.75 5L0.75 1" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
<?php /**PATH F:\Sempro TA\project\Laravel\TA\vendor\laravel\framework\src\Illuminate\Foundation\resources\exceptions\renderer\components\icons\chevrons-right.blade.php ENDPATH**/ ?>

Before

Width:  |  Height:  |  Size: 529 B

View File

@ -1,623 +0,0 @@
<!DOCTYPE html>
<html lang="id">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>CRUD Dosen - Dashboard JTI</title>
<style>
:root {
--bg: #eef2ff;
--panel: rgba(255, 255, 255, 0.9);
--panel-strong: #ffffff;
--text: #1f2937;
--muted: #6b7280;
--primary: #4f46e5;
--primary-2: #7c3aed;
--green: #059669;
--orange: #d97706;
--shadow: 0 24px 70px rgba(31, 41, 55, 0.18);
}
* { box-sizing: border-box; margin: 0; padding: 0; }
body {
min-height: 100vh;
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
background:
radial-gradient(circle at top left, rgba(99, 102, 241, 0.25), transparent 35%),
radial-gradient(circle at top right, rgba(168, 85, 247, 0.18), transparent 32%),
linear-gradient(135deg, #e0e7ff 0%, #eef2ff 45%, #f8fafc 100%);
color: var(--text);
}
.page-shell {
min-height: 100vh;
padding: 18px;
display: grid;
grid-template-columns: 260px 1fr;
gap: 18px;
}
.sidebar {
display: flex;
flex-direction: column;
gap: 12px;
height: fit-content;
position: sticky;
top: 18px;
transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1);
opacity: 1;
transform: translateX(0);
}
.sidebar.hidden {
opacity: 0;
transform: translateX(-100%);
pointer-events: none;
visibility: hidden;
}
.page-shell.sidebar-hidden {
grid-template-columns: 1fr;
}
.sidebar-top {
display: flex;
align-items: center;
justify-content: flex-end;
padding: 12px 14px;
border-bottom: 1px solid rgba(148, 163, 184, 0.2);
}
.sidebar-card {
border-radius: 20px;
background: rgba(255, 255, 255, 0.82);
backdrop-filter: blur(16px);
box-shadow: var(--shadow);
overflow: hidden;
}
.sidebar-menu {
list-style: none;
padding: 8px;
display: flex;
flex-direction: column;
gap: 6px;
}
.sidebar-menu li {
margin: 0;
padding: 0;
}
.sidebar-menu a {
display: flex;
align-items: center;
gap: 12px;
padding: 12px 14px;
border-radius: 14px;
color: var(--text);
text-decoration: none;
font-weight: 700;
transition: all 0.2s ease;
position: relative;
}
.sidebar-menu a:hover {
background: rgba(79, 70, 229, 0.08);
color: var(--primary);
}
.sidebar-menu a.active {
background: linear-gradient(135deg, var(--primary) 0%, var(--primary-2) 100%);
color: #fff;
box-shadow: 0 8px 16px rgba(79, 70, 229, 0.18);
}
.sidebar-toggle {
border: 0;
background: none;
cursor: pointer;
font-size: 1.5rem;
padding: 8px;
display: flex;
align-items: center;
justify-content: center;
color: var(--text);
transition: transform 0.4s cubic-bezier(0.4, 0, 0.2, 1), color 0.3s ease;
width: 40px;
height: 40px;
}
.sidebar-toggle:hover {
color: var(--primary);
transform: scale(1.15) rotate(90deg);
}
.sidebar-toggle.active {
color: var(--primary);
}
.sidebar-icon {
width: 20px;
height: 20px;
display: flex;
align-items: center;
justify-content: center;
font-size: 1rem;
}
.main-content {
display: flex;
flex-direction: column;
gap: 0;
}
.main-content > header {
margin-bottom: 18px;
}
.topbar {
display: flex;
align-items: center;
justify-content: space-between;
gap: 16px;
padding: 14px 18px;
border-radius: 20px;
background: rgba(255, 255, 255, 0.72);
backdrop-filter: blur(14px);
box-shadow: 0 10px 35px rgba(79, 70, 229, 0.08);
position: relative;
z-index: 20;
}
.sidebar-open {
display: none;
}
.page-shell.sidebar-hidden .sidebar-open {
display: flex;
}
.brand { display: flex; align-items: center; gap: 14px; text-decoration: none; color: inherit; }
.brand-mark {
width: 44px;
height: 44px;
border-radius: 14px;
display: grid;
place-items: center;
color: #fff;
font-weight: 800;
background: linear-gradient(135deg, var(--primary) 0%, var(--primary-2) 100%);
box-shadow: 0 12px 24px rgba(79, 70, 229, 0.28);
}
.brand-text h1 { font-size: 1.05rem; line-height: 1.1; color: var(--text); }
.brand-text p { margin-top: 2px; color: var(--muted); font-size: 0.9rem; }
.actions { display: flex; gap: 10px; flex-wrap: wrap; justify-content: flex-end; align-items: center; }
.btn {
border: 0;
border-radius: 999px;
padding: 11px 16px;
font-weight: 800;
cursor: pointer;
text-decoration: none;
display: inline-flex;
align-items: center;
justify-content: center;
transition: transform 0.15s ease, box-shadow 0.15s ease;
}
.btn:hover { transform: translateY(-1px); }
.btn.primary {
color: #fff;
background: linear-gradient(135deg, var(--primary) 0%, var(--primary-2) 100%);
box-shadow: 0 12px 22px rgba(79, 70, 229, 0.18);
}
.btn.ghost {
color: #475569;
background: rgba(226, 232, 240, 0.8);
border: 1px solid rgba(148, 163, 184, 0.25);
}
.btn.danger {
color: #fff;
background: linear-gradient(135deg, var(--orange) 0%, var(--primary-2) 100%);
box-shadow: 0 12px 22px rgba(217, 119, 6, 0.18);
}
.content {
border-radius: 28px;
background: rgba(255, 255, 255, 0.82);
backdrop-filter: blur(16px);
box-shadow: var(--shadow);
overflow: hidden;
}
.section-head {
display: flex;
align-items: center;
justify-content: space-between;
gap: 16px;
padding: 22px 26px;
background: linear-gradient(135deg, rgba(79, 70, 229, 0.1), rgba(124, 58, 237, 0.08));
border-bottom: 1px solid rgba(148, 163, 184, 0.2);
}
.section-head h2 { font-size: 1.35rem; color: var(--text); }
.section-head p { margin-top: 4px; color: var(--muted); font-size: 0.95rem; }
.filters {
padding: 18px 26px;
display: grid;
gap: 12px;
border-bottom: 1px solid rgba(148, 163, 184, 0.16);
}
.filters-row {
display: grid;
grid-template-columns: 1.4fr 220px 180px auto;
gap: 12px;
align-items: end;
}
.field label { display: block; font-size: 0.9rem; font-weight: 800; color: #475569; margin-bottom: 6px; }
.input, .select {
width: 100%;
padding: 11px 12px;
border-radius: 14px;
background: #fff;
border: 1px solid rgba(148, 163, 184, 0.22);
outline: none;
font-weight: 600;
color: var(--text);
}
.notice {
margin: 18px 26px 0;
padding: 14px 16px;
border-radius: 18px;
background: rgba(5, 150, 105, 0.08);
border: 1px solid rgba(5, 150, 105, 0.18);
color: #065f46;
font-weight: 700;
}
.table-wrap { padding: 18px 26px 26px; }
table {
width: 100%;
border-collapse: separate;
border-spacing: 0;
overflow: hidden;
border-radius: 18px;
border: 1px solid rgba(148, 163, 184, 0.18);
background: #fff;
}
thead th {
text-align: left;
padding: 12px 14px;
font-size: 0.9rem;
color: #475569;
background: #f8fafc;
border-bottom: 1px solid rgba(148, 163, 184, 0.18);
}
tbody td {
padding: 12px 14px;
border-bottom: 1px solid rgba(148, 163, 184, 0.12);
vertical-align: middle;
font-weight: 600;
color: var(--text);
}
tbody tr:last-child td { border-bottom: 0; }
.avatar {
width: 46px;
height: 46px;
border-radius: 50%;
background-size: cover;
background-position: center;
overflow: hidden;
display: grid;
place-items: center;
color: #fff;
font-weight: 900;
background: linear-gradient(135deg, var(--primary) 0%, var(--primary-2) 100%);
box-shadow: 0 10px 18px rgba(79, 70, 229, 0.18);
}
.avatar-placeholder {
display: grid;
place-items: center;
width: 100%;
height: 100%;
background: linear-gradient(135deg, var(--primary) 0%, var(--primary-2) 100%);
color: #fff;
font-weight: 900;
}
.meta { color: var(--muted); font-weight: 700; font-size: 0.92rem; }
.pill {
display: inline-flex;
padding: 7px 10px;
border-radius: 999px;
font-size: 0.85rem;
font-weight: 800;
color: #fff;
background: linear-gradient(135deg, var(--primary) 0%, var(--primary-2) 100%);
}
.pill.dosen { background: linear-gradient(135deg, #8b5cf6 0%, #6d28d9 100%); }
.pill.teknisi { background: linear-gradient(135deg, var(--green), #14b8a6); }
.pill.staff { background: linear-gradient(135deg, var(--orange), var(--orange)); }
.row-actions { display: inline-flex; gap: 8px; flex-wrap: wrap; }
.btn-sm {
border: 0;
border-radius: 999px;
padding: 9px 12px;
font-weight: 800;
cursor: pointer;
text-decoration: none;
display: inline-flex;
align-items: center;
justify-content: center;
transition: transform 0.15s ease, box-shadow 0.15s ease;
}
.btn-sm:hover { transform: translateY(-2px); }
.btn-sm.ghost {
color: #475569;
background: rgba(226, 232, 240, 0.8);
border: 1px solid rgba(148, 163, 184, 0.25);
}
.btn-sm.success {
color: #fff;
background: linear-gradient(135deg, #10b981 0%, #059669 100%);
box-shadow: 0 8px 16px rgba(16, 185, 129, 0.18);
}
.btn-sm.primary {
color: #fff;
background: linear-gradient(135deg, #3b82f6 0%, #1d4ed8 100%);
box-shadow: 0 8px 16px rgba(59, 130, 246, 0.18);
}
.btn-sm.danger {
color: #fff;
background: linear-gradient(135deg, #ef4444 0%, #dc2626 100%);
box-shadow: 0 8px 16px rgba(239, 68, 68, 0.18);
}
.pagination {
margin-top: 16px;
display: flex;
align-items: center;
justify-content: space-between;
gap: 12px;
flex-wrap: wrap;
color: var(--muted);
font-weight: 700;
}
.pager { display: inline-flex; gap: 8px; }
@media (max-width: 1000px) {
.page-shell { grid-template-columns: 1fr; }
.sidebar { position: static; }
.filters-row { grid-template-columns: 1fr; }
.actions { justify-content: stretch; }
.btn { width: 100%; }
}
</style>
</head>
<body>
<?php
$makeInitial = static function (?string $nama): string {
$nama = trim((string) $nama);
if ($nama === '') return 'NA';
$parts = preg_split('/\s+/', $nama) ?: [];
$initials = '';
foreach ($parts as $part) {
if ($part === '') continue;
$initials .= strtoupper(substr($part, 0, 1));
if (strlen($initials) >= 2) break;
}
return $initials !== '' ? $initials : 'NA';
};
$resolveFoto = static function (?string $foto): ?string {
$foto = trim((string) $foto);
if ($foto === '') return null;
if (preg_match('~^(https?://|data:|//)~i', $foto)) return $foto;
if (str_starts_with($foto, '/')) return $foto;
return asset($foto);
};
?>
<div class="page-shell sidebar-hidden">
<!-- Sidebar Navigation -->
<aside class="sidebar hidden">
<div class="sidebar-card">
<div class="sidebar-top">
<button class="sidebar-toggle" id="sidebarToggle" title="Toggle Sidebar"></button>
</div>
<ul class="sidebar-menu">
<li><a href="<?php echo e(route('users.index')); ?>"><span class="sidebar-icon">🏠</span> Home</a></li>
<li><a href="<?php echo e(route('users.dosen')); ?>" class="active"><span class="sidebar-icon">👨‍🏫</span> CRUD Dosen</a></li>
<li><a href="<?php echo e(route('users.staff')); ?>"><span class="sidebar-icon">🔧</span> CRUD Staff/Teknisi</a></li>
</ul>
</div>
</aside>
<!-- Main Content -->
<div class="main-content">
<header class="topbar">
<button class="sidebar-toggle sidebar-open" id="sidebarOpen" title="Buka Sidebar"></button>
<a class="brand" href="<?php echo e(url('/dashboard')); ?>">
<div class="brand-mark">JTI</div>
<div class="brand-text">
<h1>CRUD Dosen</h1>
<p>Kelola data dosen JTI</p>
</div>
</a>
<div class="actions">
<a class="btn-sm success" href="<?php echo e(route('dosen.create')); ?>">Tambah Dosen</a>
</div>
</header>
<main class="content">
<div class="section-head">
<div>
<h2>Daftar Dosen</h2>
<p>Kelola data dosen dengan fitur pencarian dan filter.</p>
</div>
<div class="meta">Total: <?php echo e($dosenCount); ?></div>
</div>
<form class="filters" method="GET" action="<?php echo e(route('users.dosen')); ?>">
<div class="filters-row">
<div class="field">
<label for="q">Cari</label>
<input id="q" class="input" type="text" name="q" value="<?php echo e($q); ?>" placeholder="Nama / NIP / NIDN">
</div>
<div class="field">
<label for="per_page">Per Halaman</label>
<select id="per_page" class="select" name="per_page">
<?php $__currentLoopData = ['10','25','50','100','all']; $__env->addLoop($__currentLoopData); foreach($__currentLoopData as $size): $__env->incrementLoopIndices(); $loop = $__env->getLastLoop(); ?>
<option value="<?php echo e($size); ?>" <?php if($perPage === $size): echo 'selected'; endif; ?>>
<?php echo e($size === 'all' ? 'Semua' : $size); ?>
</option>
<?php endforeach; $__env->popLoop(); $loop = $__env->getLastLoop(); ?>
</select>
</div>
<div class="field">
<button class="btn primary" type="submit">Terapkan</button>
</div>
</div>
<div class="actions">
<a class="btn ghost" href="<?php echo e(route('users.dosen')); ?>">Reset</a>
</div>
</form>
<?php if(session('success')): ?>
<div class="notice"><?php echo e(session('success')); ?></div>
<?php endif; ?>
<div class="table-wrap">
<table>
<thead>
<tr>
<th style="width: 70px;">Foto</th>
<th>Nama</th>
<th style="width: 180px;">NIP</th>
<th style="width: 140px;">NIDN</th>
<th style="width: 190px;">Aksi</th>
</tr>
</thead>
<tbody>
<?php $__empty_1 = true; $__currentLoopData = $dosen; $__env->addLoop($__currentLoopData); foreach($__currentLoopData as $item): $__env->incrementLoopIndices(); $loop = $__env->getLastLoop(); $__empty_1 = false; ?>
<tr>
<td>
<?php ($fotoUrl = $resolveFoto($item->foto)); ?>
<div class="avatar" <?php if($fotoUrl): ?> style="background-image: url('<?php echo e($fotoUrl); ?>')" <?php endif; ?>>
<?php if(!$fotoUrl): ?>
<div class="avatar-placeholder"><?php echo e($makeInitial($item->nama)); ?></div>
<?php endif; ?>
</div>
</td>
<td>
<div style="font-weight: 900;"><?php echo e($item->nama); ?></div>
<div class="meta">ID: <?php echo e($item->id); ?></div>
</td>
<td><?php echo e($item->nip ?? '-'); ?></td>
<td><?php echo e($item->nidn ?? '-'); ?></td>
<td>
<div class="row-actions">
<a class="btn-sm primary" href="<?php echo e(route('dosen.edit', $item)); ?>">Edit</a>
<form method="POST" action="<?php echo e(route('dosen.destroy', $item)); ?>" onsubmit="return confirm('Hapus dosen ini?')" style="display:inline;">
<?php echo csrf_field(); ?>
<?php echo method_field('DELETE'); ?>
<button class="btn-sm danger" type="submit">Hapus</button>
</form>
</div>
</td>
</tr>
<?php endforeach; $__env->popLoop(); $loop = $__env->getLastLoop(); if ($__empty_1): ?>
<tr>
<td colspan="5" class="meta">Belum ada data dosen.</td>
</tr>
<?php endif; ?>
</tbody>
</table>
<div class="pagination">
<div>
Menampilkan <?php echo e($dosen->firstItem() ?? 0); ?><?php echo e($dosen->lastItem() ?? 0); ?> dari <?php echo e($dosenCount); ?>
</div>
<div class="pager">
<?php if($dosen->onFirstPage()): ?>
<span class="btn-sm ghost" style="opacity:0.6; cursor:not-allowed;">Sebelumnya</span>
<?php else: ?>
<a class="btn-sm ghost" href="<?php echo e($dosen->previousPageUrl()); ?>">Sebelumnya</a>
<?php endif; ?>
<?php if($dosen->hasMorePages()): ?>
<a class="btn-sm ghost" href="<?php echo e($dosen->nextPageUrl()); ?>">Berikutnya</a>
<?php else: ?>
<span class="btn-sm ghost" style="opacity:0.6; cursor:not-allowed;">Berikutnya</span>
<?php endif; ?>
</div>
</div>
</div>
</main>
</div>
</div>
<script>
const sidebarToggle = document.getElementById('sidebarToggle');
const sidebarOpen = document.getElementById('sidebarOpen');
const sidebar = document.querySelector('.sidebar');
const pageShell = document.querySelector('.page-shell');
function toggleSidebar() {
sidebar.classList.toggle('hidden');
pageShell.classList.toggle('sidebar-hidden');
sidebarToggle.classList.toggle('active');
sidebarOpen.classList.toggle('active');
}
if (sidebarToggle) sidebarToggle.addEventListener('click', toggleSidebar);
if (sidebarOpen) sidebarOpen.addEventListener('click', toggleSidebar);
// Close sidebar when clicking on a menu link
const menuLinks = document.querySelectorAll('.sidebar-menu a');
menuLinks.forEach(link => {
link.addEventListener('click', () => {
if (!sidebar.classList.contains('hidden')) {
toggleSidebar();
}
});
});
</script>
</body>
</html>
<?php /**PATH F:\Sempro TA\project\Laravel\TA\resources\views\Dosen\dosen.blade.php ENDPATH**/ ?>

View File

@ -1,61 +0,0 @@
<div
class="relative text-neutral-400 dark:text-neutral-400"
x-data="{ spotlight: { x: 0, y: 0 } }"
@mousemove="const rect = $el.getBoundingClientRect(); spotlight = { x: $event.clientX - rect.left, y: $event.clientY - rect.top }">
<div
class="absolute w-full text-neutral-800 dark:text-neutral-100"
x-data="{ isDark: window.matchMedia('(prefers-color-scheme: dark)').matches || document.documentElement.classList.contains('dark') }"
:style="
'mask-image: radial-gradient(circle at ' +
spotlight.x +
'px ' +
spotlight.y +
'px, black 0%, transparent ' + (isDark ? '150px' : '120px') + '); -webkit-mask-image: radial-gradient(circle at ' +
spotlight.x +
'px ' +
spotlight.y +
'px, black 0%, transparent ' + (isDark ? '600px' : '400px') + ');'
">
<?php if (isset($component)) { $__componentOriginal2a45ee13943eadc15ee63d255f492356 = $component; } ?>
<?php if (isset($attributes)) { $__attributesOriginal2a45ee13943eadc15ee63d255f492356 = $attributes; } ?>
<?php $component = Illuminate\View\AnonymousComponent::resolve(['view' => 'laravel-exceptions-renderer::components.icons.laravel-ascii','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? $attributes->all() : [])); ?>
<?php $component->withName('laravel-exceptions-renderer::icons.laravel-ascii'); ?>
<?php if ($component->shouldRender()): ?>
<?php $__env->startComponent($component->resolveView(), $component->data()); ?>
<?php if (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag): ?>
<?php $attributes = $attributes->except(\Illuminate\View\AnonymousComponent::ignoredParameterNames()); ?>
<?php endif; ?>
<?php $component->withAttributes([]); ?>
<?php echo $__env->renderComponent(); ?>
<?php endif; ?>
<?php if (isset($__attributesOriginal2a45ee13943eadc15ee63d255f492356)): ?>
<?php $attributes = $__attributesOriginal2a45ee13943eadc15ee63d255f492356; ?>
<?php unset($__attributesOriginal2a45ee13943eadc15ee63d255f492356); ?>
<?php endif; ?>
<?php if (isset($__componentOriginal2a45ee13943eadc15ee63d255f492356)): ?>
<?php $component = $__componentOriginal2a45ee13943eadc15ee63d255f492356; ?>
<?php unset($__componentOriginal2a45ee13943eadc15ee63d255f492356); ?>
<?php endif; ?>
</div>
<?php if (isset($component)) { $__componentOriginal2a45ee13943eadc15ee63d255f492356 = $component; } ?>
<?php if (isset($attributes)) { $__attributesOriginal2a45ee13943eadc15ee63d255f492356 = $attributes; } ?>
<?php $component = Illuminate\View\AnonymousComponent::resolve(['view' => 'laravel-exceptions-renderer::components.icons.laravel-ascii','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? $attributes->all() : [])); ?>
<?php $component->withName('laravel-exceptions-renderer::icons.laravel-ascii'); ?>
<?php if ($component->shouldRender()): ?>
<?php $__env->startComponent($component->resolveView(), $component->data()); ?>
<?php if (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag): ?>
<?php $attributes = $attributes->except(\Illuminate\View\AnonymousComponent::ignoredParameterNames()); ?>
<?php endif; ?>
<?php $component->withAttributes([]); ?>
<?php echo $__env->renderComponent(); ?>
<?php endif; ?>
<?php if (isset($__attributesOriginal2a45ee13943eadc15ee63d255f492356)): ?>
<?php $attributes = $__attributesOriginal2a45ee13943eadc15ee63d255f492356; ?>
<?php unset($__attributesOriginal2a45ee13943eadc15ee63d255f492356); ?>
<?php endif; ?>
<?php if (isset($__componentOriginal2a45ee13943eadc15ee63d255f492356)): ?>
<?php $component = $__componentOriginal2a45ee13943eadc15ee63d255f492356; ?>
<?php unset($__componentOriginal2a45ee13943eadc15ee63d255f492356); ?>
<?php endif; ?>
</div>
<?php /**PATH F:\Sempro TA\project\Laravel\TA\vendor\laravel\framework\src\Illuminate\Foundation\resources\exceptions\renderer\components\laravel-ascii-spotlight.blade.php ENDPATH**/ ?>

View File

@ -1,65 +0,0 @@
<?php $attributes ??= new \Illuminate\View\ComponentAttributeBag;
$__newAttributes = [];
$__propNames = \Illuminate\View\ComponentAttributeBag::extractPropNames((['frame']));
foreach ($attributes->all() as $__key => $__value) {
if (in_array($__key, $__propNames)) {
$$__key = $$__key ?? $__value;
} else {
$__newAttributes[$__key] = $__value;
}
}
$attributes = new \Illuminate\View\ComponentAttributeBag($__newAttributes);
unset($__propNames);
unset($__newAttributes);
foreach (array_filter((['frame']), 'is_string', ARRAY_FILTER_USE_KEY) as $__key => $__value) {
$$__key = $$__key ?? $__value;
}
$__defined_vars = get_defined_vars();
foreach ($attributes->all() as $__key => $__value) {
if (array_key_exists($__key, $__defined_vars)) unset($$__key);
}
unset($__defined_vars, $__key, $__value); ?>
<?php
$class = $frame->class();
$operator = $frame->operator();
$callable = $frame->callable();
if ($class && $operator) {
$source = $class.$operator.$callable.'('.implode(', ', $frame->args()).')';
} elseif ($callable !== 'throw') {
$source = $callable.'('.implode(', ', $frame->args()).')';
} else {
$source = $frame->source();
}
?>
<?php if (isset($component)) { $__componentOriginal12cb286571f553eebcbe98210b217f94 = $component; } ?>
<?php if (isset($attributes)) { $__attributesOriginal12cb286571f553eebcbe98210b217f94 = $attributes; } ?>
<?php $component = Illuminate\View\AnonymousComponent::resolve(['view' => 'laravel-exceptions-renderer::components.syntax-highlight','data' => ['code' => $source,'language' => 'php','truncate' => true,'class' => 'text-xs min-w-0','dataTippyContent' => ''.e($source).'']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? $attributes->all() : [])); ?>
<?php $component->withName('laravel-exceptions-renderer::syntax-highlight'); ?>
<?php if ($component->shouldRender()): ?>
<?php $__env->startComponent($component->resolveView(), $component->data()); ?>
<?php if (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag): ?>
<?php $attributes = $attributes->except(\Illuminate\View\AnonymousComponent::ignoredParameterNames()); ?>
<?php endif; ?>
<?php $component->withAttributes(['code' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($source),'language' => 'php','truncate' => true,'class' => 'text-xs min-w-0','data-tippy-content' => ''.e($source).'']); ?>
<?php echo $__env->renderComponent(); ?>
<?php endif; ?>
<?php if (isset($__attributesOriginal12cb286571f553eebcbe98210b217f94)): ?>
<?php $attributes = $__attributesOriginal12cb286571f553eebcbe98210b217f94; ?>
<?php unset($__attributesOriginal12cb286571f553eebcbe98210b217f94); ?>
<?php endif; ?>
<?php if (isset($__componentOriginal12cb286571f553eebcbe98210b217f94)): ?>
<?php $component = $__componentOriginal12cb286571f553eebcbe98210b217f94; ?>
<?php unset($__componentOriginal12cb286571f553eebcbe98210b217f94); ?>
<?php endif; ?>
<?php /**PATH F:\Sempro TA\project\Laravel\TA\vendor\laravel\framework\src\Illuminate\Foundation\resources\exceptions\renderer\components\formatted-source.blade.php ENDPATH**/ ?>

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