diff --git a/src/components/BMDashboard/Projects/ProjectDetails/ProjectDetails.jsx b/src/components/BMDashboard/Projects/ProjectDetails/ProjectDetails.jsx index 71745b179c..1039511ccc 100644 --- a/src/components/BMDashboard/Projects/ProjectDetails/ProjectDetails.jsx +++ b/src/components/BMDashboard/Projects/ProjectDetails/ProjectDetails.jsx @@ -1,8 +1,10 @@ -import { useEffect, useState } from 'react'; +import { useEffect } from 'react'; import { useParams } from 'react-router-dom'; import { useSelector, useDispatch } from 'react-redux'; import { Container, Row, Col } from 'reactstrap'; -import { fetchBMProjects } from '~/actions/bmdashboard/projectActions'; +import { fetchBMProjects } from '../../../../actions/bmdashboard/projectActions'; +import { fetchBMProjectMembers } from '../../../../actions/bmdashboard/projectMemberAction'; +import { getAllUserTeams } from '../../../../actions/allTeamsAction'; import Loading from '~/components/common/Loading'; import LogBar from './LogBar'; import RentedToolsDisplay from './RentedTools/RentedToolsDisplay'; @@ -13,24 +15,21 @@ import styles from './ProjectDetails.module.css'; function ProjectDetails() { const { projectId } = useParams(); const dispatch = useDispatch(); - const darkMode = useSelector(state => state.theme.darkMode); + const projects = useSelector(state => state.bmProjects) || []; - const [isLoading, setIsLoading] = useState(true); - const currProject = projects.find(project => String(project._id) === String(projectId)); + const darkMode = useSelector(state => state.theme.darkMode); useEffect(() => { - const fetchProjects = async () => { - setIsLoading(true); - try { - await dispatch(fetchBMProjects()); - } finally { - setIsLoading(false); - } - }; - fetchProjects(); - }, [dispatch, projectId]); + if (projectId) { + dispatch(fetchBMProjectMembers(projectId)); + dispatch(getAllUserTeams()); + } + if (projects.length === 0) { + dispatch(fetchBMProjects()); + } + }, [projectId, dispatch, projects.length]); - if (isLoading) { + if (projects.length === 0) { return ( @@ -38,6 +37,8 @@ function ProjectDetails() { ); } + const currProject = projects.find(project => String(project._id) === String(projectId)); + if (!currProject) { return ( @@ -50,14 +51,14 @@ function ProjectDetails() { return (

{currProject.name} Dashboard{' '}

diff --git a/src/components/BMDashboard/Projects/ProjectDetails/ProjectLog.jsx b/src/components/BMDashboard/Projects/ProjectDetails/ProjectLog.jsx index 5d7fc65c6f..60ee8d734b 100644 --- a/src/components/BMDashboard/Projects/ProjectDetails/ProjectLog.jsx +++ b/src/components/BMDashboard/Projects/ProjectDetails/ProjectLog.jsx @@ -1,152 +1,121 @@ +import React, { useState, useMemo } from 'react'; +import { useSelector } from 'react-redux'; import { Card, Table, Button } from 'reactstrap'; -import React from 'react'; import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; import { faSort, faSortUp, faSortDown } from '@fortawesome/free-solid-svg-icons'; import styles from './ProjectDetails.module.css'; -const DummyData = [ - { - id: '12', - firstName: 'Dora', - lastName: 'Kimberly', - role: 'Carpenter', - team: 'XYZ', - currentTask: 'Stud wall construction', - totalHrs: 169, - todaysHrs: 5.5, - }, - { - id: '35', - firstName: 'Cailin', - lastName: 'Colby', - role: 'Volunteer', - team: 'Team A', - currentTask: 'Foundation concreting', - totalHrs: 15, - todaysHrs: 2.18, - }, - { - id: '36', - firstName: 'Member A', - lastName: 'Member A', - role: 'Role A', - team: 'Team A', - currentTask: 'Task 1', - totalHrs: 169, - todaysHrs: 5.5, - }, -]; +function ProjectLog({ projectId, darkMode }) { + const projectData = useSelector(state => state.bmProjectMembers); + const allTeams = useSelector(state => state.allTeamsData?.allTeams || []); -class ProjectLog extends React.Component { - constructor(props) { - super(props); + const membersArray = useMemo(() => { + if (!projectData) return []; + if (Array.isArray(projectData)) return projectData; + if (projectData.members && Array.isArray(projectData.members)) return projectData.members; + if (projectData.members?.members && Array.isArray(projectData.members.members)) + return projectData.members.members; + return []; + }, [projectData]); - this.state = { - idSearchText: '', - firstNameSearchText: '', - lastNameSearchText: '', - roleSearchText: '', - teamSearchText: '', - currentTaskSearchText: '', - totalHrsSearchText: '', - todaysHrsSearchText: '', + const [idSearchText, setIdSearchText] = useState(''); + const [firstNameSearchText, setFirstNameSearchText] = useState(''); + const [lastNameSearchText, setLastNameSearchText] = useState(''); + const [roleSearchText, setRoleSearchText] = useState(''); + const [teamSearchText, setTeamSearchText] = useState(''); + const [currentTaskSearchText, setCurrentTaskSearchText] = useState(''); + const [totalHrsSearchText, setTotalHrsSearchText] = useState(''); + const [todaysHrsSearchText, setTodaysHrsSearchText] = useState(''); - sortColumn: null, - sortDirection: 'asc', - }; - } + const [sortColumn, setSortColumn] = useState(null); + const [sortDirection, setSortDirection] = useState('asc'); - handleIdSearchChange = e => { - this.setState({ idSearchText: e.target.value }); - }; - handleFirstNameSearchText = e => { - this.setState({ firstNameSearchText: e.target.value }); - }; - handleLastNameSearchText = e => { - this.setState({ lastNameSearchText: e.target.value }); - }; - handleRoleSearchText = e => { - this.setState({ roleSearchText: e.target.value }); - }; - handleTeamSearchText = e => { - this.setState({ teamSearchText: e.target.value }); - }; - handleCurrentTaskSearchText = e => { - this.setState({ currentTaskSearchText: e.target.value }); - }; - handleTotalHrsSearchText = e => { - this.setState({ totalHrsSearchText: e.target.value }); - }; - handleTodaysHrsSearchText = e => { - this.setState({ todaysHrsSearchText: e.target.value }); + const findTeamNameForUser = targetUserId => { + if (!allTeams || allTeams.length === 0) return 'Loading...'; + const foundTeam = allTeams.find(team => + team.members.some(member => { + let rawId = member.userId || member._id || member.user; + if (rawId && typeof rawId === 'object') { + rawId = rawId._id || rawId.$oid || rawId; + } + return String(rawId) === String(targetUserId); + }), + ); + return foundTeam ? foundTeam.teamName : 'No Team'; }; - handleClearFilters = () => { - this.setState({ - idSearchText: '', - firstNameSearchText: '', - lastNameSearchText: '', - roleSearchText: '', - teamSearchText: '', - currentTaskSearchText: '', - totalHrsSearchText: '', - todaysHrsSearchText: '', - sortColumn: null, - sortDirection: 'asc', - }); + const handleClearFilters = () => { + setIdSearchText(''); + setFirstNameSearchText(''); + setLastNameSearchText(''); + setRoleSearchText(''); + setTeamSearchText(''); + setCurrentTaskSearchText(''); + setTotalHrsSearchText(''); + setTodaysHrsSearchText(''); + setSortColumn(null); + setSortDirection('asc'); }; - handleSort = column => { - this.setState(prevState => { - if (prevState.sortColumn === column) { - return { - sortDirection: prevState.sortDirection === 'asc' ? 'desc' : 'asc', - }; - } else { - return { - sortColumn: column, - sortDirection: 'asc', - }; - } - }); + const handleSort = column => { + if (sortColumn === column) { + setSortDirection(prev => (prev === 'asc' ? 'desc' : 'asc')); + } else { + setSortColumn(column); + setSortDirection('asc'); + } }; - getSortIcon = columnName => { - if (this.state.sortColumn === columnName) { - return this.state.sortDirection === 'asc' ? faSortUp : faSortDown; + const getSortIcon = columnName => { + if (sortColumn === columnName) { + return sortDirection === 'asc' ? faSortUp : faSortDown; } - return null; + return faSort; }; - filteredData = () => { - const filtered = DummyData.filter(person => { - const idSearch = this.state.idSearchText.trim().toLowerCase(); - const FirstNameSearch = this.state.firstNameSearchText.trim().toLowerCase(); - const LastNameSearch = this.state.lastNameSearchText.trim().toLowerCase(); - const RoleSearch = this.state.roleSearchText.trim().toLowerCase(); - const TeamSearch = this.state.teamSearchText.trim().toLowerCase(); - const CurrentTaskSearch = this.state.currentTaskSearchText.trim().toLowerCase(); - const TotalHrsSearch = this.state.totalHrsSearchText.trim().toLowerCase(); - const TodaysHrsSearch = this.state.todaysHrsSearchText.trim().toLowerCase(); - - const personId = String(person.id).toLowerCase(); - const personFirstName = person.firstName.toLowerCase(); - const personLastName = person.lastName.toLowerCase(); - const personRole = person.role.toLowerCase(); - const personTeam = person.team.toLowerCase(); - const personCurrentTask = person.currentTask.toLowerCase(); - const personTotalHrs = String(person.totalHrs).toLowerCase(); - const personTodaysHrs = String(person.todaysHrs).toLowerCase(); + const processedData = useMemo(() => { + return membersArray + .filter(member => member && member.user && typeof member.user !== 'string') + .map(member => { + const user = member.user; + return { + id: user._id ? String(user._id).substring(user._id.length - 4) : 'N/A', + rawId: user._id, + firstName: user.firstName || 'Unknown', + lastName: user.lastName || 'User', + role: user.role || 'N/A', + team: findTeamNameForUser(user._id), + currentTask: member.currentTask || '--', + totalHrs: member.hours ? Math.round(member.hours) : 0, + todaysHrs: member.todaysHrs || '--', + }; + }); + }, [membersArray, allTeams]); - const matchesId = !idSearch || personId.includes(idSearch); - const matchesFirstName = !FirstNameSearch || personFirstName.includes(FirstNameSearch); - const matchesLastName = !LastNameSearch || personLastName.includes(LastNameSearch); - const matchesRole = !RoleSearch || personRole.includes(RoleSearch); - const matchesTeam = !TeamSearch || personTeam.includes(TeamSearch); + const filteredAndSortedData = useMemo(() => { + let result = processedData.filter(person => { + const matchesId = + !idSearchText || person.id.toLowerCase().includes(idSearchText.toLowerCase()); + const matchesFirstName = + !firstNameSearchText || + person.firstName.toLowerCase().includes(firstNameSearchText.toLowerCase()); + const matchesLastName = + !lastNameSearchText || + person.lastName.toLowerCase().includes(lastNameSearchText.toLowerCase()); + const matchesRole = + !roleSearchText || person.role.toLowerCase().includes(roleSearchText.toLowerCase()); + const matchesTeam = + !teamSearchText || person.team.toLowerCase().includes(teamSearchText.toLowerCase()); const matchesCurrentTask = - !CurrentTaskSearch || personCurrentTask.includes(CurrentTaskSearch); - const matchesTotalHrs = !TotalHrsSearch || personTotalHrs.includes(TotalHrsSearch); - const matchesTodaysHrs = !TodaysHrsSearch || personTodaysHrs.includes(TodaysHrsSearch); + !currentTaskSearchText || + person.currentTask.toLowerCase().includes(currentTaskSearchText.toLowerCase()); + const matchesTotalHrs = + !totalHrsSearchText || String(person.totalHrs).includes(totalHrsSearchText); + const matchesTodaysHrs = + !todaysHrsSearchText || + String(person.todaysHrs) + .toLowerCase() + .includes(todaysHrsSearchText.toLowerCase()); return ( matchesId && @@ -160,167 +129,128 @@ class ProjectLog extends React.Component { ); }); - if (this.state.sortColumn) { - return filtered.sort((a, b) => { - let firstValue, secondValue; + if (sortColumn) { + result = result.sort((a, b) => { + let firstValue = a[sortColumn]; + let secondValue = b[sortColumn]; - switch (this.state.sortColumn) { - case 'id': - firstValue = Number(a.id); - secondValue = Number(b.id); - break; - case 'firstName': - firstValue = a.firstName.toLowerCase(); - secondValue = b.firstName.toLowerCase(); - break; - case 'lastName': - firstValue = a.lastName.toLowerCase(); - secondValue = b.lastName.toLowerCase(); - break; - case 'role': - firstValue = a.role.toLowerCase(); - secondValue = b.role.toLowerCase(); - break; - case 'team': - firstValue = a.team.toLowerCase(); - secondValue = b.team.toLowerCase(); - break; - case 'currentTask': - firstValue = a.currentTask.toLowerCase(); - secondValue = b.currentTask.toLowerCase(); - break; - case 'totalHrs': - firstValue = Number(a.totalHrs); - secondValue = Number(b.totalHrs); - break; - case 'todaysHrs': - firstValue = Number(a.todaysHrs); - secondValue = Number(b.todaysHrs); - break; - default: - return 0; + if (sortColumn === 'totalHrs' || sortColumn === 'todaysHrs') { + firstValue = Number(firstValue) || 0; + secondValue = Number(secondValue) || 0; + } else { + firstValue = String(firstValue).toLowerCase(); + secondValue = String(secondValue).toLowerCase(); } - let compare = 0; - if (firstValue < secondValue) { - compare = -1; - } else if (firstValue > secondValue) { - compare = 1; - } - return this.state.sortDirection === 'asc' ? compare : -compare; + + if (firstValue < secondValue) return sortDirection === 'asc' ? -1 : 1; + if (firstValue > secondValue) return sortDirection === 'asc' ? 1 : -1; + return 0; }); } - return filtered; - }; - render() { - const { darkMode } = this.props; - const filteredData = this.filteredData(); - const hasActiveFilters = - this.state.idSearchText || - this.state.firstNameSearchText || - this.state.lastNameSearchText || - this.state.roleSearchText || - this.state.teamSearchText || - this.state.currentTaskSearchText || - this.state.totalHrsSearchText || - this.state.todaysHrsSearchText; - const inputStyle = { - width: '100%', - backgroundColor: darkMode ? '#1e293b' : '#fff', - color: darkMode ? '#f1f5f9' : '#000', - border: darkMode ? '1px solid #334155' : '1px solid #ccc', - borderRadius: '4px', - padding: '4px 8px', - }; + return result; + }, [ + processedData, + idSearchText, + firstNameSearchText, + lastNameSearchText, + roleSearchText, + teamSearchText, + currentTaskSearchText, + totalHrsSearchText, + todaysHrsSearchText, + sortColumn, + sortDirection, + ]); - const tableRows = filteredData.map(person => ( - - {person.id} - {person.firstName} - {person.lastName} - {person.role} - {person.team} - {person.currentTask} - {person.totalHrs} - {person.todaysHrs} - - )); + const hasActiveFilters = + idSearchText || + firstNameSearchText || + lastNameSearchText || + roleSearchText || + teamSearchText || + currentTaskSearchText || + totalHrsSearchText || + todaysHrsSearchText; - return ( - -
-

Members working on site today

- {hasActiveFilters && ( - - )} -
- + const inputStyle = { + width: '100%', + backgroundColor: darkMode ? '#1e293b' : '#fff', + color: darkMode ? '#f1f5f9' : '#000', + border: darkMode ? '1px solid #334155' : '1px solid #ccc', + borderRadius: '4px', + padding: '4px 8px', + }; + + return ( + +
+

Members working on site today

+ {hasActiveFilters && ( + + )} +
+
+
- - - - - - - - @@ -328,8 +258,8 @@ class ProjectLog extends React.Component { setIdSearchText(e.target.value)} style={inputStyle} /> @@ -337,8 +267,8 @@ class ProjectLog extends React.Component { setFirstNameSearchText(e.target.value)} style={inputStyle} /> @@ -346,8 +276,8 @@ class ProjectLog extends React.Component { setLastNameSearchText(e.target.value)} style={inputStyle} /> @@ -355,8 +285,8 @@ class ProjectLog extends React.Component { setRoleSearchText(e.target.value)} style={inputStyle} /> @@ -364,8 +294,8 @@ class ProjectLog extends React.Component { setTeamSearchText(e.target.value)} style={inputStyle} /> @@ -373,8 +303,8 @@ class ProjectLog extends React.Component { setCurrentTaskSearchText(e.target.value)} style={inputStyle} /> @@ -382,8 +312,8 @@ class ProjectLog extends React.Component { setTotalHrsSearchText(e.target.value)} style={inputStyle} /> @@ -391,30 +321,43 @@ class ProjectLog extends React.Component { setTodaysHrsSearchText(e.target.value)} style={inputStyle} /> - {tableRows.length > 0 ? ( - tableRows + {filteredAndSortedData.length > 0 ? ( + filteredAndSortedData.map((person, index) => ( + + + + + + + + + + + )) ) : ( )}
this.handleSort('id')} style={{ cursor: 'pointer' }}> - ID - {(() => { - const icon = this.getSortIcon('id'); - return icon && ; - })()} + handleSort('id')} + style={{ cursor: 'pointer', whiteSpace: 'nowrap' }} + > + ID this.handleSort('firstName')} style={{ cursor: 'pointer' }}> - First Name - {(() => { - const icon = this.getSortIcon('firstName'); - return icon && ; - })()} + handleSort('firstName')} + style={{ cursor: 'pointer', whiteSpace: 'nowrap' }} + > + First Name this.handleSort('lastName')} style={{ cursor: 'pointer' }}> - Last Name - {(() => { - const icon = this.getSortIcon('lastName'); - return icon && ; - })()} + handleSort('lastName')} + style={{ cursor: 'pointer', whiteSpace: 'nowrap' }} + > + Last Name this.handleSort('role')} style={{ cursor: 'pointer' }}> - Role - {(() => { - const icon = this.getSortIcon('role'); - return icon && ; - })()} + handleSort('role')} + style={{ cursor: 'pointer', whiteSpace: 'nowrap' }} + > + Role this.handleSort('team')} style={{ cursor: 'pointer' }}> - Team - {(() => { - const icon = this.getSortIcon('team'); - return icon && ; - })()} + handleSort('team')} + style={{ cursor: 'pointer', whiteSpace: 'nowrap' }} + > + Team this.handleSort('currentTask')} style={{ cursor: 'pointer' }}> - Current Task - {(() => { - const icon = this.getSortIcon('currentTask'); - return icon && ; - })()} + handleSort('currentTask')} + style={{ cursor: 'pointer', whiteSpace: 'nowrap' }} + > + Current Task this.handleSort('totalHrs')} style={{ cursor: 'pointer' }}> - Total Hrs - {(() => { - const icon = this.getSortIcon('totalHrs'); - return icon && ; - })()} + handleSort('totalHrs')} + style={{ cursor: 'pointer', whiteSpace: 'nowrap' }} + > + Total Hrs this.handleSort('todaysHrs')} style={{ cursor: 'pointer' }}> - Today's Hrs - {(() => { - const icon = this.getSortIcon('todaysHrs'); - return icon && ; - })()} + handleSort('todaysHrs')} + style={{ cursor: 'pointer', whiteSpace: 'nowrap' }} + > + Today's Hrs{' '} +
{person.id}{person.firstName}{person.lastName}{person.role}{person.team}{person.currentTask}{person.totalHrs}{person.todaysHrs}

- No members match the current filters. + {membersArray.length === 0 + ? 'Loading or no active members...' + : 'No members match the current filters.'}

-
- ); - } + + + ); } export default ProjectLog; diff --git a/yarn.lock b/yarn.lock index d409b838c8..b56311e019 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2430,24 +2430,16 @@ "@jest/transform@30.2.0": version "30.2.0" - resolved "https://registry.npmjs.org/@jest/transform/-/transform-30.2.0.tgz" - integrity sha512-XsauDV82o5qXbhalKxD7p4TZYYdwcaEXC77PPD2HixEFF+6YGppjrAAQurTl2ECWcEomHBMMNS9AH3kcCFx8jA== + resolved "https://registry.npmjs.org/@jest/types/-/types-30.2.0.tgz" + integrity sha512-H9xg1/sfVvyfU7o3zMfBEjQ1gcsdeTMgqHoYdN79tuLqfTtuu7WckRA1R5whDwOzxaZAeMKTYWqP+WCAi0CHsg== dependencies: - "@babel/core" "^7.27.4" - "@jest/types" "30.2.0" - "@jridgewell/trace-mapping" "^0.3.25" - babel-plugin-istanbul "^7.0.1" + "@jest/pattern" "30.0.1" + "@jest/schemas" "30.0.5" + "@types/istanbul-lib-coverage" "^2.0.6" + "@types/istanbul-reports" "^3.0.4" + "@types/node" "*" + "@types/yargs" "^17.0.33" chalk "^4.1.2" - convert-source-map "^2.0.0" - fast-json-stable-stringify "^2.1.0" - graceful-fs "^4.2.11" - jest-haste-map "30.2.0" - jest-regex-util "30.0.1" - jest-util "30.2.0" - micromatch "^4.0.8" - pirates "^4.0.7" - slash "^3.0.0" - write-file-atomic "^5.0.1" "@jest/transform@^29.7.0": version "29.7.0" @@ -2914,13 +2906,12 @@ classnames "^2.3.2" rc-util "^5.24.4" -"@rc-component/qrcode@~1.0.0": - version "1.0.1" - resolved "https://registry.npmjs.org/@rc-component/qrcode/-/qrcode-1.0.1.tgz" - integrity sha512-g8eeeaMyFXVlq8cZUeaxCDhfIYjpao0l9cvm5gFwKXy/Vm1yDWV7h2sjH5jHYzdFedlVKBpATFB1VKMrHzwaWQ== +"@rc-component/qrcode@~1.1.0": + version "1.1.1" + resolved "https://registry.npmjs.org/@rc-component/qrcode/-/qrcode-1.1.1.tgz" + integrity sha512-LfLGNymzKdUPjXUbRP+xOhIWY4jQ+YMj5MmWAcgcAq1Ij8XP7tRmAXqyuv96XvLUBE/5cA8hLFl9eO1JQMujrA== dependencies: "@babel/runtime" "^7.24.7" - classnames "^2.3.2" "@rc-component/tour@~1.15.1": version "1.15.1" @@ -4278,7 +4269,14 @@ ajv@^8.0.0, ajv@^8.0.1, ajv@^8.18.0, ajv@^8.9.0: json-schema-traverse "^1.0.0" require-from-string "^2.0.2" -ansi-escapes@7.1.1, ansi-escapes@^4.3.2, ansi-escapes@^7.0.0: +ansi-escapes@^4.3.2: + version "4.3.2" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" + integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== + dependencies: + type-fest "^0.21.3" + +ansi-escapes@^7.0.0: version "7.1.1" resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-7.1.1.tgz#fdd39427a7e5a26233e48a8b4366351629ffea1b" integrity sha512-Zhl0ErHcSRUaVfGUeUdDuLgpkEo8KIFjB4Y9uAc46ScOpdDiU1Dbyplh7qWJeJ/ZHpbyMSM26+X3BySgnIz40Q== @@ -4759,6 +4757,11 @@ base64-js@^1.1.2, base64-js@^1.3.0, base64-js@^1.3.1: resolved "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz" integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== +baseline-browser-mapping@^2.8.25: + version "2.8.29" + resolved "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.8.29.tgz" + integrity sha512-sXdt2elaVnhpDNRDz+1BDx1JQoJRuNk7oVlAlbGiFkLikHCAQiccexF/9e91zVi6RCgqspl04aP+6Cnl9zRLrA== + baseline-browser-mapping@^2.9.0, baseline-browser-mapping@^2.9.17: version "2.9.19" resolved "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.19.tgz" @@ -4879,7 +4882,7 @@ browserify-sign@^4.2.3: readable-stream "^2.3.8" safe-buffer "^5.2.1" -browserslist@^4.24.0, browserslist@^4.25.3, browserslist@^4.28.1: +browserslist@^4.24.0, browserslist@^4.25.3: version "4.28.1" resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz" integrity sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA== @@ -4890,6 +4893,17 @@ browserslist@^4.24.0, browserslist@^4.25.3, browserslist@^4.28.1: node-releases "^2.0.27" update-browserslist-db "^1.2.0" +browserslist@^4.26.3: + version "4.28.0" + resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.28.0.tgz" + integrity sha512-tbydkR/CxfMwelN0vwdP/pLkDwyAASZ+VfWm4EOwlB6SWhx1sYnWLqo8N5j0rAzPfzfRaxt0mM/4wPU/Su84RQ== + dependencies: + baseline-browser-mapping "^2.8.25" + caniuse-lite "^1.0.30001754" + electron-to-chromium "^1.5.249" + node-releases "^2.0.27" + update-browserslist-db "^1.1.4" + bser@2.1.1: version "2.1.1" resolved "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz" @@ -4987,6 +5001,11 @@ camelize@^1.0.0: resolved "https://registry.npmjs.org/camelize/-/camelize-1.0.1.tgz" integrity sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ== +caniuse-lite@^1.0.30001754: + version "1.0.30001756" + resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001756.tgz" + integrity sha512-4HnCNKbMLkLdhJz3TToeVWHSnfJvPaq6vu/eRP0Ahub/07n484XHhBF5AJoSGHdVrS8tKFauUQz8Bp9P7LVx7A== + caniuse-lite@^1.0.30001759: version "1.0.30001768" resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001768.tgz" @@ -6113,6 +6132,11 @@ eastasianwidth@^0.2.0: resolved "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz" integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== +electron-to-chromium@^1.5.249: + version "1.5.256" + resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.256.tgz" + integrity sha512-uqYq1IQhpXXLX+HgiXdyOZml7spy4xfy42yPxcCCRjswp0fYM2X+JwCON07lqnpLEGVCj739B7Yr+FngmHBMEQ== + electron-to-chromium@^1.5.263: version "1.5.286" resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.286.tgz" @@ -6159,13 +6183,13 @@ encoding-sniffer@^0.2.1: iconv-lite "^0.6.3" whatwg-encoding "^3.1.1" -enhanced-resolve@^5.17.4: - version "5.19.0" - resolved "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.19.0.tgz" - integrity sha512-phv3E1Xl4tQOShqSte26C7Fl84EwUdZsyOuSSk9qtAGyyQs2s3jJzComh+Abf4g187lUUAvH+H26omrqia2aGg== +enhanced-resolve@^5.17.3: + version "5.18.3" + resolved "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.3.tgz" + integrity sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww== dependencies: graceful-fs "^4.2.4" - tapable "^2.3.0" + tapable "^2.2.0" entities@^2.0.0: version "2.2.0" @@ -6296,16 +6320,11 @@ es-iterator-helpers@^1.2.1: iterator.prototype "^1.1.4" safe-array-concat "^1.1.3" -es-module-lexer@^1.7.0: +es-module-lexer@^1.2.1, es-module-lexer@^1.7.0: version "1.7.0" resolved "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz" integrity sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA== -es-module-lexer@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.0.0.tgz" - integrity sha512-5POEcUuZybH7IdmGsD8wlf0AI55wMecM9rVBTI/qEAy2c1kTOm3DjFYjrBdI2K3BaJjJYfYFeRtM0t9ssnRuxw== - es-object-atoms@^1.0.0, es-object-atoms@^1.1.1: version "1.1.1" resolved "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz" @@ -6817,9 +6836,9 @@ fb-watchman@^2.0.0, fb-watchman@^2.0.2: dependencies: bser "2.1.1" -fdir@^6.4.4: +fdir@^6.4.4, fdir@^6.5.0: version "6.5.0" - resolved "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz" + resolved "https://registry.yarnpkg.com/fdir/-/fdir-6.5.0.tgz#ed2ab967a331ade62f18d077dae192684d50d350" integrity sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg== fecha@^4.2.1: @@ -9462,7 +9481,7 @@ picomatch@^2.0.4, picomatch@^2.2.3, picomatch@^2.3.1: resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== -picomatch@^4.0.2: +picomatch@^4.0.2, picomatch@^4.0.3: version "4.0.3" resolved "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz" integrity sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q== @@ -9775,10 +9794,10 @@ rc-dropdown@~4.2.0, rc-dropdown@~4.2.1: classnames "^2.2.6" rc-util "^5.44.1" -rc-field-form@~2.7.0: - version "2.7.0" - resolved "https://registry.npmjs.org/rc-field-form/-/rc-field-form-2.7.0.tgz" - integrity sha512-hgKsCay2taxzVnBPZl+1n4ZondsV78G++XVsMIJCAoioMjlMQR9YwAp7JZDIECzIu2Z66R+f4SFIRrO2DjDNAA== +rc-field-form@~2.7.1: + version "2.7.1" + resolved "https://registry.npmjs.org/rc-field-form/-/rc-field-form-2.7.1.tgz" + integrity sha512-vKeSifSJ6HoLaAB+B8aq/Qgm8a3dyxROzCtKNCsBQgiverpc4kWDQihoUwzUj+zNWJOykwSY4dNX3QrGwtVb9A== dependencies: "@babel/runtime" "^7.18.0" "@rc-component/async-validator" "^5.0.3" @@ -9969,10 +9988,10 @@ rc-switch@~4.1.0: classnames "^2.2.1" rc-util "^5.30.0" -rc-table@~7.53.0: - version "7.53.1" - resolved "https://registry.npmjs.org/rc-table/-/rc-table-7.53.1.tgz" - integrity sha512-firAd7Z+liqIDS5TubJ1qqcoBd6YcANLKWQDZhFf3rfoOTt/UNPj4n3O+2vhl+z4QMqwPEUVAil661WHA8H8Aw== +rc-table@~7.54.0: + version "7.54.0" + resolved "https://registry.npmjs.org/rc-table/-/rc-table-7.54.0.tgz" + integrity sha512-/wDTkki6wBTjwylwAGjpLKYklKo9YgjZwAU77+7ME5mBoS32Q4nAwoqhA2lSge6fobLW3Tap6uc5xfwaL2p0Sw== dependencies: "@babel/runtime" "^7.10.1" "@rc-component/context" "^1.4.0" @@ -10037,10 +10056,10 @@ rc-tree@~5.13.0, rc-tree@~5.13.1: rc-util "^5.16.1" rc-virtual-list "^3.5.1" -rc-upload@~4.9.2: - version "4.9.2" - resolved "https://registry.npmjs.org/rc-upload/-/rc-upload-4.9.2.tgz" - integrity sha512-nHx+9rbd1FKMiMRYsqQ3NkXUv7COHPBo3X1Obwq9SWS6/diF/A0aJ5OHubvwUAIDs+4RMleljV0pcrNUc823GQ== +rc-upload@~4.11.0: + version "4.11.0" + resolved "https://registry.npmjs.org/rc-upload/-/rc-upload-4.11.0.tgz" + integrity sha512-ZUyT//2JAehfHzjWowqROcwYJKnZkIUGWaTE/VogVrepSl7AFNbQf4+zGfX4zl9Vrj/Jm8scLO0R6UlPDKK4wA== dependencies: "@babel/runtime" "^7.18.3" classnames "^2.2.5" @@ -11566,10 +11585,10 @@ tapable@^2.3.0: resolved "https://registry.npmjs.org/tapable/-/tapable-2.3.0.tgz" integrity sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg== -terser-webpack-plugin@^5.3.16: - version "5.3.16" - resolved "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.16.tgz" - integrity sha512-h9oBFCWrq78NyWWVcSwZarJkZ01c2AyGrzs1crmHZO3QUg9D61Wu4NPjBy69n7JqylFF5y+CsUZYmYEIZ3mR+Q== +terser-webpack-plugin@^5.3.11: + version "5.3.14" + resolved "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.14.tgz" + integrity sha512-vkZjpUjb6OMS7dhV+tILUW6BhpDR7P2L/aQSAv+Uwk+m8KATX9EccViHTJR2qDtACKPIYndLGCyl3FMo+r2LMw== dependencies: "@jridgewell/trace-mapping" "^0.3.25" jest-worker "^27.4.5" @@ -11812,6 +11831,11 @@ type-fest@^0.20.2: resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz" integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== +type-fest@^0.21.3: + version "0.21.3" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" + integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== + type-fest@^4.26.1: version "4.41.0" resolved "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz" @@ -11989,10 +12013,10 @@ unzipper@^0.12.2: graceful-fs "^4.2.2" node-int64 "^0.4.0" -update-browserslist-db@^1.2.0: - version "1.2.3" - resolved "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz" - integrity sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w== +update-browserslist-db@^1.1.4: + version "1.1.4" + resolved "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.4.tgz" + integrity sha512-q0SPT4xyU84saUX+tomz1WLkxUbuaJnR1xWt17M7fJtEJigJeWUNGUqrauFXsHnqev9y9JTRGwk13tFBuKby4A== dependencies: escalade "^3.2.0" picocolors "^1.1.1"