Add Center Calendar in
This commit is contained in:
parent
4237cc4a7c
commit
e4654be2b9
@ -43,7 +43,9 @@ exports.createCalendarEvent = (req, res) => {
|
||||
edit_date: req.body.create_date,
|
||||
youtube_video_id: req.body.youtube_video_id,
|
||||
edit_history: req.body.edit_history,
|
||||
site
|
||||
site,
|
||||
event_location: req.body.event_location,
|
||||
event_prediction_date: req.body.event_prediction_date
|
||||
});
|
||||
// Save event in the database
|
||||
calendarEvent
|
||||
@ -85,6 +87,9 @@ exports.getAllEvents = (req, res) => {
|
||||
$lt: moment(parameter.end_date + 'T00:00:00:00', "America/New_York").toDate()
|
||||
};
|
||||
}
|
||||
if (params.type) {
|
||||
condition['type'] = params.type;
|
||||
}
|
||||
condition = splitSite.splitSiteGet(req, condition);
|
||||
CalendarEvent.find(condition)
|
||||
.then(data => {
|
||||
|
||||
@ -43,7 +43,7 @@ module.exports = mongoose => {
|
||||
title: String,
|
||||
type: String,
|
||||
// value could be ['shopping', 'banking', 'singing', 'dancing', 'medical', 'haircut', 'meal', 'transportation', 'others']
|
||||
descrption: String,
|
||||
description: String,
|
||||
department: String,
|
||||
notes: String,
|
||||
start_time: Date,
|
||||
@ -77,7 +77,9 @@ module.exports = mongoose => {
|
||||
edit_history: [{
|
||||
type: editHistorySchema
|
||||
}],
|
||||
site: Number
|
||||
site: Number,
|
||||
event_location: String,
|
||||
event_prediction_date: String
|
||||
},
|
||||
{ collection: 'calendar_event', timestamps: true }
|
||||
);
|
||||
|
||||
@ -1,16 +1,16 @@
|
||||
{
|
||||
"files": {
|
||||
"main.css": "/static/css/main.11c89bb3.css",
|
||||
"main.js": "/static/js/main.1ecf349a.js",
|
||||
"main.js": "/static/js/main.c96f6687.js",
|
||||
"static/js/787.c4e7f8f9.chunk.js": "/static/js/787.c4e7f8f9.chunk.js",
|
||||
"static/media/landing.png": "/static/media/landing.d4c6072db7a67dff6a78.png",
|
||||
"index.html": "/index.html",
|
||||
"main.11c89bb3.css.map": "/static/css/main.11c89bb3.css.map",
|
||||
"main.1ecf349a.js.map": "/static/js/main.1ecf349a.js.map",
|
||||
"main.c96f6687.js.map": "/static/js/main.c96f6687.js.map",
|
||||
"787.c4e7f8f9.chunk.js.map": "/static/js/787.c4e7f8f9.chunk.js.map"
|
||||
},
|
||||
"entrypoints": [
|
||||
"static/css/main.11c89bb3.css",
|
||||
"static/js/main.1ecf349a.js"
|
||||
"static/js/main.c96f6687.js"
|
||||
]
|
||||
}
|
||||
@ -1 +1 @@
|
||||
<!doctype html><html lang="en"><head><meta charset="utf-8"/><link rel="icon" href="/favicon.ico"/><meta name="viewport" content="width=device-width,initial-scale=1"/><meta name="theme-color" content="#000000"/><meta name="description" content="Web site created using create-react-app"/><link rel="apple-touch-icon" href="/logo192.png"/><script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.10/lodash.min.js"></script><link rel="manifest" href="/manifest.json"/><title>Worldshine Transportation</title><script defer="defer" src="/static/js/main.1ecf349a.js"></script><link href="/static/css/main.11c89bb3.css" rel="stylesheet"></head><body><noscript>You need to enable JavaScript to run this app.</noscript><div id="root"></div></body></html>
|
||||
<!doctype html><html lang="en"><head><meta charset="utf-8"/><link rel="icon" href="/favicon.ico"/><meta name="viewport" content="width=device-width,initial-scale=1"/><meta name="theme-color" content="#000000"/><meta name="description" content="Web site created using create-react-app"/><link rel="apple-touch-icon" href="/logo192.png"/><script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.10/lodash.min.js"></script><link rel="manifest" href="/manifest.json"/><title>Worldshine Transportation</title><script defer="defer" src="/static/js/main.c96f6687.js"></script><link href="/static/css/main.11c89bb3.css" rel="stylesheet"></head><body><noscript>You need to enable JavaScript to run this app.</noscript><div id="root"></div></body></html>
|
||||
File diff suppressed because one or more lines are too long
@ -1,126 +0,0 @@
|
||||
/*!
|
||||
Copyright (c) 2018 Jed Watson.
|
||||
Licensed under the MIT License (MIT), see
|
||||
http://jedwatson.github.io/classnames
|
||||
*/
|
||||
|
||||
/*!
|
||||
* Signature Pad v2.3.2
|
||||
* https://github.com/szimek/signature_pad
|
||||
*
|
||||
* Copyright 2017 Szymon Nowak
|
||||
* Released under the MIT license
|
||||
*
|
||||
* The main idea and some parts of the code (e.g. drawing variable width Bézier curve) are taken from:
|
||||
* http://corner.squareup.com/2012/07/smoother-signatures.html
|
||||
*
|
||||
* Implementation of interpolation using cubic Bézier curves is taken from:
|
||||
* http://benknowscode.wordpress.com/2012/09/14/path-interpolation-using-cubic-bezier-and-control-point-estimation-in-javascript
|
||||
*
|
||||
* Algorithm for approximated length of a Bézier curve is taken from:
|
||||
* http://www.lemoda.net/maths/bezier-length/index.html
|
||||
*
|
||||
*/
|
||||
|
||||
/*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */
|
||||
|
||||
/**
|
||||
* @license
|
||||
* Lodash <https://lodash.com/>
|
||||
* Copyright OpenJS Foundation and other contributors <https://openjsf.org/>
|
||||
* Released under MIT license <https://lodash.com/license>
|
||||
* Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>
|
||||
* Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
|
||||
*/
|
||||
|
||||
/**
|
||||
* @license React
|
||||
* react-dom.production.min.js
|
||||
*
|
||||
* Copyright (c) Facebook, Inc. and its affiliates.
|
||||
*
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @license React
|
||||
* react-is.production.min.js
|
||||
*
|
||||
* Copyright (c) Facebook, Inc. and its affiliates.
|
||||
*
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @license React
|
||||
* react-jsx-runtime.production.min.js
|
||||
*
|
||||
* Copyright (c) Facebook, Inc. and its affiliates.
|
||||
*
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @license React
|
||||
* react.production.min.js
|
||||
*
|
||||
* Copyright (c) Facebook, Inc. and its affiliates.
|
||||
*
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @license React
|
||||
* scheduler.production.min.js
|
||||
*
|
||||
* Copyright (c) Facebook, Inc. and its affiliates.
|
||||
*
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @license React
|
||||
* use-sync-external-store-shim.production.min.js
|
||||
*
|
||||
* Copyright (c) Facebook, Inc. and its affiliates.
|
||||
*
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @license React
|
||||
* use-sync-external-store-shim/with-selector.production.min.js
|
||||
*
|
||||
* Copyright (c) Facebook, Inc. and its affiliates.
|
||||
*
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*/
|
||||
|
||||
/**
|
||||
* React Router v6.3.0
|
||||
*
|
||||
* Copyright (c) Remix Software Inc.
|
||||
*
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE.md file in the root directory of this source tree.
|
||||
*
|
||||
* @license MIT
|
||||
*/
|
||||
|
||||
/** @license React v16.13.1
|
||||
* react-is.production.min.js
|
||||
*
|
||||
* Copyright (c) Facebook, Inc. and its affiliates.
|
||||
*
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*/
|
||||
|
||||
//! moment.js
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@ -67,6 +67,7 @@ import Layout from "./components/home/layout";
|
||||
import Home from "./components/home/home";
|
||||
|
||||
import Seating from "./components/seating/Seating";
|
||||
import CenterCalendar from "./components/center-calendar/CenterCalendar";
|
||||
|
||||
|
||||
function App() {
|
||||
@ -150,6 +151,7 @@ function App() {
|
||||
</Route>
|
||||
|
||||
<Route path="/seating" element={<Seating />} />
|
||||
<Route path="/center-calendar" element={<CenterCalendar/>} />
|
||||
|
||||
<Route path="/medical" element={<Medical />}>
|
||||
<Route path="" element={<Navigate replace to="index" />} />
|
||||
|
||||
633
client/src/components/center-calendar/CenterCalendar.js
Normal file
633
client/src/components/center-calendar/CenterCalendar.js
Normal file
@ -0,0 +1,633 @@
|
||||
import React, {useState, useEffect} from "react";
|
||||
import { useNavigate } from "react-router-dom";
|
||||
import { AuthService, EventsService, CustomerService, ResourceService, VehicleService, EmployeeService } from "../../services";
|
||||
import moment from 'moment';
|
||||
import { Breadcrumb, Tabs, Tab, Button, Modal, Dropdown } from "react-bootstrap";
|
||||
import { useCalendarApp, ScheduleXCalendar } from '@schedule-x/react';
|
||||
import {
|
||||
viewMonthGrid,
|
||||
createViewDay,
|
||||
createViewWeek,
|
||||
createViewMonthGrid
|
||||
} from '@schedule-x/calendar';
|
||||
import { createEventsServicePlugin } from '@schedule-x/events-service';
|
||||
import { createEventModalPlugin} from '@schedule-x/event-modal';
|
||||
import '@schedule-x/theme-default/dist/calendar.css';
|
||||
import { Archive, PencilSquare, Filter } from "react-bootstrap-icons";
|
||||
import DatePicker from "react-datepicker";
|
||||
import { vehicleSlice } from "../../store";
|
||||
// import { Scheduler } from "@aldabil/react-scheduler";
|
||||
|
||||
|
||||
const EventsCalendar = () => {
|
||||
const navigate = useNavigate();
|
||||
const [events, setEvents] = useState([]);
|
||||
const [allEvents, setAllEvents] = useState([]);
|
||||
const [targetedEventType, setTargetedEventType] = useState('medical');
|
||||
const [currentTab, setCurrentTab] = useState('medicalCalendar');
|
||||
const [customers, setCustomers] = useState([]);
|
||||
const [resources, setResources] = useState([]);
|
||||
const [fromDate, setFromDate] = useState(new Date(new Date().getFullYear(), new Date().getMonth(), 1));
|
||||
const [toDate, setToDate] = useState(new Date(new Date().getFullYear(), new Date().getMonth() + 1, 0));
|
||||
const [currentTotalTranslate1, setCurrentTotalTranslate1] = useState(0);
|
||||
const [currentTotalTranslate2, setCurrentTotalTranslate2] = useState(0);
|
||||
const [currentTotalResource, setCurrentTotalResource] = useState(0);
|
||||
const [showDeletedItems, setShowDeletedItems] = useState(false);
|
||||
const [timeData, setTimeData] = useState([]);
|
||||
const [showFilterDropdown, setShowFilterDropdown] = useState(false);
|
||||
const eventsServicePlugin = createEventsServicePlugin();
|
||||
const eventModalService = createEventModalPlugin();
|
||||
const [groupedEvents, setGroupedEvents] = useState(new Map());
|
||||
const [showCreationModal, setShowCreationModal] = useState(false);
|
||||
const [newEventStartDateTime, setNewEventStartDateTime] = useState(new Date());
|
||||
const [newEventEndDateTime, setNewEventEndDateTime] = useState(new Date())
|
||||
const [newEventType, setNewEventType] = useState('');
|
||||
const [newEventTitle, setNewEventTitle] = useState('');
|
||||
const [newEventDescription, setNewEventDescription] = useState('');
|
||||
const [newEventLocation, setNewEventLocation] = useState('');
|
||||
const [newEventTarget, setNewEventTarget] = useState(undefined);
|
||||
const [newEventSource, setNewEventSource] = useState(undefined);
|
||||
const [newEventDepartment, setNewEventDepartment] = useState('');
|
||||
const [newEventColor, setNewEventColor] = useState('');
|
||||
const [newEventSourceType, setNewEventSourceType] = useState('');
|
||||
const [newEventTargetType, setNewEventTargetType] = useState('');
|
||||
const [newEventFutureDate, setNewEventFutureDate] = useState(undefined);
|
||||
const [vehicles, setVehicles] = useState([]);
|
||||
const [employees, setEmployees] = useState([]);
|
||||
|
||||
const eventTypeMap = {
|
||||
medicalCalendar: 'medical',
|
||||
activitiesCalendar: 'activity',
|
||||
incidentsCalendar: 'incident',
|
||||
mealPlanCalendar: 'meal_plan',
|
||||
reminderDatesCalendar: 'reminder'
|
||||
}
|
||||
|
||||
const calendar = useCalendarApp({
|
||||
views: [createViewMonthGrid(), createViewDay(), createViewWeek()],
|
||||
monthGridOptions: {
|
||||
/**
|
||||
* Number of events to display in a day cell before the "+ N events" button is shown
|
||||
* */
|
||||
nEventsPerDay: 50,
|
||||
},
|
||||
defaultView: viewMonthGrid.name,
|
||||
skipValidation: true,
|
||||
selectedDate: moment(new Date()).format('YYYY-MM-DD HH:mm'),
|
||||
events: events,
|
||||
plugins: [eventModalService, eventsServicePlugin],
|
||||
callbacks: {
|
||||
onSelectedDateUpdate(date) {
|
||||
setFromDate(new Date(new Date(date).getFullYear(), new Date(date).getMonth(), 1));
|
||||
setToDate(new Date(new Date(date).getFullYear(), new Date(date).getMonth() + 1, 0));
|
||||
},
|
||||
onClickDate(date) {
|
||||
|
||||
|
||||
setNewEventStartDateTime(new Date(date))
|
||||
setNewEventEndDateTime(new Date(date));
|
||||
setShowCreationModal(true);
|
||||
|
||||
|
||||
|
||||
},
|
||||
onClickDateTime(dateTime) {
|
||||
|
||||
setNewEventStartDateTime(new Date(dateTime.replace(' ', 'T')));
|
||||
setNewEventEndDateTime(new Date(dateTime.replace(' ', 'T')));
|
||||
setShowCreationModal(true);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
});
|
||||
|
||||
const getGroupedEvents = () => {
|
||||
const eventsDateMap = new Map();
|
||||
for (const eventItem of events) {
|
||||
const dateString = moment(eventItem.start_time).format('MMM Do, YYYY');
|
||||
if (eventsDateMap.has(dateString)) {
|
||||
eventsDateMap.set(dateString, [...eventsDateMap.get(dateString), eventItem]);
|
||||
} else {
|
||||
const value = [];
|
||||
value.push(eventItem);
|
||||
eventsDateMap.set(dateString, value);
|
||||
}
|
||||
}
|
||||
return eventsDateMap;
|
||||
};
|
||||
|
||||
|
||||
useEffect(() => {
|
||||
if (!AuthService.canAccessLegacySystem()) {
|
||||
window.alert('You haven\'t login yet OR this user does not have access to this page. Please change an admin account to login.')
|
||||
AuthService.logout();
|
||||
navigate(`/login`);
|
||||
}
|
||||
VehicleService.getAllActiveVehicles().then((data) => {
|
||||
setVehicles(data.data)
|
||||
});
|
||||
EmployeeService.getAllEmployees().then((data) => {
|
||||
setEmployees(data.data);
|
||||
});
|
||||
CustomerService.getAllCustomers().then((data) => {
|
||||
setCustomers(data.data);
|
||||
});
|
||||
ResourceService.getAll().then((data) => {
|
||||
setResources(data.data);
|
||||
});
|
||||
EventsService.getTimeData().then(data => {
|
||||
setTimeData(data.data);
|
||||
});
|
||||
}, []);
|
||||
|
||||
useEffect(() => {
|
||||
EventsService.getAllEvents({ from: EventsService.formatDate(fromDate), to: EventsService.formatDate(toDate) }).then(data => setAllEvents(data?.data));
|
||||
}, [fromDate, toDate]);
|
||||
|
||||
useEffect(() => {
|
||||
setNewEventType(eventTypeMap[currentTab]);
|
||||
if (currentTab === 'medicalCalendar') {
|
||||
if (customers?.length > 0 && resources.length > 0) {
|
||||
const orignialEvents = [...allEvents];
|
||||
setEvents(orignialEvents?.filter(item => item.type === 'medical')?.map((item) => {
|
||||
const customerField = item?.data?.customer ? (customers?.find(c => c.id === item?.data?.customer)?.name || item?.data?.client_name || '') : (item?.data?.client_name || '');
|
||||
const doctorField = item?.data?.resource ? ((resources?.find(r => r.id === item?.data?.resource))?.name || item?.data?.resource_name || '') : (item?.data?.resource_name || '');
|
||||
item.event_id = item.id;
|
||||
item.customer = customerField;
|
||||
item.doctor = doctorField;
|
||||
item.phone = item?.data?.resource ? ((resources?.find(r => r.id === item?.data?.resource))?.phone || item?.data?.resource_phone || '') : (item?.data?.resource_phone || '');
|
||||
item.contact = item?.data?.resource? ((resources?.find(r => r.id === item?.data?.resource))?.contact || item?.data?.resource_contact || '') : (item?.data?.resource_contact || '')
|
||||
item.address = item?.data?.resource ? ((resources?.find(r => r.id === item?.data?.resource))?.address || item?.data?.resource_address || '') : (item?.data?.resource_address || '');
|
||||
item.translation = item?.data?.interpreter || '';
|
||||
item.newPatient = item?.data?.new_patient || '';
|
||||
item.needId = item?.data?.need_id || '';
|
||||
item.disability = item?.data?.disability || '';
|
||||
item.startTime = item?.start_time? `${moment(new Date(item?.start_time)).format('YYYY-MM-DD HH:mm')}` : '' ;
|
||||
item.endTime = item?.start_time? `${moment(new Date(item?.end_time)).format('YYYY-MM-DD HH:mm')}` : '' ;
|
||||
item.fasting = item?.data?.fasting || '';
|
||||
item.transportation = item?.link_event_name || '';
|
||||
item.title = currentTab==='medicalCalendar' ? `${customerField}, provider: ${doctorField}`: item.title;
|
||||
item.start = item?.start_time? `${moment(new Date(item?.start_time)).format('YYYY-MM-DD HH:mm')}` : `${moment().format('YYYY-MM-DD HH:mm')}`;
|
||||
item.end = item?.stop_time? `${moment(new Date(item?.stop_time)).format('YYYY-MM-DD HH:mm')}` : (item?.start_time? `${moment(item?.start_time).format('YYYY-MM-DD HH:mm')}` : `${moment().format('YYYY-MM-DD HH:mm')}`);
|
||||
const transportationInfo = EventsService.getTransportationInfo(allEvents, item, timeData);
|
||||
const { isFutureEvent, maxTranslate1, maxTranslate2, maxResource, totalTranslate1, totalTranslate2, totalResource} = transportationInfo;
|
||||
item.color = item?.color;
|
||||
item._options = { additionalClasses: [`event-${item?.color || 'primary'}`]};
|
||||
item.showWarnings = isFutureEvent;
|
||||
item.maxTranslate1 = maxTranslate1;
|
||||
item.maxTranslate2 = maxTranslate2;
|
||||
item.maxResource = maxResource;
|
||||
item.totalTranslate1 = totalTranslate1;
|
||||
setCurrentTotalTranslate1(item.totalTranslate1);
|
||||
item.totalTranslate2 = totalTranslate2;
|
||||
setCurrentTotalTranslate2(item.totalTranslate2);
|
||||
item.totalResource = totalResource;
|
||||
setCurrentTotalResource(item.totalResource);
|
||||
return item;
|
||||
})?.filter(item => (!showDeletedItems && item.status === 'active') || showDeletedItems));
|
||||
}
|
||||
} else {
|
||||
const originalEvents = [...allEvents];
|
||||
setEvents(originalEvents?.filter(item => item.type === eventTypeMap[currentTab])?.map(item => ({
|
||||
...item,
|
||||
title: item?.title,
|
||||
start: item?.start_time? `${moment(new Date(item?.start_time)).format('YYYY-MM-DD HH:mm')}` : `${moment().format('YYYY-MM-DD HH:mm')}`,
|
||||
end: item?.stop_time? `${moment(new Date(item?.stop_time)).format('YYYY-MM-DD HH:mm')}` : (item?.start_time? `${moment(item?.start_time).format('YYYY-MM-DD HH:mm')}` : `${moment().format('YYYY-MM-DD HH:mm')}`),
|
||||
_options: { additionalClasses: [`event-${item?.color || 'primary'}`]}
|
||||
}))?.filter(item => (!showDeletedItems && item.status === 'active') || showDeletedItems));
|
||||
}
|
||||
}, [customers, resources, timeData, currentTab, allEvents, showDeletedItems])
|
||||
|
||||
useEffect(() => {
|
||||
if (events && calendar) {
|
||||
calendar?.eventsService?.set(events);
|
||||
setGroupedEvents(getGroupedEvents());
|
||||
}
|
||||
}, [events]);
|
||||
|
||||
|
||||
const redirectToAdmin = () => {
|
||||
navigate(`/medical`)
|
||||
}
|
||||
|
||||
const goToEdit = (id) => {
|
||||
navigate(`/medical/events/edit/${id}?from=calendar`)
|
||||
}
|
||||
|
||||
const goToCreateNew = () => {
|
||||
navigate(`/medical/events`)
|
||||
}
|
||||
|
||||
const goToList = () => {
|
||||
navigate(`/medical/events/list`)
|
||||
}
|
||||
|
||||
const goToMultipleList = () => {
|
||||
navigate(`/medical/events/multiple-list`)
|
||||
}
|
||||
|
||||
|
||||
const goToView = (id) => {
|
||||
navigate(`/medical/events/${id}`)
|
||||
}
|
||||
|
||||
const disableEvent = (id) => {
|
||||
const currentEvent = events.find(item => item.id === id);
|
||||
EventsService.disableEvent(id, { status: 'inactive', edit_by: localStorage.getItem('user') && JSON.parse(localStorage.getItem('user'))?.name,
|
||||
edit_date: new Date(),
|
||||
edit_history: currentEvent?.edit_history? [...currentEvent.edit_history, { employee: localStorage.getItem('user') && JSON.parse(localStorage.getItem('user'))?.name, date: new Date() }] : [{ employee: localStorage.getItem('user') && JSON.parse(localStorage.getItem('user'))?.name, date: new Date() }]}).then(() => {
|
||||
EventsService.getAllEvents({ from: EventsService.formatDate(fromDate), to: EventsService.formatDate(toDate) }).then((data) => {
|
||||
setAllEvents(data?.data);
|
||||
// if (currentTab === 'medicalCalendar') {
|
||||
// setEvents(data.data.filter((item) => {
|
||||
// const customerField = item?.data?.customer ? (customers?.find(c => c.id === item?.data?.customer)?.name || item?.data?.client_name || '') : (item?.data?.client_name || '');
|
||||
// const doctorField = item?.data?.resource ? ((resources?.find(r => r.id === item?.data?.resource))?.name || item?.data?.resource_name || '') : (item?.data?.resource_name || '');
|
||||
// item.event_id = item.id;
|
||||
// item.customer = customerField;
|
||||
// item.doctor = doctorField;
|
||||
// item.phone = item?.data?.resource ? ((resources?.find(r => r.id === item?.data?.resource))?.phone || item?.data?.resource_phone || '') : (item?.data?.resource_phone || '');
|
||||
// item.contact = item?.data?.resource? ((resources?.find(r => r.id === item?.data?.resource))?.contact || item?.data?.resource_contact || '') : (item?.data?.resource_contact || '')
|
||||
// item.address = item?.data?.resource ? ((resources?.find(r => r.id === item?.data?.resource))?.address || item?.data?.resource_address || '') : (item?.data?.resource_address || '');
|
||||
// item.translation = item?.data?.interpreter || '';
|
||||
// item.newPatient = item?.data?.new_patient || '';
|
||||
// item.needId = item?.data?.need_id || '';
|
||||
// item.disability = item?.data?.disability || '';
|
||||
// item.startTime = item?.start_time? `${moment(new Date(item?.start_time)).format('YYYY-MM-DD HH:mm')}` : `${moment().format('YYYY-MM-DD HH:mm')}` ;
|
||||
// item.endTime = item.stop_time? `${moment(new Date(item?.stop_time)).format('YYYY-MM-DD HH:mm')}` : (item?.start_time? `${moment(item?.start_time).format('YYYY-MM-DD HH:mm')}` : `${moment().format('YYYY-MM-DD HH:mm')}`);
|
||||
// item.fasting = item?.data?.fasting || '';
|
||||
// item.transportation = item?.link_event_name || '';
|
||||
// item.title = `${customerField}, provider: ${doctorField}`;
|
||||
// item.start = item?.start_time? `${moment(new Date(item?.start_time)).format('YYYY-MM-DD HH:mm')}` : `${moment().format('YYYY-MM-DD HH:mm')}`;
|
||||
// item.end = item.stop_time? `${moment(new Date(item?.stop_time)).format('YYYY-MM-DD HH:mm')}` : (item?.start_time? `${moment(item?.start_time).format('YYYY-MM-DD HH:mm')}` : `${moment().format('YYYY-MM-DD HH:mm')}`);
|
||||
// item._options = { additionalClasses: [`event-${item?.color || 'primary'}`]};
|
||||
// const transportationInfo = EventsService.getTransportationInfo(data.data, item, timeData);
|
||||
// const { isFutureEvent, maxTranslate1, maxTranslate2, maxResource, totalTranslate1, totalTranslate2, totalResource} = transportationInfo;
|
||||
// item.color = item?.color;
|
||||
// item.showWarnings = isFutureEvent;
|
||||
// item.maxTranslate1 = maxTranslate1;
|
||||
// item.maxTranslate2 = maxTranslate2;
|
||||
// item.maxResource = maxResource;
|
||||
// item.totalTranslate1 = totalTranslate1;
|
||||
// setCurrentTotalTranslate1(item.totalTranslate1);
|
||||
// item.totalTranslate2 = totalTranslate2;
|
||||
// setCurrentTotalTranslate2(item.totalTranslate2);
|
||||
// item.totalResource = totalResource;
|
||||
// setCurrentTotalResource(item.totalResource);
|
||||
// return item;
|
||||
// }).filter(item => item.type === 'medical'));
|
||||
// }
|
||||
})
|
||||
});
|
||||
}
|
||||
|
||||
const FilterAndClose = () => {
|
||||
setShowFilterDropdown(false);
|
||||
}
|
||||
|
||||
const cleanFilterAndClose = () => {
|
||||
setShowFilterDropdown(false);
|
||||
setShowDeletedItems(false);
|
||||
}
|
||||
|
||||
const goToTab = (value) => {
|
||||
setTargetedEventType(eventTypeMap[value]);
|
||||
setCurrentTab(value);
|
||||
}
|
||||
|
||||
|
||||
const customComponents = {
|
||||
eventModal: ({calendarEvent}) => {
|
||||
return <>
|
||||
|
||||
<div className="sx__event-modal__title">{currentTab === 'medicalCalendar' ? calendarEvent?.customer : calendarEvent?.title}</div>
|
||||
{ calendarEvent?.doctor && <div className="sx__event-modal__time">{`${calendarEvent?.doctor}`}</div>}
|
||||
<div className="sx__event-modal__time">{`${calendarEvent?.start}`}</div>
|
||||
<div className="sx__event-modal__time">
|
||||
{currentTab === 'medicalCalendar' && <PencilSquare size={16} onClick={() => goToEdit(calendarEvent?.id)} className="me-4"></PencilSquare>}
|
||||
<Archive size={16} onClick={() =>{disableEvent(calendarEvent?.id)}}></Archive> </div>
|
||||
</>
|
||||
}
|
||||
};
|
||||
|
||||
const customMenu = React.forwardRef(
|
||||
({ children, style, className, 'aria-labelledby': labeledBy }, ref) => {
|
||||
return (
|
||||
<div
|
||||
ref={ref}
|
||||
style={style}
|
||||
className={className}
|
||||
aria-labelledby={labeledBy}
|
||||
>
|
||||
<h6>Filter By</h6>
|
||||
<div className="app-main-content-fields-section margin-sm dropdown-container">
|
||||
<div className="me-4">
|
||||
<div className="field-label">Show Deleted Events</div>
|
||||
<input type="checkbox" value={showDeletedItems} checked={showDeletedItems === true} onClick={() => setShowDeletedItems(!showDeletedItems)} />
|
||||
</div>
|
||||
</div>
|
||||
<div className="list row">
|
||||
<div className="col-md-12">
|
||||
<button className="btn btn-default btn-sm float-right" onClick={() => cleanFilterAndClose()}> Cancel </button>
|
||||
<button className="btn btn-primary btn-sm float-right" onClick={() => FilterAndClose()}> Filter </button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
},
|
||||
);
|
||||
|
||||
const calendarView = <div className="multi-columns-container">
|
||||
<div className="column-container" style={{'minWidth': '1000px'}}>
|
||||
{calendar && <ScheduleXCalendar customComponents={customComponents} calendarApp={calendar} />}
|
||||
</div>
|
||||
<div className="column-container">
|
||||
<div className="column-card">
|
||||
<h6 className="text-primary me-4">List</h6>
|
||||
{
|
||||
Array.from(groupedEvents?.keys())?.map((key) => {
|
||||
return <>
|
||||
<h6 className="text-primary me-2">{key}</h6>
|
||||
{
|
||||
groupedEvents.get(key).map(eventItem => <div className={`event-${eventItem.color || 'primary'} mb-4 event-list-item-container`}>
|
||||
<div className="event-item-flex">
|
||||
<div className="sx__month-agenda-event__title">{currentTab === 'medicalCalendar' ? eventItem.customer : eventItem.title}</div>
|
||||
<div className="sx__event-modal__time">{`${moment(eventItem?.start_time).format('hh:mm A')} ${eventItem?.end_time ? `- ${moment(eventItem?.end_time).format('hh:mm A')}` : '' }`}</div>
|
||||
</div>
|
||||
<div className="sx__event-modal__time with-padding">{ currentTab === 'medicalCalendar' ? `provider: ${eventItem?.doctor}` : eventItem?.description}</div>
|
||||
{eventItem?.event_prediction_date && <div className="sx__event-modal__time with-padding">{ `Vehicle: ${eventItem?.target_name}`}</div>}
|
||||
{eventItem?.event_prediction_date && <div className="sx__event-modal__time with-padding">{ `Deadline: ${moment(eventItem?.event_prediction_date).format('MM/DD/YYYY')}`}</div>}
|
||||
</div>)
|
||||
}
|
||||
</>
|
||||
})
|
||||
}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
const handleClose = () => {
|
||||
setNewEventDescription('');
|
||||
setNewEventTitle('');
|
||||
setNewEventLocation('');
|
||||
setNewEventSource(undefined);
|
||||
setNewEventTarget(undefined);
|
||||
setNewEventStartDateTime(undefined);
|
||||
setNewEventType('');
|
||||
setNewEventFutureDate(undefined);
|
||||
setNewEventSourceType('');
|
||||
setNewEventTargetType('');
|
||||
setShowCreationModal(false);
|
||||
setNewEventEndDateTime(undefined);
|
||||
}
|
||||
const handleSave = () => {
|
||||
const data = {
|
||||
title: newEventTitle,
|
||||
description: newEventDescription,
|
||||
type: newEventType,
|
||||
department: newEventDepartment,
|
||||
start_time: newEventStartDateTime,
|
||||
stop_time: newEventStartDateTime,
|
||||
color: newEventColor,
|
||||
source_type: newEventSourceType,
|
||||
source_uuid: newEventSource?.value,
|
||||
source_name: newEventSource?.label,
|
||||
target_type: newEventTargetType,
|
||||
target_uuid: newEventTarget?.value,
|
||||
target_name: newEventTarget?.label,
|
||||
event_location: newEventLocation,
|
||||
event_prediction_date: newEventFutureDate && moment(newEventFutureDate).format('MM/DD/YYYY'),
|
||||
status: 'active',
|
||||
create_by: localStorage.getItem('user') && JSON.parse(localStorage.getItem('user'))?.name,
|
||||
edit_by: localStorage.getItem('user') && JSON.parse(localStorage.getItem('user'))?.name,
|
||||
edit_date: new Date(),
|
||||
create_date: new Date(),
|
||||
edit_history: [{ employee: localStorage.getItem('user') && JSON.parse(localStorage.getItem('user'))?.name, date: new Date() }]
|
||||
}
|
||||
EventsService.createNewEvent(data).then(() => {
|
||||
EventsService.getAllEvents({ from: EventsService.formatDate(fromDate), to: EventsService.formatDate(toDate) }).then((data) => {
|
||||
setAllEvents(data.data);
|
||||
setShowCreationModal(false);
|
||||
setNewEventDescription('');
|
||||
setNewEventTitle('');
|
||||
setNewEventLocation('');
|
||||
setNewEventSource(undefined);
|
||||
setNewEventTarget(undefined);
|
||||
setNewEventStartDateTime(undefined);
|
||||
setNewEventType('');
|
||||
})
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
return (
|
||||
<>
|
||||
<div className="list row mb-4">
|
||||
<Breadcrumb>
|
||||
<Breadcrumb.Item>General</Breadcrumb.Item>
|
||||
<Breadcrumb.Item active>
|
||||
Calendar
|
||||
</Breadcrumb.Item>
|
||||
</Breadcrumb>
|
||||
<div className="col-md-12 text-primary">
|
||||
<h4>
|
||||
Calendar
|
||||
</h4>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div className="app-main-content-list-container" style={{"min-width": "1500px"}}>
|
||||
<div className="app-main-content-list-func-container">
|
||||
<Tabs defaultActiveKey="medicalCalendar" id="medical-calendar-tab" onSelect={(k) => goToTab(k)}>
|
||||
<Tab eventKey="medicalCalendar" title="Medical Appointments">
|
||||
|
||||
</Tab>
|
||||
<Tab eventKey="activitiesCalendar" title="Activities">
|
||||
|
||||
</Tab>
|
||||
<Tab eventKey="incidentsCalendar" title="Important Notes And Incidents">
|
||||
|
||||
</Tab>
|
||||
<Tab eventKey="mealPlanCalendar" title="Meal Plan">
|
||||
|
||||
</Tab>
|
||||
<Tab eventKey="reminderDatesCalendar" title="Important Dates">
|
||||
|
||||
</Tab>
|
||||
</Tabs>
|
||||
{ calendarView}
|
||||
<div className="list-func-panel">
|
||||
<Dropdown
|
||||
key={'event-calendar-filter'}
|
||||
id="event-calendar-filter"
|
||||
show={showFilterDropdown}
|
||||
onToggle={() => setShowFilterDropdown(!showFilterDropdown)}
|
||||
autoClose={false}
|
||||
>
|
||||
<Dropdown.Toggle variant="primary">
|
||||
<Filter size={16} className="me-2"></Filter>Filter
|
||||
</Dropdown.Toggle>
|
||||
<Dropdown.Menu as={customMenu}/>
|
||||
</Dropdown>
|
||||
</div>
|
||||
<Modal show={showCreationModal && currentTab !== 'medicalCalendar'} onHide={handleClose}>
|
||||
<Modal.Header closeButton>
|
||||
<Modal.Title>Create New Calendar Item</Modal.Title>
|
||||
</Modal.Header>
|
||||
<Modal.Body>
|
||||
<div className="app-main-content-fields-section">
|
||||
<div className="me-4">
|
||||
<div className="field-label">Title
|
||||
<span className="required">*</span>
|
||||
</div>
|
||||
<input type="text" placeholder="Briefly Describe activity, incident, menu or reminder" value={newEventTitle || ''} onChange={e => setNewEventTitle(e.target.value)}/>
|
||||
</div>
|
||||
</div>
|
||||
<div className="app-main-content-fields-section">
|
||||
<div className="me-4">
|
||||
<div className="field-label">Description
|
||||
<span className="required">*</span>
|
||||
</div>
|
||||
<textarea type="text" placeholder="Details for activity, incident, menu item and ingredients or reminder," value={newEventDescription || ''} onChange={e => setNewEventDescription(e.target.value)}/>
|
||||
</div>
|
||||
</div>
|
||||
<div className="app-main-content-fields-section">
|
||||
<div className="me-4">
|
||||
<div className="field-label">Type
|
||||
<span className="required">*</span>
|
||||
</div>
|
||||
<div className="field-value">{newEventType}</div>
|
||||
</div>
|
||||
</div>
|
||||
<div className="app-main-content-fields-section">
|
||||
<div className="me-4">
|
||||
<div className="field-label">Start Time
|
||||
<span className="required">*</span>
|
||||
</div>
|
||||
<DatePicker
|
||||
selected={newEventStartDateTime}
|
||||
onChange={setNewEventStartDateTime}
|
||||
showTimeInput
|
||||
timeInputLabel="Time:"
|
||||
dateFormat="MM/dd/yyyy, HH:mm"
|
||||
></DatePicker>
|
||||
</div>
|
||||
<div className="me-4">
|
||||
<div className="field-label">End Time
|
||||
<span className="required">*</span>
|
||||
<span className="field-blurb float-right">Make sure end time is later than start time </span>
|
||||
</div>
|
||||
<DatePicker
|
||||
selected={newEventEndDateTime}
|
||||
onChange={setNewEventEndDateTime}
|
||||
showTimeInput
|
||||
timeInputLabel="Time:"
|
||||
dateFormat="MM/dd/yyyy, HH:mm"
|
||||
></DatePicker>
|
||||
</div>
|
||||
</div>
|
||||
{ currentTab !== 'mealPlanCalendar' && <> <div className="app-main-content-fields-section">
|
||||
<div className="me-4">
|
||||
<div className="field-label">Who will we take care of in this event:</div>
|
||||
<select value={newEventTargetType} onChange={(e) => setNewEventTargetType(e.target.value)}>
|
||||
<option value=""></option>
|
||||
<option value="vehicle">Vehicle</option>
|
||||
<option value="customer">Customer</option>
|
||||
<option value="employee">Employee</option>
|
||||
<option value="notApplicable">Not Applicable</option>
|
||||
</select>
|
||||
</div>
|
||||
{newEventTargetType && newEventTargetType !== '' && newEventTargetType !== 'notApplicable' && <div className="me-4">
|
||||
<div className="field-label">Please select a candidate</div>
|
||||
<select value={newEventTarget?.value || ''} onChange={(e) => {
|
||||
const selectedOption = e.target.options[e.target.selectedIndex];
|
||||
setNewEventTarget({
|
||||
value: selectedOption.value,
|
||||
label: selectedOption.text
|
||||
})
|
||||
}}>
|
||||
<option value=""></option>
|
||||
{
|
||||
newEventTargetType === 'vehicle' && vehicles.map((item) => <option value={item?.id}>{item?.vehicle_number}</option>)
|
||||
}
|
||||
{
|
||||
newEventTargetType === 'customer' && customers.map((item) => <option value={item?.id}>{item?.name}</option>)
|
||||
}
|
||||
{
|
||||
newEventTargetType === 'employee' && employees.map((item) => <option value={item?.id}>{item?.name}</option>)
|
||||
}
|
||||
|
||||
</select>
|
||||
</div>}
|
||||
</div>
|
||||
|
||||
<div className="app-main-content-fields-section">
|
||||
<div className="me-4">
|
||||
<div className="field-label">Who will be responsible for this event</div>
|
||||
<select value={newEventSourceType} onChange={(e) => setNewEventSourceType(e.target.value)}>
|
||||
<option value=""></option>
|
||||
<option value="employee">Employee</option>
|
||||
<option value="resource">Resource</option>
|
||||
<option value="notApplicable">Not Applicable</option>
|
||||
</select>
|
||||
</div>
|
||||
{newEventSourceType && newEventSourceType !== '' && newEventSourceType !== 'notApplicable' && <div className="me-4">
|
||||
<div className="field-label">Please select a member</div>
|
||||
<select value={newEventSource?.value || ''} onChange={(e) => {
|
||||
const selectedOption = e.target.options[e.target.selectedIndex];
|
||||
setNewEventSource({
|
||||
value: selectedOption.value,
|
||||
label: selectedOption.text
|
||||
})
|
||||
}}>
|
||||
<option value=""></option>
|
||||
{
|
||||
newEventSourceType === 'resource' && resources.map((item) => <option value={item?.id}>{item?.name}</option>)
|
||||
}
|
||||
{
|
||||
newEventSourceType === 'employee' && employees.map((item) => <option value={item?.id}>{item?.name}</option>)
|
||||
}
|
||||
|
||||
</select>
|
||||
</div>}
|
||||
</div> </>}
|
||||
<div className="app-main-content-fields-section">
|
||||
{currentTab === 'activitiesCalendar' && <div className="me-4">
|
||||
<div className="field-label">Event Location
|
||||
</div>
|
||||
<input type="text" placeholder="Type in the location this event gonna happen if applicable" value={newEventLocation || ''} onChange={e => setNewEventLocation(e.target.value)}/>
|
||||
</div>}
|
||||
{currentTab === 'reminderDatesCalendar' && <div className="me-4">
|
||||
<div className="field-label">If this is reminder, please select the accurate Date it gonna happen:
|
||||
</div>
|
||||
<DatePicker selected={newEventFutureDate}
|
||||
onChange={setNewEventFutureDate} dateFormat="MM/dd/yyyy"/>
|
||||
</div>}
|
||||
<div className="me-4">
|
||||
<div className="field-label">Color
|
||||
</div>
|
||||
<select value={newEventColor} onChange={e => setNewEventColor(e.target.value)}>
|
||||
<option value=""></option>
|
||||
{
|
||||
EventsService.colorOptions?.map((item) => <option value={item?.value}>{item?.label}</option>)
|
||||
}
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
</Modal.Body>
|
||||
<Modal.Footer>
|
||||
<Button variant="secondary" onClick={handleClose}>
|
||||
Close
|
||||
</Button>
|
||||
<Button variant="primary" onClick={handleSave}>
|
||||
Save Calendar Item
|
||||
</Button>
|
||||
</Modal.Footer>
|
||||
</Modal>
|
||||
</div>
|
||||
</div>
|
||||
</>
|
||||
)
|
||||
};
|
||||
|
||||
export default EventsCalendar;
|
||||
@ -39,7 +39,7 @@ const EventsCalendar = () => {
|
||||
const [groupedEvents, setGroupedEvents] = useState(new Map());
|
||||
|
||||
const calendar = useCalendarApp({
|
||||
views: [createViewMonthGrid(), createViewDay(), createViewMonthAgenda()],
|
||||
views: [createViewMonthGrid(), createViewDay(), createViewMonthAgenda(), createViewWeek()],
|
||||
monthGridOptions: {
|
||||
/**
|
||||
* Number of events to display in a day cell before the "+ N events" button is shown
|
||||
@ -50,7 +50,17 @@ const EventsCalendar = () => {
|
||||
skipValidation: true,
|
||||
selectedDate: moment(new Date()).format('YYYY-MM-DD HH:mm'),
|
||||
events: events,
|
||||
plugins: [eventModalService, eventsServicePlugin]
|
||||
plugins: [eventModalService, eventsServicePlugin],
|
||||
callbacks: {
|
||||
// onRangeUpdate(range) {
|
||||
// console.log('new range', range.start);
|
||||
// console.log('new range end', range.end);
|
||||
// },
|
||||
onSelectedDateUpdate(date) {
|
||||
setFromDate(new Date(new Date(date).getFullYear(), new Date(date).getMonth(), 1));
|
||||
setToDate(new Date(new Date(date).getFullYear(), new Date(date).getMonth() + 1, 0));
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
const getGroupedEvents = () => {
|
||||
@ -126,18 +136,23 @@ const EventsCalendar = () => {
|
||||
item.totalResource = totalResource;
|
||||
setCurrentTotalResource(item.totalResource);
|
||||
return item;
|
||||
}).filter(item => item.type === 'medical'));
|
||||
}).filter(item => item.type === 'medical')?.filter(item => (!showDeletedItems && item.status === 'active') || showDeletedItems));
|
||||
})}
|
||||
}, [fromDate, toDate, customers, resources, timeData]);
|
||||
}, [fromDate, toDate, customers, resources, timeData, showDeletedItems]);
|
||||
|
||||
useEffect(() => {
|
||||
if (events) {
|
||||
events?.forEach((item) => calendar.eventsService.add(item));
|
||||
if (events && calendar) {
|
||||
// events?.forEach((item) => {
|
||||
// if (!calendar.eventsService.getAll()?.find(evItem => evItem.id === item.id)) {
|
||||
// calendar.eventsService.add(item)
|
||||
// } } );
|
||||
calendar?.eventsService?.set(events);
|
||||
setGroupedEvents(getGroupedEvents());
|
||||
}
|
||||
}, [events]);
|
||||
|
||||
|
||||
|
||||
const redirectToAdmin = () => {
|
||||
navigate(`/medical`)
|
||||
}
|
||||
@ -189,8 +204,8 @@ const EventsCalendar = () => {
|
||||
item.fasting = item?.data?.fasting || '';
|
||||
item.transportation = item?.link_event_name || '';
|
||||
item.title = `${customerField}, provider: ${doctorField}`;
|
||||
item.start = new Date(item.start_time);
|
||||
item.end = item.stop_time? new Date(item.stop_time): new Date(item.start_time);
|
||||
item.start = item?.start_time? `${moment(new Date(item?.start_time)).format('YYYY-MM-DD HH:mm')}` : '';
|
||||
item.end = item.stop_time? `${moment(new Date(item?.stop_time)).format('YYYY-MM-DD HH:mm')}` : '';
|
||||
item._options = { additionalClasses: [`event-${item?.color || 'primary'}`]};
|
||||
const transportationInfo = EventsService.getTransportationInfo(data.data, item, timeData);
|
||||
const { isFutureEvent, maxTranslate1, maxTranslate2, maxResource, totalTranslate1, totalTranslate2, totalResource} = transportationInfo;
|
||||
@ -206,7 +221,7 @@ const EventsCalendar = () => {
|
||||
item.totalResource = totalResource;
|
||||
setCurrentTotalResource(item.totalResource);
|
||||
return item;
|
||||
}).filter(item => item.type === 'medical'));;
|
||||
}).filter(item => item.type === 'medical' && ((!showDeletedItems && item.status === 'active') || showDeletedItems)));
|
||||
})
|
||||
});
|
||||
}
|
||||
|
||||
@ -46,7 +46,8 @@ const SideMenu = () => {
|
||||
},
|
||||
{
|
||||
name: 'Calendar',
|
||||
link: '#',
|
||||
link: '/center-calendar',
|
||||
category: '/center-calendar',
|
||||
roleFunc: () => true
|
||||
},
|
||||
{
|
||||
@ -176,11 +177,11 @@ const SideMenu = () => {
|
||||
collapsed: false,
|
||||
roleFunc: () => true,
|
||||
subNavs: [
|
||||
{
|
||||
name: 'Meal Status',
|
||||
link: '#',
|
||||
roleFunc: () => true
|
||||
},
|
||||
// {
|
||||
// name: 'Meal Status',
|
||||
// link: '#',
|
||||
// roleFunc: () => true
|
||||
// },
|
||||
{
|
||||
name: 'Seating Chart',
|
||||
link: '/seating',
|
||||
|
||||
@ -192,6 +192,9 @@ app.get('/signature/:id', function (req,res) {
|
||||
app.get('/seating', function (req,res) {
|
||||
res.sendFile(path + "index.html");
|
||||
});
|
||||
app.get('/center-calendar', function (req,res) {
|
||||
res.sendFile(path + "index.html");
|
||||
});
|
||||
require("./app/routes/user.routes")(app);
|
||||
require("./app/routes/auth.routes")(app);
|
||||
require("./app/routes/employee.routes")(app);
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user