diff --git a/app/Http/Controllers/Auth/RegisteredUserController.php b/app/Http/Controllers/Auth/RegisteredUserController.php index 53a546b..cae05e2 100644 --- a/app/Http/Controllers/Auth/RegisteredUserController.php +++ b/app/Http/Controllers/Auth/RegisteredUserController.php @@ -5,9 +5,8 @@ namespace App\Http\Controllers\Auth; use App\Http\Controllers\Controller; use App\Models\User; use Illuminate\Auth\Events\Registered; -use Illuminate\Http\RedirectResponse; +use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; -use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Hash; use Illuminate\Validation\Rules; use Inertia\Inertia; @@ -28,24 +27,30 @@ class RegisteredUserController extends Controller * * @throws \Illuminate\Validation\ValidationException */ - public function store(Request $request): RedirectResponse + public function store(Request $request): JsonResponse { $request->validate([ + 'emp_id' => 'required|integer', 'name' => 'required|string|max:255', 'email' => 'required|string|lowercase|email|max:255|unique:'.User::class, + 'username' => 'required|string|max:255|unique:'.User::class, 'password' => ['required', 'confirmed', Rules\Password::defaults()], + 'role_id' => 'required|exists:roles,id', ]); $user = User::create([ + 'emp_id' => $request->emp_id, 'name' => $request->name, 'email' => $request->email, + 'username' => $request->username, 'password' => Hash::make($request->password), + 'role_id' => $request->role_id, ]); event(new Registered($user)); - Auth::login($user); - - return redirect(route('dashboard', absolute: false)); + return response()->json([ + 'message' => 'Registration successful! Please log in.' + ]); } } diff --git a/app/Models/Role.php b/app/Models/Role.php new file mode 100644 index 0000000..c04d7ce --- /dev/null +++ b/app/Models/Role.php @@ -0,0 +1,20 @@ + + */ + protected $fillable = [ + 'name', + ]; +} diff --git a/app/Models/User.php b/app/Models/User.php index def621f..5efd5d0 100644 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -17,9 +17,12 @@ class User extends Authenticatable * @var array */ protected $fillable = [ + 'emp_id', 'name', 'email', + 'username', 'password', + 'role_id', ]; /** @@ -42,6 +45,15 @@ class User extends Authenticatable return [ 'email_verified_at' => 'datetime', 'password' => 'hashed', + 'role_id' => 'integer', ]; } + + /** + * Get the role associated with the user. + */ + public function role() + { + return $this->belongsTo(Role::class); + } } diff --git a/database/migrations/2024_06_09_183352_add_emp_id_and_username_to_users_table.php b/database/migrations/2024_06_09_183352_add_emp_id_and_username_to_users_table.php new file mode 100644 index 0000000..4392560 --- /dev/null +++ b/database/migrations/2024_06_09_183352_add_emp_id_and_username_to_users_table.php @@ -0,0 +1,30 @@ +integer('emp_id')->default(-1)->after('id'); + $table->string('username')->after('email'); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('users', function (Blueprint $table) { + $table->dropColumn('emp_id'); + $table->dropColumn('username'); + }); + } +}; diff --git a/database/migrations/2024_06_09_184105_create_roles_table.php b/database/migrations/2024_06_09_184105_create_roles_table.php new file mode 100644 index 0000000..3f600ed --- /dev/null +++ b/database/migrations/2024_06_09_184105_create_roles_table.php @@ -0,0 +1,28 @@ +id(); + $table->string('name'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('roles'); + } +}; diff --git a/database/migrations/2024_06_09_184744_add_role_id_to_users_table.php b/database/migrations/2024_06_09_184744_add_role_id_to_users_table.php new file mode 100644 index 0000000..45303b1 --- /dev/null +++ b/database/migrations/2024_06_09_184744_add_role_id_to_users_table.php @@ -0,0 +1,31 @@ +unsignedBigInteger('role_id')->nullable()->after('id'); + + $table->foreign('role_id')->references('id')->on('roles')->onDelete('set null'); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('users', function (Blueprint $table) { + $table->dropForeign(['role_id']); + $table->dropColumn('role_id'); + }); + } +}; diff --git a/package-lock.json b/package-lock.json index 9e69e9a..caf88ee 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4,6 +4,10 @@ "requires": true, "packages": { "": { + "dependencies": { + "feather-icons-react": "^0.7.0", + "react-feather": "^2.0.10" + }, "devDependencies": { "@headlessui/react": "^1.4.2", "@inertiajs/react": "^1.0.0", @@ -1869,6 +1873,15 @@ "reusify": "^1.0.4" } }, + "node_modules/feather-icons-react": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/feather-icons-react/-/feather-icons-react-0.7.0.tgz", + "integrity": "sha512-IAHpKhrpxag3gKWcZYC7zmewfjMQLI34tmrpH3+52mvC61Q4FRBjJXl1WmPyKefGnk3sbS0wiqWDD3QIHiJBaA==", + "peerDependencies": { + "react": "^16.8.4 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.4 || ^17.0.0 || ^18.0.0" + } + }, "node_modules/fill-range": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", @@ -2206,8 +2219,7 @@ "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" }, "node_modules/jsesc": { "version": "2.5.2", @@ -2295,7 +2307,6 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "dev": true, "dependencies": { "js-tokens": "^3.0.0 || ^4.0.0" }, @@ -2457,7 +2468,6 @@ "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -2705,6 +2715,16 @@ "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", "dev": true }, + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, "node_modules/proxy-from-env": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", @@ -2750,7 +2770,6 @@ "version": "18.3.1", "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", - "dev": true, "dependencies": { "loose-envify": "^1.1.0" }, @@ -2762,7 +2781,6 @@ "version": "18.3.1", "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", - "dev": true, "dependencies": { "loose-envify": "^1.1.0", "scheduler": "^0.23.2" @@ -2771,6 +2789,22 @@ "react": "^18.3.1" } }, + "node_modules/react-feather": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/react-feather/-/react-feather-2.0.10.tgz", + "integrity": "sha512-BLhukwJ+Z92Nmdcs+EMw6dy1Z/VLiJTzEQACDUEnWMClhYnFykJCGWQx+NmwP/qQHGX/5CzQ+TGi8ofg2+HzVQ==", + "dependencies": { + "prop-types": "^15.7.2" + }, + "peerDependencies": { + "react": ">=16.8.6" + } + }, + "node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + }, "node_modules/react-refresh": { "version": "0.14.2", "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.2.tgz", @@ -2890,7 +2924,6 @@ "version": "0.23.2", "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", - "dev": true, "dependencies": { "loose-envify": "^1.1.0" } diff --git a/package.json b/package.json index d3c3651..197d7a4 100644 --- a/package.json +++ b/package.json @@ -24,5 +24,9 @@ "tailwindcss": "^3.2.1", "typescript": "^5.0.2", "vite": "^5.0" + }, + "dependencies": { + "feather-icons-react": "^0.7.0", + "react-feather": "^2.0.10" } } diff --git a/public/assets/images/icons/ico-dropdown.png b/public/assets/images/icons/ico-dropdown.png deleted file mode 100644 index a50cc90..0000000 Binary files a/public/assets/images/icons/ico-dropdown.png and /dev/null differ diff --git a/public/assets/images/icons/ico-help.png b/public/assets/images/icons/ico-help.png deleted file mode 100644 index 0d1f06c..0000000 Binary files a/public/assets/images/icons/ico-help.png and /dev/null differ diff --git a/public/assets/images/icons/ico-search.png b/public/assets/images/icons/ico-search.png deleted file mode 100644 index daf9acd..0000000 Binary files a/public/assets/images/icons/ico-search.png and /dev/null differ diff --git a/public/assets/images/img-signup.png b/public/assets/images/img-signup.png new file mode 100644 index 0000000..80d445c Binary files /dev/null and b/public/assets/images/img-signup.png differ diff --git a/resources/js/Components/Dropdown.tsx b/resources/js/Components/Dropdown.tsx index e38514d..e17d99e 100644 --- a/resources/js/Components/Dropdown.tsx +++ b/resources/js/Components/Dropdown.tsx @@ -21,7 +21,7 @@ const Dropdown = ({ children }: PropsWithChildren) => { return ( -
{children}
+
{children}
); }; diff --git a/resources/js/Components/Footer.tsx b/resources/js/Components/Footer.tsx index 3c4ec46..853d96d 100644 --- a/resources/js/Components/Footer.tsx +++ b/resources/js/Components/Footer.tsx @@ -1,4 +1,5 @@ import { Link } from '@inertiajs/react'; +import { HelpCircle } from 'react-feather'; export default function Footer() { return ( @@ -27,7 +28,8 @@ export default function Footer() {

Copyright © 2024 DOST. All rights reserved.

- Help Icon + {/* Help Icon */} + Help
diff --git a/resources/js/Components/FormGroup.tsx b/resources/js/Components/FormGroup.tsx new file mode 100644 index 0000000..c43bb4d --- /dev/null +++ b/resources/js/Components/FormGroup.tsx @@ -0,0 +1,9 @@ +import { PropsWithChildren } from 'react'; + +export default function FormGroup({ children }: PropsWithChildren) { + return( +
+ { children } +
+ ); +} \ No newline at end of file diff --git a/resources/js/Components/InputError.tsx b/resources/js/Components/InputError.tsx index 35e801c..9c8a15d 100644 --- a/resources/js/Components/InputError.tsx +++ b/resources/js/Components/InputError.tsx @@ -2,7 +2,7 @@ import { HTMLAttributes } from 'react'; export default function InputError({ message, className = '', ...props }: HTMLAttributes & { message?: string }) { return message ? ( -

+

{message}

) : null; diff --git a/resources/js/Components/InputLabel.tsx b/resources/js/Components/InputLabel.tsx index 08f3d66..cd8efd9 100644 --- a/resources/js/Components/InputLabel.tsx +++ b/resources/js/Components/InputLabel.tsx @@ -1,9 +1,14 @@ -import { LabelHTMLAttributes } from 'react'; +import { HTMLAttributes } from 'react'; -export default function InputLabel({ value, className = '', children, ...props }: LabelHTMLAttributes & { value?: string }) { +export default function InputLabel({ className = '', children, ...props }: HTMLAttributes & { htmlFor?: string }) { return ( -