Skip to content

Commit

Permalink
Merge pull request #11 from DaleMcGrew/Dale_WCC_Dec28-2024b
Browse files Browse the repository at this point in the history
Adding ability to see QuestionAnswers.
  • Loading branch information
DaleMcGrew authored Dec 31, 2024
2 parents aaf7309 + 1919d5d commit ce40f7c
Show file tree
Hide file tree
Showing 10 changed files with 505 additions and 50 deletions.
4 changes: 3 additions & 1 deletion src/App.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -26,12 +26,13 @@ import { PrivateRoute } from './js/auth';

// Root URL pages

const AnswerQuestionsForm = React.lazy(() => import(/* webpackChunkName: 'AnswerQuestionsForm' */ './js/pages/AnswerQuestionsForm'));
const Drawers = React.lazy(() => import(/* webpackChunkName: 'Drawers' */ './js/components/Drawers/Drawers'));
const FAQ = React.lazy(() => import(/* webpackChunkName: 'FAQ' */ './js/pages/FAQ'));
const Footer = React.lazy(() => import(/* webpackChunkName: 'Footer' */ './js/components/Navigation/Footer'));
const Header = React.lazy(() => import(/* webpackChunkName: 'Header' */ './js/components/Navigation/Header'));
const PageNotFound = React.lazy(() => import(/* webpackChunkName: 'PageNotFound' */ './js/pages/PageNotFound'));
const AnswerQuestionsForm = React.lazy(() => import(/* webpackChunkName: 'AnswerQuestionsForm' */ './js/pages/AnswerQuestionsForm'));
const QuestionnaireAnswers = React.lazy(() => import(/* webpackChunkName: 'QuestionnaireAnswers' */ './js/pages/QuestionnaireAnswers'));
const QuestionnaireQuestionList = React.lazy(() => import(/* webpackChunkName: 'QuestionnaireQuestionList' */ './js/pages/SystemSettings/Questionnaire'));
const SystemSettings = React.lazy(() => import(/* webpackChunkName: 'SystemSettings' */ './js/pages/SystemSettings/SystemSettings'));
const TeamMembers = React.lazy(() => import(/* webpackChunkName: 'TeamMembers' */ './js/pages/TeamHome'));
Expand Down Expand Up @@ -277,6 +278,7 @@ class App extends Component {
</Suspense>
<Suspense fallback={<LoadingWheelComp />}>
<Switch>
<Route path="/answers/:questionnaireId/:personId" exact component={QuestionnaireAnswers} />
<PrivateRoute path="/faq" component={FAQ} isAuthenticated={localStorage.getItem('isAuthenticated')} />
<Route path="/login" exact><Login /></Route>
<Route path="/q/:questionnaireId/:personId" exact component={AnswerQuestionsForm} />
Expand Down
11 changes: 11 additions & 0 deletions src/js/actions/QuestionnaireActions.js
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,17 @@ export default {
}
},

questionnaireResponsesListRetrieve (personIdList = []) {
// console.log('QuestionnaireActions, questionnaireRetrieve personIdList:', personIdList);
if (personIdList) {
Dispatcher.loadEndpoint('questionnaire-responses-list-retrieve', {
personIdList,
});
} else {
Dispatcher.loadEndpoint('questionnaire-responses-list-retrieve');
}
},

