diff --git a/src/components/DailyProgressRport/TaskReportFilterPanel.jsx b/src/components/DailyProgressRport/TaskReportFilterPanel.jsx index 6ae6ab60..d561b6bf 100644 --- a/src/components/DailyProgressRport/TaskReportFilterPanel.jsx +++ b/src/components/DailyProgressRport/TaskReportFilterPanel.jsx @@ -1,36 +1,66 @@ -import React, { useState } from 'react' -import { useCurrentService, useProjectInfra } from '../../hooks/useProjects' -import { useSelectedProject } from '../../slices/apiDataManager'; -import { FormProvider, useForm } from 'react-hook-form'; -import { zodResolver } from '@hookform/resolvers/zod'; -import { TaskReportDefaultValue, TaskReportFilterSchema } from './TaskRportScheam'; -import { DateRangePicker1 } from '../common/DateRangePicker'; -import SelectMultiple from '../common/SelectMultiple'; +import React, { useState } from "react"; +import { useCurrentService, useProjectInfra } from "../../hooks/useProjects"; +import { useSelectedProject } from "../../slices/apiDataManager"; +import { FormProvider, useForm } from "react-hook-form"; +import { zodResolver } from "@hookform/resolvers/zod"; +import { + TaskReportDefaultValue, + TaskReportFilterSchema, +} from "./TaskRportScheam"; +import { DateRangePicker1 } from "../common/DateRangePicker"; +import SelectMultiple from "../common/SelectMultiple"; +import { localToUtc } from "../../utils/appUtils"; -const TaskReportFilterPanel = () => { - const [resetKey, setResetKey] = useState(0); - const selectedProjec = useSelectedProject() +const TaskReportFilterPanel = ({ handleFilter }) => { + const [resetKey, setResetKey] = useState(0); + const selectedProjec = useSelectedProject(); const selectedService = useCurrentService(); - const {projectInfra, isLoading, error, isFetched } = useProjectInfra(selectedProjec,selectedService); - const methods = useForm({resolver:zodResolver(TaskReportFilterSchema),defaultValues:TaskReportDefaultValue}) - const {register,reset,handleSubmit, formState:{errors}} = methods; - const onSubmit =(formData)=>{} - return ( - -
-
- - - -
+ const { projectInfra, isLoading, error, isFetched } = useProjectInfra( + selectedProjec, + selectedService + ); + const methods = useForm({ + resolver: zodResolver(TaskReportFilterSchema), + defaultValues: TaskReportDefaultValue, + }); -
+ const { + register, + reset, + handleSubmit, + formState: { errors }, + } = methods; + + const onSubmit = (formData) => { + console.log(formData) + const filterPayload = { + startDate:localToUtc(formData.startDate), + endDate:localToUtc(formData.endDate) + + } + handleFilter(filterPayload); + }; + + const onClear =()=>{ + setResetKey((prev) => prev + 1); + reset(TaskReportDefaultValue) + } + + return ( + + +
+ + +
+ + {/*
{ labelKey="floorName" valueKey="id" /> -
- +
*/} -
- - -
-
-
- ) -} +
+ + +
+ + + ); +}; -export default TaskReportFilterPanel +export default TaskReportFilterPanel; diff --git a/src/components/DailyProgressRport/TaskReportList.jsx b/src/components/DailyProgressRport/TaskReportList.jsx index c46e07ae..27323b51 100644 --- a/src/components/DailyProgressRport/TaskReportList.jsx +++ b/src/components/DailyProgressRport/TaskReportList.jsx @@ -29,7 +29,7 @@ const TaskReportList = () => { const ApprovedTaskRights = useHasUserPermission(APPROVE_TASK); const ReportTaskRights = useHasUserPermission(ASSIGN_REPORT_TASK); - const { service, openModal, closeModal } = useDailyProgrssContext(); + const { service, openModal, closeModal,filter } = useDailyProgrssContext(); const selectedProject = useSelectedProject(); const { projectNames } = useProjectName(); @@ -37,7 +37,7 @@ const TaskReportList = () => { selectedProject, ITEMS_PER_PAGE, currentPage, - service + service,filter ); const ProgrssReportColumn = [ diff --git a/src/components/DailyProgressRport/TaskRportScheam.jsx b/src/components/DailyProgressRport/TaskRportScheam.jsx index 0aee409f..11a79e6f 100644 --- a/src/components/DailyProgressRport/TaskRportScheam.jsx +++ b/src/components/DailyProgressRport/TaskRportScheam.jsx @@ -1,15 +1,15 @@ import { z } from "zod"; export const TaskReportFilterSchema = z.object({ - buildingIds: z.array(z.string()).optional(), - floorIds: z.array(z.string()).optional(), + // buildingIds: z.array(z.string()).optional(), + // floorIds: z.array(z.string()).optional(), startDate: z.string().optional(), endDate: z.string().optional(), }); export const TaskReportDefaultValue = { - buildingIds:[], - floorIds:[], + // buildingIds:[], + // floorIds:[], startDate:null, endDate:null } \ No newline at end of file diff --git a/src/components/Expenses/ExpenseFilterPanel.jsx b/src/components/Expenses/ExpenseFilterPanel.jsx index 99e821af..250f5de4 100644 --- a/src/components/Expenses/ExpenseFilterPanel.jsx +++ b/src/components/Expenses/ExpenseFilterPanel.jsx @@ -200,12 +200,12 @@ const ExpenseFilterPanel = ({ onApply, handleGroupBy }) => {
-
diff --git a/src/components/Organization/ManagOrg.jsx b/src/components/Organization/ManagOrg.jsx index cd27ff9b..122e707f 100644 --- a/src/components/Organization/ManagOrg.jsx +++ b/src/components/Organization/ManagOrg.jsx @@ -19,7 +19,12 @@ const ManagOrg = () => { const { data: service, isLoading } = useGlobalServices(); const { flowType, orgData, startStep, onOpen, onClose, prevStep } = useOrganizationModal(); - const {data:organization,isLoading:organizationLoading,isError,error} = useOrganization(orgData?.id); + const { + data: organization, + isLoading: organizationLoading, + isError, + error, + } = useOrganization(orgData?.id); const method = useForm({ resolver: zodResolver(organizationSchema), @@ -47,25 +52,27 @@ const ManagOrg = () => { onOpen({ startStep: 1 }); onClose(); }); -console.log(organization) // Prefill form if editing useEffect(() => { - if (orgData) { - console.log(orgData); + if (organization) { reset({ - name: orgData.name || "", - contactPerson: orgData.contactPerson || "", - contactNumber: orgData.contactNumber || "", - email: orgData.email || "", - serviceIds: orgData.services?.map((s) => s.id) || [], - address: orgData.address || "", + name: organization.name || "", + contactPerson: organization.contactPerson || "", + contactNumber: organization.contactNumber || "", + email: organization.email || "", + serviceIds: organization.services?.map((s) => s.id) || [], + address: organization.address || "", }); } - }, [orgData, reset]); + }, [organization, reset, service?.data]); - const onSubmit = (payload) => { - if (orgData?.id) { - updateOrganization({ id: orgData.id, ...payload }); + const onSubmit = (formData) => { + let payload = { ...formData }; + if (organization?.id) { + updateOrganization({ + orgId: organization.id, + payload: { ...payload, id: organization.id }, + }); } else { createOrganization(payload); } @@ -144,11 +151,11 @@ console.log(organization)
{errors.serviceIds && ( {errors.serviceIds.message} diff --git a/src/components/Organization/OrganizationSchema.js b/src/components/Organization/OrganizationSchema.js index e8b24daa..91c24d76 100644 --- a/src/components/Organization/OrganizationSchema.js +++ b/src/components/Organization/OrganizationSchema.js @@ -19,7 +19,7 @@ export const organizationSchema = z.object({ .email("Invalid email address"), serviceIds: z .array(z.string()) - .min(1, { message: "Please insert service id" }), + .min(1, { message: "Service isrequired" }), }); export const defaultOrganizationValues = { diff --git a/src/components/Tenant/TenantFilterPanel.jsx b/src/components/Tenant/TenantFilterPanel.jsx index f51f5245..1c2c43ca 100644 --- a/src/components/Tenant/TenantFilterPanel.jsx +++ b/src/components/Tenant/TenantFilterPanel.jsx @@ -106,13 +106,13 @@ const TenantFilterPanel = ({ onApply }) => {
-
diff --git a/src/components/common/SelectMultiple.jsx b/src/components/common/SelectMultiple.jsx index ff59d89a..7e13e290 100644 --- a/src/components/common/SelectMultiple.jsx +++ b/src/components/common/SelectMultiple.jsx @@ -8,25 +8,24 @@ const SelectMultiple = ({ name, options = [], label = "Select options", - labelKey = "name", + labelKey = "name", valueKey = "id", placeholder = "Please select...", - IsLoading = false, - required = false + IsLoading = false,required = false }) => { - const { setValue, watch } = useFormContext(); - const selectedValues = watch(name) || []; + const { setValue, watch,register } = useFormContext(); + useEffect(() => { + register(name, { value: [] }); +}, [register, name]); + +const selectedValues = watch(name) || []; const [isOpen, setIsOpen] = useState(false); const [searchText, setSearchText] = useState(""); const containerRef = useRef(null); const dropdownRef = useRef(null); - const [dropdownStyles, setDropdownStyles] = useState({ - top: 0, - left: 0, - width: 0, - }); + const [dropdownStyles, setDropdownStyles] = useState({ top: 0, left: 0, width: 0 }); useEffect(() => { const handleClickOutside = (e) => { @@ -65,10 +64,14 @@ const SelectMultiple = ({ setValue(name, updated, { shouldValidate: true }); }; - const filteredOptions = options.filter((item) => { - const label = getLabel(item); - return label?.toLowerCase().includes(searchText.toLowerCase()); - }); + const filteredOptions = (options || []).filter((item) => { + const label = getLabel(item); + return ( + typeof label === "string" && + label.toLowerCase().includes(searchText.toLowerCase()) + ); +}); + const dropdownElement = (
-
- - +
+ +
0 - ? "placeholder-style-selected" - : "placeholder-style" + selectedValues.length > 0 ? "placeholder-style-selected" : "placeholder-style" } >
@@ -168,10 +159,7 @@ const SelectMultiple = ({ const found = options.find((opt) => opt[valueKey] === val); const label = found ? getLabel(found) : ""; return ( - + {label} ); diff --git a/src/hooks/useOrganization.js b/src/hooks/useOrganization.js index 2248f7bc..e99d8ccb 100644 --- a/src/hooks/useOrganization.js +++ b/src/hooks/useOrganization.js @@ -40,7 +40,10 @@ export const useOrganizationModal = () => { export const useOrganization=(id)=>{ return useQuery({ queryKey:["organization",id], - queryFn:async()=> await OrganizationRepository.getOrganizaion(id), + queryFn:async()=> { + const resp = await await OrganizationRepository.getOrganizaion(id); + return resp.data + }, enabled:!!id }) } @@ -171,7 +174,7 @@ export const useAssignOrgToTenant = (onSuccessCallback) => { }, }); }; -export const useUpdateOrganization = () => { +export const useUpdateOrganization = (onSuccessCallback) => { const useClient = useQueryClient(); return useMutation({ mutationFn: async ({orgId,payload}) => diff --git a/src/pages/DailyProgressReport/DailyProgrssReport.jsx b/src/pages/DailyProgressReport/DailyProgrssReport.jsx index cce50688..96d9de6c 100644 --- a/src/pages/DailyProgressReport/DailyProgrssReport.jsx +++ b/src/pages/DailyProgressReport/DailyProgrssReport.jsx @@ -21,7 +21,7 @@ export const useDailyProgrssContext = () => { const DailyProgrssReport = () => { const [service, setService] = useState(""); - + const [filter,setFilter] = useState('') const { setOffcanvasContent, setShowTrigger } = useFab(); const { data, isLoading, isError, error } = useServices(); @@ -30,15 +30,20 @@ const DailyProgrssReport = () => { const openModal = (type, data = null) => setModal({ type, data }); const closeModal = () => setModal({ type: null, data: null }); - const contextObj = { + const contextDispatcher = { service, openModal, closeModal, + filter, }; + const handleFilter = (filterObj)=>{ + setFilter(filterObj) + } + useEffect(() => { setShowTrigger(true); - setOffcanvasContent("Report Filter", ); + setOffcanvasContent("Report Filter", ); return () => { setShowTrigger(false); @@ -47,7 +52,7 @@ const DailyProgrssReport = () => { }, []); return (
- + {modal.type === "report" && ( diff --git a/src/repositories/OrganizationRespository.jsx b/src/repositories/OrganizationRespository.jsx index 818cdb59..722423a9 100644 --- a/src/repositories/OrganizationRespository.jsx +++ b/src/repositories/OrganizationRespository.jsx @@ -2,7 +2,7 @@ import { api } from "../utils/axiosClient"; const OrganizationRepository = { createOrganization: (data) => api.post("/api/Organization/create", data), - updateOrganizaion:(id,data)=>api.put(`/api/Organization/edit/${id}`), + updateOrganizaion:(id,data)=>api.put(`/api/Organization/edit/${id}`,data), getOrganizaion:(id)=>api.get(`/api/Organization/details/${id}`), getOrganizationList: (pageSize, pageNumber, active, sprid, searchString) => { return api.get( diff --git a/src/repositories/TaskRepository.jsx b/src/repositories/TaskRepository.jsx index 9afc47a0..33883452 100644 --- a/src/repositories/TaskRepository.jsx +++ b/src/repositories/TaskRepository.jsx @@ -12,6 +12,7 @@ export const TasksRepository = { const payloadJsonString = encodeURIComponent(JSON.stringify(filter)); url += `&filter=${payloadJsonString}`; } + debugger return api.get(url); }, diff --git a/src/utils/appUtils.js b/src/utils/appUtils.js index 21f7fa5a..6f652db9 100644 --- a/src/utils/appUtils.js +++ b/src/utils/appUtils.js @@ -1,31 +1,31 @@ import { useEffect, useState } from "react"; import { format, parseISO } from "date-fns"; -export const formatFileSize=(bytes)=> { +export const formatFileSize = (bytes) => { if (bytes < 1024) return bytes + " B"; else if (bytes < 1024 * 1024) return (bytes / 1024).toFixed(2) + " KB"; else return (bytes / (1024 * 1024)).toFixed(2) + " MB"; -} +}; export const AppColorconfig = { colors: { - primary: '#696cff', - secondary: '#8592a3', - success: '#71dd37', - info: '#03c3ec', - warning: '#ffab00', - danger: '#ff3e1d', - dark: '#233446', - black: '#000', - white: '#fff', - cardColor: '#fff', - bodyBg: '#f5f5f9', - bodyColor: '#697a8d', - headingColor: '#566a7f', - textMuted: '#a1acb8', - borderColor: '#eceef1' - } + primary: "#696cff", + secondary: "#8592a3", + success: "#71dd37", + info: "#03c3ec", + warning: "#ffab00", + danger: "#ff3e1d", + dark: "#233446", + black: "#000", + white: "#fff", + cardColor: "#fff", + bodyBg: "#f5f5f9", + bodyColor: "#697a8d", + headingColor: "#566a7f", + textMuted: "#a1acb8", + borderColor: "#eceef1", + }, }; export const getColorNameFromHex = (hex) => { - const normalizedHex = hex?.replace(/'/g, '').toLowerCase(); + const normalizedHex = hex?.replace(/'/g, "").toLowerCase(); const colors = AppColorconfig.colors; for (const [name, value] of Object.entries(colors)) { @@ -62,18 +62,19 @@ export const getIconByFileType = (type = "") => { return "bx bx-file"; }; - export const normalizeAllowedContentTypes = (allowedContentType) => { if (!allowedContentType) return []; if (Array.isArray(allowedContentType)) return allowedContentType; - if (typeof allowedContentType === "string") return allowedContentType.split(","); + if (typeof allowedContentType === "string") + return allowedContentType.split(","); return []; }; - export function localToUtc(localDateString) { - if (!localDateString || localDateString.trim() === "") return null; // return null instead of undefined - const date = new Date(localDateString); - if (isNaN(date.getTime())) return null; // invalid date check - return date.toISOString(); -} \ No newline at end of file + if (!localDateString || localDateString.trim() === "") return null; + + const [day, month, year] = localDateString.split("-"); + const date = new Date(`${year}-${month}-${day}T00:00:00`); + + return isNaN(date.getTime()) ? null : date.toISOString(); +} diff --git a/src/utils/axiosClient.jsx b/src/utils/axiosClient.jsx index 1cc0c7cd..bf26500e 100644 --- a/src/utils/axiosClient.jsx +++ b/src/utils/axiosClient.jsx @@ -16,7 +16,6 @@ export const axiosClient = axios.create({ // Auto retry failed requests (e.g., network issues) axiosRetry(axiosClient, { retries: 3 }); -debugger // Request Interceptor — Add Bearer token if required axiosClient.interceptors.request.use( async (config) => {