From c3182c1d9b77f814e43a29b823d51c91afd26006 Mon Sep 17 00:00:00 2001 From: Rynn28 Date: Mon, 25 May 2026 00:50:52 +0700 Subject: [PATCH] Initial commit --- LOGIN_SYSTEM_DOCUMENTATION.md | 264 +++++++ SUPABASE_SETUP_GUIDE.md | 232 ++++++ app/Auth/DualUserProvider.php | 70 ++ .../Commands/HashExistingPasswords.php | 66 ++ app/Console/Commands/HashStaffPasswords.php | 42 ++ app/Console/Commands/ResetUserPassword.php | 55 ++ .../Commands/TestSupabaseConnection.php | 96 +++ app/Http/Controllers/AuthController.php | 137 ++++ app/Http/Controllers/Controller.php | 2 +- app/Http/Controllers/DebugController.php | 166 +++++ app/Http/Controllers/UserController.php | 21 +- app/Http/Controllers/WelcomeController.php | 104 ++- app/Models/Attendance.php | 130 ++-- app/Models/User.php | 90 --- app/Models/UserDosen.php | 44 +- app/Models/UserStaff.php | 44 +- app/Providers/AppServiceProvider.php | 6 +- check_staff_password.php | 30 + config/auth.php | 10 +- config/session.php | 4 +- ..._19_000000_add_remember_token_to_users.php | 46 ++ resources/views/Dosen/dosen.blade.php | 9 +- resources/views/auth/login.blade.php | 487 ++++++++++++ resources/views/dashboard.blade.php | 3 +- resources/views/staff/staff.blade.php | 9 +- resources/views/user/dosen.blade.php | 9 +- resources/views/user/index.blade.php | 9 +- resources/views/user/staff.blade.php | 9 +- resources/views/welcome.blade.php | 8 + routes/web.php | 66 +- .../010ba39dd904a2e2e061be8a5f775586.php | 5 - .../022fe70fb6131850f03b2fdb3446201d.php | 30 - .../03ea11c42735642aaf79429fbfce4107.php | 54 -- .../07278db8bf9c8f289af0f1c1a8421634.php | 78 -- .../07b08fe0e339dc1b7429eb7aaed91ba7.php | 57 -- .../098b2251a4f6e61892885a0bb1b423ad.php | 8 + .../099732f68438263e643ab6b698a35588.php | 47 -- .../09e6172f68ae167621ebb99d5c9176ab.php | 8 - .../0ea1e1ddb30f1c2c51df95f7f7f57c74.php | 48 -- .../1603d9f5f1364503b99e7f4d970d4f2c.php | 4 - .../19f4e5733d5d617c3107c1ec1f69fb6b.php | 114 --- .../1a2b9d4510716b38600924c5a20bca37.php | 694 ------------------ .../20528846544c2bb2ab7e25bb0afe173f.php | 91 --- .../2386bb7d11fdc0e1c8ad72a5327f086f.php | 5 - .../3539661b88f75d165ef6b2f5f1687b8f.php | 115 --- .../474726fc3dca98dbafd1b5d934bc6f03.php | 9 +- .../4814223a6e305bd662b45940242eabc0.php | 263 ------- .../49c203f5dab7c8af85cf75b558b48023.php | 11 - .../4ad96eb64995bb12f2208ff3191dcd9d.php | 6 - .../4bdc3f4eda416314fd0da2cd6b88f2c7.php | 167 ----- .../4c4d35a5fc86d01ec50b11494c0a79ca.php | 4 +- .../4cf9070f70510f580fd579c38c487fbc.php | 5 - .../4d4e76fbc8a0701f7a3acf24a76ea5c5.php | 673 ----------------- .../52680f1297c976cb07bbc25be42e1ec4.php | 626 ---------------- .../52c3cfb0daef045dff1aedbc3636d368.php | 51 -- .../53e7200c0f71297af5e9d0d970ea5a91.php | 5 - .../555fa3ef3ac8d731736b742cdee72f6e.php | 5 - .../57a95aa426ebc1439a211cfa60c318cf.php | 79 -- .../5ab5a638bf68300385f2a8ec048e254e.php | 157 ---- .../61f48979cf84332c499cb816e8cb37b0.php | 35 - .../635681b9a22db999f17cd7a3d0c15b67.php | 6 - .../63def277f0c2e86277d24860e4ef0cf4.php | 12 - .../66126db5a384cd0222b6b6ac92edc5af.php | 4 - .../675e01ce383c55c2faebefbcb4b93bb8.php | 83 --- .../6fc7a485a57c6222d80f208ed06c16fd.php | 180 ----- .../74bec295d7645a04575b567af055189e.php | 537 -------------- .../77a1c9ce910420dd0a2503f9a08a1423.php | 98 --- .../77c5237fa512c2c76e5e1323f050a748.php | 69 -- .../78f3d14aa4ab769f09a443f115990105.php | 77 -- .../7a729dfc4d444154d9b8cc8cb0b8178e.php | 517 +++++++++++++ .../7d2b87c6851a2c659090ebcb4ca2b4ca.php | 4 - .../7d5568fbba7949a84273fd309ba8eff8.php | 4 - .../7ea12a0844fe4989bd56aa0ca9659226.php | 6 - .../7ef76c0b4cc96927a9cc8b8a9057db62.php | 20 - .../8a2b960101143072fd2c808c7a6a5897.php | 28 - .../8bbe5c4e5decdce78e3652ec083ecd67.php | 9 +- .../8e66f3f31e4424c33ae8d8d10bc031c0.php | 5 - .../92b39079c123311dec844e1e250a2c6f.php | 4 - .../9381e27cfff54c20466139ae4a9bd643.php | 35 - ...p => 94567aa0a508984ee305f213abfe09fc.php} | 2 +- .../9710af2950af5ba39ec3979382fd1f44.php | 673 ----------------- .../99150232bd889014fd56c9365a03e0eb.php | 12 - .../9ac1918b3f0c565e848288e14b87ee0a.php | 35 - .../ad545c4092fd0a3f28af61a3d180cf41.php | 47 -- .../bbe15e3d9c14180aff3d6f21ed92085e.php | 9 +- .../be14fb2db872662f99253c3d22fe3c1e.php | 5 - .../bee5364e7682b13dfac87e5c645fe6ed.php | 101 --- .../bf7f2c080283c944518d6f1a1113a00b.php | 15 - .../bfe2ea291299e4a108a42b1621ced0ea.php | 37 - .../bfe2ff64bc6822a2b42816cf89464a9c.php | 28 - .../c3c048c6d9ea3da50af814a76691a48b.php | 31 - .../c4fecf7f98b0bb76f55eb4b769f07aae.php | 122 --- .../cbf6f2166a455a3188cecc4d632281ba.php | 5 - .../cd63379c39c0b75110a780264e7ec0ab.php | 374 ---------- .../d4f6b94df15749e3a3c080b79c07ff65.php | 647 ---------------- .../db98b01054818752cf751ac0be73f910.php | 638 ---------------- .../dc93fbab4f0b1f40255b1f189cc4cfd3.php | 5 - .../e0f3e91970077d2ae840e8665d7caad0.php | 623 ---------------- .../e5c4873196e2fdcaf2761090eaedded6.php | 61 -- .../e5f717c1924e248710181c94ce5989de.php | 65 -- .../ecde8252abf7ca1fd4fade7c42294155.php | 5 - .../f06c442637016d608b002ea80ba0e9a6.php | 170 ----- .../f0b1816e022095b1cff44339c6f72091.php | 79 -- .../f2b27ee92457aa248c4a9c79fc0913bf.php | 12 - .../f5489f5155113f2fcda5193210c95786.php | 5 - .../f80aa4df1a21d4b1b947bd41b6f43440.php | 80 -- .../fc502407f6de605231cf3bf14784261b.php | 418 ----------- .../ff1d26b604a2db193c2786e9f27a114d.php | 11 - ...38e955e02ded7174f94f.php => tmp_users.html | 322 +++++--- 109 files changed, 2771 insertions(+), 9286 deletions(-) create mode 100644 LOGIN_SYSTEM_DOCUMENTATION.md create mode 100644 SUPABASE_SETUP_GUIDE.md create mode 100644 app/Auth/DualUserProvider.php create mode 100644 app/Console/Commands/HashExistingPasswords.php create mode 100644 app/Console/Commands/HashStaffPasswords.php create mode 100644 app/Console/Commands/ResetUserPassword.php create mode 100644 app/Console/Commands/TestSupabaseConnection.php create mode 100644 app/Http/Controllers/AuthController.php create mode 100644 app/Http/Controllers/DebugController.php delete mode 100644 app/Models/User.php create mode 100644 check_staff_password.php create mode 100644 database/migrations/2026_05_19_000000_add_remember_token_to_users.php create mode 100644 resources/views/auth/login.blade.php delete mode 100644 storage/framework/views/010ba39dd904a2e2e061be8a5f775586.php delete mode 100644 storage/framework/views/022fe70fb6131850f03b2fdb3446201d.php delete mode 100644 storage/framework/views/03ea11c42735642aaf79429fbfce4107.php delete mode 100644 storage/framework/views/07278db8bf9c8f289af0f1c1a8421634.php delete mode 100644 storage/framework/views/07b08fe0e339dc1b7429eb7aaed91ba7.php delete mode 100644 storage/framework/views/099732f68438263e643ab6b698a35588.php delete mode 100644 storage/framework/views/09e6172f68ae167621ebb99d5c9176ab.php delete mode 100644 storage/framework/views/0ea1e1ddb30f1c2c51df95f7f7f57c74.php delete mode 100644 storage/framework/views/1603d9f5f1364503b99e7f4d970d4f2c.php delete mode 100644 storage/framework/views/19f4e5733d5d617c3107c1ec1f69fb6b.php delete mode 100644 storage/framework/views/1a2b9d4510716b38600924c5a20bca37.php delete mode 100644 storage/framework/views/20528846544c2bb2ab7e25bb0afe173f.php delete mode 100644 storage/framework/views/2386bb7d11fdc0e1c8ad72a5327f086f.php delete mode 100644 storage/framework/views/3539661b88f75d165ef6b2f5f1687b8f.php delete mode 100644 storage/framework/views/4814223a6e305bd662b45940242eabc0.php delete mode 100644 storage/framework/views/49c203f5dab7c8af85cf75b558b48023.php delete mode 100644 storage/framework/views/4ad96eb64995bb12f2208ff3191dcd9d.php delete mode 100644 storage/framework/views/4bdc3f4eda416314fd0da2cd6b88f2c7.php delete mode 100644 storage/framework/views/4cf9070f70510f580fd579c38c487fbc.php delete mode 100644 storage/framework/views/4d4e76fbc8a0701f7a3acf24a76ea5c5.php delete mode 100644 storage/framework/views/52680f1297c976cb07bbc25be42e1ec4.php delete mode 100644 storage/framework/views/52c3cfb0daef045dff1aedbc3636d368.php delete mode 100644 storage/framework/views/53e7200c0f71297af5e9d0d970ea5a91.php delete mode 100644 storage/framework/views/555fa3ef3ac8d731736b742cdee72f6e.php delete mode 100644 storage/framework/views/57a95aa426ebc1439a211cfa60c318cf.php delete mode 100644 storage/framework/views/5ab5a638bf68300385f2a8ec048e254e.php delete mode 100644 storage/framework/views/61f48979cf84332c499cb816e8cb37b0.php delete mode 100644 storage/framework/views/635681b9a22db999f17cd7a3d0c15b67.php delete mode 100644 storage/framework/views/63def277f0c2e86277d24860e4ef0cf4.php delete mode 100644 storage/framework/views/66126db5a384cd0222b6b6ac92edc5af.php delete mode 100644 storage/framework/views/675e01ce383c55c2faebefbcb4b93bb8.php delete mode 100644 storage/framework/views/6fc7a485a57c6222d80f208ed06c16fd.php delete mode 100644 storage/framework/views/74bec295d7645a04575b567af055189e.php delete mode 100644 storage/framework/views/77a1c9ce910420dd0a2503f9a08a1423.php delete mode 100644 storage/framework/views/77c5237fa512c2c76e5e1323f050a748.php delete mode 100644 storage/framework/views/78f3d14aa4ab769f09a443f115990105.php create mode 100644 storage/framework/views/7a729dfc4d444154d9b8cc8cb0b8178e.php delete mode 100644 storage/framework/views/7d2b87c6851a2c659090ebcb4ca2b4ca.php delete mode 100644 storage/framework/views/7d5568fbba7949a84273fd309ba8eff8.php delete mode 100644 storage/framework/views/7ea12a0844fe4989bd56aa0ca9659226.php delete mode 100644 storage/framework/views/7ef76c0b4cc96927a9cc8b8a9057db62.php delete mode 100644 storage/framework/views/8a2b960101143072fd2c808c7a6a5897.php delete mode 100644 storage/framework/views/8e66f3f31e4424c33ae8d8d10bc031c0.php delete mode 100644 storage/framework/views/92b39079c123311dec844e1e250a2c6f.php delete mode 100644 storage/framework/views/9381e27cfff54c20466139ae4a9bd643.php rename storage/framework/views/{2aeadaffef58af408e2ca5def85c2b45.php => 94567aa0a508984ee305f213abfe09fc.php} (99%) delete mode 100644 storage/framework/views/9710af2950af5ba39ec3979382fd1f44.php delete mode 100644 storage/framework/views/99150232bd889014fd56c9365a03e0eb.php delete mode 100644 storage/framework/views/9ac1918b3f0c565e848288e14b87ee0a.php delete mode 100644 storage/framework/views/ad545c4092fd0a3f28af61a3d180cf41.php delete mode 100644 storage/framework/views/be14fb2db872662f99253c3d22fe3c1e.php delete mode 100644 storage/framework/views/bee5364e7682b13dfac87e5c645fe6ed.php delete mode 100644 storage/framework/views/bf7f2c080283c944518d6f1a1113a00b.php delete mode 100644 storage/framework/views/bfe2ea291299e4a108a42b1621ced0ea.php delete mode 100644 storage/framework/views/bfe2ff64bc6822a2b42816cf89464a9c.php delete mode 100644 storage/framework/views/c3c048c6d9ea3da50af814a76691a48b.php delete mode 100644 storage/framework/views/c4fecf7f98b0bb76f55eb4b769f07aae.php delete mode 100644 storage/framework/views/cbf6f2166a455a3188cecc4d632281ba.php delete mode 100644 storage/framework/views/cd63379c39c0b75110a780264e7ec0ab.php delete mode 100644 storage/framework/views/d4f6b94df15749e3a3c080b79c07ff65.php delete mode 100644 storage/framework/views/db98b01054818752cf751ac0be73f910.php delete mode 100644 storage/framework/views/dc93fbab4f0b1f40255b1f189cc4cfd3.php delete mode 100644 storage/framework/views/e0f3e91970077d2ae840e8665d7caad0.php delete mode 100644 storage/framework/views/e5c4873196e2fdcaf2761090eaedded6.php delete mode 100644 storage/framework/views/e5f717c1924e248710181c94ce5989de.php delete mode 100644 storage/framework/views/ecde8252abf7ca1fd4fade7c42294155.php delete mode 100644 storage/framework/views/f06c442637016d608b002ea80ba0e9a6.php delete mode 100644 storage/framework/views/f0b1816e022095b1cff44339c6f72091.php delete mode 100644 storage/framework/views/f2b27ee92457aa248c4a9c79fc0913bf.php delete mode 100644 storage/framework/views/f5489f5155113f2fcda5193210c95786.php delete mode 100644 storage/framework/views/f80aa4df1a21d4b1b947bd41b6f43440.php delete mode 100644 storage/framework/views/fc502407f6de605231cf3bf14784261b.php delete mode 100644 storage/framework/views/ff1d26b604a2db193c2786e9f27a114d.php rename storage/framework/views/49f5171f42a138e955e02ded7174f94f.php => tmp_users.html (59%) diff --git a/LOGIN_SYSTEM_DOCUMENTATION.md b/LOGIN_SYSTEM_DOCUMENTATION.md new file mode 100644 index 0000000..3e10006 --- /dev/null +++ b/LOGIN_SYSTEM_DOCUMENTATION.md @@ -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 diff --git a/SUPABASE_SETUP_GUIDE.md b/SUPABASE_SETUP_GUIDE.md new file mode 100644 index 0000000..18fad22 --- /dev/null +++ b/SUPABASE_SETUP_GUIDE.md @@ -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! ๐Ÿš€ diff --git a/app/Auth/DualUserProvider.php b/app/Auth/DualUserProvider.php new file mode 100644 index 0000000..c83f134 --- /dev/null +++ b/app/Auth/DualUserProvider.php @@ -0,0 +1,70 @@ +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); + } +} diff --git a/app/Console/Commands/HashExistingPasswords.php b/app/Console/Commands/HashExistingPasswords.php new file mode 100644 index 0000000..9d0f93d --- /dev/null +++ b/app/Console/Commands/HashExistingPasswords.php @@ -0,0 +1,66 @@ +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'); + } +} diff --git a/app/Console/Commands/HashStaffPasswords.php b/app/Console/Commands/HashStaffPasswords.php new file mode 100644 index 0000000..eb6b01c --- /dev/null +++ b/app/Console/Commands/HashStaffPasswords.php @@ -0,0 +1,42 @@ +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"); + } +} diff --git a/app/Console/Commands/ResetUserPassword.php b/app/Console/Commands/ResetUserPassword.php new file mode 100644 index 0000000..d2871d6 --- /dev/null +++ b/app/Console/Commands/ResetUserPassword.php @@ -0,0 +1,55 @@ +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; + } +} diff --git a/app/Console/Commands/TestSupabaseConnection.php b/app/Console/Commands/TestSupabaseConnection.php new file mode 100644 index 0000000..5fb517b --- /dev/null +++ b/app/Console/Commands/TestSupabaseConnection.php @@ -0,0 +1,96 @@ +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; + } + } +} diff --git a/app/Http/Controllers/AuthController.php b/app/Http/Controllers/AuthController.php new file mode 100644 index 0000000..90aef98 --- /dev/null +++ b/app/Http/Controllers/AuthController.php @@ -0,0 +1,137 @@ +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'); + } +} diff --git a/app/Http/Controllers/Controller.php b/app/Http/Controllers/Controller.php index 75dde6a..8677cd5 100644 --- a/app/Http/Controllers/Controller.php +++ b/app/Http/Controllers/Controller.php @@ -4,5 +4,5 @@ abstract class Controller { - + // } diff --git a/app/Http/Controllers/DebugController.php b/app/Http/Controllers/DebugController.php new file mode 100644 index 0000000..fd467a3 --- /dev/null +++ b/app/Http/Controllers/DebugController.php @@ -0,0 +1,166 @@ + $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); + } + } +} diff --git a/app/Http/Controllers/UserController.php b/app/Http/Controllers/UserController.php index 7509519..e687ae4 100644 --- a/app/Http/Controllers/UserController.php +++ b/app/Http/Controllers/UserController.php @@ -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')), diff --git a/app/Http/Controllers/WelcomeController.php b/app/Http/Controllers/WelcomeController.php index ac68b3e..67c5c28 100644 --- a/app/Http/Controllers/WelcomeController.php +++ b/app/Http/Controllers/WelcomeController.php @@ -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, - ]); } /** diff --git a/app/Models/Attendance.php b/app/Models/Attendance.php index 6e5be8d..6a292e4 100644 --- a/app/Models/Attendance.php +++ b/app/Models/Attendance.php @@ -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'); } } diff --git a/app/Models/User.php b/app/Models/User.php deleted file mode 100644 index ff4f55a..0000000 --- a/app/Models/User.php +++ /dev/null @@ -1,90 +0,0 @@ -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; + } } \ No newline at end of file diff --git a/app/Models/UserStaff.php b/app/Models/UserStaff.php index def17b6..8232bba 100644 --- a/app/Models/UserStaff.php +++ b/app/Models/UserStaff.php @@ -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; + } } diff --git a/app/Providers/AppServiceProvider.php b/app/Providers/AppServiceProvider.php index 452e6b6..2cebdd6 100644 --- a/app/Providers/AppServiceProvider.php +++ b/app/Providers/AppServiceProvider.php @@ -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']); + }); } } diff --git a/check_staff_password.php b/check_staff_password.php new file mode 100644 index 0000000..1ee4f8f --- /dev/null +++ b/check_staff_password.php @@ -0,0 +1,30 @@ +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"; + } +} diff --git a/config/auth.php b/config/auth.php index d7568ff..f63542c 100644 --- a/config/auth.php +++ b/config/auth.php @@ -1,6 +1,7 @@ [ 'users' => [ - 'driver' => 'eloquent', - 'model' => env('AUTH_MODEL', User::class), + 'driver' => 'dual', + 'models' => [ + UserDosen::class, + UserStaff::class, + ], ], // 'users' => [ diff --git a/config/session.php b/config/session.php index f574482..b6b27b5 100644 --- a/config/session.php +++ b/config/session.php @@ -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'), /* |-------------------------------------------------------------------------- diff --git a/database/migrations/2026_05_19_000000_add_remember_token_to_users.php b/database/migrations/2026_05_19_000000_add_remember_token_to_users.php new file mode 100644 index 0000000..2e9a352 --- /dev/null +++ b/database/migrations/2026_05_19_000000_add_remember_token_to_users.php @@ -0,0 +1,46 @@ +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'); + }); + } + } +}; diff --git a/resources/views/Dosen/dosen.blade.php b/resources/views/Dosen/dosen.blade.php index e801a2f..dd47b04 100644 --- a/resources/views/Dosen/dosen.blade.php +++ b/resources/views/Dosen/dosen.blade.php @@ -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 { diff --git a/resources/views/auth/login.blade.php b/resources/views/auth/login.blade.php new file mode 100644 index 0000000..016c774 --- /dev/null +++ b/resources/views/auth/login.blade.php @@ -0,0 +1,487 @@ + + + + + + Login - JTI Management Portal + + + +
+ + @if ($errors->any()) +
+ + + +
+ @foreach ($errors->all() as $error) +

{{ $error }}

+ @endforeach +
+
+ @endif + + @if (session('success')) +
+ + + +

{{ session('success') }}

+
+ @endif + + + +
+ + + + diff --git a/resources/views/dashboard.blade.php b/resources/views/dashboard.blade.php index 315f145..87f37e9 100644 --- a/resources/views/dashboard.blade.php +++ b/resources/views/dashboard.blade.php @@ -689,5 +689,4 @@ function showRole(role) { } - - + \ No newline at end of file diff --git a/resources/views/staff/staff.blade.php b/resources/views/staff/staff.blade.php index bff3016..ef0618f 100644 --- a/resources/views/staff/staff.blade.php +++ b/resources/views/staff/staff.blade.php @@ -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 { diff --git a/resources/views/user/dosen.blade.php b/resources/views/user/dosen.blade.php index a244bc2..0ce22eb 100644 --- a/resources/views/user/dosen.blade.php +++ b/resources/views/user/dosen.blade.php @@ -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 { diff --git a/resources/views/user/index.blade.php b/resources/views/user/index.blade.php index 638cadf..98ecc8d 100644 --- a/resources/views/user/index.blade.php +++ b/resources/views/user/index.blade.php @@ -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 { diff --git a/resources/views/user/staff.blade.php b/resources/views/user/staff.blade.php index 7365cbe..c1999a8 100644 --- a/resources/views/user/staff.blade.php +++ b/resources/views/user/staff.blade.php @@ -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 { diff --git a/resources/views/welcome.blade.php b/resources/views/welcome.blade.php index d5ddf09..12f29ad 100644 --- a/resources/views/welcome.blade.php +++ b/resources/views/welcome.blade.php @@ -410,6 +410,14 @@ + + +
+ @csrf + +
diff --git a/routes/web.php b/routes/web.php index 5c6c683..a217386 100644 --- a/routes/web.php +++ b/routes/web.php @@ -1,47 +1,57 @@ 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']); diff --git a/storage/framework/views/010ba39dd904a2e2e061be8a5f775586.php b/storage/framework/views/010ba39dd904a2e2e061be8a5f775586.php deleted file mode 100644 index 2c3e74d..0000000 --- a/storage/framework/views/010ba39dd904a2e2e061be8a5f775586.php +++ /dev/null @@ -1,5 +0,0 @@ -startSection('title', __('Not Found')); ?> -startSection('code', '404'); ?> -startSection('message', __('Not Found')); ?> - -make('errors::minimal', array_diff_key(get_defined_vars(), ['__data' => 1, '__path' => 1]))->render(); ?> \ No newline at end of file diff --git a/storage/framework/views/022fe70fb6131850f03b2fdb3446201d.php b/storage/framework/views/022fe70fb6131850f03b2fdb3446201d.php deleted file mode 100644 index 94b3cae..0000000 --- a/storage/framework/views/022fe70fb6131850f03b2fdb3446201d.php +++ /dev/null @@ -1,30 +0,0 @@ -hasPages()): ?> - - - \ No newline at end of file diff --git a/storage/framework/views/03ea11c42735642aaf79429fbfce4107.php b/storage/framework/views/03ea11c42735642aaf79429fbfce4107.php deleted file mode 100644 index cf22b34..0000000 --- a/storage/framework/views/03ea11c42735642aaf79429fbfce4107.php +++ /dev/null @@ -1,54 +0,0 @@ - - - - - - - <?php echo $__env->yieldContent('title'); ?> - - - - - -
-
-
- yieldContent('message'); ?> -
-
-
- - - \ No newline at end of file diff --git a/storage/framework/views/07278db8bf9c8f289af0f1c1a8421634.php b/storage/framework/views/07278db8bf9c8f289af0f1c1a8421634.php deleted file mode 100644 index b205b28..0000000 --- a/storage/framework/views/07278db8bf9c8f289af0f1c1a8421634.php +++ /dev/null @@ -1,78 +0,0 @@ -# class()); ?> - title(); ?> - - -message(); ?> - - -PHP - -Laravel version()); ?> - -request()->httpHost()); ?> - - -## Stack Trace - -frames(); $__env->addLoop($__currentLoopData); foreach($__currentLoopData as $index => $frame): $__env->incrementLoopIndices(); $loop = $__env->getLastLoop(); ?> - - file()); ?>:line()); ?> - -popLoop(); $loop = $__env->getLastLoop(); ?> - -previousExceptions()->isNotEmpty()): ?> -## Previous previousExceptions()->count())); ?> - -previousExceptions(); $__env->addLoop($__currentLoopData); foreach($__currentLoopData as $index => $previous): $__env->incrementLoopIndices(); $loop = $__env->getLastLoop(); ?> - -### . class()); ?> - - -message(); ?> - - -frames(); $__env->addLoop($__currentLoopData); foreach($__currentLoopData as $index => $frame): $__env->incrementLoopIndices(); $loop = $__env->getLastLoop(); ?> - - file()); ?>:line()); ?> - -popLoop(); $loop = $__env->getLastLoop(); ?> -popLoop(); $loop = $__env->getLastLoop(); ?> - - -## Request - -request()->method()); ?> request()->path(), '/')); ?> - - -## Headers - -requestHeaders(); $__env->addLoop($__currentLoopData); foreach($__currentLoopData as $key => $value): $__env->incrementLoopIndices(); $loop = $__env->getLastLoop(); $__empty_1 = false; ?> -* ****: - -popLoop(); $loop = $__env->getLastLoop(); if ($__empty_1): ?> -No header data available. - - -## Route Context - -applicationRouteContext(); $__env->addLoop($__currentLoopData); foreach($__currentLoopData as $name => $value): $__env->incrementLoopIndices(); $loop = $__env->getLastLoop(); $__empty_1 = false; ?> -: - -popLoop(); $loop = $__env->getLastLoop(); if ($__empty_1): ?> -No routing data available. - - -## Route Parameters - -applicationRouteParametersContext()): ?> - - - -No route parameter data available. - - -## Database Queries - -applicationQueries(); $__env->addLoop($__currentLoopData); foreach($__currentLoopData as ['connectionName' => $connectionName, 'sql' => $sql, 'time' => $time]): $__env->incrementLoopIndices(); $loop = $__env->getLastLoop(); $__empty_1 = false; ?> -* - ( ms) -popLoop(); $loop = $__env->getLastLoop(); if ($__empty_1): ?> -No database queries detected. - - \ No newline at end of file diff --git a/storage/framework/views/07b08fe0e339dc1b7429eb7aaed91ba7.php b/storage/framework/views/07b08fe0e339dc1b7429eb7aaed91ba7.php deleted file mode 100644 index 9e09442..0000000 --- a/storage/framework/views/07b08fe0e339dc1b7429eb7aaed91ba7.php +++ /dev/null @@ -1,57 +0,0 @@ -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); ?> - -
- -> - - - '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() : [])); ?> -withName('laravel-exceptions-renderer::syntax-highlight'); ?> -shouldRender()): ?> -startComponent($component->resolveView(), $component->data()); ?> - -except(\Illuminate\View\AnonymousComponent::ignoredParameterNames()); ?> - -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']); ?> -renderComponent(); ?> - - - - - - - - - -
- \ No newline at end of file diff --git a/storage/framework/views/098b2251a4f6e61892885a0bb1b423ad.php b/storage/framework/views/098b2251a4f6e61892885a0bb1b423ad.php index 673d5a8..e794ebb 100644 --- a/storage/framework/views/098b2251a4f6e61892885a0bb1b423ad.php +++ b/storage/framework/views/098b2251a4f6e61892885a0bb1b423ad.php @@ -410,6 +410,14 @@ + + +
+ + +
diff --git a/storage/framework/views/099732f68438263e643ab6b698a35588.php b/storage/framework/views/099732f68438263e643ab6b698a35588.php deleted file mode 100644 index cecf3d6..0000000 --- a/storage/framework/views/099732f68438263e643ab6b698a35588.php +++ /dev/null @@ -1,47 +0,0 @@ -hasPages()): ?> - - - \ No newline at end of file diff --git a/storage/framework/views/09e6172f68ae167621ebb99d5c9176ab.php b/storage/framework/views/09e6172f68ae167621ebb99d5c9176ab.php deleted file mode 100644 index fb76322..0000000 --- a/storage/framework/views/09e6172f68ae167621ebb99d5c9176ab.php +++ /dev/null @@ -1,8 +0,0 @@ -
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%]"])); ?> - -> - - -
- \ No newline at end of file diff --git a/storage/framework/views/0ea1e1ddb30f1c2c51df95f7f7f57c74.php b/storage/framework/views/0ea1e1ddb30f1c2c51df95f7f7f57c74.php deleted file mode 100644 index 68fe986..0000000 --- a/storage/framework/views/0ea1e1ddb30f1c2c51df95f7f7f57c74.php +++ /dev/null @@ -1,48 +0,0 @@ -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); ?> - -
-