questionnaireRetrieve (questionnaireId = '') {
// console.log('QuestionnaireActions, questionnaireRetrieve questionnaireId:', questionnaireId);
if (questionnaireId) {
Expand Down
2 changes: 1 addition & 1 deletion src/js/components/Person/PersonProfile.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ const PersonProfile = ({ personId }) => {

const onPersonStoreChange = () => {
const personTemp = PersonStore.getPersonById(personId);
console.log('PersonProfile personId:', personId, ', personTemp:', personTemp);
// console.log('PersonProfile personId:', personId, ', personTemp:', personTemp);
setPerson(personTemp);
const fullNamePreferredTemp = PersonStore.getFullNamePreferred(personId);
setFullNamePreferred(fullNamePreferredTemp);
Expand Down
2 changes: 2 additions & 0 deletions src/js/components/Person/PersonProfileDrawerMainContent.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import TeamStore from '../../stores/TeamStore';
import apiCalming from '../../common/utils/apiCalming';
import { renderLog } from '../../common/utils/logging';
import PersonProfile from './PersonProfile';
import QuestionnaireResponsesList from '../Questionnaire/QuestionnaireResponsesList';


const PersonProfileDrawerMainContent = ({ classes }) => { // classes, teamId
Expand Down Expand Up @@ -58,6 +59,7 @@ const PersonProfileDrawerMainContent = ({ classes }) => { // classes, teamId
return (
<PersonProfileDrawerMainContentWrapper>
<PersonProfile personId={personIdTemp} />
<QuestionnaireResponsesList personId={personIdTemp} />
</PersonProfileDrawerMainContentWrapper>
);
};
Expand Down
44 changes: 0 additions & 44 deletions src/js/components/Questionnaire/CopyQuestionnaireLink.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,41 +3,15 @@ import styled from 'styled-components';
import PropTypes from 'prop-types';
import CopyToClipboard from 'react-copy-to-clipboard';
import { withStyles } from '@mui/styles';
import AppObservableStore, { messageService } from '../../stores/AppObservableStore';
import PersonActions from '../../actions/PersonActions';
import PersonStore from '../../stores/PersonStore';
import TeamStore from '../../stores/TeamStore';
import { SpanWithLinkStyle } from '../Style/linkStyles';
import apiCalming from '../../common/utils/apiCalming';
import { renderLog } from '../../common/utils/logging';
import webAppConfig from '../../config';


const CopyQuestionnaireLink = ({ personId, questionnaireId }) => {
renderLog('CopyQuestionnaireLink'); // Set LOG_RENDER_EVENTS to log all renders
const [fullNamePreferred, setFullNamePreferred] = React.useState('');
const [linkCopied, setLinkCopied] = React.useState(false);
const [linkToBeShared, setLinkToBeShared] = React.useState('');
const [person, setPerson] = React.useState({});

const onAppObservableStoreChange = () => {
// const teamIdTemp = AppObservableStore.getGlobalVariableState('personProfileDrawerTeamId');
// console.log('CopyQuestionnaireLink AppObservableStore-personProfileDrawerTeamId: ', teamIdTemp);
};

const onPersonStoreChange = () => {
const personTemp = PersonStore.getPersonById(personId);
console.log('CopyQuestionnaireLink personId:', personId, ', personTemp:', personTemp);
setPerson(personTemp);
const fullNamePreferredTemp = PersonStore.getFullNamePreferred(personId);
setFullNamePreferred(fullNamePreferredTemp);
// console.log('CopyQuestionnaireLink-onPersonStoreChange personIdTemp: ', personIdTemp);
};

const onTeamStoreChange = () => {
// const teamIdTemp = AppObservableStore.getGlobalVariableState('personProfileDrawerTeamId');
// console.log('CopyQuestionnaireLink-onTeamStoreChange teamIdTemp: ', teamIdTemp);
};

const copyLink = () => {
// console.log('CopyQuestionnaireLink copyLink');
Expand All @@ -49,24 +23,10 @@ const CopyQuestionnaireLink = ({ personId, questionnaireId }) => {
};

React.useEffect(() => {
const appStateSubscription = messageService.getMessage().subscribe(() => onAppObservableStoreChange());
onAppObservableStoreChange();
const personStoreListener = PersonStore.addListener(onPersonStoreChange);
onPersonStoreChange();
const teamStoreListener = TeamStore.addListener(onTeamStoreChange);
onTeamStoreChange();

// const personIdTemp = AppObservableStore.getGlobalVariableState('personProfileDrawerPersonId');
// if (apiCalming(`personRetrieve-${personIdTemp}`, 30000)) {
// PersonActions.personRetrieve(personIdTemp);
// }
setLinkToBeShared(`${webAppConfig.PROTOCOL}${webAppConfig.HOSTNAME}/q/${questionnaireId}/${personId}`);

return () => {
// console.log('CopyQuestionnaireLink cleanup');
appStateSubscription.unsubscribe();
personStoreListener.remove();
teamStoreListener.remove();
};
}, []);

Expand All @@ -87,17 +47,13 @@ const CopyQuestionnaireLink = ({ personId, questionnaireId }) => {
);
};
CopyQuestionnaireLink.propTypes = {
classes: PropTypes.object.isRequired,
personId: PropTypes.number,
questionnaireId: PropTypes.number,
};

const styles = () => ({
});

const FullName = styled('div')`
`;

const CopyQuestionnaireLinkWrapper = styled('div')`
`;

Expand Down
120 changes: 120 additions & 0 deletions src/js/components/Questionnaire/QuestionnaireResponsesList.jsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,120 @@
import React, { Suspense } from 'react';
import styled from 'styled-components';
import PropTypes from 'prop-types';
import { Launch } from '@mui/icons-material';
import { Tooltip } from '@mui/material';
import QuestionnaireActions from '../../actions/QuestionnaireActions';
import QuestionnaireStore from '../../stores/QuestionnaireStore';
import DesignTokenColors from '../../common/components/Style/DesignTokenColors';
import apiCalming from '../../common/utils/apiCalming';
import { renderLog } from '../../common/utils/logging';
import CopyQuestionnaireLink from './CopyQuestionnaireLink';
import webAppConfig from '../../config';

const OpenExternalWebSite = React.lazy(() => import(/* webpackChunkName: 'OpenExternalWebSite' */ '../../common/components/Widgets/OpenExternalWebSite'));

const QuestionnaireResponsesList = ({ personId }) => {
renderLog('QuestionnaireList'); // Set LOG_RENDER_EVENTS to log all renders
const [questionnaireList, setQuestionnaireList] = React.useState([]);

const onQuestionnaireStoreChange = () => {
const questionnaireListTemp = QuestionnaireStore.getQuestionnaireListByPersonId(personId);
// console.log('QuestionnaireList QuestionnaireStore.getQuestionnaireListByPersonId:', questionnaireListTemp);
const dateQuestionnairesCompletedDictTemp = QuestionnaireStore.getDateQuestionnairesCompletedDictByPersonId(personId);
const questionnaireListTempModified = [];
for (let i = 0; i < questionnaireListTemp.length; i++) {
const questionnaire = questionnaireListTemp[i];
if (dateQuestionnairesCompletedDictTemp[questionnaire.questionnaireId]) {
questionnaire.dateQuestionnaireCompleted = new Date(dateQuestionnairesCompletedDictTemp[questionnaire.questionnaireId]);
} else {
questionnaire.dateQuestionnaireCompleted = null;
}
// console.log('QuestionnaireList questionnaire:', questionnaire);
questionnaireListTempModified[i] = questionnaire;
}
setQuestionnaireList(questionnaireListTempModified);
};

React.useEffect(() => {
const questionnaireStoreListener = QuestionnaireStore.addListener(onQuestionnaireStoreChange);
onQuestionnaireStoreChange();

if (personId >= 0) {
const personIdList = [personId];
if (apiCalming(`questionnaireResponsesListRetrieve-${personId}`, 10000)) {
QuestionnaireActions.questionnaireResponsesListRetrieve(personIdList);
}
}

return () => {
questionnaireStoreListener.remove();
};
}, []);

return (
<div>
{questionnaireList.length > 0 && (
<QuestionnaireListWrapper>
Questionnaire Responses
{questionnaireList.map((questionnaire) => (
<OneQuestionnaireWrapper key={`questionnaire-${questionnaire.id}`}>
<QuestionText>
{questionnaire.questionnaireName}
</QuestionText>
<CopyQuestionnaireLink personId={personId} questionnaireId={questionnaire.id} />
<Suspense fallback={<></>}>
<OpenExternalWebSite
linkIdAttribute="view answers"
url={`${webAppConfig.PROTOCOL}${webAppConfig.HOSTNAME}/answers/${questionnaire.id}/${personId}`}
target="_blank"
body={(
<Tooltip title="View answers">
view
<LaunchStyled />
</Tooltip>
)}
/>
</Suspense>
{questionnaire.dateQuestionnaireCompleted && (
<WhenCompleted>
Completed on
{' '}
{questionnaire.dateQuestionnaireCompleted.toLocaleString('en-US', {})}
</WhenCompleted>
)}
</OneQuestionnaireWrapper>
))}
</QuestionnaireListWrapper>
)}
</div>
);
};
QuestionnaireResponsesList.propTypes = {
personId: PropTypes.number,
};

const LaunchStyled = styled(Launch)`
height: 14px;
margin-left: 2px;
margin-top: -3px;
width: 14px;
`;

const WhenCompleted = styled('div')`
color: ${DesignTokenColors.neutralUI300};
font-size: .9em;
`;

const OneQuestionnaireWrapper = styled('div')`
font-weight: 550;
margin-top: 6px;
`;

const QuestionText = styled('div')`
`;

const QuestionnaireListWrapper = styled('div')`
margin-top: 30px;
`;

export default QuestionnaireResponsesList;
2 changes: 1 addition & 1 deletion src/js/components/Team/TeamHeader.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ const TeamHeader = ({ classes, showHeaderLabels, team }) => {
TeamHeader.propTypes = {
classes: PropTypes.object.isRequired,
showHeaderLabels: PropTypes.bool,
team: PropTypes.object.isRequired,
team: PropTypes.object,
};

const styles = (theme) => ({
Expand Down
Loading

0 comments on commit ce40f7c

Please sign in to comment.