Compare commits

...

4 Commits

Author SHA1 Message Date
victorAnumudu 1708cb893f started calendar api integration 2025-01-21 21:14:03 +01:00
ameye 7ec139c5ad Merge branch 'auth-page-centralized' of MERMS/MermsPanelReactJS into master 2025-01-20 18:35:46 +00:00
ameye 03d395560a Merge branch 'section-removal' of MERMS/MermsPanelReactJS into master 2025-01-20 18:35:41 +00:00
victorAnumudu b869b76602 removed sections not needed 2025-01-20 17:12:52 +01:00
8 changed files with 131 additions and 64 deletions
+61 -31
View File
@@ -1,8 +1,13 @@
import React, { useCallback, useState } from "react"; import React, { useCallback, useState } from "react";
import { useQuery } from '@tanstack/react-query'
import BreadcrumbComBS from "../breadcrumb/BreadcrumbComBS"; import BreadcrumbComBS from "../breadcrumb/BreadcrumbComBS";
import EventCalendar from "./EventCalendar"; import EventCalendar from "./EventCalendar";
import ExternalDraggable from "./ExternalDraggable"; import ExternalDraggable from "./ExternalDraggable";
import { getCalendarEvents } from '../../services/services'
import queryKeys from '../../services/queryKeys'
export default function Calendar(){ export default function Calendar(){
@@ -11,6 +16,15 @@ export default function Calendar(){
// setDraggedEvent(event) // setDraggedEvent(event)
// } // }
const {data, isFetching, isError, error} = useQuery({
queryKey: queryKeys.calendar_events,
queryFn: () => getCalendarEvents()
})
const receievedEvents = data?.data?.bar_data
const category = receievedEvents?.category //EVENT CATEGORIES FROM API
const eventList = receievedEvents?.list //EVENT LIST FROM API
const events = [ const events = [
{id: '1111', title: 'Family Vacation', color: 'fc-event-primary', start: new Date('2025-01-18')}, {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: '2222', title: 'Meeting In Office', color: 'fc-event-warning', start: new Date('2025-01-19')},
@@ -52,40 +66,56 @@ export default function Calendar(){
</div> </div>
<div className="card-body"> <div className="card-body">
<div className="row"> <div className="row">
<div className="col-xl-3"> {isFetching ?
<div id="external-events"> <>
<button className="btn btn-primary btn-block" data-bs-toggle="modal" data-bs-target="#eventModal"> <div className="col-12">
Add New Event <p className='text-mute'>Loading...</p>
</button> </div>
<p className="mt-3"> </>
Drag and drop your event or click in the calendar. : isError ?
</p> <div className="col-12">
{/* {dummyEvents.map((item, index) => ( <p className='text-danger'>{error.message}</p>
<div key={index} className={`fc-event ${item.color}`} data-color={`${item.color}`} </div>
draggable="true" :
onDragStart={() => <>
handleDragStart({...item}) <div className="col-xl-3">
} <div id="external-events">
> {/* <button className="btn btn-primary btn-block" data-bs-toggle="modal" data-bs-target="#eventModal">
<span></span> {item.title} Add New Event
</div> </button>
))} */} <p className="mt-3">
<ExternalDraggable dummyEvents={dummyEvents} /> Drag and drop your event or click in the calendar.
<div className="form-check"> </p> */}
<input className="form-check-input" type="checkbox" value={removeAfterDrop} {/* {dummyEvents.map((item, index) => (
id="defaultCheck1" onChange={() => setRemoveAfterDrop(prev => !prev)} /> <div key={index} className={`fc-event ${item.color}`} data-color={`${item.color}`}
<label className="form-check-label" htmlFor="defaultCheck1"> draggable="true"
Remove After Drop onDragStart={() =>
</label> handleDragStart({...item})
}
>
<span></span> {item.title}
</div>
))} */}
<ExternalDraggable category={category} />
{/* <div className="form-check">
<input className="form-check-input" type="checkbox" value={removeAfterDrop}
id="defaultCheck1" onChange={() => setRemoveAfterDrop(prev => !prev)} />
<label className="form-check-label" htmlFor="defaultCheck1">
Remove After Drop
</label>
</div> */}
</div> </div>
</div> </div>
</div> <div className="col-xl-9">
<div className="col-xl-9"> <div className="event-calendar">
<div className="event-calendar"> <EventCalendar
{/* <EventCalendar draggedEvent={draggedEvent} setDraggedEvent={setDraggedEvent} /> */} removeAfterDrop={removeAfterDrop}
<EventCalendar removeAfterDrop={removeAfterDrop} setDummyEvents={setDummyEvents} /> eventList={eventList}
/>
</div>
</div> </div>
</div> </>
}
</div> </div>
</div> </div>
+16 -10
View File
@@ -1,4 +1,4 @@
import React, { useCallback, useState } from 'react'; import React, { useCallback, useEffect, useState } from 'react';
import { formatDate } from '@fullcalendar/core'; import { formatDate } from '@fullcalendar/core';
import FullCalendar from '@fullcalendar/react'; import FullCalendar from '@fullcalendar/react';
import dayGridPlugin from '@fullcalendar/daygrid'; import dayGridPlugin from '@fullcalendar/daygrid';
@@ -6,9 +6,9 @@ import timeGridPlugin from '@fullcalendar/timegrid';
import interactionPlugin from '@fullcalendar/interaction'; import interactionPlugin from '@fullcalendar/interaction';
import { INITIAL_EVENTS, createEventId } from './event-utils'; import { INITIAL_EVENTS, createEventId } from './event-utils';
export default function EventCalendar({draggedEvent, setDraggedEvent, removeAfterDrop, setDummyEvents}) { export default function EventCalendar({removeAfterDrop, eventList}) {
const [weekendsVisible, setWeekendsVisible] = useState(true); const [weekendsVisible, setWeekendsVisible] = useState(true);
const [currentEvents, setCurrentEvents] = useState(INITIAL_EVENTS); const [currentEvents, setCurrentEvents] = useState([]);
function handleWeekendsToggle() { function handleWeekendsToggle() {
setWeekendsVisible(!weekendsVisible); setWeekendsVisible(!weekendsVisible);
@@ -51,9 +51,9 @@ export default function EventCalendar({draggedEvent, setDraggedEvent, removeAfte
...event ...event
} }
setCurrentEvents(prev => ([...prev, newEvent])) setCurrentEvents(prev => ([...prev, newEvent]))
if(removeAfterDrop){ // if(removeAfterDrop){
setDummyEvents(prev => prev.filter(item => item.title != newEvent.title)) // setDummyEvents(prev => prev.filter(item => item.title != newEvent.title))
} // }
} }
} }
@@ -78,13 +78,18 @@ export default function EventCalendar({draggedEvent, setDraggedEvent, removeAfte
// setCurrentEvents(events); // setCurrentEvents(events);
} }
useEffect(()=>{
let newEventList = eventList.map(item => ({...item, start: new Date(item?.start)}))
setCurrentEvents(newEventList)
},[eventList])
return ( return (
<div className="demo-app"> <div className="demo-app">
<div className="demo-app-main"> <div className="demo-app-main">
<FullCalendar <FullCalendar
plugins={[dayGridPlugin, timeGridPlugin, interactionPlugin]} plugins={[dayGridPlugin, timeGridPlugin, interactionPlugin]}
headerToolbar={{ headerToolbar={{
left: 'prev next today', left: 'prev,next,today',
center: 'title', center: 'title',
right: 'dayGridMonth,timeGridWeek,timeGridDay', right: 'dayGridMonth,timeGridWeek,timeGridDay',
}} }}
@@ -96,17 +101,18 @@ export default function EventCalendar({draggedEvent, setDraggedEvent, removeAfte
weekends={weekendsVisible} weekends={weekendsVisible}
// initialEvents={INITIAL_EVENTS} // alternatively, use the `events` setting to fetch from a feed // initialEvents={INITIAL_EVENTS} // alternatively, use the `events` setting to fetch from a feed
events={currentEvents} events={currentEvents}
select={handleDateSelect}
eventContent={renderEventContent} // custom render function eventContent={renderEventContent} // custom render function
// eventClick={handleEventClick}
eventsSet={handleEvents} // called after events are initialized/added/changed/removed eventsSet={handleEvents} // called after events are initialized/added/changed/removed
// select={handleDateSelect}
// eventClick={handleEventClick}
/* you can update a remote database when these fire: /* you can update a remote database when these fire:
eventAdd={function(){}} eventAdd={function(){}}
eventChange={function(){}} eventChange={function(){}}
eventRemove={function(){}} eventRemove={function(){}}
*/ */
eventRemove={removeEvent} // eventBackgroundColor='purple'
// eventRemove={removeEvent}
droppable= {true} // this allows things to be dropped onto the calendar droppable= {true} // this allows things to be dropped onto the calendar
drop={onDrop} drop={onDrop}
/> />
+17 -6
View File
@@ -1,9 +1,16 @@
import React, { useEffect, useRef } from "react"; import React, { useEffect, useRef } from "react";
import { Draggable } from "@fullcalendar/interaction"; import { Draggable } from "@fullcalendar/interaction";
const ExternalDraggable = ({dummyEvents}) => { const ExternalDraggable = ({category}) => {
const eventContainerRef = useRef(null); const eventContainerRef = useRef(null);
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')}
]
useEffect(() => { useEffect(() => {
// Make the external events draggable // Make the external events draggable
const draggable = new Draggable(eventContainerRef.current, { const draggable = new Draggable(eventContainerRef.current, {
@@ -21,11 +28,15 @@ const ExternalDraggable = ({dummyEvents}) => {
return ( return (
<div ref={eventContainerRef} className="external-events"> <div ref={eventContainerRef} className="external-events">
{dummyEvents.map((item, index) => ( {category && category.map((item, index) => {
<div key={index} className={`fc-event ${item.color}`} data-color={`${item.color}`} > let color = index % 4 === 0 ? 'fc-event-success' : index % 3 === 0 ? 'fc-event-danger' : index % 2 === 0 ? 'fc-event-warning' : 'fc-event-primary'
{item.title} return (
</div> <div key={item?.cid || index} className={`fc-event ${color}`} data-color={`${color}`} >
))} {item.description}
</div>
)
}
)}
</div> </div>
); );
}; };
+13 -13
View File
@@ -2,19 +2,19 @@ let eventGuid = 0;
let todayStr = new Date().toISOString().replace(/T.*$/, ''); // YYYY-MM-DD of today let todayStr = new Date().toISOString().replace(/T.*$/, ''); // YYYY-MM-DD of today
export const INITIAL_EVENTS = [ export const INITIAL_EVENTS = [
// { {
// id: createEventId(), id: createEventId(),
// title: 'All-day event', title: 'All-day event',
// start: new Date('2025-01-19'), start: new Date('2025-01-19'),
// end: new Date('2025-01-20'), end: new Date('2025-01-20'),
// // color: 'blue' // color: 'blue'
// }, },
// { {
// id: createEventId(), id: createEventId(),
// title: 'Timed event', title: 'Timed event',
// start: todayStr + 'T12:00:00', start: todayStr + 'T12:00:00',
// // color: 'red' // color: 'red'
// }, },
]; ];
export function createEventId() { export function createEventId() {
@@ -89,7 +89,7 @@ export default function UserHeader(){
<i className="fa fa-envelope pr-2 text-primary"></i> Inbox <i className="fa fa-envelope pr-2 text-primary"></i> Inbox
<span className="badge badge-primary ml-auto">6</span> <span className="badge badge-primary ml-auto">6</span>
</a> </a>
<a className="dropdown-item d-flex nav-link" href="#"> <a className="dropdown-item d-flex nav-link" href={siteLinks.settings}>
<i className=" ti ti-settings pr-2 text-info"></i> Settings <i className=" ti ti-settings pr-2 text-info"></i> Settings
</a> </a>
<a className="dropdown-item d-flex nav-link" href="#"> <a className="dropdown-item d-flex nav-link" href="#">
+16 -2
View File
@@ -138,14 +138,28 @@ $event-padding: 10px;
.fc-today-button.fc-button, .fc-today-button.fc-button,
.fc-timeGridWeek-button.fc-button-active, .fc-timeGridDay-button.fc-button-active, .fc-dayGridMonth-button.fc-button-active{ .fc-timeGridWeek-button.fc-button-active, .fc-timeGridDay-button.fc-button-active, .fc-dayGridMonth-button.fc-button-active{
color: #fff!important; color: #fff !important;
border: none; border: none;
background-color: #8E54E9!important; background-color: #8E54E9 !important;
text-transform: capitalize !important; text-transform: capitalize !important;
} }
.fc-h-event,
.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,
.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; padding: 10px 2px !important;
background-color: #3788d8 !important;
color: white;
} }
.fc-theme-standard .fc-popover{
overflow-y: auto !important;
// height: calc(100% - 50px);
}
.fc .fc-more-popover .fc-popover-body {
overflow-y: auto;
height: 100px !important;
}
/* END OF CALENDER STYLE */ /* END OF CALENDER STYLE */
+2 -1
View File
@@ -4,7 +4,8 @@ const queryKeys = {
recentAction: ['recent-action'], recentAction: ['recent-action'],
product: ['product-data'], product: ['product-data'],
product_url: ['product_url'], product_url: ['product_url'],
myproduct_provision: ['myproduct_provision'] myproduct_provision: ['myproduct_provision'],
calendar_events: ['calendar_events']
} }
export default queryKeys export default queryKeys
+5
View File
@@ -101,6 +101,11 @@ export const topBar = () => {
return getAuxEnd(`/panel/account/bar`) return getAuxEnd(`/panel/account/bar`)
} }
// FUNCTION TO GET CALENDAR EVENTS
export const getCalendarEvents = () => {
return getAuxEnd(`/panel/account/calendar`)
}
// FUNCTION TO GET DASHBOARD RECENT ACTIONS SECTION // FUNCTION TO GET DASHBOARD RECENT ACTIONS SECTION
export const recentActions = () => { export const recentActions = () => {
return getAuxEnd(`/panel/account/actions`) return getAuxEnd(`/panel/account/actions`)