Headers

-
- addLoop($__currentLoopData); foreach($__currentLoopData as $key => $value): $__env->incrementLoopIndices(); $loop = $__env->getLastLoop(); ?> -
-
-
-
- - - - -
-
- popLoop(); $loop = $__env->getLastLoop(); ?> -
-
- \ No newline at end of file diff --git a/storage/framework/views/1603d9f5f1364503b99e7f4d970d4f2c.php b/storage/framework/views/1603d9f5f1364503b99e7f4d970d4f2c.php deleted file mode 100644 index 4202e55..0000000 --- a/storage/framework/views/1603d9f5f1364503b99e7f4d970d4f2c.php +++ /dev/null @@ -1,4 +0,0 @@ -> - - - \ No newline at end of file diff --git a/storage/framework/views/19f4e5733d5d617c3107c1ec1f69fb6b.php b/storage/framework/views/19f4e5733d5d617c3107c1ec1f69fb6b.php deleted file mode 100644 index 0dc8707..0000000 --- a/storage/framework/views/19f4e5733d5d617c3107c1ec1f69fb6b.php +++ /dev/null @@ -1,114 +0,0 @@ -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); ?> - -
-
-
- - - '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() : [])); ?> -withName('laravel-exceptions-renderer::icons.alert'); ?> -shouldRender()): ?> -startComponent($component->resolveView(), $component->data()); ?> - -except(\Illuminate\View\AnonymousComponent::ignoredParameterNames()); ?> - -withAttributes(['class' => 'w-2.5 h-2.5 text-blue-500 dark:text-emerald-500']); ?> -renderComponent(); ?> - - - - - - - - - -
-

