@@ -79,6 +79,7 @@ export interface ProjectWithTasks { | |||||
id: number; | id: number; | ||||
code: string; | code: string; | ||||
status?: string; | status?: string; | ||||
actualEnd?: string; | |||||
description?: string; | description?: string; | ||||
name: string; | name: string; | ||||
tasks: Task[]; | tasks: Task[]; | ||||
@@ -345,6 +345,7 @@ const TimeLeaveInputTable: React.FC<Props> = ({ | |||||
renderEditCell(params: GridRenderEditCellParams<TimeLeaveRow, number>) { | renderEditCell(params: GridRenderEditCellParams<TimeLeaveRow, number>) { | ||||
return ( | return ( | ||||
<ProjectSelect | <ProjectSelect | ||||
referenceDay={dayjs(day)} | |||||
includeLeaves | includeLeaves | ||||
leaveTypes={leaveTypes} | leaveTypes={leaveTypes} | ||||
multiple={false} | multiple={false} | ||||
@@ -618,6 +619,7 @@ const TimeLeaveInputTable: React.FC<Props> = ({ | |||||
taskGroupsByProject, | taskGroupsByProject, | ||||
taskGroupsWithoutProject, | taskGroupsWithoutProject, | ||||
miscTasks, | miscTasks, | ||||
day, | |||||
], | ], | ||||
); | ); | ||||
@@ -747,6 +749,7 @@ const TimeLeaveInputTable: React.FC<Props> = ({ | |||||
/> | /> | ||||
{fastEntryEnabled && ( | {fastEntryEnabled && ( | ||||
<FastTimeEntryModal | <FastTimeEntryModal | ||||
recordDate={day} | |||||
allProjects={allProjects} | allProjects={allProjects} | ||||
assignedProjects={assignedProjects} | assignedProjects={assignedProjects} | ||||
open={fastEntryModalOpen} | open={fastEntryModalOpen} | ||||
@@ -268,6 +268,7 @@ const TimeLeaveMobileEntry: React.FC<Props> = ({ | |||||
)} | )} | ||||
</Stack> | </Stack> | ||||
<TimesheetEditModal | <TimesheetEditModal | ||||
recordDate={date} | |||||
allProjects={allProjects} | allProjects={allProjects} | ||||
assignedProjects={assignedProjects} | assignedProjects={assignedProjects} | ||||
open={editTimeModalOpen} | open={editTimeModalOpen} | ||||
@@ -278,6 +279,7 @@ const TimeLeaveMobileEntry: React.FC<Props> = ({ | |||||
{...editTimeModalProps} | {...editTimeModalProps} | ||||
/> | /> | ||||
<LeaveEditModal | <LeaveEditModal | ||||
recordDate={date} | |||||
leaveTypes={leaveTypes} | leaveTypes={leaveTypes} | ||||
open={editLeaveModalOpen} | open={editLeaveModalOpen} | ||||
onClose={closeEditLeaveModal} | onClose={closeEditLeaveModal} | ||||
@@ -287,6 +289,7 @@ const TimeLeaveMobileEntry: React.FC<Props> = ({ | |||||
/> | /> | ||||
{fastEntryEnabled && ( | {fastEntryEnabled && ( | ||||
<FastTimeEntryModal | <FastTimeEntryModal | ||||
recordDate={date} | |||||
allProjects={allProjects} | allProjects={allProjects} | ||||
assignedProjects={assignedProjects} | assignedProjects={assignedProjects} | ||||
open={fastEntryModalOpen} | open={fastEntryModalOpen} | ||||
@@ -30,6 +30,7 @@ import { manhourFormatter, shortDateFormatter } from "@/app/utils/formatUtil"; | |||||
import { DAILY_NORMAL_MAX_HOURS } from "@/app/api/timesheets/utils"; | import { DAILY_NORMAL_MAX_HOURS } from "@/app/api/timesheets/utils"; | ||||
import zip from "lodash/zip"; | import zip from "lodash/zip"; | ||||
import intersectionBy from "lodash/intersectionBy"; | import intersectionBy from "lodash/intersectionBy"; | ||||
import dayjs from "dayjs"; | |||||
export interface FastTimeEntryForm { | export interface FastTimeEntryForm { | ||||
projectIds: TimeEntry["projectId"][]; | projectIds: TimeEntry["projectId"][]; | ||||
@@ -174,6 +175,7 @@ const FastTimeEntryModal: React.FC<Props> = ({ | |||||
name="projectIds" | name="projectIds" | ||||
render={({ field }) => ( | render={({ field }) => ( | ||||
<ProjectSelect | <ProjectSelect | ||||
referenceDay={dayjs(recordDate)} | |||||
includeLeaves={false} | includeLeaves={false} | ||||
error={Boolean(formState.errors.projectIds)} | error={Boolean(formState.errors.projectIds)} | ||||
multiple | multiple | ||||
@@ -15,13 +15,14 @@ import differenceBy from "lodash/differenceBy"; | |||||
import intersectionWith from "lodash/intersectionWith"; | import intersectionWith from "lodash/intersectionWith"; | ||||
import { TFunction } from "i18next"; | import { TFunction } from "i18next"; | ||||
import { LeaveType } from "@/app/api/timesheets"; | import { LeaveType } from "@/app/api/timesheets"; | ||||
import dayjs, { Dayjs } from "dayjs"; | |||||
interface CommonProps { | interface CommonProps { | ||||
allProjects: ProjectWithTasks[]; | allProjects: ProjectWithTasks[]; | ||||
assignedProjects: AssignedProject[]; | assignedProjects: AssignedProject[]; | ||||
error?: boolean; | error?: boolean; | ||||
multiple?: boolean; | multiple?: boolean; | ||||
showOnlyOngoing?: boolean; | |||||
referenceDay: Dayjs; | |||||
includeLeaves?: boolean; | includeLeaves?: boolean; | ||||
leaveTypes?: LeaveType[]; | leaveTypes?: LeaveType[]; | ||||
} | } | ||||
@@ -64,7 +65,7 @@ const getGroupName = (t: TFunction, groupName: string): string => { | |||||
const AutocompleteProjectSelect: React.FC<Props> = ({ | const AutocompleteProjectSelect: React.FC<Props> = ({ | ||||
allProjects, | allProjects, | ||||
showOnlyOngoing = true, | |||||
referenceDay, | |||||
assignedProjects, | assignedProjects, | ||||
value, | value, | ||||
onProjectSelect, | onProjectSelect, | ||||
@@ -75,10 +76,10 @@ const AutocompleteProjectSelect: React.FC<Props> = ({ | |||||
}) => { | }) => { | ||||
const { t } = useTranslation("home"); | const { t } = useTranslation("home"); | ||||
const allFilteredProjects = useMemo(() => { | const allFilteredProjects = useMemo(() => { | ||||
return showOnlyOngoing | |||||
? allProjects.filter((p) => p.status === "On-going") | |||||
: allProjects; | |||||
}, [showOnlyOngoing, allProjects]); | |||||
return allProjects.filter((p) => | |||||
p.actualEnd ? !referenceDay.isAfter(p.actualEnd) : true, | |||||
); | |||||
}, [allProjects, referenceDay]); | |||||
const nonAssignedProjects = useMemo(() => { | const nonAssignedProjects = useMemo(() => { | ||||
return differenceBy(allFilteredProjects, assignedProjects, "id"); | return differenceBy(allFilteredProjects, assignedProjects, "id"); | ||||
@@ -29,6 +29,7 @@ import { | |||||
DAILY_NORMAL_MAX_HOURS, | DAILY_NORMAL_MAX_HOURS, | ||||
TIMESHEET_DAILY_MAX_HOURS, | TIMESHEET_DAILY_MAX_HOURS, | ||||
} from "@/app/api/timesheets/utils"; | } from "@/app/api/timesheets/utils"; | ||||
import dayjs from "dayjs"; | |||||
export interface Props extends Omit<ModalProps, "children"> { | export interface Props extends Omit<ModalProps, "children"> { | ||||
onSave: (timeEntry: TimeEntry, recordDate?: string) => Promise<void>; | onSave: (timeEntry: TimeEntry, recordDate?: string) => Promise<void>; | ||||
@@ -162,6 +163,7 @@ const TimesheetEditModal: React.FC<Props> = ({ | |||||
name="projectId" | name="projectId" | ||||
render={({ field }) => ( | render={({ field }) => ( | ||||
<ProjectSelect | <ProjectSelect | ||||
referenceDay={dayjs(recordDate)} | |||||
multiple={false} | multiple={false} | ||||
allProjects={allProjects} | allProjects={allProjects} | ||||
assignedProjects={assignedProjects} | assignedProjects={assignedProjects} | ||||