diff --git a/index.html b/index.html index 934602c4..95db7228 100644 --- a/index.html +++ b/index.html @@ -31,6 +31,8 @@ + + diff --git a/public/assets/css/theme-green.css b/public/assets/css/theme-green.css new file mode 100644 index 00000000..f19c7713 --- /dev/null +++ b/public/assets/css/theme-green.css @@ -0,0 +1,55 @@ +.btn-green { + background-color: #49bf3c; + color: #fff; + border-radius: 50px; + padding: 10px 30px; + font-weight: 500; + text-decoration: none; + transition: all 0.3s ease; +} + +.btn-green-outline { + border-color: #49bf3c; + background-color: transparent; + color: unset; +} + +.btn-green-outline:hover { + background-color: #49bf3c; + color: #fff; +} + +.btn-square-small { + border-radius: 3px; + padding-bottom: 5.072px; + padding-inline-end: 12px; + padding-inline-start: 12px; + padding-left: 12px; + padding-right: 12px; + padding-top: 5.072px; +} + +.btn-green:hover { + background-color: #00a85a; + color: #fff; +} + +.text-blue { + color: #696cff !important; +} +.text-green { + color: #49bf3c !important; +} + +.btn-outline-green { + border-radius: 50px; + padding: 10px 30px; + font-weight: 500; + text-decoration: none; + transition: all 0.3s ease; +} + +.btn-outline-green:hover { + background-color: #49bf3c; + color: #fff; +} diff --git a/src/pages/Home/LandingPage.css b/src/pages/Home/LandingPage.css index 09d0a51c..e134840c 100644 --- a/src/pages/Home/LandingPage.css +++ b/src/pages/Home/LandingPage.css @@ -28,16 +28,13 @@ color: #4fc143; } -.text-primary { +/* .text-primary { color: #49bf3c !important; -} -.text-blue { - color: #696cff !important; -} +} */ -.btn-primary { +/* .btn-primary { background-color: #49bf3c !important; -} +} */ body { font-family: "Segoe UI", Roboto, sans-serif; @@ -238,28 +235,3 @@ body { margin-top: 15px; margin-bottom: 25px; } - -.btn-green { - background-color: #49bf3c; - color: #fff; - border-radius: 50px; - padding: 10px 30px; - font-weight: 500; - text-decoration: none; - transition: all 0.3s ease; -} - -.btn-square-small { - border-radius: 3px; - padding-bottom: 5.072px; - padding-inline-end: 12px; - padding-inline-start: 12px; - padding-left: 12px; - padding-right: 12px; - padding-top: 5.072px; -} - -.btn-green:hover { - background-color: #00a85a; - color: #fff; -} diff --git a/src/pages/Home/LandingPage.jsx b/src/pages/Home/LandingPage.jsx index 26dec7e1..67587252 100644 --- a/src/pages/Home/LandingPage.jsx +++ b/src/pages/Home/LandingPage.jsx @@ -14,7 +14,7 @@ const LandingPage = () => {
- + OnField Work .com @@ -187,7 +187,7 @@ const LandingPage = () => {
Dashboard @@ -203,7 +203,7 @@ const LandingPage = () => {
Smart Attendance @@ -220,7 +220,7 @@ const LandingPage = () => {
Expense & Budget Tracking @@ -236,7 +236,7 @@ const LandingPage = () => {
Cloud Scalability @@ -252,7 +252,7 @@ const LandingPage = () => {
Advanced Reporting @@ -269,7 +269,7 @@ const LandingPage = () => {
Cloud Scalability @@ -298,7 +298,7 @@ const LandingPage = () => {
-
Starter
+
Starter

₹499/month

@@ -317,7 +317,7 @@ const LandingPage = () => {
-
Professional
+
Professional

₹999/month

@@ -339,7 +339,7 @@ const LandingPage = () => {
-
Enterprise
+
Enterprise

Custom

Why Choose{" "} - + OnField Work .com @@ -498,7 +498,7 @@ const LandingPage = () => { aria-expanded="true" aria-controls="accordionOne" > - What is MarcoPMS? + What is OnFieldWork.com?
{ aria-expanded="false" aria-controls="accordionThree" > - How secure is Marco PMS? + How secure is OnFieldWork.com?
{ data-bs-parent="#accordionExample" >
- Security is at the core of Marco PMS. We use industry-standard - encryption (SSL/TLS) to protect data in transit and advanced - encryption to safeguard data at rest. Role-based access - controls ensure that only authorized users can access - sensitive information. Our system is hosted on secure, - cloud-ready infrastructure with regular backups, monitoring, - and compliance with best practices to keep your data safe and - available at all times. + Security is at the core of OnFieldWork.com. We use + industry-standard encryption (SSL/TLS) to protect data in + transit and advanced encryption to safeguard data at rest. + Role-based access controls ensure that only authorized users + can access sensitive information. Our system is hosted on + secure, cloud-ready infrastructure with regular backups, + monitoring, and compliance with best practices to keep your + data safe and available at all times.
@@ -621,8 +621,8 @@ const LandingPage = () => { data-bs-parent="#accordionExample" >
- Marco PMS operate under a proprietary license combined with a - subscription model. This means customers don’t own the + OnFieldWork.com operate under a proprietary license combined + with a subscription model. This means customers don’t own the software but are granted the right to access and use it through the cloud under our Terms of Service. Depending on the plan, licensing may be based on users, features, or usage, and @@ -640,7 +640,7 @@ const LandingPage = () => { aria-expanded="false" aria-controls="accordionSix" > - Can I customize Marco PMS for my business needs? + Can I customize OnFieldWork.com for my business needs?
{ data-bs-parent="#accordionExample" >
- Yes, Marco PMS is designed to be flexible and adaptable. You - can customize workflows, user roles, permissions, and + Yes, OnFieldWork.com is designed to be flexible and adaptable. + You can customize workflows, user roles, permissions, and reporting to match your organization’s unique processes. Depending on your plan, we also support advanced customization such as integrating with third-party tools, adding custom @@ -680,7 +680,7 @@ const LandingPage = () => {

- Contact Us + Contact Us

We’d love to hear from you! Whether you have a question about diff --git a/src/pages/authentication/ForgotPasswordPage.jsx b/src/pages/authentication/ForgotPasswordPage.jsx index 0e234bd3..568d2cfb 100644 --- a/src/pages/authentication/ForgotPasswordPage.jsx +++ b/src/pages/authentication/ForgotPasswordPage.jsx @@ -1,6 +1,6 @@ import { useState } from "react"; import { Link } from "react-router-dom"; -import { AuthWrapper } from "./AuthWrapper" +import { AuthWrapper } from "./AuthWrapper"; import "./page-auth.css"; import AuthRepository from "../../repositories/AuthRepository"; import showToast from "../../services/toastService"; @@ -8,54 +8,65 @@ import { useForm } from "react-hook-form"; import { zodResolver } from "@hookform/resolvers/zod"; import { z } from "zod"; - const forgotPassSceham = z.object({ email: z.string().trim().email(), -}) +}); const ForgotPasswordPage = () => { + const [loding, setLoading] = useState(false); - const [loding, setLoading] = useState(false) - - const { register, + const { + register, handleSubmit, formState: { errors }, reset, - getValues } = useForm({ - resolver: zodResolver(forgotPassSceham), - defaultValues: { - email: "" - } - }) + getValues, + } = useForm({ + resolver: zodResolver(forgotPassSceham), + defaultValues: { + email: "", + }, + }); const onSubmit = async (data) => { try { - setLoading(true) - const response = await AuthRepository.forgotPassword(data) + setLoading(true); + const response = await AuthRepository.forgotPassword(data); if (response.data && response.success) - showToast("verification email has been sent to your registered email address", "success") - reset() - setLoading(false) + showToast( + "verification email has been sent to your registered email address", + "success" + ); + reset(); + setLoading(false); } catch (err) { - reset() + reset(); if (err.response.status === 404) { - showToast("verification email has been sent to your registered email address", "success") + showToast( + "verification email has been sent to your registered email address", + "success" + ); } else { - showToast("Something wrong", "error") + showToast("Something wrong", "error"); } - setLoading(false) + setLoading(false); } - } + }; return ( -

+

Forgot Password? 🔒

- Enter your email and we'll send you instructions to reset your password + Enter your email and we'll send you instructions to reset your + password

-
+
)}
- -
- - - Back to login - -
+
+ + + Back to login + +
{/* Footer Text */} -
); }; -export default ForgotPasswordPage; \ No newline at end of file +export default ForgotPasswordPage; diff --git a/src/pages/authentication/LoginPage.jsx b/src/pages/authentication/LoginPage.jsx index 509a9329..e095d6c1 100644 --- a/src/pages/authentication/LoginPage.jsx +++ b/src/pages/authentication/LoginPage.jsx @@ -49,16 +49,16 @@ const LoginPage = () => { // sessionStorage.setItem("refreshToken", response.data.refreshToken); // } setLoading(false); - localStorage.setItem("jwtToken", response.data.token); - localStorage.setItem("refreshToken", response.data.refreshToken); - navigate("/dashboard",{ replace: true }); + localStorage.setItem("jwtToken", response.data.token); + localStorage.setItem("refreshToken", response.data.refreshToken); + navigate("/dashboard", { replace: true }); } else { await AuthRepository.sendOTP({ email: data.username }); showToast("OTP has been sent to your email.", "success"); localStorage.setItem("otpUsername", data.username); localStorage.setItem("otpSentTime", now.toString()); // navigate("/auth/login-otp"); - navigate("/dashboard",{ replace: true }); + navigate("/dashboard", { replace: true }); } } catch (err) { showToast("Invalid username or password.", "error"); @@ -78,14 +78,13 @@ const LoginPage = () => { }, [IsLoginWithOTP]); useEffect(() => { - const token = - localStorage.getItem("jwtToken") || - sessionStorage.getItem("jwtToken"); + const token = + localStorage.getItem("jwtToken") || sessionStorage.getItem("jwtToken"); - if (token) { - navigate("/dashboard", { replace: true }); - } -}, []); + if (token) { + navigate("/dashboard", { replace: true }); + } + }, []); return (
@@ -182,7 +181,7 @@ const LoginPage = () => {
Forgot Password? @@ -191,11 +190,7 @@ const LoginPage = () => { )} {/* Submit */} -
diff --git a/src/pages/authentication/LoginWithOtp.jsx b/src/pages/authentication/LoginWithOtp.jsx index a1af0e40..615015c3 100644 --- a/src/pages/authentication/LoginWithOtp.jsx +++ b/src/pages/authentication/LoginWithOtp.jsx @@ -21,7 +21,6 @@ const LoginWithOtp = () => { const [loading, setLoading] = useState(false); const [timeLeft, setTimeLeft] = useState(0); - const inputRefs = useRef([]); const { @@ -43,17 +42,16 @@ const LoginWithOtp = () => { try { let requestedData = { email: username, - otp: finalOtp - } - const response = await AuthRepository.verifyOTP(requestedData) + otp: finalOtp, + }; + const response = await AuthRepository.verifyOTP(requestedData); localStorage.setItem("jwtToken", response.data.token); localStorage.setItem("refreshToken", response.data.refreshToken); setLoading(false); localStorage.removeItem("otpUsername"); localStorage.removeItem("otpSentTime"); - navigate("/auth/switch/org"); - + navigate("/auth/switch/org"); } catch (err) { showToast("Invalid or expired OTP.", "error"); @@ -61,7 +59,9 @@ const LoginWithOtp = () => { } }; const formatTime = (seconds) => { - const min = Math.floor(seconds / 60).toString().padStart(2, "0"); + const min = Math.floor(seconds / 60) + .toString() + .padStart(2, "0"); const sec = (seconds % 60).toString().padStart(2, "0"); return `${min}:${sec}`; }; @@ -78,7 +78,6 @@ const LoginWithOtp = () => { } }, []); - useEffect(() => { if (timeLeft <= 0) return; @@ -112,22 +111,22 @@ const LoginWithOtp = () => { } trigger(["otp1", "otp2", "otp3", "otp4"]); } else { - showToast("Invalid OTP format pasted. Please enter 4 digits") + showToast("Invalid OTP format pasted. Please enter 4 digits"); for (let i = 0; i < 4; i++) { - setValue(`otp${i + 1}`, "") - + setValue(`otp${i + 1}`, ""); } } - } - + }; return ( // -
-
+
+

Verify Your OTP

-

Please enter the 4-digit code sent to your email.

+

+ Please enter the 4-digit code sent to your email. +

@@ -139,8 +138,9 @@ const LoginWithOtp = () => { key={num} type="text" maxLength={1} - className={`form-control text-center ${errors[`otp${num}`] ? "is-invalid" : "" - }`} + className={`form-control text-center ${ + errors[`otp${num}`] ? "is-invalid" : "" + }`} ref={(el) => { inputRefs.current[idx] = el; ref(el); @@ -150,7 +150,6 @@ const LoginWithOtp = () => { onChange(e); if (/^\d$/.test(val) && idx < 3) { inputRefs.current[idx + 1]?.focus(); - } else if (val === "" && idx > 0) { inputRefs.current[idx - 1]?.focus(); } @@ -164,7 +163,6 @@ const LoginWithOtp = () => { inputRefs.current[idx - 1]?.focus(); } }} - onPaste={idx === 0 ? handlePaste : undefined} style={{ width: "40px", height: "40px", fontSize: "15px" }} {...rest} @@ -184,7 +182,7 @@ const LoginWithOtp = () => {
+
// ); };