Exception trace

- previousExceptions()->isNotEmpty()): ?> - - previousExceptions()->count()); ?> previous previousExceptions()->count())); ?> - - - -
- -
- frameGroups(); $__env->addLoop($__currentLoopData); foreach($__currentLoopData as $group): $__env->incrementLoopIndices(); $loop = $__env->getLastLoop(); ?> - - - - 'laravel-exceptions-renderer::components.vendor-frames','data' => ['frames' => $group['frames']]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? $attributes->all() : [])); ?> -withName('laravel-exceptions-renderer::vendor-frames'); ?> -shouldRender()): ?> -startComponent($component->resolveView(), $component->data()); ?> - -except(\Illuminate\View\AnonymousComponent::ignoredParameterNames()); ?> - -withAttributes(['frames' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($group['frames'])]); ?> -renderComponent(); ?> - - - - - - - - - - - addLoop($__currentLoopData); foreach($__currentLoopData as $frame): $__env->incrementLoopIndices(); $loop = $__env->getLastLoop(); ?> - - - 'laravel-exceptions-renderer::components.frame','data' => ['frame' => $frame]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? $attributes->all() : [])); ?> -withName('laravel-exceptions-renderer::frame'); ?> -shouldRender()): ?> -startComponent($component->resolveView(), $component->data()); ?> - -except(\Illuminate\View\AnonymousComponent::ignoredParameterNames()); ?> - -withAttributes(['frame' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($frame)]); ?> -renderComponent(); ?> - - - - - - - - - - popLoop(); $loop = $__env->getLastLoop(); ?> - - popLoop(); $loop = $__env->getLastLoop(); ?> -
-
- \ No newline at end of file diff --git a/storage/framework/views/1a2b9d4510716b38600924c5a20bca37.php b/storage/framework/views/1a2b9d4510716b38600924c5a20bca37.php deleted file mode 100644 index e6ad60c..0000000 --- a/storage/framework/views/1a2b9d4510716b38600924c5a20bca37.php +++ /dev/null @@ -1,694 +0,0 @@ - - - - - - JTI Monitoring - Politeknik Negeri Jember - - - -
-
- -
JTI
-
-

Politeknik Negeri Jember

-

Dashboard data dosen dan teknisi

-
-
- -
- - -
-
- -
-
-
Jurusan Teknologi Informasi
-

Dosen JTI

-
-
- -
-
-
-

Program Studi Dosen

- Daftar dosen aktif berdasarkan program studi. -
-
- - = 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); - }; - ?> - -
- sortBy([['prodi', 'asc'], ['nama', 'asc']]) - ->groupBy(function ($item) { - $prodi = trim((string) ($item->prodi ?? '')); - return $prodi !== '' ? $prodi : 'Prodi Belum Ditentukan'; - }); - ?> - - isEmpty()): ?> -
Belum ada data dosen di database.
- -
- addLoop($__currentLoopData); foreach($__currentLoopData as $prodiName => $prodiItems): $__env->incrementLoopIndices(); $loop = $__env->getLastLoop(); ?> -
-
-

- count()); ?> Dosen -
- -
- addLoop($__currentLoopData); foreach($__currentLoopData as $item): $__env->incrementLoopIndices(); $loop = $__env->getLastLoop(); ?> -
- foto); - ?> -
style="background-image: url('')" > - -
nama)); ?>
- -
-
-
nama); ?>
-
Dosen
-
-
NIP
nip ?? '-'); ?>
-
NIDN
nidn ?? '-'); ?>
-
Lokasi
Gedung JTI Lt. 1
-
-
-
- popLoop(); $loop = $__env->getLastLoop(); ?> -
-
- popLoop(); $loop = $__env->getLastLoop(); ?> -
- -
- -
- sortBy([['bagian', 'asc'], ['nama', 'asc']]) - ->groupBy(function ($item) { - $bagian = trim((string) ($item->bagian ?? '')); - return $bagian !== '' ? $bagian : 'Bagian Belum Ditentukan'; - }); - ?> - - isEmpty()): ?> -
Belum ada data teknisi/staff di database.
- -
- addLoop($__currentLoopData); foreach($__currentLoopData as $bagianName => $bagianItems): $__env->incrementLoopIndices(); $loop = $__env->getLastLoop(); ?> -
-
-

- count()); ?> Orang -
- -
- addLoop($__currentLoopData); foreach($__currentLoopData as $item): $__env->incrementLoopIndices(); $loop = $__env->getLastLoop(); ?> -
- foto); - ?> -
style="background-image: url('')" > - -
nama)); ?>
- -
-
-
nama); ?>
-
role ?? 'staff')); ?>
-
-
NIP
nip ?? '-'); ?>
-
NIDN
nidn ?? '-'); ?>
-
Lokasi
Gedung JTI Lt. 1
-
-
-
- popLoop(); $loop = $__env->getLastLoop(); ?> -
-
- popLoop(); $loop = $__env->getLastLoop(); ?> -
- -
- - -
-
- - - - - - \ No newline at end of file diff --git a/storage/framework/views/20528846544c2bb2ab7e25bb0afe173f.php b/storage/framework/views/20528846544c2bb2ab7e25bb0afe173f.php deleted file mode 100644 index e399584..0000000 --- a/storage/framework/views/20528846544c2bb2ab7e25bb0afe173f.php +++ /dev/null @@ -1,91 +0,0 @@ -hasPages()): ?> - - - \ No newline at end of file diff --git a/storage/framework/views/2386bb7d11fdc0e1c8ad72a5327f086f.php b/storage/framework/views/2386bb7d11fdc0e1c8ad72a5327f086f.php deleted file mode 100644 index 0c71b63..0000000 --- a/storage/framework/views/2386bb7d11fdc0e1c8ad72a5327f086f.php +++ /dev/null @@ -1,5 +0,0 @@ -startSection('title', __('Unauthorized')); ?> -startSection('code', '401'); ?> -startSection('message', __('Unauthorized')); ?> - -make('errors::minimal', array_diff_key(get_defined_vars(), ['__data' => 1, '__path' => 1]))->render(); ?> \ No newline at end of file diff --git a/storage/framework/views/3539661b88f75d165ef6b2f5f1687b8f.php b/storage/framework/views/3539661b88f75d165ef6b2f5f1687b8f.php deleted file mode 100644 index f2e08a6..0000000 --- a/storage/framework/views/3539661b88f75d165ef6b2f5f1687b8f.php +++ /dev/null @@ -1,115 +0,0 @@ -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); ?> - - - -
-
-
- - - - -
-
- - -
-
- - -
- \ No newline at end of file diff --git a/storage/framework/views/474726fc3dca98dbafd1b5d934bc6f03.php b/storage/framework/views/474726fc3dca98dbafd1b5d934bc6f03.php index c7e3d85..ae65056 100644 --- a/storage/framework/views/474726fc3dca98dbafd1b5d934bc6f03.php +++ b/storage/framework/views/474726fc3dca98dbafd1b5d934bc6f03.php @@ -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 { diff --git a/storage/framework/views/4814223a6e305bd662b45940242eabc0.php b/storage/framework/views/4814223a6e305bd662b45940242eabc0.php deleted file mode 100644 index 0554231..0000000 --- a/storage/framework/views/4814223a6e305bd662b45940242eabc0.php +++ /dev/null @@ -1,263 +0,0 @@ - - - - - - Edit Dosen - JTI - - - - = 2) break; - } - return $initials !== '' ? $initials : '๐Ÿ‘จโ€๐Ÿซ'; - }; - ?> -
-
-

โœ๏ธ Edit Dosen

- Kembali -
-
- any()): ?> -
- โŒ Validasi gagal: -
    - all(); $__env->addLoop($__currentLoopData); foreach($__currentLoopData as $error): $__env->incrementLoopIndices(); $loop = $__env->getLastLoop(); ?> -
  • - popLoop(); $loop = $__env->getLastLoop(); ?> -
