diff --git a/src/pages/Gallary/ImageGallary.jsx b/src/pages/Gallary/ImageGallary.jsx index ba023adb..da51b496 100644 --- a/src/pages/Gallary/ImageGallary.jsx +++ b/src/pages/Gallary/ImageGallary.jsx @@ -1,3 +1,4 @@ +// ImageGallery.js import React, { useState, useEffect, useRef, useCallback } from "react"; import "./ImageGallery.css"; import { ImageGalleryAPI } from "./ImageGalleryAPI"; @@ -6,12 +7,15 @@ import { useSelector } from "react-redux"; import { useModal } from "./ModalContext"; import ImagePop from "./ImagePop"; import Avatar from "../../components/common/Avatar"; +import DateRangePicker from "../../components/common/DateRangePicker"; // Assuming this is the path to your DateRangePicker const ImageGallery = () => { const [images, setImages] = useState([]); const selectedProjectId = useSelector((store) => store.localVariables.projectId); const { openModal } = useModal(); + const yesterday = moment().subtract(1, 'days').format('YYYY-MM-DD'); + const [selectedFilters, setSelectedFilters] = useState({ building: [], floor: [], @@ -95,7 +99,7 @@ const ImageGallery = () => { const getUniqueValuesWithIds = useCallback( (idKey, nameKey) => { const uniqueMap = new Map(); - images.forEach(img => { + images.forEach((img) => { if (img[idKey] && img[nameKey]) { uniqueMap.set(img[idKey], img[nameKey]); } @@ -105,21 +109,20 @@ const ImageGallery = () => { [images] ); - const getUniqueUploadedByUsers = useCallback( - () => { - const uniqueUsersMap = new Map(); - images.forEach(img => { - if (img.uploadedBy && img.uploadedBy.id) { - const fullName = `${img.uploadedBy.firstName || ""} ${img.uploadedBy.lastName || ""}`.trim(); - if (fullName) { - uniqueUsersMap.set(img.uploadedBy.id, fullName); - } + const getUniqueUploadedByUsers = useCallback(() => { + const uniqueUsersMap = new Map(); + images.forEach((img) => { + if (img.uploadedBy && img.uploadedBy.id) { + const fullName = `${img.uploadedBy.firstName || ""} ${ + img.uploadedBy.lastName || "" + }`.trim(); + if (fullName) { + uniqueUsersMap.set(img.uploadedBy.id, fullName); } - }); - return Array.from(uniqueUsersMap.entries()); - }, - [images] - ); + } + }); + return Array.from(uniqueUsersMap.entries()); + }, [images]); const buildings = getUniqueValuesWithIds("buildingId", "buildingName"); const floors = getUniqueValuesWithIds("floorIds", "floorName"); @@ -131,7 +134,7 @@ const ImageGallery = () => { const toggleFilter = useCallback((type, itemId, itemName) => { setSelectedFilters((prev) => { const current = prev[type]; - const isSelected = current.some(item => item[0] === itemId); + const isSelected = current.some((item) => item[0] === itemId); const newArray = isSelected ? current.filter((item) => item[0] !== itemId) @@ -144,10 +147,11 @@ const ImageGallery = () => { }); }, []); - const handleDateChange = useCallback((type, date) => { + const setDateRange = useCallback(({ startDate, endDate }) => { setSelectedFilters((prev) => ({ ...prev, - [type]: date, + startDate: startDate || "", + endDate: endDate || "", })); }, []); @@ -160,12 +164,30 @@ const ImageGallery = () => { const handleApplyFilters = useCallback(() => { const payload = { - buildingIds: selectedFilters.building.length > 0 ? selectedFilters.building.map(item => item[0]) : null, - floorIds: selectedFilters.floor.length > 0 ? selectedFilters.floor.map(item => item[0]) : null, - workAreaIds: selectedFilters.workArea.length > 0 ? selectedFilters.workArea.map(item => item[0]) : null, - workCategoryIds: selectedFilters.workCategory.length > 0 ? selectedFilters.workCategory.map(item => item[0]) : null, - activityIds: selectedFilters.activity.length > 0 ? selectedFilters.activity.map(item => item[0]) : null, - uploadedByIds: selectedFilters.uploadedBy.length > 0 ? selectedFilters.uploadedBy.map(item => item[0]) : null, + buildingIds: + selectedFilters.building.length > 0 + ? selectedFilters.building.map((item) => item[0]) + : null, + floorIds: + selectedFilters.floor.length > 0 + ? selectedFilters.floor.map((item) => item[0]) + : null, + workAreaIds: + selectedFilters.workArea.length > 0 + ? selectedFilters.workArea.map((item) => item[0]) + : null, + workCategoryIds: + selectedFilters.workCategory.length > 0 + ? selectedFilters.workCategory.map((item) => item[0]) + : null, + activityIds: + selectedFilters.activity.length > 0 + ? selectedFilters.activity.map((item) => item[0]) + : null, + uploadedByIds: + selectedFilters.uploadedBy.length > 0 + ? selectedFilters.uploadedBy.map((item) => item[0]) + : null, startDate: selectedFilters.startDate || null, endDate: selectedFilters.endDate || null, }; @@ -173,7 +195,6 @@ const ImageGallery = () => { setIsFilterPanelOpen(false); }, [selectedFilters]); - const handleClearAllFilters = useCallback(() => { const initialStateSelected = { building: [], @@ -202,32 +223,41 @@ const ImageGallery = () => { setIsFilterPanelOpen(false); }, []); - const filteredImages = images.filter( - (img) => { - const uploadedAtMoment = moment(img.uploadedAt); - const startDateMoment = appliedFilters.startDate ? moment(appliedFilters.startDate) : null; - const endDateMoment = appliedFilters.endDate ? moment(appliedFilters.endDate) : null; + const filteredImages = images.filter((img) => { + const uploadedAtMoment = moment(img.uploadedAt); + const startDateMoment = appliedFilters.startDate + ? moment(appliedFilters.startDate) + : null; + const endDateMoment = appliedFilters.endDate + ? moment(appliedFilters.endDate) + : null; - const isWithinDateRange = - (!startDateMoment || uploadedAtMoment.isSameOrAfter(startDateMoment, 'day')) && - (!endDateMoment || uploadedAtMoment.isSameOrBefore(endDateMoment, 'day')); + const isWithinDateRange = + (!startDateMoment || uploadedAtMoment.isSameOrAfter(startDateMoment, "day")) && + (!endDateMoment || uploadedAtMoment.isSameOrBefore(endDateMoment, "day")); - const passesCategoryFilters = - (appliedFilters.buildingIds === null || appliedFilters.buildingIds.includes(img.buildingId)) && - (appliedFilters.floorIds === null || appliedFilters.floorIds.includes(img.floorIds)) && - (appliedFilters.activityIds === null || appliedFilters.activityIds.includes(img.activityId)) && - (appliedFilters.workAreaIds === null || appliedFilters.workAreaIds.includes(img.workAreaId)) && - (appliedFilters.uploadedByIds === null || appliedFilters.uploadedByIds.includes(img.uploadedBy?.id)) && - (appliedFilters.workCategoryIds === null || appliedFilters.workCategoryIds.includes(img.workCategoryId)); + const passesCategoryFilters = + (appliedFilters.buildingIds === null || + appliedFilters.buildingIds.includes(img.buildingId)) && + (appliedFilters.floorIds === null || + appliedFilters.floorIds.includes(img.floorIds)) && + (appliedFilters.activityIds === null || + appliedFilters.activityIds.includes(img.activityId)) && + (appliedFilters.workAreaIds === null || + appliedFilters.workAreaIds.includes(img.workAreaId)) && + (appliedFilters.uploadedByIds === null || + appliedFilters.uploadedByIds.includes(img.uploadedBy?.id)) && + (appliedFilters.workCategoryIds === null || + appliedFilters.workCategoryIds.includes(img.workCategoryId)); - return isWithinDateRange && passesCategoryFilters; - } - ); + return isWithinDateRange && passesCategoryFilters; + }); const imagesByActivityUser = {}; filteredImages.forEach((img) => { - const userName = `${img.uploadedBy?.firstName || ""} ${img.uploadedBy?.lastName || "" - }`.trim(); + const userName = `${img.uploadedBy?.firstName || ""} ${ + img.uploadedBy?.lastName || "" + }`.trim(); const workArea = img.workAreaName || "Unknown"; const key = `${img.activityName}__${userName}__${workArea}`; if (!imagesByActivityUser[key]) imagesByActivityUser[key] = []; @@ -243,62 +273,48 @@ const ImageGallery = () => { }, []); const renderFilterCategory = (label, items, type) => ( -
+
toggleCollapse(type)}> {label}
- {type === 'dateRange' && (selectedFilters.startDate || selectedFilters.endDate) && ( - - )} - {type !== 'dateRange' && selectedFilters[type] && selectedFilters[type].length > 0 && ( - - )} + {type === "dateRange" && (selectedFilters.startDate || selectedFilters.endDate) && ( + + )} + {type !== "dateRange" && + selectedFilters[type] && + selectedFilters[type].length > 0 && ( + + )}
{!collapsedFilters[type] && (
- {type === 'dateRange' ? ( -
- - -
+ {type === "dateRange" ? ( + // The DateRangePicker will be rendered outside this function, at the end of the filter panel + null ) : ( items.map((item) => { const itemId = item[0]; const itemName = item[1]; - const isChecked = selectedFilters[type].some(selectedItem => selectedItem[0] === itemId); + const isChecked = selectedFilters[type].some( + (selectedItem) => selectedItem[0] === itemId + ); return (