login firebase from firestore

dev
ajikamaludin 2 years ago
parent fd3faee1e1
commit 0397720ad4
Signed by: ajikamaludin
GPG Key ID: 476C9A2B4B794EBB

1
.gitignore vendored

@ -14,3 +14,4 @@ npm-debug.log
yarn-error.log
/.idea
/.vscode
/resources/js/firebase.js

@ -1,64 +1 @@
<p align="center"><a href="https://laravel.com" target="_blank"><img src="https://raw.githubusercontent.com/laravel/art/master/logo-lockup/5%20SVG/2%20CMYK/1%20Full%20Color/laravel-logolockup-cmyk-red.svg" width="400"></a></p>
<p align="center">
<a href="https://travis-ci.org/laravel/framework"><img src="https://travis-ci.org/laravel/framework.svg" alt="Build Status"></a>
<a href="https://packagist.org/packages/laravel/framework"><img src="https://img.shields.io/packagist/dt/laravel/framework" alt="Total Downloads"></a>
<a href="https://packagist.org/packages/laravel/framework"><img src="https://img.shields.io/packagist/v/laravel/framework" alt="Latest Stable Version"></a>
<a href="https://packagist.org/packages/laravel/framework"><img src="https://img.shields.io/packagist/l/laravel/framework" alt="License"></a>
</p>
## About Laravel
Laravel is a web application framework with expressive, elegant syntax. We believe development must be an enjoyable and creative experience to be truly fulfilling. Laravel takes the pain out of development by easing common tasks used in many web projects, such as:
- [Simple, fast routing engine](https://laravel.com/docs/routing).
- [Powerful dependency injection container](https://laravel.com/docs/container).
- Multiple back-ends for [session](https://laravel.com/docs/session) and [cache](https://laravel.com/docs/cache) storage.
- Expressive, intuitive [database ORM](https://laravel.com/docs/eloquent).
- Database agnostic [schema migrations](https://laravel.com/docs/migrations).
- [Robust background job processing](https://laravel.com/docs/queues).
- [Real-time event broadcasting](https://laravel.com/docs/broadcasting).
Laravel is accessible, powerful, and provides tools required for large, robust applications.
## Learning Laravel
Laravel has the most extensive and thorough [documentation](https://laravel.com/docs) and video tutorial library of all modern web application frameworks, making it a breeze to get started with the framework.
If you don't feel like reading, [Laracasts](https://laracasts.com) can help. Laracasts contains over 2000 video tutorials on a range of topics including Laravel, modern PHP, unit testing, and JavaScript. Boost your skills by digging into our comprehensive video library.
## Laravel Sponsors
We would like to extend our thanks to the following sponsors for funding Laravel development. If you are interested in becoming a sponsor, please visit the Laravel [Patreon page](https://patreon.com/taylorotwell).
### Premium Partners
- **[Vehikl](https://vehikl.com/)**
- **[Tighten Co.](https://tighten.co)**
- **[Kirschbaum Development Group](https://kirschbaumdevelopment.com)**
- **[64 Robots](https://64robots.com)**
- **[Cubet Techno Labs](https://cubettech.com)**
- **[Cyber-Duck](https://cyber-duck.co.uk)**
- **[Many](https://www.many.co.uk)**
- **[Webdock, Fast VPS Hosting](https://www.webdock.io/en)**
- **[DevSquad](https://devsquad.com)**
- **[Curotec](https://www.curotec.com/services/technologies/laravel/)**
- **[OP.GG](https://op.gg)**
- **[WebReinvent](https://webreinvent.com/?utm_source=laravel&utm_medium=github&utm_campaign=patreon-sponsors)**
- **[Lendio](https://lendio.com)**
## Contributing
Thank you for considering contributing to the Laravel framework! The contribution guide can be found in the [Laravel documentation](https://laravel.com/docs/contributions).
## Code of Conduct
In order to ensure that the Laravel community is welcoming to all, please review and abide by the [Code of Conduct](https://laravel.com/docs/contributions#code-of-conduct).
## Security Vulnerabilities
If you discover a security vulnerability within Laravel, please send an e-mail to Taylor Otwell via [taylor@laravel.com](mailto:taylor@laravel.com). All security vulnerabilities will be promptly addressed.
## License
The Laravel framework is open-sourced software licensed under the [MIT license](https://opensource.org/licenses/MIT).
## Payroll-App

@ -1,59 +0,0 @@
<?php
namespace App\Http\Controllers\Auth;
use App\Http\Controllers\Controller;
use App\Http\Requests\Auth\LoginRequest;
use App\Providers\RouteServiceProvider;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Route;
use Inertia\Inertia;
class AuthenticatedSessionController extends Controller
{
/**
* Display the login view.
*
* @return \Inertia\Response
*/
public function create()
{
return Inertia::render('Auth/Login', [
'canResetPassword' => Route::has('password.request'),
'status' => session('status'),
]);
}
/**
* Handle an incoming authentication request.
*
* @param \App\Http\Requests\Auth\LoginRequest $request
* @return \Illuminate\Http\RedirectResponse
*/
public function store(LoginRequest $request)
{
$request->authenticate();
$request->session()->regenerate();
return redirect()->intended(RouteServiceProvider::HOME);
}
/**
* Destroy an authenticated session.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\RedirectResponse
*/
public function destroy(Request $request)
{
Auth::guard('web')->logout();
$request->session()->invalidate();
$request->session()->regenerateToken();
return redirect('/');
}
}

@ -1,45 +0,0 @@
<?php
namespace App\Http\Controllers\Auth;
use App\Http\Controllers\Controller;
use App\Providers\RouteServiceProvider;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Validation\ValidationException;
use Inertia\Inertia;
class ConfirmablePasswordController extends Controller
{
/**
* Show the confirm password view.
*
* @return \Inertia\Response
*/
public function show()
{
return Inertia::render('Auth/ConfirmPassword');
}
/**
* Confirm the user's password.
*
* @param \Illuminate\Http\Request $request
* @return mixed
*/
public function store(Request $request)
{
if (! Auth::guard('web')->validate([
'email' => $request->user()->email,
'password' => $request->password,
])) {
throw ValidationException::withMessages([
'password' => __('auth.password'),
]);
}
$request->session()->put('auth.password_confirmed_at', time());
return redirect()->intended(RouteServiceProvider::HOME);
}
}

@ -1,27 +0,0 @@
<?php
namespace App\Http\Controllers\Auth;
use App\Http\Controllers\Controller;
use App\Providers\RouteServiceProvider;
use Illuminate\Http\Request;
class EmailVerificationNotificationController extends Controller
{
/**
* Send a new email verification notification.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\RedirectResponse
*/
public function store(Request $request)
{
if ($request->user()->hasVerifiedEmail()) {
return redirect()->intended(RouteServiceProvider::HOME);
}
$request->user()->sendEmailVerificationNotification();
return back()->with('status', 'verification-link-sent');
}
}

@ -1,24 +0,0 @@
<?php
namespace App\Http\Controllers\Auth;
use App\Http\Controllers\Controller;
use App\Providers\RouteServiceProvider;
use Illuminate\Http\Request;
use Inertia\Inertia;
class EmailVerificationPromptController extends Controller
{
/**
* Display the email verification prompt.
*
* @param \Illuminate\Http\Request $request
* @return mixed
*/
public function __invoke(Request $request)
{
return $request->user()->hasVerifiedEmail()
? redirect()->intended(RouteServiceProvider::HOME)
: Inertia::render('Auth/VerifyEmail', ['status' => session('status')]);
}
}

@ -1,73 +0,0 @@
<?php
namespace App\Http\Controllers\Auth;
use App\Http\Controllers\Controller;
use Illuminate\Auth\Events\PasswordReset;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Password;
use Illuminate\Support\Str;
use Illuminate\Validation\Rules;
use Illuminate\Validation\ValidationException;
use Inertia\Inertia;
class NewPasswordController extends Controller
{
/**
* Display the password reset view.
*
* @param \Illuminate\Http\Request $request
* @return \Inertia\Response
*/
public function create(Request $request)
{
return Inertia::render('Auth/ResetPassword', [
'email' => $request->email,
'token' => $request->route('token'),
]);
}
/**
* Handle an incoming new password request.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\RedirectResponse
*
* @throws \Illuminate\Validation\ValidationException
*/
public function store(Request $request)
{
$request->validate([
'token' => 'required',
'email' => 'required|email',
'password' => ['required', 'confirmed', Rules\Password::defaults()],
]);
// Here we will attempt to reset the user's password. If it is successful we
// will update the password on an actual user model and persist it to the
// database. Otherwise we will parse the error and return the response.
$status = Password::reset(
$request->only('email', 'password', 'password_confirmation', 'token'),
function ($user) use ($request) {
$user->forceFill([
'password' => Hash::make($request->password),
'remember_token' => Str::random(60),
])->save();
event(new PasswordReset($user));
}
);
// If the password was successfully reset, we will redirect the user back to
// the application's home authenticated view. If there is an error we can
// redirect them back to where they came from with their error message.
if ($status == Password::PASSWORD_RESET) {
return redirect()->route('login')->with('status', __($status));
}
throw ValidationException::withMessages([
'email' => [trans($status)],
]);
}
}

@ -1,54 +0,0 @@
<?php
namespace App\Http\Controllers\Auth;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Password;
use Illuminate\Validation\ValidationException;
use Inertia\Inertia;
class PasswordResetLinkController extends Controller
{
/**
* Display the password reset link request view.
*
* @return \Inertia\Response
*/
public function create()
{
return Inertia::render('Auth/ForgotPassword', [
'status' => session('status'),
]);
}
/**
* Handle an incoming password reset link request.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\RedirectResponse
*
* @throws \Illuminate\Validation\ValidationException
*/
public function store(Request $request)
{
$request->validate([
'email' => 'required|email',
]);
// We will send the password reset link to this user. Once we have attempted
// to send the link, we will examine the response then see the message we
// need to show to the user. Finally, we'll send out a proper response.
$status = Password::sendResetLink(
$request->only('email')
);
if ($status == Password::RESET_LINK_SENT) {
return back()->with('status', __($status));
}
throw ValidationException::withMessages([
'email' => [trans($status)],
]);
}
}

@ -1,55 +0,0 @@
<?php
namespace App\Http\Controllers\Auth;
use App\Http\Controllers\Controller;
use App\Models\User;
use App\Providers\RouteServiceProvider;
use Illuminate\Auth\Events\Registered;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Hash;
use Illuminate\Validation\Rules;
use Inertia\Inertia;
class RegisteredUserController extends Controller
{
/**
* Display the registration view.
*
* @return \Inertia\Response
*/
public function create()
{
return Inertia::render('Auth/Register');
}
/**
* Handle an incoming registration request.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\RedirectResponse
*
* @throws \Illuminate\Validation\ValidationException
*/
public function store(Request $request)
{
$request->validate([
'name' => 'required|string|max:255',
'email' => 'required|string|email|max:255|unique:users',
'password' => ['required', 'confirmed', Rules\Password::defaults()],
]);
$user = User::create([
'name' => $request->name,
'email' => $request->email,
'password' => Hash::make($request->password),
]);
event(new Registered($user));
Auth::login($user);
return redirect(RouteServiceProvider::HOME);
}
}

@ -1,30 +0,0 @@
<?php
namespace App\Http\Controllers\Auth;
use App\Http\Controllers\Controller;
use App\Providers\RouteServiceProvider;
use Illuminate\Auth\Events\Verified;
use Illuminate\Foundation\Auth\EmailVerificationRequest;
class VerifyEmailController extends Controller
{
/**
* Mark the authenticated user's email address as verified.
*
* @param \Illuminate\Foundation\Auth\EmailVerificationRequest $request
* @return \Illuminate\Http\RedirectResponse
*/
public function __invoke(EmailVerificationRequest $request)
{
if ($request->user()->hasVerifiedEmail()) {
return redirect()->intended(RouteServiceProvider::HOME.'?verified=1');
}
if ($request->user()->markEmailAsVerified()) {
event(new Verified($request->user()));
}
return redirect()->intended(RouteServiceProvider::HOME.'?verified=1');
}
}

@ -0,0 +1,26 @@
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Inertia\Inertia;
class AuthController extends Controller
{
public function login()
{
return Inertia::render('Auth/Login');
}
public function store(Request $request)
{
session(['user' => $request->input()]);
return redirect()->route('dashboard');
}
public function destroy()
{
session()->flush();
return redirect()->route('login');
}
}

@ -0,0 +1,19 @@
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Inertia\Inertia;
class GeneralController extends Controller
{
public function dashboard()
{
return Inertia::render('Dashboard');
}
public function jabatan()
{
return Inertia::render('Jabatan');
}
}

@ -36,7 +36,7 @@ class HandleInertiaRequests extends Middleware
{
return array_merge(parent::share($request), [
'auth' => [
'user' => $request->user(),
'user' => session('user'),
],
'ziggy' => function () use ($request) {
return array_merge((new Ziggy)->toArray(), [

@ -0,0 +1,24 @@
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
class IsGuest
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure(\Illuminate\Http\Request): (\Illuminate\Http\Response|\Illuminate\Http\RedirectResponse) $next
* @return \Illuminate\Http\Response|\Illuminate\Http\RedirectResponse
*/
public function handle(Request $request, Closure $next)
{
if ($request->session()->get('user') != null) {
return redirect()->route('dashboard');
}
return $next($request);
}
}

@ -0,0 +1,24 @@
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
class IsSessionAuth
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure(\Illuminate\Http\Request): (\Illuminate\Http\Response|\Illuminate\Http\RedirectResponse) $next
* @return \Illuminate\Http\Response|\Illuminate\Http\RedirectResponse
*/
public function handle(Request $request, Closure $next)
{
if ($request->session()->get('user') == null) {
return redirect()->route('login');
}
return $next($request);
}
}

2170
package-lock.json generated

File diff suppressed because it is too large Load Diff

@ -21,5 +21,8 @@
"react-dom": "^17.0.2",
"tailwindcss": "^3.1.0",
"vite": "^3.0.0"
},
"dependencies": {
"firebase": "^9.9.1"
}
}

@ -3,6 +3,7 @@ import Dropdown from '@/Components/Dropdown';
import ResponsiveNavLink from '@/Components/ResponsiveNavLink';
import { Link } from '@inertiajs/inertia-react';
export default function Authenticated({ auth, children }) {
const [showingNavigationDropdown, setShowingNavigationDropdown] = useState(false);
@ -104,46 +105,56 @@ export default function Authenticated({ auth, children }) {
</nav>
<div className='flex flex-row md:mt-5 mx-5'>
<div className='w-auto'>
<div className='w-auto hidden md:block'>
<aside className="w-64" aria-label="Sidebar">
<div className="overflow-y-auto py-4 px-3 bg-gray-50 rounded dark:bg-gray-800">
<div className="overflow-y-auto py-4 px-3 bg-white rounded dark:bg-gray-800">
<ul className="space-y-2">
<li>
<a href="#" className="flex items-center p-2 text-base font-normal text-gray-900 rounded-lg dark:text-white hover:bg-gray-100 dark:hover:bg-gray-700">
<Link href={route('dashboard')} className="flex items-center p-2 text-base font-normal text-gray-900 rounded-lg dark:text-white hover:bg-gray-100 dark:hover:bg-gray-700">
<span className="ml-3">Dashboard</span>
</a>
</Link>
</li>
<li>
<a href="#" className="flex items-center p-2 text-base font-normal text-gray-900 rounded-lg dark:text-white hover:bg-gray-100 dark:hover:bg-gray-700">
<span className="flex-1 ml-3 whitespace-nowrap">Kanban</span>
</a>
<Link href={route('jabatan')} className="flex items-center p-2 text-base font-normal text-gray-900 rounded-lg dark:text-white hover:bg-gray-100 dark:hover:bg-gray-700">
<span className="flex-1 ml-3 whitespace-nowrap">Jabatan</span>
</Link>
</li>
<li>
<a href="#" className="flex items-center p-2 text-base font-normal text-gray-900 rounded-lg dark:text-white hover:bg-gray-100 dark:hover:bg-gray-700">
<span className="flex-1 ml-3 whitespace-nowrap">Inbox</span>
</a>
<Link href={route('dashboard')} className="flex items-center p-2 text-base font-normal text-gray-900 rounded-lg dark:text-white hover:bg-gray-100 dark:hover:bg-gray-700">
<span className="flex-1 ml-3 whitespace-nowrap">Karyawan</span>
</Link>
</li>
<li>
<a href="#" className="flex items-center p-2 text-base font-normal text-gray-900 rounded-lg dark:text-white hover:bg-gray-100 dark:hover:bg-gray-700">
<span className="flex-1 ml-3 whitespace-nowrap">Users</span>
</a>
<Link href={route('dashboard')} className="flex items-center p-2 text-base font-normal text-gray-900 rounded-lg dark:text-white hover:bg-gray-100 dark:hover:bg-gray-700">
<span className="flex-1 ml-3 whitespace-nowrap">Data Absensi</span>
</Link>
</li>
<li>
<a href="#" className="flex items-center p-2 text-base font-normal text-gray-900 rounded-lg dark:text-white hover:bg-gray-100 dark:hover:bg-gray-700">
<span className="flex-1 ml-3 whitespace-nowrap">Products</span>
</a>
<Link href={route('dashboard')} className="flex items-center p-2 text-base font-normal text-gray-900 rounded-lg dark:text-white hover:bg-gray-100 dark:hover:bg-gray-700">
<span className="flex-1 ml-3 whitespace-nowrap">Setting Potongan Gaji</span>
</Link>
</li>
<li>
<a href="#" className="flex items-center p-2 text-base font-normal text-gray-900 rounded-lg dark:text-white hover:bg-gray-100 dark:hover:bg-gray-700">
<span className="flex-1 ml-3 whitespace-nowrap">Sign In</span>
</a>
<Link href={route('dashboard')} className="flex items-center p-2 text-base font-normal text-gray-900 rounded-lg dark:text-white hover:bg-gray-100 dark:hover:bg-gray-700">
<span className="flex-1 ml-3 whitespace-nowrap">Cetak Slip Gaji</span>
</Link>
</li>
<li>
<Link href={route('dashboard')} className="flex items-center p-2 text-base font-normal text-gray-900 rounded-lg dark:text-white hover:bg-gray-100 dark:hover:bg-gray-700">
<span className="flex-1 ml-3 whitespace-nowrap">Cetak Laporan Gaji</span>
</Link>
</li>
<li>
<Link href={route('dashboard')} className="flex items-center p-2 text-base font-normal text-gray-900 rounded-lg dark:text-white hover:bg-gray-100 dark:hover:bg-gray-700">
<span className="flex-1 ml-3 whitespace-nowrap">Cetak Laporan Presensi</span>
</Link>
</li>
</ul>
</div>
</aside>
</div>
<div className='w-full'>
<div className='w-full pt-5 md:pt-0'>
<main>{children}</main>
</div>
</div>

@ -6,8 +6,8 @@ export default function Guest({ children }) {
return (
<div className="min-h-screen flex flex-col sm:justify-center items-center pt-6 sm:pt-0 bg-gray-100">
<div>
<Link href="/">
<ApplicationLogo className="w-20 h-20 fill-current text-gray-500" />
<Link href="/" className='text-3xl font-bold'>
Payroll App
</Link>
</div>

@ -1,62 +0,0 @@
import React, { useEffect } from 'react';
import Button from '@/Components/Button';
import Guest from '@/Layouts/Guest';
import Input from '@/Components/Input';
import Label from '@/Components/Label';
import ValidationErrors from '@/Components/ValidationErrors';
import { Head, useForm } from '@inertiajs/inertia-react';
export default function ConfirmPassword() {
const { data, setData, post, processing, errors, reset } = useForm({
password: '',
});
useEffect(() => {
return () => {
reset('password');
};
}, []);
const onHandleChange = (event) => {
setData(event.target.name, event.target.value);
};
const submit = (e) => {
e.preventDefault();
post(route('password.confirm'));
};
return (
<Guest>
<Head title="Confirm Password" />
<div className="mb-4 text-sm text-gray-600">
This is a secure area of the application. Please confirm your password before continuing.
</div>
<ValidationErrors errors={errors} />
<form onSubmit={submit}>
<div className="mt-4">
<Label forInput="password" value="Password" />
<Input
type="password"
name="password"
value={data.password}
className="mt-1 block w-full"
isFocused={true}
handleChange={onHandleChange}
/>
</div>
<div className="flex items-center justify-end mt-4">
<Button className="ml-4" processing={processing}>
Confirm
</Button>
</div>
</form>
</Guest>
);
}

@ -1,54 +0,0 @@
import React from 'react';
import Button from '@/Components/Button';
import Guest from '@/Layouts/Guest';
import Input from '@/Components/Input';
import ValidationErrors from '@/Components/ValidationErrors';
import { Head, useForm } from '@inertiajs/inertia-react';
export default function ForgotPassword({ status }) {
const { data, setData, post, processing, errors } = useForm({
email: '',
});
const onHandleChange = (event) => {
setData(event.target.name, event.target.value);
};
const submit = (e) => {
e.preventDefault();
post(route('password.email'));
};
return (
<Guest>
<Head title="Forgot Password" />
<div className="mb-4 text-sm text-gray-500 leading-normal">
Forgot your password? No problem. Just let us know your email address and we will email you a password
reset link that will allow you to choose a new one.
</div>
{status && <div className="mb-4 font-medium text-sm text-green-600">{status}</div>}
<ValidationErrors errors={errors} />
<form onSubmit={submit}>
<Input
type="text"
name="email"
value={data.email}
className="mt-1 block w-full"
isFocused={true}
handleChange={onHandleChange}
/>
<div className="flex items-center justify-end mt-4">
<Button className="ml-4" processing={processing}>
Email Password Reset Link
</Button>
</div>
</form>
</Guest>
);
}

@ -1,4 +1,4 @@
import React, { useEffect } from 'react';
import React, { useState } from 'react';
import Button from '@/Components/Button';
import Checkbox from '@/Components/Checkbox';
import Guest from '@/Layouts/Guest';
@ -6,28 +6,44 @@ import Input from '@/Components/Input';
import Label from '@/Components/Label';
import ValidationErrors from '@/Components/ValidationErrors';
import { Head, Link, useForm } from '@inertiajs/inertia-react';
import { getAllUsers } from '@/Services/User';
import { forEach } from 'lodash';
import { Inertia } from '@inertiajs/inertia';
export default function Login({ status, canResetPassword }) {
const { data, setData, post, processing, errors, reset } = useForm({
email: '',
const [isLoading, setLoading] = useState(false)
const [error, setError] = useState('')
const { data, setData, post } = useForm({
name: '',
username: '',
password: '',
remember: '',
is_admin: ''
});
useEffect(() => {
return () => {
reset('password');
};
}, []);
const onHandleChange = (event) => {
setData(event.target.name, event.target.type === 'checkbox' ? event.target.checked : event.target.value);
};
const checkLogin = (users) => {
const user = users.find(item => item.username == data.username && item.password == data.password)
if (user) {
Inertia.post(route('login'), {
name: user.name,
username: user.username,
password: user.password,
is_admin: user.is_admin
})
} else {
setError('Username atau password tidak cocok')
}
}
const submit = (e) => {
e.preventDefault();
post(route('login'));
setLoading(true)
getAllUsers()
.then(items => checkLogin(items))
.finally(() => setLoading(false))
};
return (
@ -36,16 +52,17 @@ export default function Login({ status, canResetPassword }) {
{status && <div className="mb-4 font-medium text-sm text-green-600">{status}</div>}
<ValidationErrors errors={errors} />
<div className='text-center my-5 text-red-600'>
{error}
</div>
<form onSubmit={submit}>
<div>
<Label forInput="email" value="Email" />
<Label forInput="username" value="Username" />
<Input
type="text"
name="email"
value={data.email}
name="username"
value={data.username}
className="mt-1 block w-full"
autoComplete="username"
isFocused={true}
@ -66,14 +83,6 @@ export default function Login({ status, canResetPassword }) {
/>
</div>
<div className="block mt-4">
<label className="flex items-center">
<Checkbox name="remember" value={data.remember} handleChange={onHandleChange} />
<span className="ml-2 text-sm text-gray-600">Remember me</span>
</label>
</div>
<div className="flex items-center justify-end mt-4">
{canResetPassword && (
<Link
@ -84,7 +93,7 @@ export default function Login({ status, canResetPassword }) {
</Link>
)}
<Button className="ml-4" processing={processing}>
<Button className="ml-4" processing={isLoading}>
Log in
</Button>
</div>

@ -1,88 +0,0 @@
import React, { useEffect } from 'react';
import Button from '@/Components/Button';
import Guest from '@/Layouts/Guest';
import Input from '@/Components/Input';
import Label from '@/Components/Label';
import ValidationErrors from '@/Components/ValidationErrors';
import { Head, useForm } from '@inertiajs/inertia-react';
export default function ResetPassword({ token, email }) {
const { data, setData, post, processing, errors, reset } = useForm({
token: token,
email: email,
password: '',
password_confirmation: '',
});
useEffect(() => {
return () => {
reset('password', 'password_confirmation');
};
}, []);
const onHandleChange = (event) => {
setData(event.target.name, event.target.value);
};
const submit = (e) => {
e.preventDefault();
post(route('password.update'));
};
return (
<Guest>
<Head title="Reset Password" />
<ValidationErrors errors={errors} />
<form onSubmit={submit}>
<div>
<Label forInput="email" value="Email" />
<Input
type="email"
name="email"
value={data.email}
className="mt-1 block w-full"
autoComplete="username"
handleChange={onHandleChange}
/>
</div>
<div className="mt-4">
<Label forInput="password" value="Password" />
<Input
type="password"
name="password"
value={data.password}
className="mt-1 block w-full"
autoComplete="new-password"
isFocused={true}
handleChange={onHandleChange}
/>
</div>
<div className="mt-4">
<Label forInput="password_confirmation" value="Confirm Password" />
<Input
type="password"
name="password_confirmation"
value={data.password_confirmation}
className="mt-1 block w-full"
autoComplete="new-password"
handleChange={onHandleChange}
/>
</div>
<div className="flex items-center justify-end mt-4">
<Button className="ml-4" processing={processing}>
Reset Password
</Button>
</div>
</form>
</Guest>
);
}

@ -1,46 +0,0 @@
import React from 'react';
import Button from '@/Components/Button';
import Guest from '@/Layouts/Guest';
import { Head, Link, useForm } from '@inertiajs/inertia-react';
export default function VerifyEmail({ status }) {
const { post, processing } = useForm();
const submit = (e) => {
e.preventDefault();
post(route('verification.send'));
};
return (
<Guest>
<Head title="Email Verification" />
<div className="mb-4 text-sm text-gray-600">
Thanks for signing up! Before getting started, could you verify your email address by clicking on the
link we just emailed to you? If you didn't receive the email, we will gladly send you another.
</div>
{status === 'verification-link-sent' && (
<div className="mb-4 font-medium text-sm text-green-600">
A new verification link has been sent to the email address you provided during registration.
</div>
)}
<form onSubmit={submit}>
<div className="mt-4 flex items-center justify-between">
<Button processing={processing}>Resend Verification Email</Button>
<Link
href={route('logout')}
method="post"
as="button"
className="underline text-sm text-gray-600 hover:text-gray-900"
>
Log Out
</Link>
</div>
</form>
</Guest>
);
}

@ -7,7 +7,6 @@ export default function Dashboard(props) {
<Authenticated
auth={props.auth}
errors={props.errors}
header={<h2 className="font-semibold text-xl text-gray-800 leading-tight">Dashboard</h2>}
>
<Head title="Dashboard" />

@ -0,0 +1,89 @@
import React from 'react';
import Authenticated from '@/Layouts/Authenticated';
import { Head } from '@inertiajs/inertia-react';
import Button from '@/Components/Button';
export default function Jabatan(props) {
return (
<Authenticated
auth={props.auth}
errors={props.errors}
>
<Head title="Jabatan" />
<div className="py-0">
<div className="max-w-7xl sm:px-6">
<div className="bg-white overflow-hidden shadow-sm sm:rounded-lg">
<div className="p-6 bg-white border-b border-gray-200">
<Button>Tambah</Button>
<div className="overflow-x-auto relative pt-5">
<table className="w-full text-sm text-left text-gray-500 dark:text-gray-400">
<thead className="text-xs text-gray-700 uppercase bg-gray-50 dark:bg-gray-700 dark:text-gray-400">
<tr>
<th scope="col" className="py-3 px-6">
Product name
</th>
<th scope="col" className="py-3 px-6">
Color
</th>
<th scope="col" className="py-3 px-6">
Category
</th>
<th scope="col" className="py-3 px-6">
Price
</th>
</tr>
</thead>
<tbody>
<tr className="bg-white border-b dark:bg-gray-800 dark:border-gray-700">
<th scope="row" className="py-4 px-6 font-medium text-gray-900 whitespace-nowrap dark:text-white">
Apple MacBook Pro 17"
</th>
<td className="py-4 px-6">
Sliver
</td>
<td className="py-4 px-6">
Laptop
</td>
<td className="py-4 px-6">
$2999
</td>
</tr>
<tr className="bg-white border-b dark:bg-gray-800 dark:border-gray-700">
<th scope="row" className="py-4 px-6 font-medium text-gray-900 whitespace-nowrap dark:text-white">
Microsoft Surface Pro
</th>
<td className="py-4 px-6">
White
</td>
<td className="py-4 px-6">
Laptop PC
</td>
<td className="py-4 px-6">
$1999
</td>
</tr>
<tr className="bg-white dark:bg-gray-800">
<th scope="row" className="py-4 px-6 font-medium text-gray-900 whitespace-nowrap dark:text-white">
Magic Mouse 2
</th>
<td className="py-4 px-6">
Black
</td>
<td className="py-4 px-6">
Accessories
</td>
<td className="py-4 px-6">
$99
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
</div>
</div>
</Authenticated>
);
}

@ -0,0 +1,19 @@
import db from "@/firebase";
import { collection, getDocs, doc, setDoc } from "firebase/firestore";
async function getAllJabatan() {
const collect = collection(db, 'jabatan')
const data = await getDocs(collect)
const lists = data.docs.map(doc => doc.data())
return lists
}
async function createJabatan(payload) {
const docRef = await setDoc(doc(db, "jabatan"), payload);
return docRef.id
}
export {
getAllJabatan,
createJabatan
}

@ -0,0 +1,13 @@
import db from "@/firebase";
import { collection, getDocs } from "firebase/firestore";
async function getAllUsers() {
const usersCollcetion = collection(db, 'users')
const users = await getDocs(usersCollcetion)
const usersList = users.docs.map(doc => doc.data())
return usersList
}
export {
getAllUsers
}

@ -0,0 +1,21 @@
// Import the functions you need from the SDKs you need
import { initializeApp } from "firebase/app";
import { getAnalytics } from "firebase/analytics";
// TODO: Add SDKs for Firebase products that you want to use
// https://firebase.google.com/docs/web/setup#available-libraries
// Your web app's Firebase configuration
// For Firebase JS SDK v7.20.0 and later, measurementId is optional
const firebaseConfig = {
apiKey: "xxxxxxxxxxxxxxxx",
authDomain: "xxxxxxxxxxxxxxxx.firebaseapp.com",
projectId: "xxxxxxxxxxxxxxxx",
storageBucket: "xxxxxxxxxxxxxxxx.appspot.com",
messagingSenderId: "xxxxxxxxxxxxxxxx",
appId: "xxxxxxxxxxxxxxxx",
measurementId: "xxxxxxxxxxxxxxxx"
};
// Initialize Firebase
const app = initializeApp(firebaseConfig);
const analytics = getAnalytics(app);

@ -1,8 +1,11 @@
<?php
use Illuminate\Foundation\Application;
use App\Http\Controllers\AuthController;
use App\Http\Controllers\GeneralController;
use App\Http\Middleware\IsGuest;
use Illuminate\Support\Facades\Route;
use Inertia\Inertia;
use App\Http\Middleware\IsSessionAuth;
/*
|--------------------------------------------------------------------------
@ -19,8 +22,13 @@ Route::get('/', function () {
return redirect()->route("login");
});
Route::get('/dashboard', function () {
return Inertia::render('Dashboard');
})->middleware(['auth', 'verified'])->name('dashboard');
Route::middleware([IsGuest::class])->group(function () {
Route::get('/login', [AuthController::class, 'login'])->name('login');
Route::post('/login', [AuthController::class, 'store'])->name('login.store');
});
require __DIR__.'/auth.php';
Route::middleware([IsSessionAuth::class])->group(function () {
Route::get('/dashboard', [GeneralController::class, 'dashboard'])->name('dashboard');
Route::get('/jabatan', [GeneralController::class, 'jabatan'])->name('jabatan');
Route::post('/logout', [AuthController::class, 'destroy'])->name('logout');
});

Loading…
Cancel
Save