-
- -
- - -
-
- nama)); ?> - -
- - - -
URL gambar untuk profil
-
-
-
-
- - - getBag($__errorArgs[1] ?? 'default'); -if ($__bag->has($__errorArgs[0])) : -if (isset($message)) { $__messageOriginal = $message; } -$message = $__bag->first($__errorArgs[0]); ?>
-
Nama lengkap dosen
-
-
-
-
- - - getBag($__errorArgs[1] ?? 'default'); -if ($__bag->has($__errorArgs[0])) : -if (isset($message)) { $__messageOriginal = $message; } -$message = $__bag->first($__errorArgs[0]); ?>
-
Nomor Induk Pegawai
-
-
- - - getBag($__errorArgs[1] ?? 'default'); -if ($__bag->has($__errorArgs[0])) : -if (isset($message)) { $__messageOriginal = $message; } -$message = $__bag->first($__errorArgs[0]); ?>
-
Nomor Induk Dosen Nasional
-
-
-
-
- - - getBag($__errorArgs[1] ?? 'default'); -if ($__bag->has($__errorArgs[0])) : -if (isset($message)) { $__messageOriginal = $message; } -$message = $__bag->first($__errorArgs[0]); ?>
-
Program studi dosen
-
-
- -
- - โŒ Batal -
-
-
-
-
- - - \ No newline at end of file diff --git a/storage/framework/views/49c203f5dab7c8af85cf75b558b48023.php b/storage/framework/views/49c203f5dab7c8af85cf75b558b48023.php deleted file mode 100644 index 3660324..0000000 --- a/storage/framework/views/49c203f5dab7c8af85cf75b558b48023.php +++ /dev/null @@ -1,11 +0,0 @@ -> - - - - - - - - - - \ No newline at end of file diff --git a/storage/framework/views/4ad96eb64995bb12f2208ff3191dcd9d.php b/storage/framework/views/4ad96eb64995bb12f2208ff3191dcd9d.php deleted file mode 100644 index 27218f3..0000000 --- a/storage/framework/views/4ad96eb64995bb12f2208ff3191dcd9d.php +++ /dev/null @@ -1,6 +0,0 @@ -> - - - - - \ No newline at end of file diff --git a/storage/framework/views/4bdc3f4eda416314fd0da2cd6b88f2c7.php b/storage/framework/views/4bdc3f4eda416314fd0da2cd6b88f2c7.php deleted file mode 100644 index 68b71db..0000000 --- a/storage/framework/views/4bdc3f4eda416314fd0da2cd6b88f2c7.php +++ /dev/null @@ -1,167 +0,0 @@ -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); ?> - -
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"])); ?> - -> -
- - - 'laravel-exceptions-renderer::components.badge','data' => ['type' => 'error','variant' => 'solid']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? $attributes->all() : [])); ?> -withName('laravel-exceptions-renderer::badge'); ?> -shouldRender()): ?> -startComponent($component->resolveView(), $component->data()); ?> - -except(\Illuminate\View\AnonymousComponent::ignoredParameterNames()); ?> - -withAttributes(['type' => 'error','variant' => 'solid']); ?> - - - 'laravel-exceptions-renderer::components.icons.alert','data' => ['class' => 'w-2.5 h-2.5']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? $attributes->all() : [])); ?> -withName('laravel-exceptions-renderer::icons.alert'); ?> -shouldRender()): ?> -startComponent($component->resolveView(), $component->data()); ?> - -except(\Illuminate\View\AnonymousComponent::ignoredParameterNames()); ?> - -withAttributes(['class' => 'w-2.5 h-2.5']); ?> -renderComponent(); ?> - - - - - - - - - - httpStatusCode()); ?> - - renderComponent(); ?> - - - - - - - - - - - - 'laravel-exceptions-renderer::components.http-method','data' => ['method' => ''.e($request->method()).'']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? $attributes->all() : [])); ?> -withName('laravel-exceptions-renderer::http-method'); ?> -shouldRender()): ?> -startComponent($component->resolveView(), $component->data()); ?> - -except(\Illuminate\View\AnonymousComponent::ignoredParameterNames()); ?> - -withAttributes(['method' => ''.e($request->method()).'']); ?> -renderComponent(); ?> - - - - - - - - - -
- - fullUrl()); ?> - - -
- -
-
- \ No newline at end of file diff --git a/storage/framework/views/4c4d35a5fc86d01ec50b11494c0a79ca.php b/storage/framework/views/4c4d35a5fc86d01ec50b11494c0a79ca.php index 8e68e18..98b874e 100644 --- a/storage/framework/views/4c4d35a5fc86d01ec50b11494c0a79ca.php +++ b/storage/framework/views/4c4d35a5fc86d01ec50b11494c0a79ca.php @@ -689,6 +689,4 @@ function showRole(role) { } - - - \ No newline at end of file + \ No newline at end of file diff --git a/storage/framework/views/4cf9070f70510f580fd579c38c487fbc.php b/storage/framework/views/4cf9070f70510f580fd579c38c487fbc.php deleted file mode 100644 index 0840272..0000000 --- a/storage/framework/views/4cf9070f70510f580fd579c38c487fbc.php +++ /dev/null @@ -1,5 +0,0 @@ -startSection('title', __('Not Found')); ?> -startSection('code', '404'); ?> -startSection('message', __('Not Found')); ?> - -make('errors::minimal', array_diff_key(get_defined_vars(), ['__data' => 1, '__path' => 1]))->render(); ?> \ No newline at end of file diff --git a/storage/framework/views/4d4e76fbc8a0701f7a3acf24a76ea5c5.php b/storage/framework/views/4d4e76fbc8a0701f7a3acf24a76ea5c5.php deleted file mode 100644 index 76b8393..0000000 --- a/storage/framework/views/4d4e76fbc8a0701f7a3acf24a76ea5c5.php +++ /dev/null @@ -1,673 +0,0 @@ - - - - - - Tambah Dosen Baru - Dashboard JTI - - - -
-
- -
JTI
-
-

Tambah Dosen

-

Data dosen baru

-
-
-
- Kembali -
-
- -
-
-

๐Ÿ‘จโ€๐Ÿซ Form Tambah Dosen Baru

-

Lengkapi informasi dosen dengan data yang akurat dan benar.

-
- - any()): ?> -
-
- โŒ Validasi gagal, periksa kembali data Anda: -
    - all(); $__env->addLoop($__currentLoopData); foreach($__currentLoopData as $error): $__env->incrementLoopIndices(); $loop = $__env->getLastLoop(); ?> -
  • - popLoop(); $loop = $__env->getLastLoop(); ?> -
-
-
- - -
- - - -
-
-
๐Ÿ‘จโ€๐Ÿซ
- -
- - - -
๐Ÿ“ Gunakan file atau URL gambar untuk foto profil
-
- - -
- -
-
- - - getBag($__errorArgs[1] ?? 'default'); -if ($__bag->has($__errorArgs[0])) : -if (isset($message)) { $__messageOriginal = $message; } -$message = $__bag->first($__errorArgs[0]); ?> -
- -
Masukkan nama lengkap dosen
-
-
- - -
-
- - - getBag($__errorArgs[1] ?? 'default'); -if ($__bag->has($__errorArgs[0])) : -if (isset($message)) { $__messageOriginal = $message; } -$message = $__bag->first($__errorArgs[0]); ?> -
- -
Nomor Induk Pegawai (opsional)
-
- -
- - - getBag($__errorArgs[1] ?? 'default'); -if ($__bag->has($__errorArgs[0])) : -if (isset($message)) { $__messageOriginal = $message; } -$message = $__bag->first($__errorArgs[0]); ?> -
- -
Nomor Induk Dosen Nasional (opsional)
-
-
- - -
-
- - - getBag($__errorArgs[1] ?? 'default'); -if ($__bag->has($__errorArgs[0])) : -if (isset($message)) { $__messageOriginal = $message; } -$message = $__bag->first($__errorArgs[0]); ?> -
- -
Pilih program studi untuk dosen
-
-
- - - - - -
- - โŒ Batal -
-
-
-
-
- - - - - - \ No newline at end of file diff --git a/storage/framework/views/52680f1297c976cb07bbc25be42e1ec4.php b/storage/framework/views/52680f1297c976cb07bbc25be42e1ec4.php deleted file mode 100644 index 9d622e9..0000000 --- a/storage/framework/views/52680f1297c976cb07bbc25be42e1ec4.php +++ /dev/null @@ -1,626 +0,0 @@ - - - - - - Tambah Staff/Teknisi - Dashboard JTI - - - -
-
-

๐Ÿ”ง Tambah Staff/Teknisi

-

Lengkapi data staff atau teknisi dengan informasi yang akurat.

-
- -
- any()): ?> -
- โŒ Terjadi kesalahan validasi: -
    - all(); $__env->addLoop($__currentLoopData); foreach($__currentLoopData as $error): $__env->incrementLoopIndices(); $loop = $__env->getLastLoop(); ?> -
  • - popLoop(); $loop = $__env->getLastLoop(); ?> -
-
- - -
- - - -
-
- ๐Ÿ”ง - -
- - -
Format: URL gambar (https://...)
-
- - -
- -
-
- - - getBag($__errorArgs[1] ?? 'default'); -if ($__bag->has($__errorArgs[0])) : -if (isset($message)) { $__messageOriginal = $message; } -$message = $__bag->first($__errorArgs[0]); ?> -
- -
-
- - -
-
- - - getBag($__errorArgs[1] ?? 'default'); -if ($__bag->has($__errorArgs[0])) : -if (isset($message)) { $__messageOriginal = $message; } -$message = $__bag->first($__errorArgs[0]); ?> -
- -
Nomor Induk Pegawai (opsional)
-
- -
- - - getBag($__errorArgs[1] ?? 'default'); -if ($__bag->has($__errorArgs[0])) : -if (isset($message)) { $__messageOriginal = $message; } -$message = $__bag->first($__errorArgs[0]); ?> -
- -
Identitas tambahan (opsional)
-
-
- - -
-
- - - getBag($__errorArgs[1] ?? 'default'); -if ($__bag->has($__errorArgs[0])) : -if (isset($message)) { $__messageOriginal = $message; } -$message = $__bag->first($__errorArgs[0]); ?> -
- -
Pilih bagian/divisi staff
-
-
- - -
- -
-
- required> - -
-
- required> - -
-
-
-
- - -
- - โŒ Batal -
-
-
-
- - - - - \ No newline at end of file diff --git a/storage/framework/views/52c3cfb0daef045dff1aedbc3636d368.php b/storage/framework/views/52c3cfb0daef045dff1aedbc3636d368.php deleted file mode 100644 index 8964ca0..0000000 --- a/storage/framework/views/52c3cfb0daef045dff1aedbc3636d368.php +++ /dev/null @@ -1,51 +0,0 @@ - '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); ?> - -file(); - $line = $frame->line(); -?> - -
merge(['class' => 'truncate font-mono text-xs text-neutral-500 dark:text-neutral-400'])); ?> - - dir="" -> - - - - : - - - : - - -
- \ No newline at end of file diff --git a/storage/framework/views/53e7200c0f71297af5e9d0d970ea5a91.php b/storage/framework/views/53e7200c0f71297af5e9d0d970ea5a91.php deleted file mode 100644 index 266ab21..0000000 --- a/storage/framework/views/53e7200c0f71297af5e9d0d970ea5a91.php +++ /dev/null @@ -1,5 +0,0 @@ -startSection('title', __('Payment Required')); ?> -startSection('code', '402'); ?> -startSection('message', __('Payment Required')); ?> - -make('errors::minimal', array_diff_key(get_defined_vars(), ['__data' => 1, '__path' => 1]))->render(); ?> \ No newline at end of file diff --git a/storage/framework/views/555fa3ef3ac8d731736b742cdee72f6e.php b/storage/framework/views/555fa3ef3ac8d731736b742cdee72f6e.php deleted file mode 100644 index c544f29..0000000 --- a/storage/framework/views/555fa3ef3ac8d731736b742cdee72f6e.php +++ /dev/null @@ -1,5 +0,0 @@ -startSection('title', __('Service Unavailable')); ?> -startSection('code', '503'); ?> -startSection('message', __('Service Unavailable')); ?> - -make('errors::minimal', array_diff_key(get_defined_vars(), ['__data' => 1, '__path' => 1]))->render(); ?> \ No newline at end of file diff --git a/storage/framework/views/57a95aa426ebc1439a211cfa60c318cf.php b/storage/framework/views/57a95aa426ebc1439a211cfa60c318cf.php deleted file mode 100644 index 4ec2a16..0000000 --- a/storage/framework/views/57a95aa426ebc1439a211cfa60c318cf.php +++ /dev/null @@ -1,79 +0,0 @@ -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); ?> - -
-

Body

- -
- - - 'laravel-exceptions-renderer::components.syntax-highlight','data' => ['code' => $body,'language' => 'json']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? $attributes->all() : [])); ?> -withName('laravel-exceptions-renderer::syntax-highlight'); ?> -shouldRender()): ?> -startComponent($component->resolveView(), $component->data()); ?> - -except(\Illuminate\View\AnonymousComponent::ignoredParameterNames()); ?> - -withAttributes(['code' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($body),'language' => 'json']); ?> -renderComponent(); ?> - - - - - - - - - -
- - - - 'laravel-exceptions-renderer::components.empty-state','data' => ['message' => 'No request body']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? $attributes->all() : [])); ?> -withName('laravel-exceptions-renderer::empty-state'); ?> -shouldRender()): ?> -startComponent($component->resolveView(), $component->data()); ?> - -except(\Illuminate\View\AnonymousComponent::ignoredParameterNames()); ?> - -withAttributes(['message' => 'No request body']); ?> -renderComponent(); ?> - - - - - - - - - - -
- \ No newline at end of file diff --git a/storage/framework/views/5ab5a638bf68300385f2a8ec048e254e.php b/storage/framework/views/5ab5a638bf68300385f2a8ec048e254e.php deleted file mode 100644 index d8293f2..0000000 --- a/storage/framework/views/5ab5a638bf68300385f2a8ec048e254e.php +++ /dev/null @@ -1,157 +0,0 @@ -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); ?> - -
-
-

class()); ?>

