This commit is contained in:
2023-10-23 17:25:05 +05:00
parent 6f908a0da1
commit 478554982f
5 changed files with 110 additions and 41 deletions
+1
View File
@@ -30,6 +30,7 @@ function SelectUser({
>
{managers.map((manager) => (
<button
key={manager.id}
onClick={() => handleClick(manager.id)}
className="px-4 flex justify-between gap-2 w-full py-1 transition-colors hover:bg-[#E6ECF2]"
>
+54 -40
View File
@@ -16,8 +16,7 @@ import {
addDays,
subDays,
parseISO,
isAfter,
isBefore,
isWithinInterval,
} from "date-fns";
import Button from "../components/Button";
import { ru } from "date-fns/locale";
@@ -34,7 +33,7 @@ function DashboardPage() {
state.setAccessToken,
]);
const [company, setCompany] = useState<{ [key: string]: any }>();
const [managers, setManagers] = useState<any[]>();
const [selectedBuildManagers, setSelectedBuildManagers] = useState<any[]>();
const [builds, setBuilds] = useState<any[]>();
const [selectedBuild, setSelectedBuild] = useState<{ [key: string]: any }>();
const [schedules, setSchedules] = useState<any[]>();
@@ -42,15 +41,7 @@ function DashboardPage() {
const [generatedScheduledSessions, setGeneratedScheduledSessions] =
useState<any[][]>();
const [selectedDate, setSelectedDate] = useState(new Date());
const startDateTime = parse("10:00", "HH:mm", selectedDate);
const endDateTime = parse("20:00", "HH:mm", selectedDate);
const dateTimes: Date[] = eachMinuteOfInterval(
{
start: startDateTime,
end: endDateTime,
},
{ step: 60 }
);
const [dateTimes, setDateTimes] = useState<Date[]>();
const [currentTime, setCurrentTime] = useState<string>(
format(new Date(), "HH:mm")
);
@@ -76,19 +67,41 @@ function DashboardPage() {
}
useEffect(() => {
if (!schedules?.length) return;
if (!selectedDate || !selectedBuild || !schedules?.length) return;
schedules.map((schedule) => {
if (
isAfter(selectedDate, parseISO(schedule.startDate)) &&
isBefore(selectedDate, parseISO(schedule.endDate))
) {
console.log("FIND");
} else {
console.log("Not find");
}
});
}, [schedules, scheduledSessions]);
const foundSchedule = schedules.find(
(schedule) =>
isWithinInterval(selectedDate, {
start: parseISO(schedule.startDate),
end: parseISO(schedule.endDate),
}) && selectedBuild.id === schedule.buildId
);
if (foundSchedule) {
console.log("foundSchedule", foundSchedule);
const startDateTime = parse(
foundSchedule.startTime,
"HH:mm",
selectedDate
);
const endDateTime = parse(foundSchedule.endTime, "HH:mm", selectedDate);
const step = foundSchedule.sessionDuration + foundSchedule.sessionBreak;
setDateTimes(
eachMinuteOfInterval(
{
start: startDateTime,
end: endDateTime,
},
{ step }
)
);
} else {
setDateTimes(undefined);
setGeneratedScheduledSessions(undefined);
}
}, [selectedDate, selectedBuild, schedules]);
async function getCompany() {
if (!user) {
@@ -125,14 +138,17 @@ function DashboardPage() {
}
async function getManagers() {
if (!company) {
console.log("No Managers", managers);
console.log("getManagers");
if (!company || !selectedBuild) {
return;
}
try {
const result: any = await api.get(`companies/${company.id}/users`).json();
setManagers(result);
const result: any = await api
.get(`companies/${company.id}/builds/${selectedBuild.id}/users`)
.json();
setSelectedBuildManagers(result);
} catch (error) {
if (error instanceof Error) {
console.log("Error: ", error.message);
@@ -177,22 +193,22 @@ function DashboardPage() {
}
function generateScheduledSessions() {
if (!scheduledSessions || !selectedBuild) return;
if (!dateTimes || !scheduledSessions || !selectedBuild) return;
const arr: any[][] = [];
dateTimes.forEach((dateTime) => {
const arr2 = [];
const findedSessionsCount = scheduledSessions.filter(
const foundSessionsCount = scheduledSessions.filter(
(session) => session.startAt === dateTime.toISOString()
);
arr2.push(dateTime);
for (let i = 0; i < selectedBuild.sessionLimit; i++) {
if (findedSessionsCount[i]) {
arr2.push(findedSessionsCount[i]);
if (foundSessionsCount[i]) {
arr2.push(foundSessionsCount[i]);
} else {
arr2.push({});
}
@@ -264,11 +280,10 @@ function DashboardPage() {
useEffect(() => {
if (!builds) return;
setSelectedBuild(builds[0]);
getManagers();
}, [builds]);
useEffect(() => {
if (!managers || !selectedDate || !selectedBuild) return;
if (!selectedBuildManagers || !selectedDate || !selectedBuild) return;
getScheduledSessions(true);
const interval = setInterval(() => {
@@ -278,11 +293,11 @@ function DashboardPage() {
return () => {
clearInterval(interval);
};
}, [managers, selectedDate, selectedBuild]);
}, [selectedBuildManagers, selectedDate, selectedBuild]);
useEffect(() => {
if (!company || !selectedBuild) return;
getManagers();
getSchedules();
}, [selectedBuild]);
@@ -379,7 +394,6 @@ function DashboardPage() {
{company &&
selectedBuild &&
user &&
managers?.length &&
generatedScheduledSessions?.map(
(generatedScheduledSession, index) => {
return (
@@ -397,7 +411,7 @@ function DashboardPage() {
);
} else {
if (Object.keys(scheduledSession).length) {
const selectedManager = managers.find(
const selectedManager = selectedBuildManagers?.find(
(manager) => manager.id == scheduledSession.userId
);
@@ -416,7 +430,7 @@ function DashboardPage() {
email: scheduledSession.clientEmail,
}}
manager={selectedManager}
managers={managers}
managers={selectedBuildManagers || []}
handleSelect={(scheduledSessionId, managerId) =>
updateScheduledSessionManager(
scheduledSessionId,
@@ -526,7 +540,7 @@ function DashboardPage() {
<p className="text-sm font-semibold">Менеджеры</p>
<div className="flex flex-col gap-2">
{managers?.map((manager) => (
{selectedBuildManagers?.map((manager) => (
<div key={manager.id} className="flex justify-between">
<div className="flex items-center gap-2">
<img
+25
View File
@@ -0,0 +1,25 @@
import { model, Schema } from "mongoose";
const buildUserSchema = new Schema(
{
buildId: {
type: Schema.Types.ObjectId,
ref: "Build",
required: true,
},
userId: {
type: Schema.Types.ObjectId,
ref: "User",
required: true,
},
},
{
timestamps: true,
toJSON: { virtuals: true },
toObject: { virtuals: true },
}
);
const BuildUser = model("Build_User", buildUserSchema);
export default BuildUser;
+4
View File
@@ -20,6 +20,10 @@ const scheduledSessionSchema = new Schema(
type: Date,
required: true,
},
endAt: {
type: Date,
required: true,
},
clientName: {
type: String,
required: true,
+26 -1
View File
@@ -3,6 +3,8 @@ import Company from "../models/Company.js";
import { parseISO, startOfDay, endOfDay } from "date-fns";
import ScheduledSession from "../models/ScheduledSession.js";
import Schedule from "../models/Schedule.js";
import BuildUser from "../models/BuildUser.js";
import User from "../models/User.js";
const companiesRouter = Router();
@@ -47,6 +49,26 @@ companiesRouter.get("/:id/users", async (req, res) => {
res.json(users);
});
companiesRouter.get("/:id/builds/:buildId/users", async (req, res) => {
if (req.params.id != res.locals.user.companyId) {
res.json({ error: "Access denied!" });
return;
}
const buildUsers: any = await BuildUser.find({
buildId: req.params.buildId,
});
const users = [];
for (const buildUser of buildUsers) {
const user = await User.findById(buildUser.userId);
users.push(user);
}
res.json(users);
});
companiesRouter.get(
"/:id/builds/:buildId/scheduled_sessions",
async (req, res) => {
@@ -155,11 +177,14 @@ companiesRouter.get(
"/:id/builds/:buildId/scheduled_sessions/:scheduledSessionId/availableManagers",
async (req, res) => {
if (!req.query.startAt) {
res.json({ error: "No dateTime" });
res.json({ error: "No param `startAt`" });
return;
}
try {
// const date = req.query.startAt;
// const sessions = ScheduledSession.find({ userId: res.locals.user.id });
const scheduledSession = await ScheduledSession.findById(
req.params.scheduledSessionId
);