From 37dbbf53f33c690d34c5bd412e2911ee1032dfad Mon Sep 17 00:00:00 2001 From: "pramod.mahajan" Date: Tue, 18 Nov 2025 16:56:11 +0530 Subject: [PATCH] fixed table align --- src/components/ServiceProject/JobComments.jsx | 1 - .../ServiceProject/ManageJobTicket.jsx | 2 +- .../ServiceProjectTeamAllocation.jsx | 77 ++++---- .../ServiceProjectTeamList.jsx | 92 +++++----- .../common/Forms/InputFieldSuggesstion.jsx | 56 ++++++ .../common/Forms/SelectFieldServerSide.jsx | 170 +++++++++++++++++- 6 files changed, 311 insertions(+), 87 deletions(-) create mode 100644 src/components/common/Forms/InputFieldSuggesstion.jsx diff --git a/src/components/ServiceProject/JobComments.jsx b/src/components/ServiceProject/JobComments.jsx index 65f47e94..84d31665 100644 --- a/src/components/ServiceProject/JobComments.jsx +++ b/src/components/ServiceProject/JobComments.jsx @@ -150,7 +150,6 @@ const JobComments = ({ data }) => { type="submit" disabled={!watch("comment")?.trim() || isPending} > - Submit diff --git a/src/components/ServiceProject/ManageJobTicket.jsx b/src/components/ServiceProject/ManageJobTicket.jsx index d3cbc119..9bae7f24 100644 --- a/src/components/ServiceProject/ManageJobTicket.jsx +++ b/src/components/ServiceProject/ManageJobTicket.jsx @@ -141,7 +141,7 @@ const ManageJobTicket = ({ Job }) => {
- Assigned By + Assigned To
diff --git a/src/components/ServiceProject/ServiceProjectTeam/ServiceProjectTeamAllocation.jsx b/src/components/ServiceProject/ServiceProjectTeam/ServiceProjectTeamAllocation.jsx index 50b834ac..37005288 100644 --- a/src/components/ServiceProject/ServiceProjectTeam/ServiceProjectTeamAllocation.jsx +++ b/src/components/ServiceProject/ServiceProjectTeam/ServiceProjectTeamAllocation.jsx @@ -123,12 +123,14 @@ const ServiceProjectTeamAllocation = () => {
- {!isAddEmployee && } + {!isAddEmployee && ( + + )}
{isAddEmployee && ( @@ -166,18 +168,18 @@ const ServiceProjectTeamAllocation = () => { )}
- { isAddEmployee && ( -
+ {isAddEmployee && ( +
{" "} - +
)}
- +
@@ -202,29 +204,30 @@ const ServiceProjectTeamAllocation = () => { Team?.map((emp) => ( + - @@ -233,18 +236,12 @@ const ServiceProjectTeamAllocation = () => { diff --git a/src/components/ServiceProject/ServiceProjectTeam/ServiceProjectTeamList.jsx b/src/components/ServiceProject/ServiceProjectTeam/ServiceProjectTeamList.jsx index 7913fdec..ff2acdd7 100644 --- a/src/components/ServiceProject/ServiceProjectTeam/ServiceProjectTeamList.jsx +++ b/src/components/ServiceProject/ServiceProjectTeam/ServiceProjectTeamList.jsx @@ -15,14 +15,17 @@ const ServiceProjectTeamList = () => { { key: "employeName", label: "Name", - getValue: (e) => { - return ( -
- - {`${e.employee.firstName} ${e.employee.lastName}`} -
- ); - }, + getValue: (e) => ( +
+ {" "} + + {`${e.employee.firstName} ${e.employee.lastName}`} +
+ ), + align: "text-start", }, { key: "teamRole", @@ -34,53 +37,54 @@ const ServiceProjectTeamList = () => { ); }, + align: "text-start", }, { key: "assignedAt", label: "assigned Date", - getValue: (e) => { - return ( -
- {formatUTCToLocalTime(e.assignedAT)} -
- ); - }, - className:"text-center" + getValue: (e) => + formatUTCToLocalTime(e.assignedAT) + , + align: "text-center", }, ]; return ( -
-
Name
-
- {" "} +
- {`${emp?.employee?.firstName} ${emp?.employee?.lastName}`} + + {emp?.employee?.firstName} {emp?.employee?.lastName} +
{emp?.teamRole?.name} - {deletingEmp?.emplyee?.id === emp.id && isPending ? ( -
+ +
+ {deletingEmp?.employee?.id === emp.id && isPending ? ( +
) : ( - - - setSeletingEmp({ employee: emp, isOpen: true }) - } - > - + + setSeletingEmp({ employee: emp, isOpen: true }) + } + > )}
{isTeamLoading ? ( ) : ( -
- -

- {" "} - Please Add a Employee{" "} -

-
+

No Records Found

)}
- - - {servceProjectColmen.map((col) => ( - - ))} - - - - - {data?.length > 0 ? ( - data.map((row) => ( - +
+
{col.label}
+ + {servceProjectColmen.map((col) => ( - + ))} - )) - ) : ( - - - - )} - -
- {col.getValue(row)} - {col.label}
- {isLoading ? : "No Records Available"} -
-
+ + + {data?.length > 0 ? ( + data.map((row) => ( + + {servceProjectColmen.map((col) => ( + {col.getValue(row)} + ))} + + )) + ) : ( + + + {isLoading ? ( + + ) : ( +
No Records Available
+ )} + + + )} + + +
); }; diff --git a/src/components/common/Forms/InputFieldSuggesstion.jsx b/src/components/common/Forms/InputFieldSuggesstion.jsx new file mode 100644 index 00000000..881eb16c --- /dev/null +++ b/src/components/common/Forms/InputFieldSuggesstion.jsx @@ -0,0 +1,56 @@ +import React from 'react' + +const InputFieldSuggesstion = () => { + return ( +
+ setTimeout(() => setShowSuggestions(false), 150)} + onFocus={() => { + if (value) setShowSuggestions(true); + }} + disabled={disabled} + /> + {showSuggestions && filteredList.length > 0 && ( +
    + {filteredList.map((org) => ( +
  • handleSelectSuggestion(org)} + onMouseEnter={(e) => + (e.currentTarget.style.backgroundColor = "#f8f9fa") + } + onMouseLeave={(e) => + (e.currentTarget.style.backgroundColor = "transparent") + } + > + {org} +
  • + ))} +
+ )} + + {error && {error}} +
+ ) +} + +export default InputFieldSuggesstion diff --git a/src/components/common/Forms/SelectFieldServerSide.jsx b/src/components/common/Forms/SelectFieldServerSide.jsx index 5d398932..f7aa70eb 100644 --- a/src/components/common/Forms/SelectFieldServerSide.jsx +++ b/src/components/common/Forms/SelectFieldServerSide.jsx @@ -181,5 +181,173 @@ const SelectEmployeeServerSide = ({
); }; - export default SelectEmployeeServerSide; + + +export const SelectProjectField = ()=>{ + const [searchText, setSearchText] = useState(""); + const debounce = useDebounce(searchText, 300); + + const { data, isLoading } = useEmployeesName( + projectId, + debounce, + isAllEmployee + ); + + const options = data?.data ?? []; + const [open, setOpen] = useState(false); + const dropdownRef = useRef(null); + + const getDisplayName = (emp) => { + if (!emp) return ""; + return `${emp.firstName || ""} ${emp.lastName || ""}`.trim(); + }; + + /** ----------------------------- + * SELECTED OPTION (SINGLE) + * ----------------------------- */ + let selectedSingle = null; + + if (!isMultiple) { + if (isFullObject && value) selectedSingle = value; + else if (!isFullObject && value) + selectedSingle = options.find((o) => o[valueKey] === value); + } + + /** ----------------------------- + * SELECTED OPTION (MULTIPLE) + * ----------------------------- */ + let selectedList = []; + + if (isMultiple && Array.isArray(value)) { + if (isFullObject) selectedList = value; + else { + selectedList = options.filter((opt) => value.includes(opt[valueKey])); + } + } + + /** Main button label */ + const displayText = !isMultiple + ? getDisplayName(selectedSingle) || placeholder + : selectedList.length > 0 + ? selectedList.map((e) => getDisplayName(e)).join(", ") + : placeholder; + + /** ----------------------------- + * HANDLE OUTSIDE CLICK + * ----------------------------- */ + useEffect(() => { + const handleClickOutside = (e) => { + if (dropdownRef.current && !dropdownRef.current.contains(e.target)) { + setOpen(false); + } + }; + + document.addEventListener("mousedown", handleClickOutside); + return () => document.removeEventListener("mousedown", handleClickOutside); + }, []); + + /** ----------------------------- + * HANDLE SELECT + * ----------------------------- */ + const handleSelect = (option) => { + if (!isMultiple) { + // SINGLE SELECT + if (isFullObject) onChange(option); + else onChange(option[valueKey]); + } else { + // MULTIPLE SELECT + let updated = []; + + const exists = selectedList.some((e) => e[valueKey] === option[valueKey]); + + if (exists) { + // remove + updated = selectedList.filter((e) => e[valueKey] !== option[valueKey]); + } else { + // add + updated = [...selectedList, option]; + } + + if (isFullObject) onChange(updated); + else onChange(updated.map((x) => x[valueKey])); + } + }; + + return ( +
+ {label && ( + + )} + + {/* MAIN BUTTON */} + + + {/* DROPDOWN */} + {open && ( +
    +
    + setSearchText(e.target.value)} + className="form-control form-control-sm" + placeholder="Search..." + /> +
    + + {isLoading && ( +
  • Loading...
  • + )} + + {!isLoading && options.length === 0 && ( +
  • No results found
  • + )} + + {!isLoading && + options.map((option) => { + const isActive = isMultiple + ? selectedList.some((x) => x[valueKey] === option[valueKey]) + : selectedSingle && + selectedSingle[valueKey] === option[valueKey]; + + return ( +
  • + +
  • + ); + })} +
+ )} +
+ ); +}; \ No newline at end of file