- - - '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() : [])); ?> -withName('laravel-exceptions-renderer::file-with-line'); ?> -shouldRender()): ?> -startComponent($component->resolveView(), $component->data()); ?> - -except(\Illuminate\View\AnonymousComponent::ignoredParameterNames()); ?> - -withAttributes(['frame' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($exception->frames()->first()),'class' => '-mt-3 text-xs']); ?> -renderComponent(); ?> - - - - - - - - - -

- message()); ?> - -

-
- -
-
-
- LARAVEL - version()); ?> -
-
- PHP - -
-
- - - 'laravel-exceptions-renderer::components.badge','data' => ['type' => 'error']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? $attributes->all() : [])); ?> -withName('laravel-exceptions-renderer::badge'); ?> -shouldRender()): ?> -startComponent($component->resolveView(), $component->data()); ?> - -except(\Illuminate\View\AnonymousComponent::ignoredParameterNames()); ?> - -withAttributes(['type' => 'error']); ?> - - - 'laravel-exceptions-renderer::components.icons.alert','data' => ['class' => 'w-2.5 h-2.5']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? $attributes->all() : [])); ?> -withName('laravel-exceptions-renderer::icons.alert'); ?> -shouldRender()): ?> -startComponent($component->resolveView(), $component->data()); ?> - -except(\Illuminate\View\AnonymousComponent::ignoredParameterNames()); ?> - -withAttributes(['class' => 'w-2.5 h-2.5']); ?> -renderComponent(); ?> - - - - - - - - - - UNHANDLED - renderComponent(); ?> - - - - - - - - - - - - 'laravel-exceptions-renderer::components.badge','data' => ['type' => 'error','variant' => 'solid']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? $attributes->all() : [])); ?> -withName('laravel-exceptions-renderer::badge'); ?> -shouldRender()): ?> -startComponent($component->resolveView(), $component->data()); ?> - -except(\Illuminate\View\AnonymousComponent::ignoredParameterNames()); ?> - -withAttributes(['type' => 'error','variant' => 'solid']); ?> - CODE code()); ?> - - renderComponent(); ?> - - - - - - - - - -
- - - - '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() : [])); ?> -withName('laravel-exceptions-renderer::request-url'); ?> -shouldRender()): ?> -startComponent($component->resolveView(), $component->data()); ?> - -except(\Illuminate\View\AnonymousComponent::ignoredParameterNames()); ?> - -withAttributes(['exception' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($exception),'request' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($exception->request()),'class' => 'relative z-50']); ?> -renderComponent(); ?> - - - - - - - - - -
- \ No newline at end of file diff --git a/storage/framework/views/61f48979cf84332c499cb816e8cb37b0.php b/storage/framework/views/61f48979cf84332c499cb816e8cb37b0.php deleted file mode 100644 index e442893..0000000 --- a/storage/framework/views/61f48979cf84332c499cb816e8cb37b0.php +++ /dev/null @@ -1,35 +0,0 @@ - - - - - - - <?php echo $__env->yieldContent('title'); ?> - - - - - - -
-
-
-

- yieldContent('code'); ?> -

- -
- yieldContent('message'); ?> -
-
-
-
- - - \ No newline at end of file diff --git a/storage/framework/views/635681b9a22db999f17cd7a3d0c15b67.php b/storage/framework/views/635681b9a22db999f17cd7a3d0c15b67.php deleted file mode 100644 index aea2c66..0000000 --- a/storage/framework/views/635681b9a22db999f17cd7a3d0c15b67.php +++ /dev/null @@ -1,6 +0,0 @@ -> - - - - - \ No newline at end of file diff --git a/storage/framework/views/63def277f0c2e86277d24860e4ef0cf4.php b/storage/framework/views/63def277f0c2e86277d24860e4ef0cf4.php deleted file mode 100644 index 983b92f..0000000 --- a/storage/framework/views/63def277f0c2e86277d24860e4ef0cf4.php +++ /dev/null @@ -1,12 +0,0 @@ -> - - - - - - - - - - - \ No newline at end of file diff --git a/storage/framework/views/66126db5a384cd0222b6b6ac92edc5af.php b/storage/framework/views/66126db5a384cd0222b6b6ac92edc5af.php deleted file mode 100644 index d977a74..0000000 --- a/storage/framework/views/66126db5a384cd0222b6b6ac92edc5af.php +++ /dev/null @@ -1,4 +0,0 @@ -> - - - \ No newline at end of file diff --git a/storage/framework/views/675e01ce383c55c2faebefbcb4b93bb8.php b/storage/framework/views/675e01ce383c55c2faebefbcb4b93bb8.php deleted file mode 100644 index e46bdb7..0000000 --- a/storage/framework/views/675e01ce383c55c2faebefbcb4b93bb8.php +++ /dev/null @@ -1,83 +0,0 @@ -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); ?> - - 'default', - 'POST' => 'success', - 'PUT', 'PATCH' => 'primary', - 'DELETE' => 'error', - default => 'default', -}; -?> - - - - 'laravel-exceptions-renderer::components.badge','data' => ['type' => ''.e($type).'']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? $attributes->all() : [])); ?> -withName('laravel-exceptions-renderer::badge'); ?> -shouldRender()): ?> -startComponent($component->resolveView(), $component->data()); ?> - -except(\Illuminate\View\AnonymousComponent::ignoredParameterNames()); ?> - -withAttributes(['type' => ''.e($type).'']); ?> - - - 'laravel-exceptions-renderer::components.icons.globe','data' => ['class' => 'w-2.5 h-2.5']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? $attributes->all() : [])); ?> -withName('laravel-exceptions-renderer::icons.globe'); ?> -shouldRender()): ?> -startComponent($component->resolveView(), $component->data()); ?> - -except(\Illuminate\View\AnonymousComponent::ignoredParameterNames()); ?> - -withAttributes(['class' => 'w-2.5 h-2.5']); ?> -renderComponent(); ?> - - - - - - - - - - - - renderComponent(); ?> - - - - - - - - - - \ No newline at end of file diff --git a/storage/framework/views/6fc7a485a57c6222d80f208ed06c16fd.php b/storage/framework/views/6fc7a485a57c6222d80f208ed06c16fd.php deleted file mode 100644 index ca927de..0000000 --- a/storage/framework/views/6fc7a485a57c6222d80f208ed06c16fd.php +++ /dev/null @@ -1,180 +0,0 @@ -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); ?> - -
-
- -
-
-
- -
- - - 'laravel-exceptions-renderer::components.formatted-source','data' => ['frame' => $frame]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? $attributes->all() : [])); ?> -withName('laravel-exceptions-renderer::formatted-source'); ?> -shouldRender()): ?> -startComponent($component->resolveView(), $component->data()); ?> - -except(\Illuminate\View\AnonymousComponent::ignoredParameterNames()); ?> - -withAttributes(['frame' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($frame)]); ?> -renderComponent(); ?> - - - - - - - - - - - - 'laravel-exceptions-renderer::components.file-with-line','data' => ['frame' => $frame,'direction' => 'rtl']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? $attributes->all() : [])); ?> -withName('laravel-exceptions-renderer::file-with-line'); ?> -shouldRender()): ?> -startComponent($component->resolveView(), $component->data()); ?> - -except(\Illuminate\View\AnonymousComponent::ignoredParameterNames()); ?> - -withAttributes(['frame' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($frame),'direction' => 'rtl']); ?> -renderComponent(); ?> - - - - - - - - - -
- -
- -
-
- - snippet()): ?> - - - '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() : [])); ?> -withName('laravel-exceptions-renderer::frame-code'); ?> -shouldRender()): ?> -startComponent($component->resolveView(), $component->data()); ?> - -except(\Illuminate\View\AnonymousComponent::ignoredParameterNames()); ?> - -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())]); ?> -renderComponent(); ?> - - - - - - - - - - -
- \ No newline at end of file diff --git a/storage/framework/views/74bec295d7645a04575b567af055189e.php b/storage/framework/views/74bec295d7645a04575b567af055189e.php deleted file mode 100644 index 5c346b5..0000000 --- a/storage/framework/views/74bec295d7645a04575b567af055189e.php +++ /dev/null @@ -1,537 +0,0 @@ - - - - - - Management Portal - Dosen & Staff/Teknisi - - - - 7.5, - 'Selasa' => 6.8, - 'Rabu' => 8.2, - 'Kamis' => 7.1, - 'Jumat' => 5.4, - ]; - $maksJam = max($durasiMingguan); - ?> - -
- - -
-
-
-

Selamat datang,

-

Semoga aktivitas akademik dan operasional hari ini berjalan lancar.

-
- -
- - -
- - -
-
-
- -
-
-

Grafik Durasi Kehadiran Dosen di Kampus

-

Rekap otomatis dari Senin sampai Jumat, reset pada awal minggu berikutnya.

- -
-
- Durasi mingguan (jam) - Reset Mingguan Otomatis -
- -
- addLoop($__currentLoopData); foreach($__currentLoopData as $hari => $jam): $__env->incrementLoopIndices(); $loop = $__env->getLastLoop(); ?> - 0 ? ($jam / $maksJam) * 100 : 0; - ?> -
-
- -
j
-
- popLoop(); $loop = $__env->getLastLoop(); ?> -
-
-
- - -
-
-
- - - - - \ No newline at end of file diff --git a/storage/framework/views/77a1c9ce910420dd0a2503f9a08a1423.php b/storage/framework/views/77a1c9ce910420dd0a2503f9a08a1423.php deleted file mode 100644 index 0424da8..0000000 --- a/storage/framework/views/77a1c9ce910420dd0a2503f9a08a1423.php +++ /dev/null @@ -1,98 +0,0 @@ - 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); ?> - -' : '
';
-
-    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 .= '';
-            $fallback .= '' . $lineNumber . '';
-            $fallback .= htmlspecialchars($line);
-            $fallback .= '';
-        }
-
-    } else {
-        $fallback .= htmlspecialchars($code);
-    }
-
-    $fallback .= '
'; -?> - -
- -> -
-
-
- \ No newline at end of file diff --git a/storage/framework/views/77c5237fa512c2c76e5e1323f050a748.php b/storage/framework/views/77c5237fa512c2c76e5e1323f050a748.php deleted file mode 100644 index 53b6e79..0000000 --- a/storage/framework/views/77c5237fa512c2c76e5e1323f050a748.php +++ /dev/null @@ -1,69 +0,0 @@ -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); ?> - -
-

Routing

