From 603bac7b217a2abc9824466cf33e494628f7176e Mon Sep 17 00:00:00 2001 From: "CHIEFSOFT\\ameye" Date: Mon, 30 Dec 2024 07:46:34 -0500 Subject: [PATCH 01/36] Product updates --- public/index.html | 9 +++++++++ src/assets/img/widget/coming-soon.jpg | Bin 0 -> 40618 bytes src/component/auth/Login2.jsx | 9 ++------- src/component/product/ProductStart.jsx | 18 +++++++++++++++++- src/css/style.scss | 5 ++++- 5 files changed, 32 insertions(+), 9 deletions(-) create mode 100644 src/assets/img/widget/coming-soon.jpg diff --git a/public/index.html b/public/index.html index a45580d..b75e2b3 100644 --- a/public/index.html +++ b/public/index.html @@ -13,6 +13,15 @@ MERMS-Panel + + +
diff --git a/src/assets/img/widget/coming-soon.jpg b/src/assets/img/widget/coming-soon.jpg new file mode 100644 index 0000000000000000000000000000000000000000..48315e55a1dcd67f278a8ac1c58603f0ff51c9d1 GIT binary patch literal 40618 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 literal 0 HcmV?d00001 diff --git a/src/component/auth/Login2.jsx b/src/component/auth/Login2.jsx index 1517044..ce99323 100644 --- a/src/component/auth/Login2.jsx +++ b/src/component/auth/Login2.jsx @@ -118,9 +118,7 @@ export default function Login() {
@@ -128,10 +126,7 @@ export default function Login() {
diff --git a/src/component/product/ProductStart.jsx b/src/component/product/ProductStart.jsx index 256ebc9..6d3a4c4 100644 --- a/src/component/product/ProductStart.jsx +++ b/src/component/product/ProductStart.jsx @@ -11,6 +11,7 @@ export default function ProductStart(props){ const modalRef = useRef() + console.log(props); const hideModal = () => { // modalRef.current.hide() @@ -32,6 +33,21 @@ export default function ProductStart(props){
+
+ <> + Card image cap + + +
+ {/*

Subscription

*/} +

Start with your goals in mind and then work possible.ith yand Goals. If the plan doesn’t support the vision then change it!

+
+
    +
  • Coming soon!!!

  • +
  • +
+
+
{/*Card image cap*/}
@@ -48,7 +64,7 @@ export default function ProductStart(props){ {/* Another link*/} {/*
*/}
- +
diff --git a/src/css/style.scss b/src/css/style.scss index 61ea7ca..13c9f28 100644 --- a/src/css/style.scss +++ b/src/css/style.scss @@ -104,7 +104,10 @@ $event-padding: 10px; padding: 10px; text-align: center; } - +.panel_coming_soon_c3{ + background-color: aliceblue; + border-radius: 10px; +} .panel_round_c1{ background-color: #e6f5f4; border-radius: 10px; From 6814957c2e5a161d7ecd426eda57c605e752bbff Mon Sep 17 00:00:00 2001 From: "CHIEFSOFT\\ameye" Date: Mon, 30 Dec 2024 11:17:19 -0500 Subject: [PATCH 02/36] Procuct ready select --- src/component/product/ProductStart.jsx | 72 ++++++++++++++------------ 1 file changed, 38 insertions(+), 34 deletions(-) diff --git a/src/component/product/ProductStart.jsx b/src/component/product/ProductStart.jsx index 6d3a4c4..e2fdc0a 100644 --- a/src/component/product/ProductStart.jsx +++ b/src/component/product/ProductStart.jsx @@ -8,7 +8,7 @@ export default function ProductStart(props){ const productTitle = props.productData.title; const productDescription = props.productData.description; const promotion_text = props.productData.promotion_text; - + const product_status = props.productData.status; const modalRef = useRef() console.log(props); @@ -33,40 +33,44 @@ export default function ProductStart(props){
-
- <> - Card image cap + { + (product_status===1) ? <> +
+ <> + Card image cap + + +
+ {/*

Subscription

*/} +

Start with your goals in mind and then work possible.ith yand Goals. If the plan doesn’t support the vision then change it!

+
+
    +
  • Coming soon!!!

  • +
  • +
+
+ : <> +
+ {/*Card image cap*/} +
+

Subscription

+

Start with your goals in mind and then work possible.ith yand Goals. If the plan doesn’t support the vision then change it!

+
+
    +
  • {promotion_text}

  • +
  • 90 days free and 3.95/Month
  • +
  • +
+ {/*
*/} + {/* Card link*/} + {/* Another link*/} + {/*
*/} +
+ +
+
- -
- {/*

Subscription

*/} -

Start with your goals in mind and then work possible.ith yand Goals. If the plan doesn’t support the vision then change it!

-
-
    -
  • Coming soon!!!

  • -
  • -
-
- -
- {/*Card image cap*/} -
-

Subscription

-

Start with your goals in mind and then work possible.ith yand Goals. If the plan doesn’t support the vision then change it!

-
-
    -
  • {promotion_text}

  • -
  • 90 days free and 3.95/Month
  • -
  • -
- {/*
*/} - {/* Card link*/} - {/* Another link*/} - {/*
*/} -
- -
-
+ }
From 10c8636bd7351f793cd289ee6bbc733b26b85bce Mon Sep 17 00:00:00 2001 From: "CHIEFSOFT\\ameye" Date: Mon, 30 Dec 2024 11:35:42 -0500 Subject: [PATCH 03/36] Sub scribrr button --- src/component/product/ProductStart.jsx | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/src/component/product/ProductStart.jsx b/src/component/product/ProductStart.jsx index e2fdc0a..d0edc6b 100644 --- a/src/component/product/ProductStart.jsx +++ b/src/component/product/ProductStart.jsx @@ -79,7 +79,7 @@ export default function ProductStart(props){
-
Modal title
+
{productTitle}
@@ -88,19 +88,17 @@ export default function ProductStart(props){

Cras mattis consectetur purus sit amet fermentum. Cras justo odio, dapibus ac facilisis in, egestas eget quam. Morbi leo risus, porta ac consectetur ac, vestibulum at eros. Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Vivamus +

+

sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Aenean lacinia bibendum nulla sed consectetur. Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Donec sed odio dui. Donec ullamcorper nulla non metus auctor fringilla. Cras mattis consectetur purus sit amet fermentum. Cras justo odio, - dapibus ac facilisis in, egestas eget quam. Morbi leo risus, porta ac consectetur - ac, vestibulum at eros. Praesent commodo cursus magna, vel scelerisque nisl consectetur - et. Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Aenean - lacinia bibendum nulla sed consectetur.

- +
From 46621f60c098909df7654d2b2ead68c2292ac1fd Mon Sep 17 00:00:00 2001 From: victorAnumudu Date: Mon, 30 Dec 2024 19:17:52 +0100 Subject: [PATCH 04/36] added select country in complete signup page --- src/component/auth/CSignup.jsx | 237 +++++++++++++++++++-------------- src/services/services.js | 8 ++ 2 files changed, 145 insertions(+), 100 deletions(-) diff --git a/src/component/auth/CSignup.jsx b/src/component/auth/CSignup.jsx index c38db83..c2b203d 100644 --- a/src/component/auth/CSignup.jsx +++ b/src/component/auth/CSignup.jsx @@ -2,35 +2,27 @@ import React, { useEffect, useState } from 'react' import { Form, Formik } from "formik"; import * as Yup from "yup"; -// import LoginImg from '../../assets/bg/login.svg' - -import { Link, useNavigate, useParams, useSearchParams } from 'react-router-dom' +import { Link, useNavigate, useParams } from 'react-router-dom' import siteLinks from '../../links/siteLinks' import { useMutation } from '@tanstack/react-query'; -import { signUpUser } from '../../services/services'; +import { verifyEmail } from '../../services/services'; + +import { IoMdArrowDropdown } from "react-icons/io"; const validationSchema = Yup.object().shape({ - email: Yup.string() - .email("Wrong email format") - // .matches( - // /^[^0-9][a-zA-Z0-9._%+-]+@[a-zA-Z]+(\.[a-zA-Z]+)+$/, - // "Invalid email format" - // ) - .min(3, "Minimum 3 characters") + country: Yup.string().required("Username is required"), + username: Yup.string().min(3, "Minimum 3 characters") .max(50, "Maximum 50 characters") - .required("Email is required"), + .required("Username is required"), password: Yup.string().required("Password is required"), confirmpassword: Yup.string().required("Confirm Password is required").oneOf([Yup.ref('password')], 'Passwords must match') - // lastname: Yup.string().required("Lastname is required"), - // isChecked: Yup.bool().oneOf([true], "Please accept the terms & policy"), // use bool instead of boolean }) const initialValues = { - email: '', + username: '', password: '', + country: '', confirmpassword: '', - // lastname: '', - // isChecked: false, }; export default function CSignup() { @@ -39,19 +31,33 @@ export default function CSignup() { const navigate = useNavigate() - const mutation = useMutation({ +// API to verify email link + const verifyLink = useMutation({ mutationFn: (fields) => { - return signUpUser(fields) + return verifyEmail(fields) }, onSuccess: (res) => { console.log('res', res) + }, + onError: (err) => { + console.log('err', err) } }) - const CSignUp = (values) => { - // helpers.resetForm() - // console.log('values', values, helpers) - // mutation.mutate(values) + const cSignup = useMutation({ + mutationFn: (fields) => { + return null + }, + onSuccess: (res) => { + console.log('res', res) + }, + onError: (err) => { + console.log('err', err) + } + }) + + const completeSignup = (values) => { + // cSignup() console.log('values', values) } @@ -59,7 +65,8 @@ export default function CSignup() { if(!jwt){ return navigate(siteLinks.login, {replace: true}) } - }) + verifyLink.mutate({verify_link: jwt}) + }, []) return (
@@ -72,87 +79,117 @@ export default function CSignup() {

MERMS Panel

-

Welcome, Enter your password.

- Welcome, Enter your password.

*/} +
- {(props) => { - return ( -
-
- {!mutation.isSuccess ? - <> - {/*
-
- - -
-
*/} -
-
- - -
-
-
-
- - -
-
-
-
- - -
-
- - {/*
-
- - -
- {props.errors.isChecked} -
*/} - - {mutation.error && - <> -
-

{mutation.error.message}

-
- - } - -
- -
- - : -
-
-

Check your email to continue.

- Home +
+
+ {verifyLink.isPending ? +
+
+
+

loading...

- } +
+ : verifyLink.isSuccess ? +
+ + {(props) => { + return ( + +
+ <> +
+
+ + {/* */} +
+
+
+
+ +
+ + +
+ {/* */} +
+
+
+
+ + +
+
+
+
+ + +
+
+
+
+ + +
+
+ + {/*
+
+ + +
+ {props.errors.isChecked} +
*/} -
- Need help with logging in or signing up? -
- -
- {/*

Already have an account ? Sign In

*/} -

Ready our Privacy Statement

-
+ {cSignup.error && + <> +
+

{cSignup.error.message}

+
+ + } + +
+ +
+ +
+ + ); + }} +
+
+ : +
+
+
+

{verifyLink?.error?.message}

+
+
+
+ } + +
+ Need help with logging in or signing up?
- - ); - }} - + +
+

Read our Privacy Statement

+
+
+
+
diff --git a/src/services/services.js b/src/services/services.js index 700be83..d1c41ee 100644 --- a/src/services/services.js +++ b/src/services/services.js @@ -58,6 +58,14 @@ export const signUpUser = (reqData) => { return postAuxEnd('/panel/auth/register', postData, false) } +// FUNCTION TO VERIFY EMAIL +export const verifyEmail = (reqData) => { + let postData = { + ...reqData + } + return postAuxEnd('/panel/auth/register/verify', postData, false) +} + // FUNCTION TO RESET USER PASSWORD export const recoverPWD = (reqData) => { From 1bcd26e602f7e012b177f8559558aad944521147 Mon Sep 17 00:00:00 2001 From: victorAnumudu Date: Tue, 31 Dec 2024 10:25:51 +0100 Subject: [PATCH 05/36] subscribe api added --- src/component/product/ProductStart.jsx | 46 ++++++++++++++++++++++++-- src/services/services.js | 9 +++++ 2 files changed, 53 insertions(+), 2 deletions(-) diff --git a/src/component/product/ProductStart.jsx b/src/component/product/ProductStart.jsx index d0edc6b..7269c51 100644 --- a/src/component/product/ProductStart.jsx +++ b/src/component/product/ProductStart.jsx @@ -1,8 +1,13 @@ -import React, { useRef } from "react"; +import React, { useRef, useState } from "react"; import getImage from "../../utils/getImage"; import { Modal } from "bootstrap"; +import { useMutation } from "@tanstack/react-query"; +import { subscribe } from '../../services/services' + export default function ProductStart(props){ + const [requestStatus, setRequestStatus] = useState({status:false, message: ''}) + console.log(props) const productBanner = "product/"+props.productData.banner; const productTitle = props.productData.title; @@ -20,6 +25,29 @@ export default function ProductStart(props){ // modal.hide() } + const mutation = useMutation({ + mutationFn: (fields) => { + return subscribe(fields) + }, + onError: (error) => { + setRequestStatus({status:false, message:'failed, try again'}) + console.log(error) + }, + onSuccess: (res) => { + setRequestStatus({status:true, message:'successful'}) + console.log(res) + }, + // onSettled: () => { + // setTimeout(()=>{ + // setRequestStatus({status:false, message:''}) + // },4000) + // } + }) + + const handleSubscribe = () => { + mutation.mutate({}) + } + return ( <>
@@ -95,10 +123,24 @@ export default function ProductStart(props){ nisl consectetur et. Donec sed odio dui. Donec ullamcorper nulla non metus auctor fringilla. Cras mattis consectetur purus sit amet fermentum. Cras justo odio,

+ {mutation.error && + <> +
+

{mutation.error.message}

+
+ + } + {mutation.isSuccess && + <> +
+

{'subscription is successful'}

+
+ + }
- +
diff --git a/src/services/services.js b/src/services/services.js index d1c41ee..8eaeb7e 100644 --- a/src/services/services.js +++ b/src/services/services.js @@ -66,6 +66,15 @@ export const verifyEmail = (reqData) => { return postAuxEnd('/panel/auth/register/verify', postData, false) } +// FUNCTION TO SUBSCRIBE +export const subscribe = (reqData) => { + let postData = { + ...reqData + } + return postAuxEnd('/panel/myproduct/subscription', postData, false) + // return getAuxEnd('/panel/myproduct/subscription') +} + // FUNCTION TO RESET USER PASSWORD export const recoverPWD = (reqData) => { From 3f9157c81295601a4db6669b754f5c58e7553be6 Mon Sep 17 00:00:00 2001 From: victorAnumudu Date: Tue, 31 Dec 2024 10:32:08 +0100 Subject: [PATCH 06/36] removal of unwanted logs --- src/component/home/TopBar.jsx | 1 - src/component/product/ProductStart.jsx | 14 +++++++------- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/src/component/home/TopBar.jsx b/src/component/home/TopBar.jsx index f2f1fd9..7d2b83c 100644 --- a/src/component/home/TopBar.jsx +++ b/src/component/home/TopBar.jsx @@ -11,7 +11,6 @@ export default function TopBar() { }) const topData = data?.data?.bar_data?.top_bar - console.log('TOP', topData) return ( <> diff --git a/src/component/product/ProductStart.jsx b/src/component/product/ProductStart.jsx index 7269c51..867fc0f 100644 --- a/src/component/product/ProductStart.jsx +++ b/src/component/product/ProductStart.jsx @@ -8,15 +8,15 @@ export default function ProductStart(props){ const [requestStatus, setRequestStatus] = useState({status:false, message: ''}) - console.log(props) - const productBanner = "product/"+props.productData.banner; - const productTitle = props.productData.title; - const productDescription = props.productData.description; - const promotion_text = props.productData.promotion_text; - const product_status = props.productData.status; + console.log(props?.productData?.product_uid) + + const productBanner = "product/"+props.productData?.banner; + const productTitle = props.productData?.title; + const productDescription = props.productData?.description; + const promotion_text = props.productData?.promotion_text; + const product_status = props.productData?.status; const modalRef = useRef() - console.log(props); const hideModal = () => { // modalRef.current.hide() From 9011a83259a40f154fbf76633d5a43c5fc81a69a Mon Sep 17 00:00:00 2001 From: victorAnumudu Date: Tue, 31 Dec 2024 14:33:11 +0100 Subject: [PATCH 07/36] subscribe api bug fix --- src/component/product/ProductStart.jsx | 30 +++++++++++++++----------- src/services/services.js | 1 - 2 files changed, 17 insertions(+), 14 deletions(-) diff --git a/src/component/product/ProductStart.jsx b/src/component/product/ProductStart.jsx index 867fc0f..8ded5ef 100644 --- a/src/component/product/ProductStart.jsx +++ b/src/component/product/ProductStart.jsx @@ -8,8 +8,7 @@ export default function ProductStart(props){ const [requestStatus, setRequestStatus] = useState({status:false, message: ''}) - console.log(props?.productData?.product_uid) - + const product_uid = props?.productData?.product_uid; const productBanner = "product/"+props.productData?.banner; const productTitle = props.productData?.title; const productDescription = props.productData?.description; @@ -31,21 +30,21 @@ export default function ProductStart(props){ }, onError: (error) => { setRequestStatus({status:false, message:'failed, try again'}) - console.log(error) + console.log('ERROR IS', error) }, onSuccess: (res) => { setRequestStatus({status:true, message:'successful'}) console.log(res) }, - // onSettled: () => { - // setTimeout(()=>{ - // setRequestStatus({status:false, message:''}) - // },4000) - // } + onSettled: () => { + setTimeout(()=>{ + setRequestStatus({status:false, message:''}) + },4000) + } }) const handleSubscribe = () => { - mutation.mutate({}) + mutation.mutate({product_id: product_uid}) } return ( @@ -123,7 +122,7 @@ export default function ProductStart(props){ nisl consectetur et. Donec sed odio dui. Donec ullamcorper nulla non metus auctor fringilla. Cras mattis consectetur purus sit amet fermentum. Cras justo odio,

- {mutation.error && + {/* {mutation.error && <>

{mutation.error.message}

@@ -133,10 +132,15 @@ export default function ProductStart(props){ {mutation.isSuccess && <>
-

{'subscription is successful'}

-
+

{'subscription is successful'}

+
- } + } */} + {requestStatus.message && ( +
+

{requestStatus.message}

+
+ )}
diff --git a/src/services/services.js b/src/services/services.js index 8eaeb7e..8e11532 100644 --- a/src/services/services.js +++ b/src/services/services.js @@ -72,7 +72,6 @@ export const subscribe = (reqData) => { ...reqData } return postAuxEnd('/panel/myproduct/subscription', postData, false) - // return getAuxEnd('/panel/myproduct/subscription') } From f64e1885986fe6f87f3be847bd3cba1c97c72b5d Mon Sep 17 00:00:00 2001 From: victorAnumudu Date: Tue, 31 Dec 2024 14:38:47 +0100 Subject: [PATCH 08/36] signup bg size fixed --- src/App.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/App.css b/src/App.css index 79280ae..b389f38 100644 --- a/src/App.css +++ b/src/App.css @@ -6,6 +6,6 @@ .signup-bg { background-image: url('./assets/bg/signup_bg.jpg') !important; - background-size: 100%; + background-size: cover; background-repeat: no-repeat; } \ No newline at end of file From 0dfae27896d1422c6314eb760ad2342b456bff3a Mon Sep 17 00:00:00 2001 From: "CHIEFSOFT\\ameye" Date: Tue, 31 Dec 2024 08:51:43 -0500 Subject: [PATCH 09/36] Users layout --- src/component/users/Users.jsx | 508 +++++++++++++++++++++++++++++++++- 1 file changed, 505 insertions(+), 3 deletions(-) diff --git a/src/component/users/Users.jsx b/src/component/users/Users.jsx index b5b7129..ff62058 100644 --- a/src/component/users/Users.jsx +++ b/src/component/users/Users.jsx @@ -7,9 +7,511 @@ export default function Users(){ return( <> -
-
Coming Soon
-
+ <> + {/*
*/} + {/*
Coming Soon
*/} + {/*
*/} +
+
+
+
+
+
+ +
+
+

Lizzy Halfman

+

Home

+
+
+
+
    +
  • +
    +
  • +
  • +

    021-843-8478

    +
  • +
+
    +
  • +
    +
  • +
  • +

    40-1440-8546

    +
  • +
+
    +
  • +
    +
  • +
  • +

    Lizzy.Halfman@gmail.com

    +
  • +
+
+
+
+
+
+
+
+
+
+ +
+
+

Samuel Woods

+

Friends

+
+
+
+
    +
  • +
    +
    +
    +
  • +
  • +

    026-123-8546

    +
  • +
+
    +
  • +
    +
  • +
  • +

    80-1230-8546

    +
  • +
+
    +
  • +
    +
  • +
  • +

    Samuel.Woods@gmail.com

    +
  • +
+
+
+
+
+
+
+
+
+
+ +
+
+

Garettdon

+

Office

+
+
+
+
    +
  • +
    +
  • +
  • +

    026-123-8546

    +
  • +
+
    +
  • +
    +
  • +
  • +

    80-1230-8546

    +
  • +
+
    +
  • +
    +
  • +
  • +

    Garettdon@gmail.com

    +
  • +
+
+
+
+
+
+
+
+
+
+ +
+
+

Garynice

+

Home

+
+
+
+
    +
  • +
    +
  • +
  • +

    026-123-8546

    +
  • +
+
    +
  • +
    +
  • +
  • +

    80-1230-8546

    +
  • +
+
    +
  • +
    +
  • +
  • +

    Garynice@gmail.com

    +
  • +
+
+
+
+
+
+
+
+
+
+ +
+
+

Andrew nico

+

Friends

+
+
+
+
    +
  • +
    +
  • +
  • +

    026-123-8546

    +
  • +
+
    +
  • +
    +
  • +
  • +

    80-1230-8546

    +
  • +
+
    +
  • +
    +
  • +
  • +

    Andrew.nico@gmail.com

    +
  • +
+
+
+
+
+
+
+
+
+
+ +
+
+

Michaelveld

+

Office

+
+
+
+
    +
  • +
    +
  • +
  • +

    026-123-8546

    +
  • +
+
    +
  • +
    +
  • +
  • +

    80-1230-8546

    +
  • +
+
    +
  • +
    +
  • +
  • +

    Michaelveld@gmail.com

    +
  • +
+
+
+
+
+
+
+
+
+
+ +
+
+

Jimmy Falicon

+

Home

+
+
+
+
    +
  • +
    +
  • +
  • +

    026-123-8546

    +
  • +
+
    +
  • +
    +
  • +
  • +

    80-1230-8546

    +
  • +
+
    +
  • +
    +
  • +
  • +

    Jimmy.Falicon@gmail.com

    +
  • +
+
+
+
+
+
+
+
+
+
+ +
+
+

Richardket

+

Friends

+
+
+
+
    +
  • +
    +
  • +
  • +

    026-123-8546

    +
  • +
+
    +
  • +
    +
  • +
  • +

    80-1230-8546

    +
  • +
+
    +
  • +
    +
  • +
  • +

    Richardket@gmail.com

    +
  • +
+
+
+
+
+
+
+
+
+
+ +
+
+

Jenny Smithnig

+

Office

+
+
+
+
    +
  • +
    +
  • +
  • +

    026-123-8546

    +
  • +
+
    +
  • +
    +
  • +
  • +

    80-1230-8546

    +
  • +
+
    +
  • +
    +
  • +
  • +

    Jenny Smithnig@gmail.com

    +
  • +
+
+
+
+
+
+
+
+
+
+ +
+
+

Garettdon

+

Home

+
+
+
+
    +
  • +
    +
  • +
  • +

    026-123-8546

    +
  • +
+
    +
  • +
    +
  • +
  • +

    80-1230-8546

    +
  • +
+
    +
  • +
    +
  • +
  • +

    Garettdon@gmail.com

    +
  • +
+
+
+
+
+
+
+
+
+
+ +
+
+

Lizzy Halfman

+

Friends

+
+
+
+
    +
  • +
    +
    +
    +
  • +
  • +

    026-123-8546

    +
  • +
+
    +
  • +
    +
  • +
  • +

    80-1230-8546

    +
  • +
+
    +
  • +
    +
  • +
  • +

    your@gmail.com

    +
  • +
+
+
+
+
+
+
+
+
+
+ +
+
+

Brian Joedon

+

Office

+
+
+
+
    +
  • +
    +
  • +
  • +

    026-123-8546

    +
  • +
+
    +
  • +
    +
  • +
  • +

    80-1205-8156

    +
  • +
+
    +
  • +
    +
  • +
  • +

    Brian.Joedon@gmail.com

    +
  • +
+
+
+
+
+
+ + + ) } \ No newline at end of file From 1a2d137f1271edcb0f23339a76abc0a71e8a46fd Mon Sep 17 00:00:00 2001 From: "CHIEFSOFT\\ameye" Date: Tue, 31 Dec 2024 09:01:26 -0500 Subject: [PATCH 10/36] Settings page --- src/component/settings/Settings.jsx | 287 +++++++++++++++++++++++++++- 1 file changed, 285 insertions(+), 2 deletions(-) diff --git a/src/component/settings/Settings.jsx b/src/component/settings/Settings.jsx index 27ad758..c79b29d 100644 --- a/src/component/settings/Settings.jsx +++ b/src/component/settings/Settings.jsx @@ -7,9 +7,292 @@ export default function Settings(){ return( <> -
-
Coming Soon
+ {/*
*/} + {/*
Coming Soon
*/} + {/*
*/} + + +
+
+
+
+
+
+
+
+
+
+ users-avatar +
+
+

Alice Williams

+

Enthusiast

+
+
+
+ +
+
    +
  • +
    +

    90

    +

    Post

    +
    +
  • + +
  • +
    +

    1.5K

    +

    Messages

    +
    +
  • + +
  • +
    +

    4.4K

    +

    Members

    +
    +
  • +
+
+ +
+
+ +
+
+ +
+
+
+
+
+
+
+
Edit Your Personal Settings
+
+
+
+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+
+ + +
+
+ + +
+ +
+
+ +
+
+ +
+
+ +
+ +
+ +
+
+
+
+ + +
+
+ + +
+
+ + +
+
+
+
+ + +
+
+ +
+
+
+
+
+
+
+
Your External Link
+
+
+
+
+ + +
+
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+
+
+
+
+
+
+
+ ) } \ No newline at end of file From 27e30c1e348a0d1c4e601e6426f298995a916f64 Mon Sep 17 00:00:00 2001 From: victorAnumudu Date: Thu, 2 Jan 2025 10:33:34 +0100 Subject: [PATCH 11/36] dropdown fix started --- public/index.html | 2 + src/component/layout/layoutcom/UserHeader.jsx | 222 +----------------- 2 files changed, 4 insertions(+), 220 deletions(-) diff --git a/public/index.html b/public/index.html index b75e2b3..a7067ac 100644 --- a/public/index.html +++ b/public/index.html @@ -26,4 +26,6 @@
+ + diff --git a/src/component/layout/layoutcom/UserHeader.jsx b/src/component/layout/layoutcom/UserHeader.jsx index bf0aff0..5845286 100644 --- a/src/component/layout/layoutcom/UserHeader.jsx +++ b/src/component/layout/layoutcom/UserHeader.jsx @@ -64,230 +64,12 @@ export default function UserHeader(){
    - {/*
  • - - -
  • */} - {/*
  • - - -
  • */} - {/*
  • - - - -
    -
    - -
    -
    -
    -
    - - -
    -
    -
    -
    -
  • */}
  • - avtar-img -
    +
    From a60a18dce8d5f3c3e27cc1881559f83dd10340f9 Mon Sep 17 00:00:00 2001 From: victorAnumudu Date: Fri, 3 Jan 2025 21:17:46 +0100 Subject: [PATCH 12/36] menu drop down fix --- src/component/layout/layoutcom/UserHeader.jsx | 1 + 1 file changed, 1 insertion(+) diff --git a/src/component/layout/layoutcom/UserHeader.jsx b/src/component/layout/layoutcom/UserHeader.jsx index 5845286..88d210c 100644 --- a/src/component/layout/layoutcom/UserHeader.jsx +++ b/src/component/layout/layoutcom/UserHeader.jsx @@ -12,6 +12,7 @@ export default function UserHeader(){ const toggleSidebar = (e) => { e.preventDefault() document.body.classList.toggle('sidebar-toggled') + document.querySelector('.navbar-collapse').classList.remove('show') } const removeSidebar = (e) => { From 68c4bbbca7cb0b5785719a53854e05fd4a59175f Mon Sep 17 00:00:00 2001 From: "CHIEFSOFT\\ameye" Date: Sun, 5 Jan 2025 17:50:39 -0500 Subject: [PATCH 13/36] New active [product page --- src/component/product/ProductActive.jsx | 173 +++++++++++++++++++++ src/component/product/ProductFactory.jsx | 17 +- src/component/product/ProductProvision.jsx | 91 +++++++++++ src/component/product/ProductStart.jsx | 3 +- src/constants/products.js | 5 + 5 files changed, 285 insertions(+), 4 deletions(-) create mode 100644 src/component/product/ProductActive.jsx create mode 100644 src/component/product/ProductProvision.jsx create mode 100644 src/constants/products.js diff --git a/src/component/product/ProductActive.jsx b/src/component/product/ProductActive.jsx new file mode 100644 index 0000000..92c4e16 --- /dev/null +++ b/src/component/product/ProductActive.jsx @@ -0,0 +1,173 @@ +import React from "react"; +import getImage from "../../utils/getImage"; +import BreadcrumbComBS from "../breadcrumb/BreadcrumbComBS"; + + +export default function ProductActive(){ + + return( + <> + + {/*
    */} + {/*
    Coming Soon
    */} + {/*
    */} + + +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + users-avatar +
    +
    +

    Alice Williams

    +

    Enthusiast

    +
    +
    +
    + +
    +
      +
    • +
      +

      90

      +

      Post

      +
      +
    • + +
    • +
      +

      1.5K

      +

      Messages

      +
      +
    • + +
    • +
      +

      4.4K

      +

      Members

      +
      +
    • +
    +
    + +
    +
    + +
    +
    + +
    +
    +
    +
    +
    +
    +
    +
    Edit Your Personal Settings
    +
    +
    +
    +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    +
    + + +
    +
    + + +
    + + + +
    +
    +
    +
    +
    +
    +
    +
    Your External Link
    +
    +
    +
    +
    + + +
    +
    + + +
    + +
    + + +
    + +
    + + +
    + +
    + + +
    + +
    + + +
    + +
    +
    +
    +
    +
    +
    +
    +
    +
    + + + ) +} \ No newline at end of file diff --git a/src/component/product/ProductFactory.jsx b/src/component/product/ProductFactory.jsx index 9efeea5..81648c9 100644 --- a/src/component/product/ProductFactory.jsx +++ b/src/component/product/ProductFactory.jsx @@ -1,4 +1,4 @@ -import React from "react"; +import React, {useState} from "react"; import { useQuery } from '@tanstack/react-query' import BreadcrumbComBS from "../breadcrumb/BreadcrumbComBS"; // import getImage from "../../utils/getImage"; @@ -6,12 +6,18 @@ import ProductStart from "./ProductStart"; import { useLocation } from 'react-router-dom'; import {MyProductData, productData} from "../../services/services"; import queryKeys from "../../services/queryKeys"; +import ProductActive from "./ProductActive"; +import ProductProvision from "./ProductProvision"; +import {productConst} from "../../constants/products"; export default function ProductFactory(){ const location = useLocation(); const pathname = location.pathname; + const [productStatus, setProductStatus] = useState(0); + + //productConst.PRODUCT_ACTIVE + - // Split the pathname by '/' and get the last element const lastPart = pathname.split('/').pop(); console.log(lastPart) @@ -21,10 +27,15 @@ export default function ProductFactory(){ queryFn: () => MyProductData(lastPart) }) + + const myproduct_data = data?.data?.myproduct_data + //setProductStatus(myproduct_data?.status) const product_name = myproduct_data?.product_name; + // const product_status = myproduct_data?.status; + return( <> @@ -46,6 +57,8 @@ export default function ProductFactory(){ :
    + +
    }
    diff --git a/src/component/product/ProductProvision.jsx b/src/component/product/ProductProvision.jsx new file mode 100644 index 0000000..6b2d248 --- /dev/null +++ b/src/component/product/ProductProvision.jsx @@ -0,0 +1,91 @@ +import getImage from "../../utils/getImage"; + +export default function ProductProvision(){ + + return <> +
    +
    +
    +
    +
    +

    Creating - Your personal professional web

    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + + +
    +
    +
    + +
    + +
    +
    +
    +

    Progress Information

    +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + +
    #Action
    1Start Creation
    2Update Access Routes
    3Veryfing ...
    +
    +
    +
    +
    + +
    +
    + Card image cap +
    + {/*

    Commitment

    */} +

    Commitment is something that comes from understanding that + everything has its price and then having the willingness to pay that price. This is + important because nobody wants to put significant effort into something, only to + find out after the fact that the price was too high.The price is something not + necessarily defined as financial. It could be time, effort, sacrifice, money or + perhaps, something else.

    +
    +
    + +
    + + +
    + +} \ No newline at end of file diff --git a/src/component/product/ProductStart.jsx b/src/component/product/ProductStart.jsx index 8ded5ef..9ae5159 100644 --- a/src/component/product/ProductStart.jsx +++ b/src/component/product/ProductStart.jsx @@ -68,8 +68,7 @@ export default function ProductStart(props){
    - {/*

    Subscription

    */} -

    Start with your goals in mind and then work possible.ith yand Goals. If the plan doesn’t support the vision then change it!

    +

    Start with your goals in mind and then work possible.

    • Coming soon!!!

    • diff --git a/src/constants/products.js b/src/constants/products.js new file mode 100644 index 0000000..a90af7f --- /dev/null +++ b/src/constants/products.js @@ -0,0 +1,5 @@ +export const productConst = { + PRODUCT_AVAILABLE: 0, + PRODUCT_PROVISIONING: 5, + PRODUCT_ACTIVE: 7, +}; \ No newline at end of file From 7d3ec88c1b1df6b6a23da6470f34895cf6a6af0d Mon Sep 17 00:00:00 2001 From: "CHIEFSOFT\\ameye" Date: Sun, 5 Jan 2025 20:13:43 -0500 Subject: [PATCH 14/36] Clean app part show --- src/component/product/ProductActive.jsx | 39 ++---------------------- src/component/product/ProductFactory.jsx | 17 ++++++++--- src/constants/products.js | 4 +-- 3 files changed, 18 insertions(+), 42 deletions(-) diff --git a/src/component/product/ProductActive.jsx b/src/component/product/ProductActive.jsx index 92c4e16..423869a 100644 --- a/src/component/product/ProductActive.jsx +++ b/src/component/product/ProductActive.jsx @@ -27,52 +27,19 @@ export default function ProductActive(){ alt="users-avatar" />
    -

    Alice Williams

    -

    Enthusiast

    +

    Product Short Name

    +

    last Update : 00:00:0000

    -
    -
      -
    • -
      -

      90

      -

      Post

      -
      -
    • -
    • -
      -

      1.5K

      -

      Messages

      -
      -
    • - -
    • -
      -

      4.4K

      -

      Members

      -
      -
    • -
    -
    - -
    -
    - -
    -
    - -
    -
-
Edit Your Personal Settings
+
Edit Your Product Settings
diff --git a/src/component/product/ProductFactory.jsx b/src/component/product/ProductFactory.jsx index 81648c9..154ab91 100644 --- a/src/component/product/ProductFactory.jsx +++ b/src/component/product/ProductFactory.jsx @@ -34,7 +34,7 @@ export default function ProductFactory(){ const product_name = myproduct_data?.product_name; - // const product_status = myproduct_data?.status; + const product_status = myproduct_data?.status; return( <> @@ -56,9 +56,18 @@ export default function ProductFactory(){
:
- - - + {(product_status <= productConst.PRODUCT_AVAILABLE)? + + :<> } + + {(product_status === productConst.PRODUCT_PROVISIONING)? + + :<> } + + {(product_status === productConst.PRODUCT_ACTIVE)? + + :<> } +
}
diff --git a/src/constants/products.js b/src/constants/products.js index a90af7f..44ccbc9 100644 --- a/src/constants/products.js +++ b/src/constants/products.js @@ -1,5 +1,5 @@ export const productConst = { - PRODUCT_AVAILABLE: 0, - PRODUCT_PROVISIONING: 5, + PRODUCT_AVAILABLE: 5, + PRODUCT_PROVISIONING: 6, PRODUCT_ACTIVE: 7, }; \ No newline at end of file From 5b0f79bba5019ce280eca01a775c06a040cfb8a7 Mon Sep 17 00:00:00 2001 From: "CHIEFSOFT\\ameye" Date: Mon, 6 Jan 2025 13:39:04 -0500 Subject: [PATCH 15/36] Clear data --- src/component/home/Products.jsx | 33 +++++++++++++++++---------------- 1 file changed, 17 insertions(+), 16 deletions(-) diff --git a/src/component/home/Products.jsx b/src/component/home/Products.jsx index 67d3893..e4eba8a 100644 --- a/src/component/home/Products.jsx +++ b/src/component/home/Products.jsx @@ -10,8 +10,20 @@ export default function Products() { queryKey: queryKeys.product, queryFn: () => productData() }) - - const products = data?.data?.products_data?.products +/* + { + "banner": "p1.jpg", + "description": "Your personal professional web presence", + "id": 1, + "name": "Personal Website", + "product_id": "A000001", + "product_uid": "e92282b4-3ee1-4026-92ac-12cfd214b43a", + "status": 5, + "status_text": "Activate Now" + }, + */ + //const products = data?.data?.products_list?.products + const products = data?.data?.products_list return ( <> @@ -38,31 +50,20 @@ export default function Products() {
{products && products.map((product, index) => (
- +
-

{product?.status}

-

{product?.description}

+

{product?.status_text}

+

{product?.name}

))} - {/*
*/} - {/*
*/} - {/*
*/} - {/* */} - {/*
*/} - {/*
*/} - {/*

Annual Revenue

*/} - {/*

$40,516

*/} - {/*
*/} - {/*
*/} - {/*
*/}
}
From e15fa4ddd0cbdf9c685a8a63fd1a4401adf05419 Mon Sep 17 00:00:00 2001 From: victorAnumudu Date: Tue, 7 Jan 2025 23:48:56 +0100 Subject: [PATCH 16/36] adding complete registration endpoint started --- src/component/auth/CSignup.jsx | 49 ++++++++++++++++++++++------------ src/services/services.js | 8 ++++++ 2 files changed, 40 insertions(+), 17 deletions(-) diff --git a/src/component/auth/CSignup.jsx b/src/component/auth/CSignup.jsx index c2b203d..9fa2746 100644 --- a/src/component/auth/CSignup.jsx +++ b/src/component/auth/CSignup.jsx @@ -5,7 +5,7 @@ import * as Yup from "yup"; import { Link, useNavigate, useParams } from 'react-router-dom' import siteLinks from '../../links/siteLinks' import { useMutation } from '@tanstack/react-query'; -import { verifyEmail } from '../../services/services'; +import { completeRegistration, verifyEmail } from '../../services/services'; import { IoMdArrowDropdown } from "react-icons/io"; @@ -31,34 +31,48 @@ export default function CSignup() { const navigate = useNavigate() + const [user, setUser] = useState(null) + // API to verify email link const verifyLink = useMutation({ mutationFn: (fields) => { return verifyEmail(fields) }, onSuccess: (res) => { - console.log('res', res) + setUser(res.data) }, - onError: (err) => { - console.log('err', err) - } + // onError: (err) => { + // console.log('err', err) + // } }) const cSignup = useMutation({ mutationFn: (fields) => { - return null + return completeRegistration(fields) }, onSuccess: (res) => { - console.log('res', res) - }, - onError: (err) => { - console.log('err', err) + const {token, room} = res?.data?.data + if(token){ + localStorage.setItem('token', token) + localStorage.setItem('room', room) + // const data = {token} + // dispatch(updateUserDetails({ ...data })); + navigate('/dash') // later add redux to dispatch state + } } + // onError: (err) => { + // console.log('err', err) + // } }) const completeSignup = (values) => { - // cSignup() - console.log('values', values) + let reqData = { + country : values.country, + username: values.username, + password: values.password, + verify_link: user.verify_link + } + cSignup.mutate(reqData) } useEffect(()=>{ @@ -106,21 +120,22 @@ export default function CSignup() { <>
- + {/* */}
-
+
- - + {user?.country?.list && user?.country?.list?.map(item => ( + + ))}
- {/* */}
diff --git a/src/services/services.js b/src/services/services.js index 8e11532..f02e56b 100644 --- a/src/services/services.js +++ b/src/services/services.js @@ -66,6 +66,14 @@ export const verifyEmail = (reqData) => { return postAuxEnd('/panel/auth/register/verify', postData, false) } +// FUNCTION TO COMPLETE REGISTRATION +export const completeRegistration = (reqData) => { + let postData = { + ...reqData + } + return postAuxEnd('/panel/auth/register/complete', postData, false) +} + // FUNCTION TO SUBSCRIBE export const subscribe = (reqData) => { let postData = { From 8d9eabe8773921325bbdce19fcd0eaec30009968 Mon Sep 17 00:00:00 2001 From: victorAnumudu Date: Fri, 10 Jan 2025 13:25:00 +0100 Subject: [PATCH 17/36] product uid changed to product id --- src/component/product/ProductStart.jsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/component/product/ProductStart.jsx b/src/component/product/ProductStart.jsx index 9ae5159..d9d4d80 100644 --- a/src/component/product/ProductStart.jsx +++ b/src/component/product/ProductStart.jsx @@ -9,6 +9,7 @@ export default function ProductStart(props){ const [requestStatus, setRequestStatus] = useState({status:false, message: ''}) const product_uid = props?.productData?.product_uid; + const product_id = props?.productData?.product_id; const productBanner = "product/"+props.productData?.banner; const productTitle = props.productData?.title; const productDescription = props.productData?.description; @@ -44,7 +45,7 @@ export default function ProductStart(props){ }) const handleSubscribe = () => { - mutation.mutate({product_id: product_uid}) + mutation.mutate({product_id: product_id}) } return ( From 656e3fd24a0d9f13d794a9a42cc7bf8553ad9bbf Mon Sep 17 00:00:00 2001 From: "CHIEFSOFT\\ameye" Date: Fri, 10 Jan 2025 11:55:16 -0500 Subject: [PATCH 18/36] added image --- src/assets/img/widget/working.jpg | Bin 0 -> 41784 bytes src/component/product/ProductProvision.jsx | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 src/assets/img/widget/working.jpg diff --git a/src/assets/img/widget/working.jpg b/src/assets/img/widget/working.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ce8c5e360794bf809459a00091f7b0281bd5657f GIT binary patch literal 41784 zcmcG#1ymi&7AD;19NgXAJ-EBOy9IZ5P0--(?wSAzZUGY9-6gmL_XH9$_TuFtGrr+}!cjkAZdyN$C883zk1z$-4N1O@Y39e@R3Kp^1x z=Pw@hUp%zG%0G%<+eo@{5)v;})m5bB6s3Nv14y!pwocCAXI)1p4>xrgaWY*!eKOby z01UtbFaR3>n3}u0C}~J*{&plMB|+x?tn`P|XLz^pSC4>MW?5A-vVY3{uQhaY7dMaR zl&C&ya#&cpn?K{QXYAnZ;qse*@r<#|?0;i0)Nkze+`wmy_ZwUPjhX(^`5TM=#ukoF z7SB4r+w5ZDXz?5OJ>y6(Ps?WvQGCX4ylgGKpYhx?rgHFfw0*|ko-vlArKvjrKq39+ zdsv#=JY&{pjO3=NF7b>7p9d1j`VVaO2llY^d2S~FNI1Lry4hOWc#zSV)046B@$r($ zT6#NJdU!Canws02x>=A(I6JzSI{5;?-+lgV1z`NnE!lIDx!L%*xtZBnp40y?`acT) zrS*RXzsL4(jcc{P#teir_HW+5ZU4=4E(QSJ+vnUQ{+nl(1pqDK0D!mhZyr@40HB5e zK=b4u{lWP?Uu--)T=-wS@b>m*v9&a3`JK>z(f?K9Uz-0N{1K1kcf5b)j!e?h%GA@r zgY0)w&7B>bJ>AIMT};g_$(a9h68}FN{?V*I+QFo5X=UkV>GT{*`+1hxI$1vtx08jf zhpn>{nXS`*8{z*)vp?GK8~#17p8;m+6M*%S1wfm`0wAYj02C%705QyemVo{>Zi?{Q z!0$UxhxFj@dH;-`<$sm`D8LENRj|9QHQ8^rgt{h~xu=`gZ~S~u{4SsY1OOGl0`LJ6 zfD)hsm;rWx2M_>60VzNpPysXnJ-`?+2W$XGzzy&Q0)SxP4G;q)0%<@tPymzyRX{CJ z53~TCz$ah;7zL()d0-XT1onVq-~zY<9zh@wEC?Bd3Bm`Ff~Y}^Aa)QhNEjpqQUs}k z^gt#cYmgJj6BGan1;v1pLD`@pP!;F{s15W9Gz^*sErYf|N1!Xv0~i8E0%L)R!8G6( zU|z5oSOKgFHUe9NUBQ0fFmOCL6I={_2W|#`0*`{{!JFV?@GS&@AVP2;O z0?~(9LEIp(AkmO?NHL@q(heDf%tAIHCy?(@Fi@CKWKhgd0#LG0T2SUtu28R_Vxh93 zDxsR8`k-c^wxBMco}iJTiJ%#w`Jv^Yb)l`Hy`kSgr$d)RH$nG9&qMD)-@(AZ;K0zr z@W9Bz=)u^*_`}4)AKMQF2h4QD#uiP~lOj zQN>V=QTl&`i-@q2-{pp)I1_qGO`7p{t-fqQ|0FqYtAWV!&e1 zU`SzDV1!|mVDw__U_vk{F(oj~F+(v+G5az1uwbxgvE;Dquwt-kuqLoBuraVXv9+;% zuye3KVsGL=aAgaief+ac6Mv@d)um@htJ8@#^sA@gDHW z@TKtW@ssdd@Ye~T2p9;|2)qgM3Hk|62(btS2+awj3F`@0h`>Y)MCwHTL?uLHM7P8w z#4^M##973>#3v*;B%&mCB&j4_BuAu}q{5`Oq^YFcq+iLf$;8MU$TG?L$S%l<$Yser z$&1J*$R8@xbM-M~KOK(q~M?b{?X5eD5VaQ>aWCSyE zGukrdF-|if{G9xjIF?%t;W!_@JVNqlWVQFDGdqMR=|3%V^!52@gT&xbP zrL3!L7;N%vA#CkzSL_Vz=IlA_a~#MV(j2cjS~)H`896OE^EsEeFu9btBDg+t{p9B1 zcH^$)KH{O`G2zMOS>(myRppK49pZ!L6X$!)*U9&tpPS!3aT$S8~ zJdb>!e4hf6f`&r2!nPuVqMKs75?D!IDMe{bnOfONxkUv~kyA-gSy!c1bye+9gHcme z%Te1`XHySQAJo9qc&SmXai=M+nV`9T1KCHgBe!2dwfs{d-!JZ+P;TyvRBU&RLqhVtLV+Z4pFHv8bzHBgoHqkMuHu+(y zVp?o^YbIxwYj$BSVV+@rY$0lqYH?&KWSMMvU?pUgY;|ZYWSwGtWFumeZgXNQVViAx zX(ww}V0Uk?VqanZ%R$GX&JoVh#Iel@!^z&M&zZ#8$9dX?(dCWHrYpZ|n(Kv|f?K&e z$lb`j)dTB!Gd1Q(=Nay~9BokB_j1X)eJRZUtk{ogqsuS8CMjRFtwi7NB{`L*Z z8@D%$5dskfkx-GgkrPoIQCU$>(H7AoF|0A^F+XC>V@KlH;xglY#aqQsBycC>C&DB; zB`ze1BvmG(C;KJuq$s5{r;?>cr{1K!OdC$;OfSel$nebA%v8*5&7#Um%=(dSlRcj! zo>P}glpB?MpJ$OblP{WITR>b8Q}9q|TewstQ`B5cQ=DD`Q{q*!U#eX?SjJmcRZdVI zQ~tBUsbaHIy|S;0r>d%&s5;>-_^s#Lqj!eyrfMW>T5FkWi|TOdV%`JqJ>P%*VDe$1 zUZMVT18+lZBXwhL6J}F%GpO0O`J%<9WwTYUb-GQy?Q^?8ds7EXM@1)jXU<3Lj|p7} zU143ny8XIudt7=>K3RX-`TX+pYOikZT%TIsM887+(17$n@1WRV_mI#~=P>_p+X(MS z%P99~^BC7y(>T|7(**ZK^CZt?>lEKq`?TP6*Nn)_r&-C_fjPOk(Rt@HYrA5QV z%_WPa!)1r%%N4Jc$JL-U=(Xr|wDt52qK)D&^k3>Wxi>#^zb_n)+(+b??~a`0?b;Df(&d8Qodqx#;=Wh3>`PrQ7ANtJrJ& z>xvuBo6onZw;OkkcaQhc-|)Xxe&_u@_@MJ}@aX*m_DAMV`k(Dj3Qudl9Dn`#bq0`& zSvZ?n0v4jrdjSvxK!boGe;-YLZw{X6*D4SOfd561X9R(IE+J6RP`?Qp2Kq08fq{jE zgN22Ghetqwhe!G+fglhFG!!&E3=BLn0z3jTD#|mVqW-1yKQBms*ZyhuuiCHA06H8f z5v&UVp#xxa5Ck3cs}F?zyyF2uL4Kcy{ujYQ!@$8qpb)^%n+^a3{ig^3{cbc2EF9YN zt_K2!217xh;lO{L-+l`K7+7>TG*xm8crrFt3QR0f6KpYdN@^UJAPy=n8eCp(JWg7k z=is2{3_(Fd!^0!O!65$jiT>M`oDD-v4HMSXHJAb`sptc{IGXAwbu+hmN^G)_WDY6| z4;(mFlj&j!4RiN~#-^>5Sx#zCFI>^klCV@Bm!QwRlA2snT9z~zza2tg;ozRL3;EqG z5IPtjhoG^EsXe<+!hj-EH7WY=X`14KUHsWSCMB!rR&q!^hXj^OP-5|=xjXc)6#(fu zBVcq0`m_0$&Ht5{|39xd_;|Qgud##vYYb@C#de#><6NuZk){8tgjX&qS5o{YpUU!6 zn&^MiBJsZD)?LPSI_J>A!`X7i-d5%2|8Kf*!i?8)aXI)3Gc?kumc(-2veW3G=Gn~u zq7P+`?OWEnB5`BXxSyNfkszc#$@7G6NJ9xyZ<9O;Ts z>8aMJ?&IT}vs&-wd_DmDCvm;A2^7$hEVg##4|!VF zxL?EI?xAIM6#Xvx;@&Ac@*hr~D+JxjImqXf(nmK8v6att*sb`7R~69T z&K1Ib{sKN9lk)x~zV;{a``E9K*Y<5EtNZ)cwl5=`O|N3YyO>|@f2>_^e=YhSPGQP0 zt1)N5?09_~FM6JD0+sT8jH``^Xu|@3nVjkKsVDHoqcm_|PS4zmB@6Qb;@-Bd0_LE-vafPTg@3AEO!N8bt@d*w#BS$5DhF8(3IY9IF4|?(kaWvT7&rvoiv=%YVk8kI129 z8y^c2hfNQ=R@kQvCwAY~LmcsE@!W9CDY{~b(|$KPo$zRY=bz%obGre_W_D3Cit6`c zzP?(V$*5Vw`(jkz@U!Ire<055ZuUm^u#YJY#&72ahgsXt-L3@JnZWr!ZdXe4(d0lp ze5`2S1x|Qu(||!`BaW~i)CPpiJGI`NwBARFz`a^ zWlZ58JtmEiEKl7T=WFfTs}@$Nw5L>Pnyo$8QOeLJ#ej1fh^-dF z!TTLyCwnhQ!h)Rk6(eJA)gRHJd<+h@P&467R@_8~Al8*XDI?!XbKs5W)_<4b_chJc zbnvRM_9UJUkDcE%@Z8+HDI*$n<^F=fxMBb9;ea>bx_D0w%djOTgOZ@eU}(KAOVz$F zr@Dzoe|dYMrS)8QWzTDI;vJ#heH^~OWZ!YmAEBY+^(|x75VGVMq|UUI+1J=u6Jk6P zWSiK6tuX~zY%Ru=WimXvspT`URFG7Rvs+_~tC_2-T5Mylasml1{n(V7TQ)dWV^SHM ze_CC&2~^!w573HzAToaUM+^Y;rlMe*a$WBhy{hBdsm4#yqGo7FK;uCsyj&fnYE=Nf zwpdQZj1;!7of@6f)^q#Swr{b&>~`j!j43GxR&lm@{OF{az=JV-@luXI|Khz~P1M}o zp8)_Eg8bJh(d#fgwWrMAv&X*GWR;#d_(6ZJbI8=1LSS=Bw{;{f8#9z6HZRqfh?-I2 z64DK*s7`3~EEk~rs36-sx9skOGq&f5^u+M^`Pj`K(mdj+KJt|`U+x6>s< zLkb*w;@0qYIL&$nGaI#=fY_>Hp!7XIK}MFx7pU*kX1m7ur(a^cFNG*8JtmSYGYex1 zo2iq~mZsxo61H4O%c9&7TAaDp*#k0r{tNu$^Y&pW?a-;qrCIjL=Sq&0_WUeX!sE850y9bv+3uQPDSPDF4CfCz}w5MczydB^~KODs@XS3=Ukrri#ncB>w`0gZ>Q5T6*1+nNr%n5|8cwJSjLn9ADjI zhPNCo2MEzG72zj zR$1#PO4)~ik+Z#8HuFvkeMmexoLr4r)s>XGPi?H1J$2z8g1M zK3f@Mox6@xpBQgw|6+RGT2VN&oF(gRorZ7i$U!=CzqGtVtjs9CT+M#$8Np}rW#9*6 zOFu{K*Rqe{*~E0`1ReTwmkc-j6^=HIm^)0j>ap)x9j3B|a_!T99yv~!{F!13dW$E|b2 zpVhM=}=A9ltGKFvrcg<*l#QzDL2( z+4cVT#NjITL1#e7=f+ZUP!FmvDzw-cKkl;6gu#vO3jq{~Zz6|epIjzC$=LM7KYAH@ zbREiOqkU`SAqzm7Sis^GFX{?+r+s?$zc)Nhem(AQfnw%I;?%RxP; zyeisu_@TsBQ=Y`ksxHhy8IQ%UT-qpPSgSC+I1hfj8@+X-P^i(VPnGQyUX%vZX}3vkhopfoWy|l zv#or_(xMWkkJ9jIjAWMgIJ?J##|{;5)X*D6|Ll(o9*OU48cfx=q;(j_*R(G6p_$h5 zv61F4GU)SMYxcQ=dwSMd!kP3h!%%!H$u0E^6I3f_YKB@5^Q>rb&FoUJBmMTJ1#s9L zvTNyVN2+(!qHZZAOlyXZv?Hko{?Dw{u=FlbaQh`}cf``JRMet&ae;+Qp zQxVAf{H3K)0b34=%6FE0_gs&VoVnzkZ5e-w)@ru@z#e)VoVs$VO;$Z&O_lBAN$PyR3meakvSi#QIe&m#O*9N9MH{YGI9QuxODG<9&n z+IMrq@O_xbvDz8(v~SGq;THOor;|R^KM4+`Be=oi$2;&Yq5aVZHANSikWzzvtlZ>@ zN_S%SYE`)XvK@FF;`(7qbHX?V8Zz!>ue@^gWcpnHh&(WrmZFrK9yoTBL!ZQRPde&L zGRv$Ud#IHyYeW$}rFr;*%$uj6f4c{N7MxV@cID%baT!RyrQK-{z}gP+Q0QxocfZ(S zJGp)@A@`+ozycSEd}pEvQ*p0vV7uyNSn^AlH?fS$GfD5ScKNB~%|6g(_`a=&7P9)o zGjy0Qm^UTI%C7i{{UT-JlOi+5v*RC~%158ohYn|p&}qFRGgRsc1@F)iyy4;!vE4Qq z-UuWn&9T4hKxva=E#kMNNR@tLK)J{+`tSClv>jOT9}1(kc@=TsTg4W<;9NkQ$IT+c zjT+IXPF5e)eVa1BQUArP^|h3wxx z0sj3~WS-1*jbz%)eLnP?f=Eroq3&U_&WW};zUWJrWVt1NDXJLR_iYMGElH&1Ok|(u zGQ>$Sws=uEwuwuvKXqQS2mRp=fDz1oVBO<=%Vt82+8b>iEaYD6k}HFMjk+9|n|P2x zKZ;sKe&ISAOssi3(YDBof_ag%%>m7~>0pZy`KO=fbIpLbl`xtd7%d4W$z#kW#%4!l zOvLiRO(NScf=W27oBWzFHwm2z!-7_Fa;P9Si|XQ^_J7rQM_pP*ZJI`SMO0=}Ycu3r zaY2S6qW>Gk|Bo!#=Qjy(An@}`6yWKn9npHf>dKQW`V{gKh4HxOLeq~}%0j${g{B%B zyTvPxq^U3?4((LVOzlR}BrH`-#$m2p9ZT*+H3FtKMP>~nozMCR2n47@FA~{@Qo}&A zK^gkdNzAA~QQ?mecdQ~1?EUdNgn$v$;{$idRIZIlK!1dZK!9RFN+52;-Lv&DAw$so z3vm8%ljTvQ(VXT1Qsdzm+AFPF&ZuT>1-WO(oKGs6(8*1x#nPb7F=D)UwTLx6 zVaVIn&Fe=A3BF}01mm0}wknn#PZA3%wOLT7x(T)GeB`#WgvBp~!?}5Hr4_IhQy!vr z%Elj3cFJLXt2*z*K>dn*9HyxzQ2uS9Y@V2*WGMh4(r>^-7ohS2RLj9ZAG~ z+bWqP`_q_KE=Npr-oE0N3VHmdhPO@UC~YlVkoB!>u_+D{Qel&oBsiKM(fq!YTn9?b zvScD_nm1xjQ9_Kb36UCQPbNE}>N8orT~yHc%B=3R?l6^R%qOVF@Jz2lOMtHWO`AI6 z3H3_V{I*az`jHLKg9B{7JR7*xYDlXXtrS5Cvr4I`Z#(qG4wWkyZ)FNsY-p;xN{X0G zaX_;g_b4((`itFYjch2t|cbwYdVC zfQU&UJWy-4aC0SzSuI_;eu}bs6~EUL1dUZ}%4ot&*ci0AZ4Mku^M+%|sIo$XBJDUF zMf))l7|3`Te*rp8*c$2a-_0}h<8d}^`ZGf;oXn@tJSoIE)os4{ znv&8$rXjDUP$kP$lH>(Kg2=uFWyKc4`_fITkq4^>tLUp1yMT_qm5&6ENI^Ba-$x-) zSH%3(a5F82l_A|$)sXO}x@jl8B;!|i0&LMiunGVwErFu2&TkoH_Vd@5iiYZSbBRra zTyZGKHGDeE8D?9pPe65M(FjZmYTDqpT!Ne?sfUbdLXwibVhVMOv?Sk^fal=1R7qt&Mv0)zmFZrw&1@^xg*kj(3jKD-cO__j@*kD3 z@@*@DoykQ#jPjIHsNw{urF=FsuiKe4FtMqIWw=wlp%CaFgH4VLe})Us&5HZ-c39YI6bGFW08UQ{;v%D`{o zfVW1vEdvbSgdlSpRd#1VM`jiQLR0sQ({RZBPY>xdJ}5dN%8Src*iyPTGpVeZ8wnfC z(9%N?UhFaR{D>e`RoqrZHPAQH5paiR(F-&J1Xj-*;HI!_56LS;IA{}61_wU6K!F@1 zkSJr94H7ZVt3zODz5?FETEo7HW)e4jL_QE(#EpvwD0QVCd9xBQUE zNaP(DZF{CbiS$RE?t%Ddy`yb1bTd_Ao2bZX1kGL+5wXitfv@`?4$?DZGrXG#pfU!^|>+p&?BD3psnF|Qd3JG?pnDvQcGJ44bzpo(MeX4q$@HLvyQ zQ9MkP?ikR>Ful>HgAd}Y{W^g8(v-o?8>GfA1C0P;dOXihz=*_~VXsYcm2t^}Jx`pg z#pD8xM}#T^2~hGghp96w>rBHA$kY~UknGq^KxAFvtj7}iGs-BzoAnMFyTmWw$Bn)S zjID+)DodxJ@^r1-M8`$NiLgReLqo%$(3pvvJyrXVUee+hPVVA`fS6?F_R^13ESQqx z7MmlpLKYm35p<;BefW(CZ$KAO;)HglJ+d*>sE517fL2P0Gn%%DAn(Wvc`7ZqRC|xFlI2*X$+~B9iY-Ns@+uM znsBXa4l=b>N&C1F!GaJ>Wf9-D6-#krV`r)gOYON*hzG@sTIido7Eu*gsR$Bxso^Zz zHV28@sp@dI&yl^(E2`Q#y!mKHt)^AzLPESr1Y5_30(<`uTHz80sA7cC3AL)o+sg1} zigHz|+nl|r82s@dR@p-+8Pl`IS;Khe4iuL7rwQ4>VV5D}(RI>T1b@KMR3?|hC`Np8 zdQ%bl{ohhXVw3MLnd&L<-?92$>5V>NO*@QWa$<^~`8VCirTjgcL_5RvN4`x-4h zD%nKsPAD6tIb>0;IyQvo^%I4E3Yp~t8dYp?9+BS^uD)Vph-Pr~vK;|BI3yVkBUv{( z0#pK13{3!_K>CEl#3W9K#l!d$$~|e7=RKiL!R!%w%Q1FnAOl}b+Z4CdcX{}0nNyD= zggTD1*hnFwNxY~PcPcanZP|{|YWp;{5B++)AO=LlL59dLS;}%xFMR6a| zc1*FI`Jo(FT{5GSJ$j7^w+cT@9vuZEVAcs!y5;J8mua?@C@|EFhcq$QQn5dJL#EdX zk8oq3+1d(YR+)8ep@a_fxLz=qn01RnO7d%#Dn+(bZdOlhd!HH90#A( z9Y%S&-q*{`^AdAO+O~)4A(+J1Ar@84+qc-4JmlcM61_@uiFqe&559?)w5nslQmNH;+BoY6IKKSs^>F&%7027S?eCU zQ))dWR2oU1x)RX65~0S!El9rR$X@MoaxC~T+1vTN3p!n#`USX2U~6EH0CulFaV0Z> zGY?n=^JV+|zQrIh$WTUE%tPa~VVgVAGP3)V9Gv4_ol`s}HRR~sjTgL{pmb=`+RaDo z;}PDhPs_9ES<>$AP0NgmbWAbSvl0B@bObZDeNbFsz;CC4^RsDnEpbv$E;(nYO-fe} zIL}KYH~1t3Y3YPgAxDeKk#bu8{A-4x^`5rG#aCMb!7N8-M4Kgv@TLEwW4kzn+I+RLQ&P0Z#~A*Dqu;22`jN}! zTdKW^9y*+?Hj4|INpog%ClylOA>DG~obr2o3l#M}`Etvpb_nvsXe$<5R_CiiFGB?2 zEt*P0$O;u%zv+Zt_jnmDdGG0{$l9vs&;s$L!)}gD+^l22G53c22TRvCq6(@w^~sLX z%WEW7jmQq)k=B^t420FoFuAh21>H0D>jdN927jax7bRFrfWte+-&lU*k8EPVfij@A z$}oVjlJAg$7&JJA;lq^Q*Exl)SdZSIB*lT4@Rpc@;_GG>xIXN2(#zs)Cxh;vrP-g; zmtl@GdRqLw;W{J|Qe%bLy!nZ3f_o(C1}Y7reipdMuAfq63Hwip}eQO~3ig4_$HLrrJotg)h4lWPq>i71lkbDf?_~yujwGM5jqJ`81+oqXwx5wg*MQA>?(-<19 zPxya*L0!Yt*+A3NkSYaFFF9M4b=UXS0J5hTl8ZB4lWuNjW^XqydK6gYrfpNtmSXq| z=;%0j(X+iKCY18hOt7qJjTYMLEW#d_(>g(+zjw?s@yci~r={`ib4b(3gr6I?0g|PM znQddkl;Fg%2l&+3rFpD=EoQI zt{q*iZkLMsm>%t9tK9}KP6=+CtjaFamBVmhyvF){V2WE27=vo!c0Y?+aCF+8EPCmF zVB4|%_^_n?F!lIx-O44oH#38AwPBIC8=aNCHG3qn>a$D&h({I@H`6Gyu z#QMFsIP353Qe=NvmhW&iQK8jwpLbnjQWkG^l2jfK3F#EA^uk$hr1+E~ z-9y3Y$eG29{&A6*q2r!OQ_{G{;Hp2P2e00$?C!O>Kvi6>;h_d|_rW8BoAL6OcuP-P zpHrie^zt!R;!+=bH6QKM_|vL9VbMABz8dLRr!pk-kl+=fRQRTatw9{*HLE2F!ol>- z)m6P-`3-I2c}KlFlrNi;ZQ3p7YZ?yp2rIO=-+3rfFNkOF;M<*pHj_u*-!)@(GdqkA z^PB+!R(6?W@02~po6Xm|`d+^@30RW4gkfs#%yxVbbrjlk+&+U_&3o6tV-J~;*H>A~ zvUh#tH|C2@Rj>k?GN+3b>(?e%cKEuptdMYl@l)7PKakrPFksa?0Yo-fEh|K?rqPSj zzG}*x!;xK#z+SmWnXfX+^)czI<)n&PTS($|X@{^V3pEJ2NGWwhsc&X;R;`S7CI~O) ze$s1Bu~ynB8s<6w1?bK2jQuD$Xig_^Oh0MKT3`6M>in^(mP&)7(kJR;_UQH^cT?9P z(N3$SZGbmfR^BoXA6R@=7Pu=Vb#qCkLwfxc`7nN(74O|#NxiJC^avUjLw^}kB|fG>3^M|A++)!zHh;p>P8| zsb0dpmT7KtW9O z4kO&!Y$5F}B8f0ogg$!Mne|uprtdSFc_y24^59~FEtL~vs;SxE;$btImXIaR6w|A% z@es5*GYZc*`=2j5r+?5G$7sP)5ZIv@n9$GZ>Y~_?9InrfnFxK_NkB~#vBabwr8Hf+ zLPg0$t2ezesrvz&?0n&|N?<)TDNk{2yH&noKPD`4;+J?=6;{{8mTxBJVOTOqYoV)X zYHO*O;If;O^a&`Zf3lzIK0D#Es9*{oP#;Rhq_H>_yu-QUc|q(h?JRsFO8X;=9-hte zto=2Wp6@S!Vs}~4@b4%?H{rLVP6OVV);`$8e5-Nd(~BE?!N+;j26v{O%)_IbjYMAA86grK#a01Yf{W zkjesI^23_3#p~4C2Zp;7XukliP5yP>!b09IPxVrTELCmkHD2TuhJeMMW1nyHa#VLw?&eJHez*adkuI@bcv~f9zu)DS!cdddA=)YZc@Qdq+BN|rym{q z5fYzcOy1tgQp?H{iyxb3y+p#z{n1jZ%5)irQRv6cdP&AC;1lU?Bw?* zWqFl*I-_1V#-i}jNw^$T8e$zXKgXlf>DfFNzH248>)!WiLRTLj8*NvN`@i0M;)XRU z*2yG%eq8*#GC4jnw9Hh~qlMRYPjbh17*wg;qt5VZBi0`lG-NK5*I1!8Bv`scnnn1_B*;N%)hkia>50Kr;y_XC?NfDa9OyLO z;k3wWhGg#iUHaovj?d$GKVec&6$2IpweWP^FW@_eV^e_MSe*}JsB0@F$?jX}t&q;* zNb^htL_93YAlTYzJA+XkGeR~ZJ=?(p0d1ien*pMPA>E^<;)1tHPu%mbkKIOTLY&Sq zXadi5lYQ@@6vXAkhx!eYTd>AQ1J>@D3P;zwX+uKREPqUTaP8$^z1rzI9Wj}u_W#gf4?oi;Ze@|I+!pFiQM@ee3_4tLp z%k#sxdt|qPF*l>~MOym@Z4DV~OP3C-bcg8BBO{oxDkIr)9AJ{(-OS3U*ZpO@Dhebq<0r+pxfx^0TX zdC78|8a3zAP~}Tl2rF^#aj(-*#e%4uM-dMD1tMFhb+_Jap14c145usM-n$Nn zwz(SJwwyCGb1l^+kM%6lJCXKj(?32oyxBAF*6y)`d2@O33pi=vXnTZnE#G8IJ87n# zs4?R4TTS|oLCjsPHfIb3Dz*1hvNd^X@FSG&Nmgxr5|?8z3u}!EnSE5STYf4gmR4#= z?xagJPQ{^l*=exs1!nR8yie?eWGqW_cc*bhnCn!z@Xed@C4vEOiW9nvi7P?dpg|0p z*vLemUPt4aHgwXebK;3}E=@q8Zm{pE90yDV2x9J7YN#_IP6(&@Xivu?GwdoyM_OR;g)+`_>2 zm4)=`EHo2@$g zb&R(h_)Dh_b@cU>kDkdkOAlfkNm@9w;48D7j-Y6=a$m++WzVe8lKFja^y7(F3vD8Y zrQ8?nHfUX0&oJEtm-BbiUfeBI#k3^q(yt&>5z6<~VI1~>;L8E(HX~Z1TH(RF{#7^wbpEIqX^uK?j_37Ir>UIG8*eJ9UeV_}wM71}p-X!5P9mgjs zU4~bK?`!)`1f5OHWuEky&DutGr6j)!#Y9}OCpqKuT@H49vpKf>Y)57JCg?MwQ?$eG z#D%*vs!*EOsfY5~hvs^n1(gBq`486SlY_bIWvQ9^dTU0JX+LSC579avMc=GsvLaI> zNRBpdE;{=`+o@JWHu`O-BWu$H&}G4mdL*l>)&xJl5?^MAVG|WoKP1eHSK1(;xARP9 z7}577rQVUr6mfst`G{rU@mTWVE%|v4$rs(JaEx@1_VE*OJA##!`QvV(_qx3S-_?Cg zy6y+t?SIs}VPH%`*H?pwn4l&*^z+8Qb%C`S-D7b-c6g1)H}H^Kyo`HkRF6K^AaQfX zROH;QywZC8>gt+hhvam}>e@$rY;{5_BfPbn)OD<-h54A~vbi3)et1T{SPPEJs|4u* ze77o%&>2B++6}u?wv3O#&i+Y8KUH;}_Et+ymQ2k?_DhjcG&LD8H=h~WAp2Q?m3W}V z@S9}S-0w?b5&eTVewjkS*brRZFsqJRq+eRJnePAw_2yUcyq`Gsd0fbJ`~z%MXc=QqB`(tAcJ)3qliPS*Mey6o)}r*TwVN(0owJkPFN- zIPP4TQ#8%WsD#<_+ccy6!PodYck@KY-Vi4rwIRK+#*=x<$lgxy-B8AmW1mBU0LO6m z#glGo{xS^QM60qiH-3Gwu9craOJ*zcW!TB;2;atvgUNvEg1n9vX%f<8&zHkOlffiKx>n*Az)N^C8 zxv;hdKu|~p7?P!Z1hd6MY-!HP{m005?Yn6TX9aXN_cNE zGzF(7^Hyu#rm3veaN45E(wB0SRm|C!dk}*zBe0cU^PRU+^q%4%(-Ou!F&EM|b3?CL zZ)xzmAM$#9YJeyAZt=%~^FyQ}MJC<0L_xB^M%y(sdTS&0RI0eWgj&bieSi6E$G1Gj zIyfsexOo1UY}qzN7=BSlT!7eP-<0%y*E={`;2F@VwDGD>@ujcO%=DHx~0EPyB7SMIHni zAASMTKPz>f5*?+JmWAih1dPfY^AhV<&)^bZzSZGzawr(Dn3w=`udNFH{BHnG%CH(gAW6ehe#m3#mDNaledj68HJd2fI z8zuy6mf?<1a*dFx#8x|Mp$bVn?hKFbm4+~c3%7~o-qL7Xz4z|;7Nxtsjb7{8DOY-U z=g;W@Qp8bTMKDu+ka_fsw(&tZ)!nw)T&aUdUs5)soZh`4oA%XV-%0DPuohvAb!t|M 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 K$PfOFfB)G@*6yhQ literal 0 HcmV?d00001 diff --git a/src/component/product/ProductProvision.jsx b/src/component/product/ProductProvision.jsx index 6b2d248..a2e9aaa 100644 --- a/src/component/product/ProductProvision.jsx +++ b/src/component/product/ProductProvision.jsx @@ -71,7 +71,7 @@ export default function ProductProvision(){
- Card image cap + Card image cap
{/*

Commitment

*/}

Commitment is something that comes from understanding that From 4d71547c947f0914df9d23d7fd826b2609310595 Mon Sep 17 00:00:00 2001 From: victorAnumudu Date: Sun, 12 Jan 2025 05:27:34 +0100 Subject: [PATCH 19/36] date style fixed --- src/component/home/RecentActions.jsx | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/component/home/RecentActions.jsx b/src/component/home/RecentActions.jsx index 5ec76a2..930e425 100644 --- a/src/component/home/RecentActions.jsx +++ b/src/component/home/RecentActions.jsx @@ -83,8 +83,9 @@ export default function RecentActions() { #. Description - Date - Status + {/* Date */} + Date + Status @@ -94,7 +95,7 @@ export default function RecentActions() { {action?.no} {action?.description} - {action?.date} + {new Date(action?.date).toDateString()} From 33edb1b59f766d6edc2063132120a86dd715d646 Mon Sep 17 00:00:00 2001 From: "CHIEFSOFT\\ameye" Date: Sun, 12 Jan 2025 12:21:10 -0500 Subject: [PATCH 20/36] product additions --- src/component/home/ProductsURL.jsx | 2 +- src/component/product/ProductProvision.jsx | 17 ++++++++--------- src/constants/products.js | 1 + 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/component/home/ProductsURL.jsx b/src/component/home/ProductsURL.jsx index baafc4e..12e8288 100644 --- a/src/component/home/ProductsURL.jsx +++ b/src/component/home/ProductsURL.jsx @@ -53,7 +53,7 @@ export default function ProductsURL() { {urlData && urlData.map((item, index) => { - let statusColor = item?.status == 'Active' ? 'badge-success-inverse' : item?.status == 'Updating' ? 'badge-success-inverse' : item?.status == 'Refreshing' ? 'badge-danger-inverse' : 'badge-info-inverse' + let statusColor = item?.status === 'Preparing' ? 'badge-success-inverse' : item?.status === 'Active' ? 'badge-success-inverse' : item?.status == 'Refreshing' ? 'badge-danger-inverse' : 'badge-info-inverse' return ( {Number(item?.no) + Number(index)} diff --git a/src/component/product/ProductProvision.jsx b/src/component/product/ProductProvision.jsx index a2e9aaa..f4adb06 100644 --- a/src/component/product/ProductProvision.jsx +++ b/src/component/product/ProductProvision.jsx @@ -1,6 +1,8 @@ import getImage from "../../utils/getImage"; -export default function ProductProvision(){ +export default function ProductProvision(props){ + const productTitle = props.productData?.title; + const productDescription = props.productData?.description; return <>

@@ -8,7 +10,7 @@ export default function ProductProvision(){
-

Creating - Your personal professional web

+

Creating - {productTitle}

@@ -71,15 +73,12 @@ export default function ProductProvision(){
+

Started creating your selection

Card image cap
- {/*

Commitment

*/} -

Commitment is something that comes from understanding that - everything has its price and then having the willingness to pay that price. This is - important because nobody wants to put significant effort into something, only to - find out after the fact that the price was too high.The price is something not - necessarily defined as financial. It could be time, effort, sacrifice, money or - perhaps, something else.

+

+ {productDescription} +

diff --git a/src/constants/products.js b/src/constants/products.js index 44ccbc9..6742e1e 100644 --- a/src/constants/products.js +++ b/src/constants/products.js @@ -2,4 +2,5 @@ export const productConst = { PRODUCT_AVAILABLE: 5, PRODUCT_PROVISIONING: 6, PRODUCT_ACTIVE: 7, + PRODUCT_DEACTIVATED: 9, }; \ No newline at end of file From c4521914fe5707c5d8c23a49a4daa48959121f34 Mon Sep 17 00:00:00 2001 From: "CHIEFSOFT\\ameye" Date: Sun, 12 Jan 2025 16:56:43 -0500 Subject: [PATCH 21/36] URL fix --- src/component/home/ProductsURL.jsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/component/home/ProductsURL.jsx b/src/component/home/ProductsURL.jsx index 12e8288..8538731 100644 --- a/src/component/home/ProductsURL.jsx +++ b/src/component/home/ProductsURL.jsx @@ -54,10 +54,11 @@ export default function ProductsURL() { {urlData && urlData.map((item, index) => { let statusColor = item?.status === 'Preparing' ? 'badge-success-inverse' : item?.status === 'Active' ? 'badge-success-inverse' : item?.status == 'Refreshing' ? 'badge-danger-inverse' : 'badge-info-inverse' + let productUrl = '/product/'+ item?.product_id return ( {Number(item?.no) + Number(index)} - {item?.description} -
{item?.url} + {item?.description} - {item?.url} {item?.status} From 69cecd2c396d3dca98be2a7435e4231b14d24c84 Mon Sep 17 00:00:00 2001 From: victorAnumudu Date: Mon, 13 Jan 2025 09:35:10 +0100 Subject: [PATCH 22/36] date and status fixed --- src/component/home/RecentActions.jsx | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/component/home/RecentActions.jsx b/src/component/home/RecentActions.jsx index 930e425..a3a0b49 100644 --- a/src/component/home/RecentActions.jsx +++ b/src/component/home/RecentActions.jsx @@ -90,14 +90,15 @@ export default function RecentActions() { {actionData && actionData?.actions.map((action, index) => { - let bgColor = action?.status == 'completed' ? 'badge-success-inverse' : action?.status == 'verifying' ? 'badge-info-inverse' : action?.status == 'processing' ? 'badge-warning-inverse' : 'badge-primary-inverse' + let bgColor = action?.status == '5' ? 'badge-success-inverse' : action?.status == '3' ? 'badge-info-inverse' : action?.status == '0' ? 'badge-warning-inverse' : 'badge-primary-inverse' + let text = action?.status == '5' ? 'completed' : action?.status == '3' ? 'verifying' : action?.status == '0' ? 'processing' : 'processing' return ( {action?.no} {action?.description} {new Date(action?.date).toDateString()} - + ) From 098f59a9297c62889156b49cda3df01a99258771 Mon Sep 17 00:00:00 2001 From: victorAnumudu Date: Mon, 13 Jan 2025 11:05:59 +0100 Subject: [PATCH 23/36] my product provision API added --- src/component/product/ProductProvision.jsx | 172 ++++++++++++--------- src/services/queryKeys.js | 3 +- src/services/services.js | 6 + 3 files changed, 104 insertions(+), 77 deletions(-) diff --git a/src/component/product/ProductProvision.jsx b/src/component/product/ProductProvision.jsx index f4adb06..fbabcc4 100644 --- a/src/component/product/ProductProvision.jsx +++ b/src/component/product/ProductProvision.jsx @@ -1,90 +1,110 @@ +import { useQuery } from "@tanstack/react-query"; +import queryKeys from "../../services/queryKeys"; +import { productProvision } from "../../services/services"; import getImage from "../../utils/getImage"; export default function ProductProvision(props){ const productTitle = props.productData?.title; const productDescription = props.productData?.description; + const productID = props?.productData?.product_id - return <> -
-
-
-
-
-

Creating - {productTitle}

+ const {data:provision, isFetching, isError, error} = useQuery({ + queryKey: queryKeys.myproduct_provision, + queryFn: () => productProvision(productID) + }) + + const provisionData = provision?.data?.provision + + return ( + <> + {isFetching ? + <> +
+
+

Loading...

+
+
+ + : isError ? +
+
+

{error.message}

+
+
+ : + <> +
+
+
+
+
+

Creating - {productTitle}

+
+
+
+
+
+
+
-
-
-
+
+
+
+ + +
+
+
+
+ +
+
+
+

Progress Information

+
+
+
+
+ + + + + + + + + + {provisionData?.url?.map(item => ( + + + + + + ))} + +
#Action
{item.id}{item.action}
+
+
-
-
-
-
-
-
+
+
+
+

Started creating your selection

+ Card image cap +
+

+ {productDescription} +

+
+
-
-
-
- -
- -
-
-
-

Progress Information

-
-
- - - - - - - - - - - - - - - - - - - - - - - - - -
#Action
1Start Creation
2Update Access Routes
3Veryfing ...
-
-
-
-
- -
-
-

Started creating your selection

- Card image cap -
-

- {productDescription} -

-
-
- -
- - -
- + + } + + ) } \ No newline at end of file diff --git a/src/services/queryKeys.js b/src/services/queryKeys.js index 3a25f02..374cebe 100644 --- a/src/services/queryKeys.js +++ b/src/services/queryKeys.js @@ -3,7 +3,8 @@ const queryKeys = { topBar: ['top-bar'], recentAction: ['recent-action'], product: ['product-data'], - product_url: ['product_url'] + product_url: ['product_url'], + myproduct_provision: ['myproduct_provision'] } export default queryKeys \ No newline at end of file diff --git a/src/services/services.js b/src/services/services.js index f02e56b..c843224 100644 --- a/src/services/services.js +++ b/src/services/services.js @@ -106,6 +106,12 @@ export const recentActions = () => { return getAuxEnd(`/panel/account/actions`) } +// FUNCTION TO GET MY PRODUCT PROVISION DATA +export const productProvision = (productID) => { + const reqData = { product_id : productID} + return getAuxEnd(`/panel/myproduct/provision`,reqData) +} + // FUNCTION TO GET DASHBOARD PRODUCT DATA SECTION export const productData = () => { return getAuxEnd(`/panel/account/products`) From 950eb720512b1259fce5941b4be9ff8591ee9597 Mon Sep 17 00:00:00 2001 From: victorAnumudu Date: Mon, 13 Jan 2025 12:11:13 +0100 Subject: [PATCH 24/36] product provision list fixed --- src/component/product/ProductFactory.jsx | 2 +- src/component/product/ProductProvision.jsx | 16 +++++++++++++--- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/src/component/product/ProductFactory.jsx b/src/component/product/ProductFactory.jsx index 154ab91..ec17ee7 100644 --- a/src/component/product/ProductFactory.jsx +++ b/src/component/product/ProductFactory.jsx @@ -20,7 +20,7 @@ export default function ProductFactory(){ // Split the pathname by '/' and get the last element const lastPart = pathname.split('/').pop(); - console.log(lastPart) + // console.log(lastPart) const {data, isFetching, isError, error} = useQuery({ queryKey: queryKeys.product, diff --git a/src/component/product/ProductProvision.jsx b/src/component/product/ProductProvision.jsx index fbabcc4..488f13b 100644 --- a/src/component/product/ProductProvision.jsx +++ b/src/component/product/ProductProvision.jsx @@ -1,12 +1,18 @@ +import { useEffect } from "react"; import { useQuery } from "@tanstack/react-query"; import queryKeys from "../../services/queryKeys"; import { productProvision } from "../../services/services"; import getImage from "../../utils/getImage"; +import { SocketContextValues } from "../context/SocketIOContext"; + export default function ProductProvision(props){ - const productTitle = props.productData?.title; - const productDescription = props.productData?.description; + const {joinRoom} = SocketContextValues() // Destructures values from socket context + + const productTitle = props?.productData?.title; + const productDescription = props?.productData?.description; const productID = props?.productData?.product_id + const productSubUID = props?.productData?.product_subscription_uid const {data:provision, isFetching, isError, error} = useQuery({ queryKey: queryKeys.myproduct_provision, @@ -15,6 +21,10 @@ export default function ProductProvision(props){ const provisionData = provision?.data?.provision + // useEffect(()=>{ + // joinRoom(productSubUID); // provision subscription room + // },[]) + return ( <> {isFetching ? @@ -76,7 +86,7 @@ export default function ProductProvision(props){ - {provisionData?.url?.map(item => ( + {provisionData?.activities?.map(item => ( {item.id} {item.action} From 6ac8c41221a763e6ab9678c62dc438ea53931674 Mon Sep 17 00:00:00 2001 From: victorAnumudu Date: Mon, 13 Jan 2025 17:40:26 +0100 Subject: [PATCH 25/36] joining promotion room added --- src/component/product/ProductProvision.jsx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/component/product/ProductProvision.jsx b/src/component/product/ProductProvision.jsx index 488f13b..ef545a2 100644 --- a/src/component/product/ProductProvision.jsx +++ b/src/component/product/ProductProvision.jsx @@ -21,9 +21,9 @@ export default function ProductProvision(props){ const provisionData = provision?.data?.provision - // useEffect(()=>{ - // joinRoom(productSubUID); // provision subscription room - // },[]) + useEffect(()=>{ + joinRoom(productSubUID); // provision subscription room + },[]) return ( <> From bdf3f5c9a0aca65e9ca54866ea863a06d29d8e46 Mon Sep 17 00:00:00 2001 From: victorAnumudu Date: Mon, 13 Jan 2025 20:07:26 +0100 Subject: [PATCH 26/36] refresh promotion socket event added --- src/component/context/SocketIOContext.jsx | 6 ++++++ src/component/context/socketEvents.js | 3 ++- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/src/component/context/SocketIOContext.jsx b/src/component/context/SocketIOContext.jsx index 1643d74..1ca2b8d 100644 --- a/src/component/context/SocketIOContext.jsx +++ b/src/component/context/SocketIOContext.jsx @@ -49,6 +49,12 @@ export default function SocketIOContextProvider({children}) { }) }); + socket.on(socketOnEvents.refresh_provision, (data) => { + queryClient.refetchQueries({ // refetches productProvision API call + queryKey: [...queryKeys.myproduct_provision], + }) + }); + // client-side socket.on("connect", () => { console.log(socket.id); diff --git a/src/component/context/socketEvents.js b/src/component/context/socketEvents.js index d3b198c..42eee18 100644 --- a/src/component/context/socketEvents.js +++ b/src/component/context/socketEvents.js @@ -5,5 +5,6 @@ export const socketEmitEvents = { export const socketOnEvents = { - receive_message: 'receive_message' + receive_message: 'receive_message', + refresh_provision: 'refresh_provision_actions' } \ No newline at end of file From 83a8b3234c4993265561170c4f632eedbc2eb299 Mon Sep 17 00:00:00 2001 From: victorAnumudu Date: Tue, 14 Jan 2025 08:49:43 +0100 Subject: [PATCH 27/36] subscription auto reload started --- src/component/product/ProductStart.jsx | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/component/product/ProductStart.jsx b/src/component/product/ProductStart.jsx index d9d4d80..e387eeb 100644 --- a/src/component/product/ProductStart.jsx +++ b/src/component/product/ProductStart.jsx @@ -1,11 +1,14 @@ import React, { useRef, useState } from "react"; import getImage from "../../utils/getImage"; import { Modal } from "bootstrap"; -import { useMutation } from "@tanstack/react-query"; +import { useMutation, useQueryClient } from "@tanstack/react-query"; import { subscribe } from '../../services/services' +import queryKeys from "../../services/queryKeys"; export default function ProductStart(props){ + const queryClient = useQueryClient() + const [requestStatus, setRequestStatus] = useState({status:false, message: ''}) const product_uid = props?.productData?.product_uid; @@ -35,6 +38,11 @@ export default function ProductStart(props){ }, onSuccess: (res) => { setRequestStatus({status:true, message:'successful'}) + // queryClient.refetchQueries({ + // queryKey: [...queryKeys.product], + // // type: 'active', + // // exact: true, + // }) console.log(res) }, onSettled: () => { From 29efac554e4cd784a391437ef8c17fa51217979f Mon Sep 17 00:00:00 2001 From: victorAnumudu Date: Tue, 14 Jan 2025 18:00:29 +0100 Subject: [PATCH 28/36] min height added to payment box --- src/component/home/HomeSections.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/component/home/HomeSections.jsx b/src/component/home/HomeSections.jsx index c525ec9..d7727e6 100644 --- a/src/component/home/HomeSections.jsx +++ b/src/component/home/HomeSections.jsx @@ -52,7 +52,7 @@ export default function HomeSections(){
-
+
From ca0274aeb16b05788098055e59610c8d28877028 Mon Sep 17 00:00:00 2001 From: victorAnumudu Date: Wed, 15 Jan 2025 10:30:11 +0100 Subject: [PATCH 29/36] product API refetched on modal close --- src/component/product/ProductStart.jsx | 23 +++++++++-------------- 1 file changed, 9 insertions(+), 14 deletions(-) diff --git a/src/component/product/ProductStart.jsx b/src/component/product/ProductStart.jsx index e387eeb..172e777 100644 --- a/src/component/product/ProductStart.jsx +++ b/src/component/product/ProductStart.jsx @@ -1,6 +1,6 @@ import React, { useRef, useState } from "react"; import getImage from "../../utils/getImage"; -import { Modal } from "bootstrap"; +// import { Modal } from "bootstrap"; import { useMutation, useQueryClient } from "@tanstack/react-query"; import { subscribe } from '../../services/services' import queryKeys from "../../services/queryKeys"; @@ -20,12 +20,12 @@ export default function ProductStart(props){ const product_status = props.productData?.status; const modalRef = useRef() - const hideModal = () => { - // modalRef.current.hide() - - // document.body.classList.remove('modal-open') - // const modal = new Modal(document.querySelector('.modal')) - // modal.hide() + const refetch = () => { + queryClient.refetchQueries({ + queryKey: [...queryKeys.product], + // type: 'active', + // exact: true, + }) } const mutation = useMutation({ @@ -38,11 +38,6 @@ export default function ProductStart(props){ }, onSuccess: (res) => { setRequestStatus({status:true, message:'successful'}) - // queryClient.refetchQueries({ - // queryKey: [...queryKeys.product], - // // type: 'active', - // // exact: true, - // }) console.log(res) }, onSettled: () => { @@ -115,7 +110,7 @@ export default function ProductStart(props){
{productTitle}
-
@@ -151,7 +146,7 @@ export default function ProductStart(props){ )}
- +
From 4079d2701744ded6b55a83e7c68ab57b9958c510 Mon Sep 17 00:00:00 2001 From: victorAnumudu Date: Fri, 17 Jan 2025 10:38:21 +0100 Subject: [PATCH 30/36] drop down fix --- public/index.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/public/index.html b/public/index.html index a7067ac..db07959 100644 --- a/public/index.html +++ b/public/index.html @@ -26,6 +26,6 @@
- - + From 7d7a15e386bb5bc0474e208c286ed05c076cec4f Mon Sep 17 00:00:00 2001 From: victorAnumudu Date: Fri, 17 Jan 2025 23:21:38 +0100 Subject: [PATCH 31/36] calendar fix started --- package.json | 7 +- src/component/calendar/Calendar.jsx | 19 +- src/component/calendar/EventCalendar.jsx | 241 ++++++++++---------- src/component/calendar/EventCalendarOld.jsx | 138 +++++++++++ src/component/calendar/event-utils.js | 29 +++ src/css/style.scss | 44 ++-- 6 files changed, 321 insertions(+), 157 deletions(-) create mode 100644 src/component/calendar/EventCalendarOld.jsx create mode 100644 src/component/calendar/event-utils.js diff --git a/package.json b/package.json index 64c8218..06fc1ed 100644 --- a/package.json +++ b/package.json @@ -3,6 +3,11 @@ "version": "0.1.1", "private": true, "dependencies": { + "@fullcalendar/core": "^6.1.15", + "@fullcalendar/daygrid": "^6.1.15", + "@fullcalendar/interaction": "^6.1.15", + "@fullcalendar/react": "^6.1.15", + "@fullcalendar/timegrid": "^6.1.15", "@popperjs/core": "^2.11.8", "@reduxjs/toolkit": "^2.4.0", "@tanstack/react-query": "^5.62.3", @@ -12,11 +17,9 @@ "apexcharts": "^4.1.0", "axios": "^1.7.9", "bootstrap": "^5.3.3", - "dayjs": "^1.11.13", "formik": "^2.4.6", "react": "^18.3.1", "react-apexcharts": "^1.7.0", - "react-big-calendar": "^1.17.0", "react-dom": "^18.3.1", "react-icons": "^5.4.0", "react-redux": "^9.1.2", diff --git a/src/component/calendar/Calendar.jsx b/src/component/calendar/Calendar.jsx index 9aa4175..1ec5470 100644 --- a/src/component/calendar/Calendar.jsx +++ b/src/component/calendar/Calendar.jsx @@ -6,19 +6,15 @@ import EventCalendar from "./EventCalendar"; export default function Calendar(){ const [draggedEvent, setDraggedEvent] = useState('undroppable') - const handleDragStart = useCallback((event) => setDraggedEvent(event), []) + const handleDragStart = (event) => { + setDraggedEvent(event) + } - // const dummyEvents = [ - // {id: '1', title: 'Family Vacation', color: 'fc-event-primary', start: new Date('2024-12-18'), end: new Date('2024-12-18'), isAllDay: false, resource: ''}, - // {id: '2', title: 'Meeting In Office', color: 'fc-event-warning', start: new Date('2024-12-19'), end: new Date('2024-12-19'), isAllDay: false, resource: ''}, - // {id: '3', title: 'Client Call', color: 'fc-event-danger', start: new Date('2024-12-20'), end: new Date('2024-12-20'), isAllDay: false, resource: ''}, - // {id: '4', title: 'Interview', color: 'fc-event-success', start: new Date('2024-12-21'), end: new Date('2024-12-21'), isAllDay: false, resource: ''} - // ] const dummyEvents = [ - {id: '1', title: 'Family Vacation', color: 'fc-event-primary', isAllDay: false}, - {id: '2', title: 'Meeting In Office', color: 'fc-event-warning', isAllDay: false}, - {id: '3', title: 'Client Call', color: 'fc-event-danger', isAllDay: false}, - {id: '4', title: 'Interview', color: 'fc-event-success', isAllDay: false} + {id: '1111', title: 'Family Vacation', color: 'fc-event-primary', start: new Date('2025-01-18')}, + {id: '2222', title: 'Meeting In Office', color: 'fc-event-warning', start: new Date('2025-01-19')}, + {id: '3333', title: 'Client Call', color: 'fc-event-danger', start: new Date('2025-01-22')}, + {id: '4444', title: 'Interview', color: 'fc-event-success', start: new Date('2025-01-1')} ] return( @@ -63,6 +59,7 @@ export default function Calendar(){
+ {/* */}
diff --git a/src/component/calendar/EventCalendar.jsx b/src/component/calendar/EventCalendar.jsx index 5d03708..e6a56a6 100644 --- a/src/component/calendar/EventCalendar.jsx +++ b/src/component/calendar/EventCalendar.jsx @@ -1,130 +1,131 @@ -import React, { useCallback, useState } from 'react' -import { Calendar, dayjsLocalizer } from 'react-big-calendar' -import dayjs from 'dayjs' - -import withDragAndDrop from 'react-big-calendar/lib/addons/dragAndDrop' - - - -const localizer = dayjsLocalizer(dayjs) - -const DnDCalendar = withDragAndDrop(Calendar) +import React, { useCallback, useState } from 'react'; +import { formatDate } from '@fullcalendar/core'; +import FullCalendar from '@fullcalendar/react'; +import dayGridPlugin from '@fullcalendar/daygrid'; +import timeGridPlugin from '@fullcalendar/timegrid'; +import interactionPlugin from '@fullcalendar/interaction'; +import { INITIAL_EVENTS, createEventId } from './event-utils'; export default function EventCalendar({draggedEvent, setDraggedEvent}) { - const myEventsList = [] - const [myEvents, setMyEvents] = useState(myEventsList) + const [weekendsVisible, setWeekendsVisible] = useState(true); + const [currentEvents, setCurrentEvents] = useState(INITIAL_EVENTS); - const moveEvent = useCallback( - ({ event, start, end, isAllDay: droppedOnAllDaySlot = false }) => { - // const { isAllDay } = event - // if (!allDay && droppedOnAllDaySlot) { - // event.allDay = true - // } - // if (allDay && !droppedOnAllDaySlot) { - // event.allDay = false; - // } - - setMyEvents((prev) => { - const existing = prev.find((ev) => ev.id === event.id) ?? {} - const filtered = prev.filter((ev) => ev.id !== event.id) - return [...filtered, { ...existing, start, end, allDay: event.allDay }] - }) - }, - [setMyEvents] - ) - const [displayDragItemInCell, setDisplayDragItemInCell] = useState(true) - - - const dragFromOutsideItem = useCallback(() => draggedEvent === 'undroppable' ? null : draggedEvent, [draggedEvent]) - - const customOnDragOverFromOutside = useCallback( - (dragEvent) => { - // check for undroppable is specific to this example - // and not part of API. This just demonstrates that - // onDragOver can optionally be passed to conditionally - // allow draggable items to be dropped on cal, based on - // whether event.preventDefault is called - if (draggedEvent !== 'undroppable') { - console.log('preventDefault') - dragEvent.preventDefault() - } - }, - [draggedEvent] - ) + function handleWeekendsToggle() { + setWeekendsVisible(!weekendsVisible); + } + function handleDateSelect(selectInfo) { + let title = prompt('Please enter a new title for your event'); + // let calendarApi = selectInfo.view.calendar; - const eventPropGetter = useCallback( - (event) => ({ - ...(event.isDraggable - ? { className: 'isDraggable' } - : { className: 'nonDraggable' }), - }), - [] - ) - - const newEvent = useCallback( - (event) => { - setMyEvents((prev) => { - const idList = prev.map((item) => item.id) - const newId = Math.max(...idList) + 1 - // return [...prev, { ...event, id: newId }] - return [...prev, { ...event}] - }) - }, - [setMyEvents] - ) - - const onDropFromOutside = useCallback( - ({ start, end, allDay: isAllDay }) => { - if (draggedEvent === 'undroppable') { - setDraggedEvent(null) - return - } - - const { title, id } = draggedEvent - const event = { - title: title, - start, - end, - isAllDay, - id - } - setDraggedEvent(null) - newEvent(event) - }, - [draggedEvent, setDraggedEvent, newEvent] - ) - - const resizeEvent = useCallback( - ({ event, start, end }) => { - setMyEvents((prev) => { - const existing = prev.find((ev) => ev.id === event.id) ?? {} - const filtered = prev.filter((ev) => ev.id !== event.id) - return [...filtered, { ...existing, start, end }] - }) - }, - [setMyEvents] + // calendarApi.unselect(); // clear date selection + + if (title) { + // calendarApi.addEvent({ + // id: createEventId(), + // title, + // start: selectInfo.startStr, + // end: selectInfo.endStr, + // allDay: selectInfo.allDay, + // }); + let newEvent = { + id: createEventId(), + title, + start: selectInfo.startStr, + end: selectInfo.endStr, + allDay: selectInfo.allDay, + } + setCurrentEvents(prev => ([...prev, newEvent])) + } + } + +// const onDrop = useCallback( +// (event) => { +// // if (draggedEvent === 'undroppable') { +// // setDraggedEvent(null) +// // return +// // } + +// // let calendarApi; + +// // calendarApi.unselect(); // clear date selection + +// // calendarApi.addEvent({ +// // id: createEventId(), +// // allDay: selectInfo.allDay, +// // end: selectInfo.endStr, +// // start: selectInfo.startStr, +// // title, +// // ...draggedEvent +// // }); + +// // setDraggedEvent(null) +// console.log('EVENT', event) +// }, +// [draggedEvent] +// ) + + const onDrop = + (dropInfo) => { + console.log('dropInfo', dropInfo) + } + + function handleEventClick(clickInfo) { + if ( + confirm( + `Are you sure you want to delete the event '${clickInfo.event.title}'` ) + ) { + clickInfo.event.remove(); + } + } + + function handleEvents(events) { + // setCurrentEvents(events); + } return ( -
- +
+ +
- ) -} \ No newline at end of file + ); +} + +function renderEventContent(eventInfo) { + return ( + <> + {/* {eventInfo.timeText} */} + {eventInfo.event.title} + + ); +} diff --git a/src/component/calendar/EventCalendarOld.jsx b/src/component/calendar/EventCalendarOld.jsx new file mode 100644 index 0000000..5634a54 --- /dev/null +++ b/src/component/calendar/EventCalendarOld.jsx @@ -0,0 +1,138 @@ +// import React, { useCallback, useState } from 'react' +// import { Calendar, dayjsLocalizer } from 'react-big-calendar' +// import dayjs from 'dayjs' + +// import withDragAndDrop from 'react-big-calendar/lib/addons/dragAndDrop' + + + +// const localizer = dayjsLocalizer(dayjs) + +// const DnDCalendar = withDragAndDrop(Calendar) + +// export default function EventCalendar({draggedEvent, setDraggedEvent}) { +// const myEventsList = [] +// const [myEvents, setMyEvents] = useState(myEventsList) + +// const moveEvent = useCallback( +// ({ event, start, end, isAllDay: droppedOnAllDaySlot = false }) => { +// // const { isAllDay } = event +// // if (!allDay && droppedOnAllDaySlot) { +// // event.allDay = true +// // } +// // if (allDay && !droppedOnAllDaySlot) { +// // event.allDay = false; +// // } + +// setMyEvents((prev) => { +// const existing = prev.find((ev) => ev.id === event.id) ?? {} +// const filtered = prev.filter((ev) => ev.id !== event.id) +// return [...filtered, { ...existing, start, end, allDay: event.allDay }] +// }) +// }, +// [setMyEvents] +// ) +// const [displayDragItemInCell, setDisplayDragItemInCell] = useState(true) + + +// const dragFromOutsideItem = useCallback(() => draggedEvent === 'undroppable' ? null : draggedEvent, [draggedEvent]) + +// const customOnDragOverFromOutside = useCallback( +// (dragEvent) => { +// // check for undroppable is specific to this example +// // and not part of API. This just demonstrates that +// // onDragOver can optionally be passed to conditionally +// // allow draggable items to be dropped on cal, based on +// // whether event.preventDefault is called +// if (draggedEvent !== 'undroppable') { +// console.log('preventDefault') +// dragEvent.preventDefault() +// } +// }, +// [draggedEvent] +// ) + + +// const eventPropGetter = useCallback( +// (event) => ({ +// ...(event.isDraggable +// ? { className: 'isDraggable' } +// : { className: 'nonDraggable' }), +// }), +// [] +// ) + +// const newEvent = useCallback( +// (event) => { +// setMyEvents((prev) => { +// const idList = prev.map((item) => item.id) +// const newId = Math.max(...idList) + 1 +// // return [...prev, { ...event, id: newId }] +// return [...prev, { ...event}] +// }) +// }, +// [setMyEvents] +// ) + +// const onDropFromOutside = useCallback( +// ({ start, end, allDay: isAllDay }) => { +// if (draggedEvent === 'undroppable') { +// setDraggedEvent(null) +// return +// } + +// const { title, id } = draggedEvent +// const event = { +// title: title, +// start, +// end, +// isAllDay, +// id +// } +// setDraggedEvent(null) +// newEvent(event) +// }, +// [draggedEvent, setDraggedEvent, newEvent] +// ) + +// const resizeEvent = useCallback( +// ({ event, start, end }) => { +// setMyEvents((prev) => { +// const existing = prev.find((ev) => ev.id === event.id) ?? {} +// const filtered = prev.filter((ev) => ev.id !== event.id) +// return [...filtered, { ...existing, start, end }] +// }) +// }, +// [setMyEvents] +// ) + +// return ( +//
+// +//
+// ) +// } + +import React from 'react' + +export default function EventCalendar() { + return ( +
EventCalendar
+ ) +} diff --git a/src/component/calendar/event-utils.js b/src/component/calendar/event-utils.js new file mode 100644 index 0000000..566934c --- /dev/null +++ b/src/component/calendar/event-utils.js @@ -0,0 +1,29 @@ +let eventGuid = 0; +let todayStr = new Date().toISOString().replace(/T.*$/, ''); // YYYY-MM-DD of today + +export const INITIAL_EVENTS = [ + { + id: createEventId(), + title: 'All-day event', + start: new Date('2025-01-19'), + end: new Date('2025-01-20'), + // color: 'blue' + }, + { + id: createEventId(), + title: 'Timed event', + start: todayStr + 'T12:00:00', + // color: 'red' + }, + { + id: createEventId(), + title: 'Timed event 2', + start: new Date('2025-01-25'), + start: new Date('2025-01-26'), + // color: 'blue' + }, +]; + +export function createEventId() { + return String(eventGuid++); +} diff --git a/src/css/style.scss b/src/css/style.scss index 13c9f28..ba10949 100644 --- a/src/css/style.scss +++ b/src/css/style.scss @@ -91,9 +91,6 @@ $btn-bg: #8e54e9; $btn-border: #8e54e9; $event-padding: 10px; -@import 'react-big-calendar/lib/sass/styles'; -@import 'react-big-calendar/lib/addons/dragAndDrop/styles'; // if using DnD - .extraProductCard{ background-color: aliceblue; border-radius: 5px; @@ -125,30 +122,29 @@ $event-padding: 10px; /* CALENDER STYLE HERE */ -// .rbc-today{ -// background-color: '#fcf8e3' !important; -// } -.rbc-toolbar button { - background: #eceef3; +.fc-next-button.fc-button, .fc-prev-button.fc-button, +.fc-timeGridWeek-button.fc-button, .fc-timeGridDay-button.fc-button, .fc-dayGridMonth-button.fc-button { + background: #eceef3!important; border: none; color: #a6a9b7 !important; - text-transform: capitalize; - box-shadow: none!important; - text-shadow: none!important; - border-radius: 3px!important; - margin: 0 3px!important; - padding: 6px 12px!important; - height: auto!important; + text-transform: capitalize !important; + // box-shadow: none!important; + // text-shadow: none!important; + // border-radius: 3px!important; + // margin: 0 3px!important; + // padding: 6px 12px!important; + // height: auto!important; } -.rbc-toolbar-label{ - color: black !important; - font-size: 1.5rem; - font-weight: 700; -} -// .rbc-month-view{ -// border: .5px solid #e8edf1!important; -// } -.rbc-toolbar button.rbc-active, .rbc-toolbar button:active, .rbc-toolbar button:hover{ + +.fc-today-button.fc-button, +.fc-timeGridWeek-button.fc-button-active, .fc-timeGridDay-button.fc-button-active, .fc-dayGridMonth-button.fc-button-active{ color: #fff!important; + border: none; + background-color: #8E54E9!important; +} + +.fc-event.fc-event-draggable.fc-event-start.fc-event-end.fc-daygrid-event, +.fc-event.fc-event-draggable.fc-event-start.fc-event-end.fc-daygrid-event{ + padding: 10px 2px !important; } /* END OF CALENDER STYLE */ \ No newline at end of file From 0e2f5f67609d5e3040c27dbaf86c2a03673e368f Mon Sep 17 00:00:00 2001 From: victorAnumudu Date: Fri, 17 Jan 2025 23:23:51 +0100 Subject: [PATCH 32/36] calendar fix unused fxn commented --- src/component/calendar/EventCalendar.jsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/component/calendar/EventCalendar.jsx b/src/component/calendar/EventCalendar.jsx index e6a56a6..89ad339 100644 --- a/src/component/calendar/EventCalendar.jsx +++ b/src/component/calendar/EventCalendar.jsx @@ -102,9 +102,9 @@ export default function EventCalendar({draggedEvent, setDraggedEvent}) { weekends={weekendsVisible} // initialEvents={INITIAL_EVENTS} // alternatively, use the `events` setting to fetch from a feed events={currentEvents} - select={handleDateSelect} + // select={handleDateSelect} eventContent={renderEventContent} // custom render function - eventClick={handleEventClick} + // eventClick={handleEventClick} eventsSet={handleEvents} // called after events are initialized/added/changed/removed /* you can update a remote database when these fire: eventAdd={function(){}} From b5d0fc556499c29df010563c91051ed59536b918 Mon Sep 17 00:00:00 2001 From: victorAnumudu Date: Sat, 18 Jan 2025 00:03:20 +0100 Subject: [PATCH 33/36] calendar fix contd --- src/component/calendar/Calendar.jsx | 16 ++++--- src/component/calendar/EventCalendar.jsx | 47 +++++++------------- src/component/calendar/ExternalDraggable.jsx | 28 ++++++++++++ src/component/calendar/event-utils.js | 7 --- src/css/style.scss | 1 + 5 files changed, 54 insertions(+), 45 deletions(-) create mode 100644 src/component/calendar/ExternalDraggable.jsx diff --git a/src/component/calendar/Calendar.jsx b/src/component/calendar/Calendar.jsx index 1ec5470..3c4c2d5 100644 --- a/src/component/calendar/Calendar.jsx +++ b/src/component/calendar/Calendar.jsx @@ -1,14 +1,15 @@ import React, { useCallback, useState } from "react"; import BreadcrumbComBS from "../breadcrumb/BreadcrumbComBS"; import EventCalendar from "./EventCalendar"; +import ExternalDraggable from "./ExternalDraggable"; export default function Calendar(){ - const [draggedEvent, setDraggedEvent] = useState('undroppable') - const handleDragStart = (event) => { - setDraggedEvent(event) - } + // const [draggedEvent, setDraggedEvent] = useState('undroppable') + // const handleDragStart = (event) => { + // setDraggedEvent(event) + // } const dummyEvents = [ {id: '1111', title: 'Family Vacation', color: 'fc-event-primary', start: new Date('2025-01-18')}, @@ -38,7 +39,7 @@ export default function Calendar(){

Drag and drop your event or click in the calendar.

- {dummyEvents.map((item, index) => ( + {/* {dummyEvents.map((item, index) => (
@@ -47,7 +48,8 @@ export default function Calendar(){ > {item.title}
- ))} + ))} */} +
@@ -60,7 +62,7 @@ export default function Calendar(){
{/* */} - +
diff --git a/src/component/calendar/EventCalendar.jsx b/src/component/calendar/EventCalendar.jsx index 89ad339..f1c2f88 100644 --- a/src/component/calendar/EventCalendar.jsx +++ b/src/component/calendar/EventCalendar.jsx @@ -39,37 +39,22 @@ export default function EventCalendar({draggedEvent, setDraggedEvent}) { } } -// const onDrop = useCallback( -// (event) => { -// // if (draggedEvent === 'undroppable') { -// // setDraggedEvent(null) -// // return -// // } - -// // let calendarApi; - -// // calendarApi.unselect(); // clear date selection - -// // calendarApi.addEvent({ -// // id: createEventId(), -// // allDay: selectInfo.allDay, -// // end: selectInfo.endStr, -// // start: selectInfo.startStr, -// // title, -// // ...draggedEvent -// // }); - -// // setDraggedEvent(null) -// console.log('EVENT', event) -// }, -// [draggedEvent] -// ) - - const onDrop = - (dropInfo) => { - console.log('dropInfo', dropInfo) + const onDrop = (event) => { + console.log('event', event) + if(event){ + let newEvent = { + id: createEventId(), + title: event.draggedEl.innerText, + start: event.startStr, + end: event.endStr, + allDay: event.allDay, + ...event + } + setCurrentEvents(prev => ([...prev, newEvent])) + } } + function handleEventClick(clickInfo) { if ( confirm( @@ -112,9 +97,9 @@ export default function EventCalendar({draggedEvent, setDraggedEvent}) { eventRemove={function(){}} */ - dropAccept= '.fc-event' + droppable= {true} // this allows things to be dropped onto the calendar - drop= {onDrop} + drop={onDrop} />
diff --git a/src/component/calendar/ExternalDraggable.jsx b/src/component/calendar/ExternalDraggable.jsx new file mode 100644 index 0000000..9ae460c --- /dev/null +++ b/src/component/calendar/ExternalDraggable.jsx @@ -0,0 +1,28 @@ +import React, { useEffect, useRef } from "react"; +import { Draggable } from "@fullcalendar/interaction"; + +const ExternalDraggable = ({dummyEvents}) => { + const eventContainerRef = useRef(null); + + useEffect(() => { + // Make the external events draggable + new Draggable(eventContainerRef.current, { + itemSelector: ".fc-event", + eventData: (eventEl) => ({ + title: eventEl.innerText.trim(), + }), + }); + }, []); + + return ( +
+ {dummyEvents.map((item, index) => ( +
+ {item.title} +
+ ))} +
+ ); +}; + +export default ExternalDraggable; diff --git a/src/component/calendar/event-utils.js b/src/component/calendar/event-utils.js index 566934c..70f85e8 100644 --- a/src/component/calendar/event-utils.js +++ b/src/component/calendar/event-utils.js @@ -15,13 +15,6 @@ export const INITIAL_EVENTS = [ start: todayStr + 'T12:00:00', // color: 'red' }, - { - id: createEventId(), - title: 'Timed event 2', - start: new Date('2025-01-25'), - start: new Date('2025-01-26'), - // color: 'blue' - }, ]; export function createEventId() { diff --git a/src/css/style.scss b/src/css/style.scss index ba10949..39f9815 100644 --- a/src/css/style.scss +++ b/src/css/style.scss @@ -141,6 +141,7 @@ $event-padding: 10px; color: #fff!important; border: none; background-color: #8E54E9!important; + text-transform: capitalize !important; } .fc-event.fc-event-draggable.fc-event-start.fc-event-end.fc-daygrid-event, From e8123bc898004aa47035f55290132dce40f441e3 Mon Sep 17 00:00:00 2001 From: "CHIEFSOFT\\ameye" Date: Sat, 18 Jan 2025 11:22:33 -0500 Subject: [PATCH 34/36] node_modules --- docker-compose.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/docker-compose.yml b/docker-compose.yml index d3e70c8..9ac0b20 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -16,6 +16,7 @@ services: - ./:/usr/src/app - ./src/:/usr/src/app/src - ./run.sh:/usr/src/app/run.sh + - ./node_modules/:/usr/src/app/node_modules extra_hosts: - api.mermsemr.com:10.10.33.15 - devapi.mermsemr.com:10.10.33.15 From d1d6c6a9fc65c4864c9da5041ed6b4608c8007e6 Mon Sep 17 00:00:00 2001 From: victorAnumudu Date: Sun, 19 Jan 2025 07:14:46 +0100 Subject: [PATCH 35/36] calendar fix contd --- src/component/calendar/EventCalendar.jsx | 17 +++++++++---- src/component/calendar/ExternalDraggable.jsx | 7 +++++- src/component/calendar/event-utils.js | 26 ++++++++++---------- 3 files changed, 31 insertions(+), 19 deletions(-) diff --git a/src/component/calendar/EventCalendar.jsx b/src/component/calendar/EventCalendar.jsx index f1c2f88..03db5fd 100644 --- a/src/component/calendar/EventCalendar.jsx +++ b/src/component/calendar/EventCalendar.jsx @@ -40,13 +40,13 @@ export default function EventCalendar({draggedEvent, setDraggedEvent}) { } const onDrop = (event) => { - console.log('event', event) + // console.log('event', event) if(event){ let newEvent = { id: createEventId(), title: event.draggedEl.innerText, start: event.startStr, - end: event.endStr, + // end: event.endStr, allDay: event.allDay, ...event } @@ -54,6 +54,13 @@ export default function EventCalendar({draggedEvent, setDraggedEvent}) { } } + const removeEvent = (event) => { + // let eventToRemove = event?.event?._def?.title + // let remainingEvent = currentEvents.filter(item => item.title != eventToRemove) + // setCurrentEvents(remainingEvent) + console.log('Event', event, currentEvents) + } + function handleEventClick(clickInfo) { if ( @@ -87,9 +94,9 @@ export default function EventCalendar({draggedEvent, setDraggedEvent}) { weekends={weekendsVisible} // initialEvents={INITIAL_EVENTS} // alternatively, use the `events` setting to fetch from a feed events={currentEvents} - // select={handleDateSelect} + // select={handleDateSelect} eventContent={renderEventContent} // custom render function - // eventClick={handleEventClick} + eventClick={handleEventClick} eventsSet={handleEvents} // called after events are initialized/added/changed/removed /* you can update a remote database when these fire: eventAdd={function(){}} @@ -97,7 +104,7 @@ export default function EventCalendar({draggedEvent, setDraggedEvent}) { eventRemove={function(){}} */ - + eventRemove={removeEvent} droppable= {true} // this allows things to be dropped onto the calendar drop={onDrop} /> diff --git a/src/component/calendar/ExternalDraggable.jsx b/src/component/calendar/ExternalDraggable.jsx index 9ae460c..fff304d 100644 --- a/src/component/calendar/ExternalDraggable.jsx +++ b/src/component/calendar/ExternalDraggable.jsx @@ -6,12 +6,17 @@ const ExternalDraggable = ({dummyEvents}) => { useEffect(() => { // Make the external events draggable - new Draggable(eventContainerRef.current, { + const draggable = new Draggable(eventContainerRef.current, { itemSelector: ".fc-event", eventData: (eventEl) => ({ title: eventEl.innerText.trim(), }), }); + + // Cleanup the Draggable instance on unmount + return () => { + draggable.destroy(); + }; }, []); return ( diff --git a/src/component/calendar/event-utils.js b/src/component/calendar/event-utils.js index 70f85e8..b4453d8 100644 --- a/src/component/calendar/event-utils.js +++ b/src/component/calendar/event-utils.js @@ -2,19 +2,19 @@ let eventGuid = 0; let todayStr = new Date().toISOString().replace(/T.*$/, ''); // YYYY-MM-DD of today export const INITIAL_EVENTS = [ - { - id: createEventId(), - title: 'All-day event', - start: new Date('2025-01-19'), - end: new Date('2025-01-20'), - // color: 'blue' - }, - { - id: createEventId(), - title: 'Timed event', - start: todayStr + 'T12:00:00', - // color: 'red' - }, + // { + // id: createEventId(), + // title: 'All-day event', + // start: new Date('2025-01-19'), + // end: new Date('2025-01-20'), + // // color: 'blue' + // }, + // { + // id: createEventId(), + // title: 'Timed event', + // start: todayStr + 'T12:00:00', + // // color: 'red' + // }, ]; export function createEventId() { From cd7e6fdf755576d43424a58699b9b8b10419ad5d Mon Sep 17 00:00:00 2001 From: victorAnumudu Date: Mon, 20 Jan 2025 06:15:11 +0100 Subject: [PATCH 36/36] calendar fixing contd --- src/component/calendar/Calendar.jsx | 44 ++++++++++++++++++------ src/component/calendar/EventCalendar.jsx | 14 ++++---- 2 files changed, 41 insertions(+), 17 deletions(-) diff --git a/src/component/calendar/Calendar.jsx b/src/component/calendar/Calendar.jsx index 3c4c2d5..316c9c5 100644 --- a/src/component/calendar/Calendar.jsx +++ b/src/component/calendar/Calendar.jsx @@ -11,13 +11,34 @@ export default function Calendar(){ // setDraggedEvent(event) // } - const dummyEvents = [ + const events = [ {id: '1111', title: 'Family Vacation', color: 'fc-event-primary', start: new Date('2025-01-18')}, {id: '2222', title: 'Meeting In Office', color: 'fc-event-warning', start: new Date('2025-01-19')}, {id: '3333', title: 'Client Call', color: 'fc-event-danger', start: new Date('2025-01-22')}, {id: '4444', title: 'Interview', color: 'fc-event-success', start: new Date('2025-01-1')} ] + const [dummyEvents, setDummyEvents] = useState(events) + + const [removeAfterDrop, setRemoveAfterDrop] = useState(false) + + const [newEvent, setNewEvent] = useState({ + title: '', color: '' + }) + + const handleEditEvent = ({target:{name,value}}) => { + setNewEvent(prev => ({...prev, [name]:value})) + } + + const handleAddNewEvent = () => { + if(newEvent.title && newEvent.color){ + const eventToAdd = {...newEvent} + setDummyEvents(prev => ([...prev, eventToAdd])) + setNewEvent({title: '', color: ''}) + } + } + + return( <> @@ -51,8 +72,8 @@ export default function Calendar(){ ))} */}
- + setRemoveAfterDrop(prev => !prev)} /> @@ -62,7 +83,7 @@ export default function Calendar(){
{/* */} - +
@@ -86,15 +107,16 @@ export default function Calendar(){
- +
- + + + + +
@@ -102,7 +124,7 @@ export default function Calendar(){
- +
diff --git a/src/component/calendar/EventCalendar.jsx b/src/component/calendar/EventCalendar.jsx index 03db5fd..145d1bc 100644 --- a/src/component/calendar/EventCalendar.jsx +++ b/src/component/calendar/EventCalendar.jsx @@ -6,7 +6,7 @@ import timeGridPlugin from '@fullcalendar/timegrid'; import interactionPlugin from '@fullcalendar/interaction'; import { INITIAL_EVENTS, createEventId } from './event-utils'; -export default function EventCalendar({draggedEvent, setDraggedEvent}) { +export default function EventCalendar({draggedEvent, setDraggedEvent, removeAfterDrop, setDummyEvents}) { const [weekendsVisible, setWeekendsVisible] = useState(true); const [currentEvents, setCurrentEvents] = useState(INITIAL_EVENTS); @@ -51,14 +51,16 @@ export default function EventCalendar({draggedEvent, setDraggedEvent}) { ...event } setCurrentEvents(prev => ([...prev, newEvent])) + if(removeAfterDrop){ + setDummyEvents(prev => prev.filter(item => item.title != newEvent.title)) + } } } const removeEvent = (event) => { - // let eventToRemove = event?.event?._def?.title - // let remainingEvent = currentEvents.filter(item => item.title != eventToRemove) - // setCurrentEvents(remainingEvent) - console.log('Event', event, currentEvents) + let eventToRemove = event?.event?._def?.publicId + let remainingEvent = currentEvents.filter(item => item.id != eventToRemove) + setCurrentEvents(remainingEvent) } @@ -94,7 +96,7 @@ export default function EventCalendar({draggedEvent, setDraggedEvent}) { weekends={weekendsVisible} // initialEvents={INITIAL_EVENTS} // alternatively, use the `events` setting to fetch from a feed events={currentEvents} - // select={handleDateSelect} + select={handleDateSelect} eventContent={renderEventContent} // custom render function eventClick={handleEventClick} eventsSet={handleEvents} // called after events are initialized/added/changed/removed