Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 14 additions & 10 deletions src/components/UserProfile/QuickSetupModal/AddNewTitleModal.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,6 @@ function AddNewTitleModal({
QSTTeamCodes,
}) {
const darkMode = useSelector(state => state.theme.darkMode);
const teamCodes = useSelector(state => state.teamCodes?.teamCodes || []);

// ------------------------- state -----------------------------------------

Expand Down Expand Up @@ -129,10 +128,10 @@ function AddNewTitleModal({
? teamsData
: (teamsData && Array.isArray(teamsData.allTeams) ? teamsData.allTeams : []);

let existTeamCodes = new Set(
(Array.isArray(teamsData?.allTeamCode?.distinctTeamCodes)
? teamsData.allTeamCode.distinctTeamCodes
: [])
const existTeamCodes = new Set(
(Array.isArray(QSTTeamCodes) ? QSTTeamCodes : [])
.map(code => code?.value)
.filter(Boolean)
);

const existTeamName = new Set(
Expand Down Expand Up @@ -245,19 +244,24 @@ function AddNewTitleModal({

const confirmOnClick = () => {
if (!onTeamNameValidation(titleData.teamAssiged)) return;


const teamCodeValue = (titleData.teamCode || '').trim();

if (teamCodeValue && !isValidTeamCode) {
setWarningMessage({ title: 'Error', content: 'Please select a valid Team Code' });
setShowMessage(true);
return;
}

const safeTeams = allTeamsArray;
const team = normalizeTeam(titleData.teamAssiged, safeTeams);

// normalize teamCode to a pure string
const teamCodeValue = (titleData.teamCode || '').trim();

const payload = {
id: titleData.id,
titleName: titleData.titleName?.trim() || '',
titleCode: titleData.titleCode?.trim() || '',
mediaFolder: titleData.mediaFolder?.trim() || '',
teamCode: teamCodeValue, // now a non-empty string
teamCode: teamCodeValue,
projectAssigned: titleData.projectAssigned || '',
};

Expand Down
48 changes: 34 additions & 14 deletions src/components/UserProfile/QuickSetupModal/QuickSetupModal.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
import AddNewTitleModal from './AddNewTitleModal';
import EditTitlesModal from './EditTitlesModal';
import { getAllTitle } from '../../../actions/title';
import { setTeamCodes } from '../../../actions/teamCodes';
import './QuickSetupModal.css';
import '../../Header/index.css';
import styles from '../../SummaryBar/SummaryBar.module.css'
Expand All @@ -29,10 +30,25 @@
const [adminLinks, setAdminLinks] = useState([]);
const [editModal, showEditModal] = useState(false);
const [refreshTrigger, setRefreshTrigger] = useState(0);
const [QSTTeamCodes, setQSTTeamCodes] = useState([])

const stateTeamCodes = useSelector(state => state.teamCodes?.teamCodes || []);

const QSTTeamCodes = stateTeamCodes
.filter(code => {
if (typeof code === 'string') return code.trim() !== '';
return code?.value?.trim?.() !== '';
})
.map(code => {
if (typeof code === 'string') {
return { value: code, label: code };
}

return {
value: code.value || '',
label: code.label || code.value || '',
};
});

useEffect(() => {
getAllTitle()
.then(res => {
Expand All @@ -55,20 +71,24 @@
}
};

useEffect(() => {
if (props.fetchTeamCodeAllUsers) {
props.fetchTeamCodeAllUsers()
.then((fetchedCodes) => {
if (fetchedCodes?.length) {
const formatted = fetchedCodes.map(code => ({ value: code }));
setQSTTeamCodes(formatted);
}
useEffect(() => {
if (stateTeamCodes.length > 0 || !props.fetchTeamCodeAllUsers) return;

Check warning on line 75 in src/components/UserProfile/QuickSetupModal/QuickSetupModal.jsx

View check run for this annotation

SonarQubeCloud / SonarCloud Code Analysis

'fetchTeamCodeAllUsers' is missing in props validation

See more on https://sonarcloud.io/project/issues?id=OneCommunityGlobal_HighestGoodNetworkApp&issues=AZzeOhItMid-3ub3ZEas&open=AZzeOhItMid-3ub3ZEas&pullRequest=4976

props
.fetchTeamCodeAllUsers()

Check warning on line 78 in src/components/UserProfile/QuickSetupModal/QuickSetupModal.jsx

View check run for this annotation

SonarQubeCloud / SonarCloud Code Analysis

'fetchTeamCodeAllUsers' is missing in props validation

See more on https://sonarcloud.io/project/issues?id=OneCommunityGlobal_HighestGoodNetworkApp&issues=AZzeOhItMid-3ub3ZEat&open=AZzeOhItMid-3ub3ZEat&pullRequest=4976
.then(fetchedCodes => {
const formatted = (fetchedCodes || [])
.filter(code => typeof code === 'string' && code.trim() !== '')
.map(code => ({
value: code,
label: code,
}));

props.setTeamCodes(formatted);

Check warning on line 87 in src/components/UserProfile/QuickSetupModal/QuickSetupModal.jsx

View check run for this annotation

SonarQubeCloud / SonarCloud Code Analysis

'setTeamCodes' is missing in props validation

See more on https://sonarcloud.io/project/issues?id=OneCommunityGlobal_HighestGoodNetworkApp&issues=AZzeOhItMid-3ub3ZEau&open=AZzeOhItMid-3ub3ZEau&pullRequest=4976
})
// eslint-disable-next-line no-console
.catch((err) => console.error('Failed to fetch team codes:', err));
}
}, [stateTeamCodes.length, props.teamsData && props.teamsData.allTeamCode]);

.catch(err => console.error('Failed to fetch team codes:', err));
}, [stateTeamCodes, props.fetchTeamCodeAllUsers, props.setTeamCodes]);

Check warning on line 91 in src/components/UserProfile/QuickSetupModal/QuickSetupModal.jsx

View check run for this annotation

SonarQubeCloud / SonarCloud Code Analysis

'setTeamCodes' is missing in props validation

See more on https://sonarcloud.io/project/issues?id=OneCommunityGlobal_HighestGoodNetworkApp&issues=AZzeOhItMid-3ub3ZEaw&open=AZzeOhItMid-3ub3ZEaw&pullRequest=4976

Check warning on line 91 in src/components/UserProfile/QuickSetupModal/QuickSetupModal.jsx

View check run for this annotation

SonarQubeCloud / SonarCloud Code Analysis

'fetchTeamCodeAllUsers' is missing in props validation

See more on https://sonarcloud.io/project/issues?id=OneCommunityGlobal_HighestGoodNetworkApp&issues=AZzeOhItMid-3ub3ZEav&open=AZzeOhItMid-3ub3ZEav&pullRequest=4976

return (
<div className={`container pt-3 ${darkMode ? 'bg-yinmn-blue text-light border-0' : ''}`}>
Expand Down Expand Up @@ -205,4 +225,4 @@
);
}

export default connect(null, { hasPermission })(QuickSetupModal);
export default connect(null, { hasPermission, setTeamCodes })(QuickSetupModal);
35 changes: 22 additions & 13 deletions src/components/UserProfile/UserProfile.jsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import React, { useState, useEffect, useRef, useId } from 'react';
import React, { useState, useEffect, useRef, useId, useCallback } from 'react';
import {
Row,
Input,
Expand Down Expand Up @@ -101,27 +101,36 @@ function UserProfile(props) {
// Explaination:
// fetchTeamCodeAllUsers get all weekly summaries and filter out the team codes. (~800ms - 1 sec res time)
// getAllTeamCode() will get all team codes from the database directly with distinct teamcode value (~15ms res time cache enabled).
const fetchTeamCodeAllUsers = async () => {
const url = ENDPOINTS.WEEKLY_SUMMARIES_REPORT();
const fetchTeamCodeAllUsers = useCallback(async () => {
const url = ENDPOINTS.WEEKLY_SUMMARIES_TEAM_CODES();

try {
setIsLoading(true);
const response = await axios.get(url);
const stringWithValue = response.data.map(item => item.teamCode).filter(Boolean);
const stringNoRepeat = stringWithValue
.map(item => item)
.filter((item, index, array) => array.indexOf(item) === index);
setInputAutoComplete(stringNoRepeat);

const response = await axios.get(url, {
params: { _ts: Date.now() },
headers: { 'Cache-Control': 'no-cache', Pragma: 'no-cache' },
});

const teamCodes = (Array.isArray(response.data) ? response.data : [])
.filter(item => typeof item === 'string' && item.trim() !== '');

const uniqueTeamCodes = [...new Set(teamCodes)].sort((a, b) => a.localeCompare(b));

setInputAutoComplete(uniqueTeamCodes);
setInputAutoStatus(response.status);
setIsLoading(false);
return stringNoRepeat;

return uniqueTeamCodes;
} catch (error) {
// eslint-disable-next-line no-console
console.log(error);
setIsLoading(false);
toast.error(`It was not possible to retrieve the team codes.
Please try again by clicking the icon inside the input auto complete.`);
return [];
} finally {
setIsLoading(false);
}
};
}, []);


/* Hooks */
Expand Down
12 changes: 12 additions & 0 deletions src/components/WeeklySummariesReport/WeeklySummariesReport.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -1742,6 +1742,8 @@ const WeeklySummariesReport = props => {
_ids: updatedSummaries.filter(s => s.teamCode === replaceCode).map(s => s._id),
});

props.setTeamCodes(updatedTeamCodes);

const updatedSelectedCodes = selectedCodes
.filter(code => !oldTeamCodes.includes(code.value) && code.value !== replaceCode)
.concat({
Expand Down Expand Up @@ -1795,6 +1797,10 @@ const WeeklySummariesReport = props => {
setState(prev => ({
...prev,
summaries: updatedSummaries,
summariesByTab: {
...prev.summariesByTab,
[prev.activeTab]: updatedSummaries,
},
teamCodes: updatedTeamCodes,
selectedCodes: updatedSelectedCodes,
replaceCode: '',
Expand Down Expand Up @@ -2299,6 +2305,12 @@ const WeeklySummariesReport = props => {
};
}, [state.activeTab]);

useEffect(() => {
if (!Array.isArray(state.teamCodes)) return;

props.setTeamCodes(state.teamCodes);
}, [state.teamCodes, props.setTeamCodes]);

const { role, darkMode } = props;
const { error } = props;
const hasPermissionToFilter = role === 'Owner' || role === 'Administrator';
Expand Down
1 change: 1 addition & 0 deletions src/utils/URL.js
Original file line number Diff line number Diff line change
Expand Up @@ -122,6 +122,7 @@ export const ENDPOINTS = {
UPDATE_PARENT_TASKS: wbsId => `${APIEndpoint}/task/updateAllParents/${wbsId}`,
MOVE_TASKS: wbsId => `${APIEndpoint}/tasks/moveTasks/${wbsId}`,
WEEKLY_SUMMARIES_REPORT: () => `${APIEndpoint}/reports/weeklysummaries`,
WEEKLY_SUMMARIES_TEAM_CODES: () => `${APIEndpoint}/reports/weeklysummaries/teamcodes`,
WEEKLY_SUMMARIES_FILTERS: `${APIEndpoint}/weeklySummariesFilters`,
WEEKLY_SUMMARIES_FILTER_BY_ID: filterId => `${APIEndpoint}/weeklySummariesFilters/${filterId}`,
WEEKLY_SUMMARIES_FILTER_REPLACE_CODES: `${APIEndpoint}/weeklySummariesFilters/replaceTeamcodes`,
Expand Down
Loading