-
- addLoop($__currentLoopData); foreach($__currentLoopData as $key => $value): $__env->incrementLoopIndices(); $loop = $__env->getLastLoop(); $__empty_1 = false; ?> -
-
-
-
- - - - -
-
- popLoop(); $loop = $__env->getLastLoop(); if ($__empty_1): ?> - - - 'laravel-exceptions-renderer::components.empty-state','data' => ['message' => 'No routing context']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? $attributes->all() : [])); ?> -withName('laravel-exceptions-renderer::empty-state'); ?> -shouldRender()): ?> -startComponent($component->resolveView(), $component->data()); ?> - -except(\Illuminate\View\AnonymousComponent::ignoredParameterNames()); ?> - -withAttributes(['message' => 'No routing context']); ?> -renderComponent(); ?> - - - - - - - - - - -
-
- \ No newline at end of file diff --git a/storage/framework/views/78f3d14aa4ab769f09a443f115990105.php b/storage/framework/views/78f3d14aa4ab769f09a443f115990105.php deleted file mode 100644 index f4fd10c..0000000 --- a/storage/framework/views/78f3d14aa4ab769f09a443f115990105.php +++ /dev/null @@ -1,77 +0,0 @@ - '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); ?> - - [ - '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]); - -?> - -
merge(['class' => $classes])); ?>> - - -
- \ No newline at end of file diff --git a/storage/framework/views/7a729dfc4d444154d9b8cc8cb0b8178e.php b/storage/framework/views/7a729dfc4d444154d9b8cc8cb0b8178e.php new file mode 100644 index 0000000..cc204e4 --- /dev/null +++ b/storage/framework/views/7a729dfc4d444154d9b8cc8cb0b8178e.php @@ -0,0 +1,517 @@ + + + + + + Login - JTI Management Portal + + + + + + + + + \ No newline at end of file diff --git a/storage/framework/views/7d2b87c6851a2c659090ebcb4ca2b4ca.php b/storage/framework/views/7d2b87c6851a2c659090ebcb4ca2b4ca.php deleted file mode 100644 index d1c18c4..0000000 --- a/storage/framework/views/7d2b87c6851a2c659090ebcb4ca2b4ca.php +++ /dev/null @@ -1,4 +0,0 @@ -> - - - \ No newline at end of file diff --git a/storage/framework/views/7d5568fbba7949a84273fd309ba8eff8.php b/storage/framework/views/7d5568fbba7949a84273fd309ba8eff8.php deleted file mode 100644 index 469ed9b..0000000 --- a/storage/framework/views/7d5568fbba7949a84273fd309ba8eff8.php +++ /dev/null @@ -1,4 +0,0 @@ -> - - - \ No newline at end of file diff --git a/storage/framework/views/7ea12a0844fe4989bd56aa0ca9659226.php b/storage/framework/views/7ea12a0844fe4989bd56aa0ca9659226.php deleted file mode 100644 index b079842..0000000 --- a/storage/framework/views/7ea12a0844fe4989bd56aa0ca9659226.php +++ /dev/null @@ -1,6 +0,0 @@ -> - - - - - \ No newline at end of file diff --git a/storage/framework/views/7ef76c0b4cc96927a9cc8b8a9057db62.php b/storage/framework/views/7ef76c0b4cc96927a9cc8b8a9057db62.php deleted file mode 100644 index 83996df..0000000 --- a/storage/framework/views/7ef76c0b4cc96927a9cc8b8a9057db62.php +++ /dev/null @@ -1,20 +0,0 @@ -hasPages()): ?> - - - \ No newline at end of file diff --git a/storage/framework/views/8a2b960101143072fd2c808c7a6a5897.php b/storage/framework/views/8a2b960101143072fd2c808c7a6a5897.php deleted file mode 100644 index 9fbca47..0000000 --- a/storage/framework/views/8a2b960101143072fd2c808c7a6a5897.php +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - - - <?php echo e(config('app.name', 'Laravel')); ?> - - - - - - - -
- - -
- - - - - - \ No newline at end of file diff --git a/storage/framework/views/8bbe5c4e5decdce78e3652ec083ecd67.php b/storage/framework/views/8bbe5c4e5decdce78e3652ec083ecd67.php index a75953b..351c8dd 100644 --- a/storage/framework/views/8bbe5c4e5decdce78e3652ec083ecd67.php +++ b/storage/framework/views/8bbe5c4e5decdce78e3652ec083ecd67.php @@ -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 { diff --git a/storage/framework/views/8e66f3f31e4424c33ae8d8d10bc031c0.php b/storage/framework/views/8e66f3f31e4424c33ae8d8d10bc031c0.php deleted file mode 100644 index b6a77fe..0000000 --- a/storage/framework/views/8e66f3f31e4424c33ae8d8d10bc031c0.php +++ /dev/null @@ -1,5 +0,0 @@ -> - - - - \ No newline at end of file diff --git a/storage/framework/views/92b39079c123311dec844e1e250a2c6f.php b/storage/framework/views/92b39079c123311dec844e1e250a2c6f.php deleted file mode 100644 index cc7492a..0000000 --- a/storage/framework/views/92b39079c123311dec844e1e250a2c6f.php +++ /dev/null @@ -1,4 +0,0 @@ -
merge(['class' => "h-0 w-full relative"])); ?>> -
-
- \ No newline at end of file diff --git a/storage/framework/views/9381e27cfff54c20466139ae4a9bd643.php b/storage/framework/views/9381e27cfff54c20466139ae4a9bd643.php deleted file mode 100644 index dc08f1f..0000000 --- a/storage/framework/views/9381e27cfff54c20466139ae4a9bd643.php +++ /dev/null @@ -1,35 +0,0 @@ -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); ?> - -
- // - -
- \ No newline at end of file diff --git a/storage/framework/views/2aeadaffef58af408e2ca5def85c2b45.php b/storage/framework/views/94567aa0a508984ee305f213abfe09fc.php similarity index 99% rename from storage/framework/views/2aeadaffef58af408e2ca5def85c2b45.php rename to storage/framework/views/94567aa0a508984ee305f213abfe09fc.php index 699b35d..6fa5121 100644 --- a/storage/framework/views/2aeadaffef58af408e2ca5def85c2b45.php +++ b/storage/framework/views/94567aa0a508984ee305f213abfe09fc.php @@ -212,4 +212,4 @@ class="flex h-6 w-6 flex-shrink-0 cursor-pointer items-center justify-center rou popLoop(); $loop = $__env->getLastLoop(); ?> - \ No newline at end of file + \ No newline at end of file diff --git a/storage/framework/views/9710af2950af5ba39ec3979382fd1f44.php b/storage/framework/views/9710af2950af5ba39ec3979382fd1f44.php deleted file mode 100644 index 52f622e..0000000 --- a/storage/framework/views/9710af2950af5ba39ec3979382fd1f44.php +++ /dev/null @@ -1,673 +0,0 @@ - - - - - - Tambah Dosen Baru - Dashboard JTI - - - -
-
- -
JTI
-
-

Tambah Dosen

-

Data dosen baru

-
-
-
- Kembali -
-
- -
-
-

๐Ÿ‘จโ€๐Ÿซ Form Tambah Dosen Baru

-

Lengkapi informasi dosen dengan data yang akurat dan benar.

-
- - any()): ?> -
-
- โŒ Validasi gagal, periksa kembali data Anda: -
    - all(); $__env->addLoop($__currentLoopData); foreach($__currentLoopData as $error): $__env->incrementLoopIndices(); $loop = $__env->getLastLoop(); ?> -
  • - popLoop(); $loop = $__env->getLastLoop(); ?> -
-
-
- - -
- - - -
-
-
๐Ÿ‘จโ€๐Ÿซ
- -
- - - -
๐Ÿ“ Gunakan file atau URL gambar untuk foto profil
-
- - -
- -
-
- - - getBag($__errorArgs[1] ?? 'default'); -if ($__bag->has($__errorArgs[0])) : -if (isset($message)) { $__messageOriginal = $message; } -$message = $__bag->first($__errorArgs[0]); ?> -
- -
Masukkan nama lengkap dosen
-
-
- - -
-
- - - getBag($__errorArgs[1] ?? 'default'); -if ($__bag->has($__errorArgs[0])) : -if (isset($message)) { $__messageOriginal = $message; } -$message = $__bag->first($__errorArgs[0]); ?> -
- -
Nomor Induk Pegawai (opsional)
-
- -
- - - getBag($__errorArgs[1] ?? 'default'); -if ($__bag->has($__errorArgs[0])) : -if (isset($message)) { $__messageOriginal = $message; } -$message = $__bag->first($__errorArgs[0]); ?> -
- -
Nomor Induk Dosen Nasional (opsional)
-
-
- - -
-
- - - getBag($__errorArgs[1] ?? 'default'); -if ($__bag->has($__errorArgs[0])) : -if (isset($message)) { $__messageOriginal = $message; } -$message = $__bag->first($__errorArgs[0]); ?> -
- -
Pilih program studi untuk dosen
-
-
- - - - - -
- - โŒ Batal -
-
-
-
-
- - - - - - \ No newline at end of file diff --git a/storage/framework/views/99150232bd889014fd56c9365a03e0eb.php b/storage/framework/views/99150232bd889014fd56c9365a03e0eb.php deleted file mode 100644 index 921ffcd..0000000 --- a/storage/framework/views/99150232bd889014fd56c9365a03e0eb.php +++ /dev/null @@ -1,12 +0,0 @@ -> - - - - - - - - - - - \ No newline at end of file diff --git a/storage/framework/views/9ac1918b3f0c565e848288e14b87ee0a.php b/storage/framework/views/9ac1918b3f0c565e848288e14b87ee0a.php deleted file mode 100644 index 0ccd501..0000000 --- a/storage/framework/views/9ac1918b3f0c565e848288e14b87ee0a.php +++ /dev/null @@ -1,35 +0,0 @@ - - - - - - - <?php echo $__env->yieldContent('title'); ?> - - - - - - -
-
-
-

- yieldContent('code'); ?> -

- -
- yieldContent('message'); ?> -
-
-
-
- - - \ No newline at end of file diff --git a/storage/framework/views/ad545c4092fd0a3f28af61a3d180cf41.php b/storage/framework/views/ad545c4092fd0a3f28af61a3d180cf41.php deleted file mode 100644 index 846b971..0000000 --- a/storage/framework/views/ad545c4092fd0a3f28af61a3d180cf41.php +++ /dev/null @@ -1,47 +0,0 @@ -hasPages()): ?> - - - \ No newline at end of file diff --git a/storage/framework/views/bbe15e3d9c14180aff3d6f21ed92085e.php b/storage/framework/views/bbe15e3d9c14180aff3d6f21ed92085e.php index 69158a7..762178b 100644 --- a/storage/framework/views/bbe15e3d9c14180aff3d6f21ed92085e.php +++ b/storage/framework/views/bbe15e3d9c14180aff3d6f21ed92085e.php @@ -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 { diff --git a/storage/framework/views/be14fb2db872662f99253c3d22fe3c1e.php b/storage/framework/views/be14fb2db872662f99253c3d22fe3c1e.php deleted file mode 100644 index a3dcc48..0000000 --- a/storage/framework/views/be14fb2db872662f99253c3d22fe3c1e.php +++ /dev/null @@ -1,5 +0,0 @@ -startSection('title', __('Forbidden')); ?> -startSection('code', '403'); ?> -startSection('message', __($exception->getMessage() ?: 'Forbidden')); ?> - -make('errors::minimal', array_diff_key(get_defined_vars(), ['__data' => 1, '__path' => 1]))->render(); ?> \ No newline at end of file diff --git a/storage/framework/views/bee5364e7682b13dfac87e5c645fe6ed.php b/storage/framework/views/bee5364e7682b13dfac87e5c645fe6ed.php deleted file mode 100644 index 85c71f6..0000000 --- a/storage/framework/views/bee5364e7682b13dfac87e5c645fe6ed.php +++ /dev/null @@ -1,101 +0,0 @@ - - - $__env->getContainer()->make(Illuminate\View\Factory::class)->make('mail::message'),'data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? $attributes->all() : [])); ?> -withName('mail::message'); ?> -shouldRender()): ?> -startComponent($component->resolveView(), $component->data()); ?> - -except(\Illuminate\View\AnonymousComponent::ignoredParameterNames()); ?> - -withAttributes([]); ?> - - -# - - - -# get('Whoops!'); ?> - -# get('Hello!'); ?> - - - - -addLoop($__currentLoopData); foreach($__currentLoopData as $line): $__env->incrementLoopIndices(); $loop = $__env->getLastLoop(); ?> - - - -popLoop(); $loop = $__env->getLastLoop(); ?> - - - - $level, - default => 'primary', - }; -?> - - - $__env->getContainer()->make(Illuminate\View\Factory::class)->make('mail::button'),'data' => ['url' => $actionUrl,'color' => $color]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? $attributes->all() : [])); ?> -withName('mail::button'); ?> -shouldRender()): ?> -startComponent($component->resolveView(), $component->data()); ?> - -except(\Illuminate\View\AnonymousComponent::ignoredParameterNames()); ?> - -withAttributes(['url' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($actionUrl),'color' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($color)]); ?> - - - renderComponent(); ?> - - - - - - - - - - - - -addLoop($__currentLoopData); foreach($__currentLoopData as $line): $__env->incrementLoopIndices(); $loop = $__env->getLastLoop(); ?> - - - -popLoop(); $loop = $__env->getLastLoop(); ?> - - - - - - -get('Regards,'); ?>
- - - - - - - slot('subcopy', null, []); ?> -get( - "If you're having trouble clicking the \":actionText\" button, copy and paste the URL below\n". - 'into your web browser:', - [ - 'actionText' => $actionText, - ] -); ?> []() - endSlot(); ?> - - renderComponent(); ?> - - - - - - - - - - \ No newline at end of file diff --git a/storage/framework/views/bf7f2c080283c944518d6f1a1113a00b.php b/storage/framework/views/bf7f2c080283c944518d6f1a1113a00b.php deleted file mode 100644 index 711d02a..0000000 --- a/storage/framework/views/bf7f2c080283c944518d6f1a1113a00b.php +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/storage/framework/views/bfe2ea291299e4a108a42b1621ced0ea.php b/storage/framework/views/bfe2ea291299e4a108a42b1621ced0ea.php deleted file mode 100644 index 5f3e855..0000000 --- a/storage/framework/views/bfe2ea291299e4a108a42b1621ced0ea.php +++ /dev/null @@ -1,37 +0,0 @@ -hasPages()): ?> - - - \ No newline at end of file diff --git a/storage/framework/views/bfe2ff64bc6822a2b42816cf89464a9c.php b/storage/framework/views/bfe2ff64bc6822a2b42816cf89464a9c.php deleted file mode 100644 index f256f03..0000000 --- a/storage/framework/views/bfe2ff64bc6822a2b42816cf89464a9c.php +++ /dev/null @@ -1,28 +0,0 @@ -hasPages()): ?> - - - \ No newline at end of file diff --git a/storage/framework/views/c3c048c6d9ea3da50af814a76691a48b.php b/storage/framework/views/c3c048c6d9ea3da50af814a76691a48b.php deleted file mode 100644 index dc1243a..0000000 --- a/storage/framework/views/c3c048c6d9ea3da50af814a76691a48b.php +++ /dev/null @@ -1,31 +0,0 @@ -hasPages()): ?> - - - \ No newline at end of file diff --git a/storage/framework/views/c4fecf7f98b0bb76f55eb4b769f07aae.php b/storage/framework/views/c4fecf7f98b0bb76f55eb4b769f07aae.php deleted file mode 100644 index 50e14c6..0000000 --- a/storage/framework/views/c4fecf7f98b0bb76f55eb4b769f07aae.php +++ /dev/null @@ -1,122 +0,0 @@ -hasPages()): ?> - - - \ No newline at end of file diff --git a/storage/framework/views/cbf6f2166a455a3188cecc4d632281ba.php b/storage/framework/views/cbf6f2166a455a3188cecc4d632281ba.php deleted file mode 100644 index c05f9da..0000000 --- a/storage/framework/views/cbf6f2166a455a3188cecc4d632281ba.php +++ /dev/null @@ -1,5 +0,0 @@ -startSection('title', __('Server Error')); ?> -startSection('code', '500'); ?> -startSection('message', __('Server Error')); ?> - -make('errors::minimal', array_diff_key(get_defined_vars(), ['__data' => 1, '__path' => 1]))->render(); ?> \ No newline at end of file diff --git a/storage/framework/views/cd63379c39c0b75110a780264e7ec0ab.php b/storage/framework/views/cd63379c39c0b75110a780264e7ec0ab.php deleted file mode 100644 index be51d9a..0000000 --- a/storage/framework/views/cd63379c39c0b75110a780264e7ec0ab.php +++ /dev/null @@ -1,374 +0,0 @@ -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); ?> - -
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: , - 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; - } - }" -> -
-
-
- - - '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() : [])); ?> -withName('laravel-exceptions-renderer::icons.database'); ?> -shouldRender()): ?> -startComponent($component->resolveView(), $component->data()); ?> - -except(\Illuminate\View\AnonymousComponent::ignoredParameterNames()); ?> - -withAttributes(['class' => 'w-2.5 h-2.5 text-blue-500 dark:text-emerald-500']); ?> -renderComponent(); ?> - - - - - - - - - -
-

