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