feat: showing users in work time tab instead of hiding

This commit is contained in:
2025-01-19 18:49:28 +04:00
parent 9dab596e87
commit 0948a1da4a

View File

@@ -3,19 +3,9 @@ import { DatePickerInput, MonthPickerInput } from "@mantine/dates";
import useWorkTableState from "../hooks/useWorkTableState.tsx"; import useWorkTableState from "../hooks/useWorkTableState.tsx";
import { BaseTable } from "../../../../../components/BaseTable/BaseTable.tsx"; import { BaseTable } from "../../../../../components/BaseTable/BaseTable.tsx";
import { useEffect, useState } from "react"; import { useEffect, useState } from "react";
import useWorkTableColumns, { import useWorkTableColumns, { EmployeeData } from "../hooks/useWorkTableColumns.tsx";
EmployeeData, import { TimeTrackingRecord, TimeTrackingService, UserSchema } from "../../../../../client";
} from "../hooks/useWorkTableColumns.tsx"; import { dateWithoutTimezone, getDatesBetween, getDatesInMonth } from "../../../../../shared/lib/date.ts";
import {
TimeTrackingRecord,
TimeTrackingService,
UserSchema,
} from "../../../../../client";
import {
dateWithoutTimezone,
getDatesBetween,
getDatesInMonth,
} from "../../../../../shared/lib/date.ts";
import useUsersList from "../../../hooks/useUsersList.tsx"; import useUsersList from "../../../hooks/useUsersList.tsx";
import { notifications } from "../../../../../shared/lib/notifications.ts"; import { notifications } from "../../../../../shared/lib/notifications.ts";
import { PaySchemeType } from "../../../../../shared/enums/PaySchemeType.ts"; import { PaySchemeType } from "../../../../../shared/enums/PaySchemeType.ts";
@@ -23,18 +13,19 @@ import { IconEyeOff } from "@tabler/icons-react";
import { MRT_TableOptions } from "mantine-react-table"; import { MRT_TableOptions } from "mantine-react-table";
import { difference, omit } from "lodash"; import { difference, omit } from "lodash";
import { strTimeToFloatHours } from "../../../../../types/utils.ts"; import { strTimeToFloatHours } from "../../../../../types/utils.ts";
import { useListState } from "@mantine/hooks";
const WorkTimeTable = () => { const WorkTimeTable = () => {
const [data, setData] = useState<EmployeeData[]>([]); const [data, setData] = useState<EmployeeData[]>([]);
const { dateBoundaries, month, setMonth, trackingRecords, refetch } = const { dateBoundaries, month, setMonth, trackingRecords, refetch } =
useWorkTableState(); useWorkTableState();
const [hiddenUsers, setHiddenUsers] = useState<UserSchema[]>([]); const [shownUsers, shownUsersHandlers] = useListState<UserSchema>([]);
const [selectedBoundaries, setSelectedBoundaries] = useState< const [selectedBoundaries, setSelectedBoundaries] = useState<
[Date | null, Date | null] [Date | null, Date | null]
>([null, null]); >([null, null]);
const users = useUsersList().objects.filter( const users = useUsersList().objects.filter(
user => user.payRate?.payrollScheme.key === PaySchemeType.HOURLY user => user.payRate?.payrollScheme.key === PaySchemeType.HOURLY,
); );
const getRange = () => { const getRange = () => {
@@ -49,7 +40,7 @@ const WorkTimeTable = () => {
const range = getRange(); const range = getRange();
const transformTrackingRecordsToData = ( const transformTrackingRecordsToData = (
trackingRecords: TimeTrackingRecord[] trackingRecords: TimeTrackingRecord[],
): EmployeeData[] => { ): EmployeeData[] => {
if (!month) return []; if (!month) return [];
const rangeDays = range.map(r => r.date()); const rangeDays = range.map(r => r.date());
@@ -57,7 +48,7 @@ const WorkTimeTable = () => {
trackingRecords = trackingRecords.map(tr => ({ trackingRecords = trackingRecords.map(tr => ({
...tr, ...tr,
data: tr.data.filter(d => data: tr.data.filter(d =>
rangeDays.includes(new Date(d.date).getDate()) rangeDays.includes(new Date(d.date).getDate()),
), ),
})); }));
const existingUserIds = trackingRecords.map(tr => tr.user.id); const existingUserIds = trackingRecords.map(tr => tr.user.id);
@@ -70,15 +61,15 @@ const WorkTimeTable = () => {
...Object.fromEntries( ...Object.fromEntries(
getDatesInMonth(month).reduce((acc, day) => { getDatesInMonth(month).reduce((acc, day) => {
return acc.set(day.date().toString(), 0); return acc.set(day.date().toString(), 0);
}, new Map<string, number>()) }, new Map<string, number>()),
), ),
...Object.fromEntries( ...Object.fromEntries(
record.data.reduce((acc, recordData) => { record.data.reduce((acc, recordData) => {
return acc.set( return acc.set(
new Date(recordData.date).getDate().toString(), new Date(recordData.date).getDate().toString(),
recordData.hours recordData.hours,
); );
}, new Map<string, number>()) }, new Map<string, number>()),
), ),
})); }));
const restUsersResult = users const restUsersResult = users
@@ -91,25 +82,25 @@ const WorkTimeTable = () => {
...Object.fromEntries( ...Object.fromEntries(
getDatesInMonth(month).reduce((acc, day) => { getDatesInMonth(month).reduce((acc, day) => {
return acc.set(day.date().toString(), 0); return acc.set(day.date().toString(), 0);
}, new Map<string, number>()) }, new Map<string, number>()),
), ),
})); }));
const hiddenUserIds = hiddenUsers.map(user => user.id); const shownUserIds = shownUsers.map(user => user.id);
const result = firstResult const result = firstResult
// eslint-disable-next-line @typescript-eslint/ban-ts-comment // eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-expect-error // @ts-expect-error
.concat(restUsersResult) .concat(restUsersResult)
.filter(r => !hiddenUserIds.includes(r.userId)); .filter(r => shownUserIds.includes(r.userId));
const firstDate = selectedBoundaries[0]; const firstDate = selectedBoundaries[0];
const lastDate = selectedBoundaries[1]; const lastDate = selectedBoundaries[1];
if (firstDate && lastDate) { if (firstDate && lastDate) {
const allDays = getDatesInMonth(month).map(d => const allDays = getDatesInMonth(month).map(d =>
d.date().toString() d.date().toString(),
); );
const allowedDays = getDatesBetween(firstDate, lastDate).map(d => const allowedDays = getDatesBetween(firstDate, lastDate).map(d =>
d.date().toString() d.date().toString(),
); );
const omitDays = difference(allDays, allowedDays); const omitDays = difference(allDays, allowedDays);
@@ -118,7 +109,7 @@ const WorkTimeTable = () => {
}) as unknown as EmployeeData[]; }) as unknown as EmployeeData[];
} }
return (result as unknown as EmployeeData[]).sort( return (result as unknown as EmployeeData[]).sort(
(a, b) => a.userId - b.userId (a, b) => a.userId - b.userId,
); );
}; };
@@ -153,21 +144,26 @@ const WorkTimeTable = () => {
await refetch(); await refetch();
}); });
}; };
const columns = useWorkTableColumns({ const columns = useWorkTableColumns({
month, month,
selectedBoundaries, selectedBoundaries,
data, data,
onUpdate: optimisticUpdate, onUpdate: optimisticUpdate,
selectedCells: [], selectedCells: [],
setSelectedCells: () => {}, setSelectedCells: () => {
},
range, range,
}); });
useEffect(() => { useEffect(() => {
setData(transformTrackingRecordsToData(trackingRecords)); setData(transformTrackingRecordsToData(trackingRecords));
}, [trackingRecords, hiddenUsers, selectedBoundaries]); }, [trackingRecords, shownUsers, selectedBoundaries]);
useEffect(() => { useEffect(() => {
setSelectedBoundaries([null, null]); setSelectedBoundaries([null, null]);
}, [month]); }, [month]);
return ( return (
<Flex <Flex
direction={"column"} direction={"column"}
@@ -183,15 +179,15 @@ const WorkTimeTable = () => {
value: user.id.toString(), value: user.id.toString(),
}))} }))}
onChange={event => onChange={event =>
setHiddenUsers( shownUsersHandlers.setState(
users.filter(user => users.filter(user =>
event.includes(user.id.toString()) event.includes(user.id.toString()),
) ),
) )
} }
value={hiddenUsers.map(user => user.id.toString())} value={shownUsers.map(user => user.id.toString())}
placeholder={ placeholder={
hiddenUsers.length > 0 ? "" : "Скрытые пользователи" shownUsers.length > 0 ? "" : "Показанные пользователи"
} }
/> />
<Flex gap={rem(10)}> <Flex gap={rem(10)}>
@@ -232,16 +228,9 @@ const WorkTimeTable = () => {
<Tooltip label="Скрыть"> <Tooltip label="Скрыть">
<ActionIcon <ActionIcon
onClick={() => { onClick={() => {
const user = users.find( shownUsersHandlers.filter(
user => user => user.id !== row.original.userId,
user.id ===
row.original.userId
); );
if (!user) return;
setHiddenUsers(prevState => [
...prevState,
user,
]);
}} }}
variant={"default"}> variant={"default"}>
<IconEyeOff /> <IconEyeOff />