Queries

-
-
- - 100): ?> - - - '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() : [])); ?> -withName('laravel-exceptions-renderer::icons.info'); ?> -shouldRender()): ?> -startComponent($component->resolveView(), $component->data()); ?> - -except(\Illuminate\View\AnonymousComponent::ignoredParameterNames()); ?> - -withAttributes(['class' => 'w-3 h-3 text-blue-500 dark:text-emerald-500','data-tippy-content' => 'Only the first 100 queries are shown']); ?> -renderComponent(); ?> - - - - - - - - - - -
-
- -
- addLoop($__currentLoopData); foreach($__currentLoopData as $index => ['connectionName' => $connectionName, 'sql' => $sql, 'time' => $time]): $__env->incrementLoopIndices(); $loop = $__env->getLastLoop(); $__empty_1 = false; ?> -
-
-
- - - '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() : [])); ?> -withName('laravel-exceptions-renderer::icons.database'); ?> -shouldRender()): ?> -startComponent($component->resolveView(), $component->data()); ?> - -except(\Illuminate\View\AnonymousComponent::ignoredParameterNames()); ?> - -withAttributes(['class' => 'w-3 h-3 text-neutral-500 dark:text-neutral-400']); ?> -renderComponent(); ?> - - - - - - - - - - -
- - - '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() : [])); ?> -withName('laravel-exceptions-renderer::syntax-highlight'); ?> -shouldRender()): ?> -startComponent($component->resolveView(), $component->data()); ?> - -except(\Illuminate\View\AnonymousComponent::ignoredParameterNames()); ?> - -withAttributes(['code' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($sql),'language' => 'sql','truncate' => true,'class' => 'min-w-0','data-tippy-content' => ''.e(nl2br($sql)).'']); ?> -renderComponent(); ?> - - - - - - - - - -
-
ms
-
- popLoop(); $loop = $__env->getLastLoop(); if ($__empty_1): ?> - - - 'laravel-exceptions-renderer::components.empty-state','data' => ['message' => 'No queries executed']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? $attributes->all() : [])); ?> -withName('laravel-exceptions-renderer::empty-state'); ?> -shouldRender()): ?> -startComponent($component->resolveView(), $component->data()); ?> - -except(\Illuminate\View\AnonymousComponent::ignoredParameterNames()); ?> - -withAttributes(['message' => 'No queries executed']); ?> -renderComponent(); ?> - - - - - - - - - - -
- - -
- - - - - - - - - - - - - - -
-
- \ No newline at end of file diff --git a/storage/framework/views/d4f6b94df15749e3a3c080b79c07ff65.php b/storage/framework/views/d4f6b94df15749e3a3c080b79c07ff65.php deleted file mode 100644 index 1ea87c7..0000000 --- a/storage/framework/views/d4f6b94df15749e3a3c080b79c07ff65.php +++ /dev/null @@ -1,647 +0,0 @@ - - - - - - Edit Staff/Teknisi - Dashboard JTI - - - - = 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); - }; - ?> - -
-
-

โœ๏ธ Edit Staff/Teknisi

-

Perbarui informasi staff/teknisi (ID: id); ?>)

-
- -
- any()): ?> -
- โŒ Terjadi kesalahan validasi: -
    - all(); $__env->addLoop($__currentLoopData); foreach($__currentLoopData as $error): $__env->incrementLoopIndices(); $loop = $__env->getLastLoop(); ?> -
  • - popLoop(); $loop = $__env->getLastLoop(); ?> -
-
- - -
- - - - -
-
- nama)); ?> - -
- - -
Format: URL gambar (https://...)
-
- - -
- -
-
- - - getBag($__errorArgs[1] ?? 'default'); -if ($__bag->has($__errorArgs[0])) : -if (isset($message)) { $__messageOriginal = $message; } -$message = $__bag->first($__errorArgs[0]); ?> -
- -
-
- - -
-
- - - getBag($__errorArgs[1] ?? 'default'); -if ($__bag->has($__errorArgs[0])) : -if (isset($message)) { $__messageOriginal = $message; } -$message = $__bag->first($__errorArgs[0]); ?> -
- -
Nomor Induk Pegawai (opsional)
-
- -
- - - getBag($__errorArgs[1] ?? 'default'); -if ($__bag->has($__errorArgs[0])) : -if (isset($message)) { $__messageOriginal = $message; } -$message = $__bag->first($__errorArgs[0]); ?> -
- -
Identitas tambahan (opsional)
-
-
- - -
-
- - - getBag($__errorArgs[1] ?? 'default'); -if ($__bag->has($__errorArgs[0])) : -if (isset($message)) { $__messageOriginal = $message; } -$message = $__bag->first($__errorArgs[0]); ?> -
- -
Pilih bagian/divisi staff
-
-
- - -
- -
-
- role) === 'staff'): echo 'checked'; endif; ?> required> - -
-
- role) === 'teknisi'): echo 'checked'; endif; ?> required> - -
-
-
-
- - -
- - โŒ Batal -
-
-
-
- - - - - \ No newline at end of file diff --git a/storage/framework/views/db98b01054818752cf751ac0be73f910.php b/storage/framework/views/db98b01054818752cf751ac0be73f910.php deleted file mode 100644 index 9028f94..0000000 --- a/storage/framework/views/db98b01054818752cf751ac0be73f910.php +++ /dev/null @@ -1,638 +0,0 @@ - - - - - - CRUD Staff/Teknisi - Dashboard JTI - - - - = 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); - }; - ?> - - - - - - - \ No newline at end of file diff --git a/storage/framework/views/dc93fbab4f0b1f40255b1f189cc4cfd3.php b/storage/framework/views/dc93fbab4f0b1f40255b1f189cc4cfd3.php deleted file mode 100644 index 49d92a1..0000000 --- a/storage/framework/views/dc93fbab4f0b1f40255b1f189cc4cfd3.php +++ /dev/null @@ -1,5 +0,0 @@ -> - - - - \ No newline at end of file diff --git a/storage/framework/views/e0f3e91970077d2ae840e8665d7caad0.php b/storage/framework/views/e0f3e91970077d2ae840e8665d7caad0.php deleted file mode 100644 index 50e31b7..0000000 --- a/storage/framework/views/e0f3e91970077d2ae840e8665d7caad0.php +++ /dev/null @@ -1,623 +0,0 @@ - - - - - - CRUD Dosen - Dashboard JTI - - - - = 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); - }; - ?> - - - - - - - \ No newline at end of file diff --git a/storage/framework/views/e5c4873196e2fdcaf2761090eaedded6.php b/storage/framework/views/e5c4873196e2fdcaf2761090eaedded6.php deleted file mode 100644 index 46c59c9..0000000 --- a/storage/framework/views/e5c4873196e2fdcaf2761090eaedded6.php +++ /dev/null @@ -1,61 +0,0 @@ -
-
- - - 'laravel-exceptions-renderer::components.icons.laravel-ascii','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? $attributes->all() : [])); ?> -withName('laravel-exceptions-renderer::icons.laravel-ascii'); ?> -shouldRender()): ?> -startComponent($component->resolveView(), $component->data()); ?> - -except(\Illuminate\View\AnonymousComponent::ignoredParameterNames()); ?> - -withAttributes([]); ?> -renderComponent(); ?> - - - - - - - - - -
- - - 'laravel-exceptions-renderer::components.icons.laravel-ascii','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? $attributes->all() : [])); ?> -withName('laravel-exceptions-renderer::icons.laravel-ascii'); ?> -shouldRender()): ?> -startComponent($component->resolveView(), $component->data()); ?> - -except(\Illuminate\View\AnonymousComponent::ignoredParameterNames()); ?> - -withAttributes([]); ?> -renderComponent(); ?> - - - - - - - - - -
- \ No newline at end of file diff --git a/storage/framework/views/e5f717c1924e248710181c94ce5989de.php b/storage/framework/views/e5f717c1924e248710181c94ce5989de.php deleted file mode 100644 index 24612c2..0000000 --- a/storage/framework/views/e5f717c1924e248710181c94ce5989de.php +++ /dev/null @@ -1,65 +0,0 @@ -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); ?> - -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(); - } -?> - - - - '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() : [])); ?> -withName('laravel-exceptions-renderer::syntax-highlight'); ?> -shouldRender()): ?> -startComponent($component->resolveView(), $component->data()); ?> - -except(\Illuminate\View\AnonymousComponent::ignoredParameterNames()); ?> - -withAttributes(['code' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($source),'language' => 'php','truncate' => true,'class' => 'text-xs min-w-0','data-tippy-content' => ''.e($source).'']); ?> -renderComponent(); ?> - - - - - - - - - - \ No newline at end of file diff --git a/storage/framework/views/ecde8252abf7ca1fd4fade7c42294155.php b/storage/framework/views/ecde8252abf7ca1fd4fade7c42294155.php deleted file mode 100644 index 8bb89f6..0000000 --- a/storage/framework/views/ecde8252abf7ca1fd4fade7c42294155.php +++ /dev/null @@ -1,5 +0,0 @@ -startSection('title', __('Page Expired')); ?> -startSection('code', '419'); ?> -startSection('message', __('Page Expired')); ?> - -make('errors::minimal', array_diff_key(get_defined_vars(), ['__data' => 1, '__path' => 1]))->render(); ?> \ No newline at end of file diff --git a/storage/framework/views/f06c442637016d608b002ea80ba0e9a6.php b/storage/framework/views/f06c442637016d608b002ea80ba0e9a6.php deleted file mode 100644 index db91be2..0000000 --- a/storage/framework/views/f06c442637016d608b002ea80ba0e9a6.php +++ /dev/null @@ -1,170 +0,0 @@ -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((['frames']), '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); ?> - - - -
-
- - - 'laravel-exceptions-renderer::components.icons.folder','data' => ['class' => 'w-3 h-3 text-neutral-400','xShow' => '!expanded','xCloak' => true]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? $attributes->all() : [])); ?> -withName('laravel-exceptions-renderer::icons.folder'); ?> -shouldRender()): ?> -startComponent($component->resolveView(), $component->data()); ?> - -except(\Illuminate\View\AnonymousComponent::ignoredParameterNames()); ?> - -withAttributes(['class' => 'w-3 h-3 text-neutral-400','x-show' => '!expanded','x-cloak' => true]); ?> -renderComponent(); ?> - - - - - - - - - - - - 'laravel-exceptions-renderer::components.icons.folder-open','data' => ['class' => 'w-3 h-3 text-blue-500 dark:text-emerald-500','xShow' => 'expanded']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? $attributes->all() : [])); ?> -withName('laravel-exceptions-renderer::icons.folder-open'); ?> -shouldRender()): ?> -startComponent($component->resolveView(), $component->data()); ?> - -except(\Illuminate\View\AnonymousComponent::ignoredParameterNames()); ?> - -withAttributes(['class' => 'w-3 h-3 text-blue-500 dark:text-emerald-500','x-show' => 'expanded']); ?> -renderComponent(); ?> - - - - - - - - - - -
- vendor - -
- - -
- -
- addLoop($__currentLoopData); foreach($__currentLoopData as $frame): $__env->incrementLoopIndices(); $loop = $__env->getLastLoop(); ?> -
- - - 'laravel-exceptions-renderer::components.vendor-frame','data' => ['frame' => $frame]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? $attributes->all() : [])); ?> -withName('laravel-exceptions-renderer::vendor-frame'); ?> -shouldRender()): ?> -startComponent($component->resolveView(), $component->data()); ?> - -except(\Illuminate\View\AnonymousComponent::ignoredParameterNames()); ?> - -withAttributes(['frame' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($frame)]); ?> -renderComponent(); ?> - - - - - - - - - -
- popLoop(); $loop = $__env->getLastLoop(); ?> -
-
- \ No newline at end of file diff --git a/storage/framework/views/f0b1816e022095b1cff44339c6f72091.php b/storage/framework/views/f0b1816e022095b1cff44339c6f72091.php deleted file mode 100644 index 84643e6..0000000 --- a/storage/framework/views/f0b1816e022095b1cff44339c6f72091.php +++ /dev/null @@ -1,79 +0,0 @@ -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((['routeParameters']), '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); ?> - -
-

Routing parameters

- -
- - - 'laravel-exceptions-renderer::components.syntax-highlight','data' => ['code' => $routeParameters,'language' => 'json']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? $attributes->all() : [])); ?> -withName('laravel-exceptions-renderer::syntax-highlight'); ?> -shouldRender()): ?> -startComponent($component->resolveView(), $component->data()); ?> - -except(\Illuminate\View\AnonymousComponent::ignoredParameterNames()); ?> - -withAttributes(['code' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($routeParameters),'language' => 'json']); ?> -renderComponent(); ?> - - - - - - - - - -
- - - - 'laravel-exceptions-renderer::components.empty-state','data' => ['message' => 'No routing parameters']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? $attributes->all() : [])); ?> -withName('laravel-exceptions-renderer::empty-state'); ?> -shouldRender()): ?> -startComponent($component->resolveView(), $component->data()); ?> - -except(\Illuminate\View\AnonymousComponent::ignoredParameterNames()); ?> - -withAttributes(['message' => 'No routing parameters']); ?> -renderComponent(); ?> - - - - - - - - - - -
- \ No newline at end of file diff --git a/storage/framework/views/f2b27ee92457aa248c4a9c79fc0913bf.php b/storage/framework/views/f2b27ee92457aa248c4a9c79fc0913bf.php deleted file mode 100644 index 2d8b234..0000000 --- a/storage/framework/views/f2b27ee92457aa248c4a9c79fc0913bf.php +++ /dev/null @@ -1,12 +0,0 @@ -> - - - - - - - - - - - \ No newline at end of file diff --git a/storage/framework/views/f5489f5155113f2fcda5193210c95786.php b/storage/framework/views/f5489f5155113f2fcda5193210c95786.php deleted file mode 100644 index 2bddd65..0000000 --- a/storage/framework/views/f5489f5155113f2fcda5193210c95786.php +++ /dev/null @@ -1,5 +0,0 @@ -startSection('title', __('Too Many Requests')); ?> -startSection('code', '429'); ?> -startSection('message', __('Too Many Requests')); ?> - -make('errors::minimal', array_diff_key(get_defined_vars(), ['__data' => 1, '__path' => 1]))->render(); ?> \ No newline at end of file diff --git a/storage/framework/views/f80aa4df1a21d4b1b947bd41b6f43440.php b/storage/framework/views/f80aa4df1a21d4b1b947bd41b6f43440.php deleted file mode 100644 index 73f907f..0000000 --- a/storage/framework/views/f80aa4df1a21d4b1b947bd41b6f43440.php +++ /dev/null @@ -1,80 +0,0 @@ -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); ?> - -
- previous()): ?> -
- - - 'laravel-exceptions-renderer::components.formatted-source','data' => ['frame' => $frame,'className' => 'text-xs']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? $attributes->all() : [])); ?> -withName('laravel-exceptions-renderer::formatted-source'); ?> -shouldRender()): ?> -startComponent($component->resolveView(), $component->data()); ?> - -except(\Illuminate\View\AnonymousComponent::ignoredParameterNames()); ?> - -withAttributes(['frame' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($frame),'className' => 'text-xs']); ?> -renderComponent(); ?> - - - - - - - - - -
- - Entrypoint - - - - - 'laravel-exceptions-renderer::components.file-with-line','data' => ['frame' => $frame,'class' => 'text-xs']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? $attributes->all() : [])); ?> -withName('laravel-exceptions-renderer::file-with-line'); ?> -shouldRender()): ?> -startComponent($component->resolveView(), $component->data()); ?> - -except(\Illuminate\View\AnonymousComponent::ignoredParameterNames()); ?> - -withAttributes(['frame' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($frame),'class' => 'text-xs']); ?> -renderComponent(); ?> - - - - - - - - - -
- \ No newline at end of file diff --git a/storage/framework/views/fc502407f6de605231cf3bf14784261b.php b/storage/framework/views/fc502407f6de605231cf3bf14784261b.php deleted file mode 100644 index 28d02ab..0000000 --- a/storage/framework/views/fc502407f6de605231cf3bf14784261b.php +++ /dev/null @@ -1,418 +0,0 @@ - - - 'laravel-exceptions-renderer::components.layout','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? $attributes->all() : [])); ?> -withName('laravel-exceptions-renderer::layout'); ?> -shouldRender()): ?> -startComponent($component->resolveView(), $component->data()); ?> - -except(\Illuminate\View\AnonymousComponent::ignoredParameterNames()); ?> - -withAttributes([]); ?> - - - 'laravel-exceptions-renderer::components.section-container','data' => ['class' => 'px-6 py-0 sm:py-0']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? $attributes->all() : [])); ?> -withName('laravel-exceptions-renderer::section-container'); ?> -shouldRender()): ?> -startComponent($component->resolveView(), $component->data()); ?> - -except(\Illuminate\View\AnonymousComponent::ignoredParameterNames()); ?> - -withAttributes(['class' => 'px-6 py-0 sm:py-0']); ?> - - - 'laravel-exceptions-renderer::components.topbar','data' => ['title' => $exception->title(),'markdown' => $exceptionAsMarkdown]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? $attributes->all() : [])); ?> -withName('laravel-exceptions-renderer::topbar'); ?> -shouldRender()): ?> -startComponent($component->resolveView(), $component->data()); ?> - -except(\Illuminate\View\AnonymousComponent::ignoredParameterNames()); ?> - -withAttributes(['title' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($exception->title()),'markdown' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($exceptionAsMarkdown)]); ?> -renderComponent(); ?> - - - - - - - - - - renderComponent(); ?> - - - - - - - - - - - - - 'laravel-exceptions-renderer::components.separator','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? $attributes->all() : [])); ?> -withName('laravel-exceptions-renderer::separator'); ?> -shouldRender()): ?> -startComponent($component->resolveView(), $component->data()); ?> - -except(\Illuminate\View\AnonymousComponent::ignoredParameterNames()); ?> - -withAttributes([]); ?> -renderComponent(); ?> - - - - - - - - - - - - - 'laravel-exceptions-renderer::components.section-container','data' => ['class' => 'flex flex-col gap-8 py-0 sm:py-0']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? $attributes->all() : [])); ?> -withName('laravel-exceptions-renderer::section-container'); ?> -shouldRender()): ?> -startComponent($component->resolveView(), $component->data()); ?> - -except(\Illuminate\View\AnonymousComponent::ignoredParameterNames()); ?> - -withAttributes(['class' => 'flex flex-col gap-8 py-0 sm:py-0']); ?> - - - 'laravel-exceptions-renderer::components.header','data' => ['exception' => $exception]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? $attributes->all() : [])); ?> -withName('laravel-exceptions-renderer::header'); ?> -shouldRender()): ?> -startComponent($component->resolveView(), $component->data()); ?> - -except(\Illuminate\View\AnonymousComponent::ignoredParameterNames()); ?> - -withAttributes(['exception' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($exception)]); ?> -renderComponent(); ?> - - - - - - - - - - renderComponent(); ?> - - - - - - - - - - - - - 'laravel-exceptions-renderer::components.separator','data' => ['class' => '-mt-5 -z-10']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? $attributes->all() : [])); ?> -withName('laravel-exceptions-renderer::separator'); ?> -shouldRender()): ?> -startComponent($component->resolveView(), $component->data()); ?> - -except(\Illuminate\View\AnonymousComponent::ignoredParameterNames()); ?> - -withAttributes(['class' => '-mt-5 -z-10']); ?> -renderComponent(); ?> - - - - - - - - - - - - - 'laravel-exceptions-renderer::components.section-container','data' => ['class' => 'flex flex-col gap-8 pt-14']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? $attributes->all() : [])); ?> -withName('laravel-exceptions-renderer::section-container'); ?> -shouldRender()): ?> -startComponent($component->resolveView(), $component->data()); ?> - -except(\Illuminate\View\AnonymousComponent::ignoredParameterNames()); ?> - -withAttributes(['class' => 'flex flex-col gap-8 pt-14']); ?> - - - 'laravel-exceptions-renderer::components.trace','data' => ['exception' => $exception]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? $attributes->all() : [])); ?> -withName('laravel-exceptions-renderer::trace'); ?> -shouldRender()): ?> -startComponent($component->resolveView(), $component->data()); ?> - -except(\Illuminate\View\AnonymousComponent::ignoredParameterNames()); ?> - -withAttributes(['exception' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($exception)]); ?> -renderComponent(); ?> - - - - - - - - - - - previousExceptions()->isNotEmpty()): ?> - - - 'laravel-exceptions-renderer::components.previous-exceptions','data' => ['exception' => $exception]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? $attributes->all() : [])); ?> -withName('laravel-exceptions-renderer::previous-exceptions'); ?> -shouldRender()): ?> -startComponent($component->resolveView(), $component->data()); ?> - -except(\Illuminate\View\AnonymousComponent::ignoredParameterNames()); ?> - -withAttributes(['exception' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($exception)]); ?> -renderComponent(); ?> - - - - - - - - - - - - - - 'laravel-exceptions-renderer::components.query','data' => ['queries' => $exception->applicationQueries()]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? $attributes->all() : [])); ?> -withName('laravel-exceptions-renderer::query'); ?> -shouldRender()): ?> -startComponent($component->resolveView(), $component->data()); ?> - -except(\Illuminate\View\AnonymousComponent::ignoredParameterNames()); ?> - -withAttributes(['queries' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($exception->applicationQueries())]); ?> -renderComponent(); ?> - - - - - - - - - - renderComponent(); ?> - - - - - - - - - - - - - 'laravel-exceptions-renderer::components.separator','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? $attributes->all() : [])); ?> -withName('laravel-exceptions-renderer::separator'); ?> -shouldRender()): ?> -startComponent($component->resolveView(), $component->data()); ?> - -except(\Illuminate\View\AnonymousComponent::ignoredParameterNames()); ?> - -withAttributes([]); ?> -renderComponent(); ?> - - - - - - - - - - - - - 'laravel-exceptions-renderer::components.section-container','data' => ['class' => 'flex flex-col gap-12']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? $attributes->all() : [])); ?> -withName('laravel-exceptions-renderer::section-container'); ?> -shouldRender()): ?> -startComponent($component->resolveView(), $component->data()); ?> - -except(\Illuminate\View\AnonymousComponent::ignoredParameterNames()); ?> - -withAttributes(['class' => 'flex flex-col gap-12']); ?> - - - 'laravel-exceptions-renderer::components.request-header','data' => ['headers' => $exception->requestHeaders()]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? $attributes->all() : [])); ?> -withName('laravel-exceptions-renderer::request-header'); ?> -shouldRender()): ?> -startComponent($component->resolveView(), $component->data()); ?> - -except(\Illuminate\View\AnonymousComponent::ignoredParameterNames()); ?> - -withAttributes(['headers' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($exception->requestHeaders())]); ?> -renderComponent(); ?> - - - - - - - - - - - - - 'laravel-exceptions-renderer::components.request-body','data' => ['body' => $exception->requestBody()]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? $attributes->all() : [])); ?> -withName('laravel-exceptions-renderer::request-body'); ?> -shouldRender()): ?> -startComponent($component->resolveView(), $component->data()); ?> - -except(\Illuminate\View\AnonymousComponent::ignoredParameterNames()); ?> - -withAttributes(['body' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($exception->requestBody())]); ?> -renderComponent(); ?> - - - - - - - - - - - - - 'laravel-exceptions-renderer::components.routing','data' => ['routing' => $exception->applicationRouteContext()]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? $attributes->all() : [])); ?> -withName('laravel-exceptions-renderer::routing'); ?> -shouldRender()): ?> -startComponent($component->resolveView(), $component->data()); ?> - -except(\Illuminate\View\AnonymousComponent::ignoredParameterNames()); ?> - -withAttributes(['routing' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($exception->applicationRouteContext())]); ?> -renderComponent(); ?> - - - - - - - - - - - - - 'laravel-exceptions-renderer::components.routing-parameter','data' => ['routeParameters' => $exception->applicationRouteParametersContext()]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? $attributes->all() : [])); ?> -withName('laravel-exceptions-renderer::routing-parameter'); ?> -shouldRender()): ?> -startComponent($component->resolveView(), $component->data()); ?> - -except(\Illuminate\View\AnonymousComponent::ignoredParameterNames()); ?> - -withAttributes(['routeParameters' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($exception->applicationRouteParametersContext())]); ?> -renderComponent(); ?> - - - - - - - - - - renderComponent(); ?> - - - - - - - - - - - - - 'laravel-exceptions-renderer::components.separator','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? $attributes->all() : [])); ?> -withName('laravel-exceptions-renderer::separator'); ?> -shouldRender()): ?> -startComponent($component->resolveView(), $component->data()); ?> - -except(\Illuminate\View\AnonymousComponent::ignoredParameterNames()); ?> - -withAttributes([]); ?> -renderComponent(); ?> - - - - - - - - - - - runningUnitTests() && ! app()->runningInConsole()): ?> - - - 'laravel-exceptions-renderer::components.section-container','data' => ['class' => 'pb-0 sm:pb-0']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? $attributes->all() : [])); ?> -withName('laravel-exceptions-renderer::section-container'); ?> -shouldRender()): ?> -startComponent($component->resolveView(), $component->data()); ?> - -except(\Illuminate\View\AnonymousComponent::ignoredParameterNames()); ?> - -withAttributes(['class' => 'pb-0 sm:pb-0']); ?> - - - 'laravel-exceptions-renderer::components.laravel-ascii-spotlight','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? $attributes->all() : [])); ?> -withName('laravel-exceptions-renderer::laravel-ascii-spotlight'); ?> -shouldRender()): ?> -startComponent($component->resolveView(), $component->data()); ?> - -except(\Illuminate\View\AnonymousComponent::ignoredParameterNames()); ?> - -withAttributes([]); ?> -renderComponent(); ?> - - - - - - - - - - renderComponent(); ?> - - - - - - - - - - - renderComponent(); ?> - - - - - - - - - - \ No newline at end of file diff --git a/storage/framework/views/ff1d26b604a2db193c2786e9f27a114d.php b/storage/framework/views/ff1d26b604a2db193c2786e9f27a114d.php deleted file mode 100644 index 4d41986..0000000 --- a/storage/framework/views/ff1d26b604a2db193c2786e9f27a114d.php +++ /dev/null @@ -1,11 +0,0 @@ -> - - - - - - - - - - \ No newline at end of file diff --git a/storage/framework/views/49f5171f42a138e955e02ded7174f94f.php b/tmp_users.html similarity index 59% rename from storage/framework/views/49f5171f42a138e955e02ded7174f94f.php rename to tmp_users.html index 30ac11a..1d9b9d9 100644 --- a/storage/framework/views/49f5171f42a138e955e02ded7174f94f.php +++ b/tmp_users.html @@ -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,7 +44,7 @@ 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); @@ -621,40 +621,18 @@ - = 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); - }; - ?> - +