This commit is contained in:
2025-06-11 13:05:18 +01:00
parent 19ae9b9f63
commit a80fa87ea2
7 changed files with 547 additions and 948 deletions
+8 -18
View File
@@ -24,25 +24,15 @@ let AdvancedSearch = (props) => {
//console.log("props here:", props.props);
const appealOptionsObj = _.isEmpty(props)
? [{}]
: _.isEmpty(props.appealType)
? [{}]
: _.isEmpty(props.appealType.appealTypeOptions)
? [{}]
: _.isEmpty(props.appealType.appealTypeOptions.value)
? [{}]
: props.appealType.appealTypeOptions.value;
const appealOptionsObj =
props?.appealType?.appealTypeOptions?.value?.length > 0
? props.appealType.appealTypeOptions.value
: [{}];
let lpaOptionsObj = _.isEmpty(props)
? [{}]
: _.isEmpty(props.LPAData)
? [{}]
: _.isEmpty(props.LPAData.LPAData)
? [{}]
: _.isEmpty(props.LPAData.LPAData)
? [{}]
: props.LPAData.LPAData.value;
const lpaOptionsObj =
props?.LPAData?.LPAData?.value?.length > 0
? props.LPAData.LPAData.value
: [{}];
const RenderTextfield = ({
id,
+216 -235
View File
@@ -17,246 +17,227 @@ import {
} from "../elements";
export default function BuildField(props) {
let { t } = useTranslation();
const { t } = useTranslation();
const { locale } = useRouter();
const router = useRouter();
const { locale } = router;
const { fieldType, label, datafieldname, mandatoryFieldData } = props;
const parser = new DOMParser();
// Destructure frequently used props for clarity
const {
fieldType,
label,
datafieldname,
picklistData,
validation,
hint,
maxFieldLength,
dateStart,
dateEnd,
documentTypeCode,
uploadCount,
setUploadCount,
setFileCount,
parentField,
parentFieldShowOnValue,
requiredDocumentValue,
requiredDocumentLabel,
setDocumentsList,
documentList,
maxSubField,
datafieldcontent,
} = props;
const whichFieldType = (classid) => {
//console.log(props.datafieldname, classid);
// Extract deeply nested props for convenience (avoid props.props.props all over)
// Defensive checks in case nested props don't exist
const appealType = props?.props?.props?.appealType || {};
const form = props?.props?.props?.form || {};
const formProps = props?.props?.props?.props?.form || {};
const setFilesForAppeal = props?.props?.props?.setFilesForAppeal;
const accountDetails = props?.props?.props?.props?.accountDetails || {};
const ticketnumber = appealType.caseReference?.ticketnumber || "";
const fileList = appealType.fileList || {};
const containerID = accountDetails.containerID || "";
switch (classid) {
case "{270BD3DB-D9AF-4782-9025-509E298DEC0A}":
return (
<ReadOnlyfield
name={props.datafieldname}
label={props.label}
value={
props.props.props.appealType.caseReference
.ticketnumber
}
props={props}
ticketnumber={
props.props.props.appealType.caseReference
.ticketnumber
}
/>
);
break;
case "{3EF39988-22BB-4f0b-BBBE-64B5A3748AEE}":
return (
<PickList
name={props.datafieldname}
label={props.label}
datafieldname={props.datafieldname}
picklistData={props.picklistData}
validation={props.validation}
hint={props.hint}
/>
);
break;
case "{67FAC785-CD58-4f9f-ABB3-4B7DDC6ED5ED}":
return (
<YesNofield
name={props.datafieldname}
label={props.label}
requiredDocumentValue={props.requiredDocumentValue}
requiredDocumentLabel={props.requiredDocumentLabel}
validation={props.validation}
setDocumentsList={props.setDocumentsList}
documentList={props.documentList}
form={props.props.props.form}
formProps={props.props.props.props.form}
parentField={props.parentField}
parentFieldShowOnValue={props.parentFieldShowOnValue}
/>
);
break;
case "{07FAC785-CD58-4f9f-ABB3-4B7DDC6ED5ED}":
return (
<Radiofield
name={props.datafieldname}
label={props.label}
datafieldname={props.datafieldname}
options={props.datafieldcontent}
inline={false}
hint={props.hint}
form={props.props.props.form}
formProps={props.props.props.props.form}
parentField={props.parentField}
parentFieldShowOnValue={props.parentFieldShowOnValue}
validation={props.validation}
setDocumentsList={props.setDocumentsList}
documentList={props.documentList}
requiredDocumentValue={props.requiredDocumentValue}
requiredDocumentLabel={props.requiredDocumentLabel}
/>
);
break;
case "{4273EDBD-AC1D-40d3-9FB2-095C621B552D}":
const required = (value) =>
value ? undefined : t("newappeal:is-required-label");
return (
<Textfield
name={props.datafieldname}
label={props.label}
props={props}
ticketnumber={
props.props.props.appealType.caseReference
.ticketnumber
}
form={props.props.props.form}
formProps={props.props.props.props.form}
parentField={props.parentField}
parentFieldShowOnValue={props.parentFieldShowOnValue}
validation={props.validation}
hint={props.hint}
maxFieldLength={props.maxFieldLength}
/>
);
break;
case "{5B773807-9FB2-42db-97C3-7A91EFF8ADFF}":
return (
<DateFieldPicker
name={props.datafieldname}
label={props.label}
form={props.props.props.form}
formProps={props.props.props.props.form}
parentField={props.parentField}
parentFieldShowOnValue={props.parentFieldShowOnValue}
validation={props.validation}
dateStart={props.dateStart}
dateEnd={props.dateEnd}
hint={props.hint}
/>
);
break;
case "{E0DECE4B-6FC8-4a8f-A065-082708572369}":
return (
<MultiLinefield
name={props.datafieldname}
label={props.label}
form={props.props.props.form}
formProps={props.props.props.props.form}
parentField={props.parentField}
parentFieldShowOnValue={props.parentFieldShowOnValue}
validation={props.validation}
maxFieldLength={props.maxFieldLength}
hint={props.hint}
/>
);
break;
case "{E0DECE4B-6666-4a8f-A065-082708572369}":
return (
<RichMultiLinefield
name={props.datafieldname}
label={props.label}
form={props.props.props.form}
formProps={props.props.props.props.form}
parentField={props.parentField}
parentFieldShowOnValue={props.parentFieldShowOnValue}
validation={props.validation}
maxFieldLength={props.maxFieldLength}
hint={props.hint}
/>
);
break;
case "{C6D124CA-7EDA-4a60-AEA9-7FB8D318B68F}":
return (
<NumericField
name={props.datafieldname}
label={props.label}
form={props.props.props.form}
formProps={props.props.props.props.form}
validation={props.validation}
parentField={props.parentField}
parentFieldShowOnValue={props.parentFieldShowOnValue}
maxFieldLength={props.maxFieldLength}
/>
);
break;
case "{C3EFE0C3-0EC6-42be-8349-CBD9079DFD8E}":
return (
<DecimalField
name={props.datafieldname}
label={props.label}
form={props.props.props.form}
formProps={props.props.props.props.form}
validation={props.validation}
parentField={props.parentField}
parentFieldShowOnValue={props.parentFieldShowOnValue}
maxFieldLength={props.maxFieldLength}
/>
);
break;
case "{16D63FD6-119B-4353-BDCA-18358721C3FE}":
return (
<div className="govuk-!-margin-bottom-9">
<FileUploadField
name={props.datafieldname}
label={props.label}
ticketnumber={
props.props.props.props.appealType.caseReference
.ticketnumber
}
documentTypeCode={props.documentTypeCode}
hint={props.hint}
fileList={
props.props.props.props.appealType.fileList
}
setFilesForAppeal={
props.props.props.setFilesForAppeal
}
containerID={
props.props.props.props.accountDetails
.containerID
}
uploadCount={props.uploadCount}
setFileCount={props.props.setFileCount}
setUploadCount={props.setUploadCount}
props={props.props.props.props}
/>
</div>
);
break;
case "{0273EDBD-AC1D-40d3-9FB2-095C621B552D}":
return (
<FieldArrayForm
name={props.datafieldname}
label={props.label}
form={props.props.props.form}
formProps={props.props.props.props.form}
parentField={props.parentField}
parentFieldShowOnValue={props.parentFieldShowOnValue}
maxSubField={props.maxSubField}
/>
);
case "{9EF39988-22BB-4f0b-BBBE-64B5A3748AEE}":
return (
<CheckBoxfield
name={props.datafieldname}
label={props.label}
props={props}
form={props.props.props.form}
formProps={props.props.props.props.form}
parentField={props.parentField}
parentFieldShowOnValue={props.parentFieldShowOnValue}
validation={props.validation}
/>
);
break;
default:
return (
<Textfield name={props.datafieldname} label={props.label} />
);
}
// Mapping fieldType to components
const fieldTypeMap = {
"{270BD3DB-D9AF-4782-9025-509E298DEC0A}": (
<ReadOnlyfield
name={datafieldname}
label={label}
value={ticketnumber}
props={props}
ticketnumber={ticketnumber}
/>
),
"{3EF39988-22BB-4f0b-BBBE-64B5A3748AEE}": (
<PickList
name={datafieldname}
label={label}
datafieldname={datafieldname}
picklistData={picklistData}
validation={validation}
hint={hint}
/>
),
"{67FAC785-CD58-4f9f-ABB3-4B7DDC6ED5ED}": (
<YesNofield
name={datafieldname}
label={label}
requiredDocumentValue={requiredDocumentValue}
requiredDocumentLabel={requiredDocumentLabel}
validation={validation}
setDocumentsList={setDocumentsList}
documentList={documentList}
form={form}
formProps={formProps}
parentField={parentField}
parentFieldShowOnValue={parentFieldShowOnValue}
/>
),
"{07FAC785-CD58-4f9f-ABB3-4B7DDC6ED5ED}": (
<Radiofield
name={datafieldname}
label={label}
datafieldname={datafieldname}
options={datafieldcontent}
inline={false}
hint={hint}
form={form}
formProps={formProps}
parentField={parentField}
parentFieldShowOnValue={parentFieldShowOnValue}
validation={validation}
setDocumentsList={setDocumentsList}
documentList={documentList}
requiredDocumentValue={requiredDocumentValue}
requiredDocumentLabel={requiredDocumentLabel}
/>
),
"{4273EDBD-AC1D-40d3-9FB2-095C621B552D}": (
<Textfield
name={datafieldname}
label={label}
props={props}
ticketnumber={ticketnumber}
form={form}
formProps={formProps}
parentField={parentField}
parentFieldShowOnValue={parentFieldShowOnValue}
validation={validation}
hint={hint}
maxFieldLength={maxFieldLength}
/>
),
"{5B773807-9FB2-42db-97C3-7A91EFF8ADFF}": (
<DateFieldPicker
name={datafieldname}
label={label}
form={form}
formProps={formProps}
parentField={parentField}
parentFieldShowOnValue={parentFieldShowOnValue}
validation={validation}
dateStart={dateStart}
dateEnd={dateEnd}
hint={hint}
/>
),
"{E0DECE4B-6FC8-4a8f-A065-082708572369}": (
<MultiLinefield
name={datafieldname}
label={label}
form={form}
formProps={formProps}
parentField={parentField}
parentFieldShowOnValue={parentFieldShowOnValue}
validation={validation}
maxFieldLength={maxFieldLength}
hint={hint}
/>
),
"{E0DECE4B-6666-4a8f-A065-082708572369}": (
<RichMultiLinefield
name={datafieldname}
label={label}
form={form}
formProps={formProps}
parentField={parentField}
parentFieldShowOnValue={parentFieldShowOnValue}
validation={validation}
maxFieldLength={maxFieldLength}
hint={hint}
/>
),
"{C6D124CA-7EDA-4a60-AEA9-7FB8D318B68F}": (
<NumericField
name={datafieldname}
label={label}
form={form}
formProps={formProps}
validation={validation}
parentField={parentField}
parentFieldShowOnValue={parentFieldShowOnValue}
maxFieldLength={maxFieldLength}
/>
),
"{C3EFE0C3-0EC6-42be-8349-CBD9079DFD8E}": (
<DecimalField
name={datafieldname}
label={label}
form={form}
formProps={formProps}
validation={validation}
parentField={parentField}
parentFieldShowOnValue={parentFieldShowOnValue}
maxFieldLength={maxFieldLength}
/>
),
"{16D63FD6-119B-4353-BDCA-18358721C3FE}": (
<div className="govuk-!-margin-bottom-9">
<FileUploadField
name={datafieldname}
label={label}
ticketnumber={ticketnumber}
documentTypeCode={documentTypeCode}
hint={hint}
fileList={fileList}
setFilesForAppeal={setFilesForAppeal}
containerID={containerID}
uploadCount={uploadCount}
setFileCount={setFileCount}
setUploadCount={setUploadCount}
props={props?.props?.props}
/>
</div>
),
"{0273EDBD-AC1D-40d3-9FB2-095C621B552D}": (
<FieldArrayForm
name={datafieldname}
label={label}
form={form}
formProps={formProps}
parentField={parentField}
parentFieldShowOnValue={parentFieldShowOnValue}
maxSubField={maxSubField}
/>
),
"{9EF39988-22BB-4f0b-BBBE-64B5A3748AEE}": (
<CheckBoxfield
name={datafieldname}
label={label}
props={props}
form={form}
formProps={formProps}
parentField={parentField}
parentFieldShowOnValue={parentFieldShowOnValue}
validation={validation}
/>
),
};
return (
<div className="govuk-grid-row">{whichFieldType(props.fieldType)}</div>
<div className="govuk-grid-row">
{fieldTypeMap[fieldType] || (
<Textfield name={datafieldname} label={label} />
)}
</div>
);
}
+137 -287
View File
@@ -4,31 +4,65 @@ import { connect } from "react-redux";
import { setCurrentSection } from "../../store/appealType/action";
import { FieldsTranslations } from "../elements";
const BuildProgress = (props) => {
let { t } = useTranslation();
const BuildProgress = ({
progObj,
titleList,
currentSection,
documentListObj,
formObjXML,
mandatoryFieldsData,
gotoSection,
setCurrentSection,
props: outerProps,
}) => {
const { t } = useTranslation();
const router = useRouter();
const { locale } = router;
const {
progObj,
titleList,
currentSection,
documentListObj,
formObjXML,
mandatoryFieldsData,
gotoSection,
setCurrentSection,
} = props;
const parser = new DOMParser();
// Helper to safely access nested form values
const getFormValue = (field) =>
outerProps?.props?.form?.appealForm?.values?.[field];
//const progObj = getProgressObj(
// formObjXML,
// titleList,
// mandatoryFieldsData,
// props
// );
const renderDocumentList = () => {
const formValues = outerProps?.props?.form?.appealForm?.values || {};
//console.log(progObj);
return (
<>
<li>{t("newappeal:application-form")}</li>
{formValues.pinswg_developmentdescriptionchanged === "true" && (
<li>Description of development change confirmation</li>
)}
{formValues.pinswg_caseworkreason === "846040005" && (
<li>{t("newappeal:registration-of-application-letter")}</li>
)}
{formValues.pinswg_caseworkreason === "846040000" && (
<li>Decision notice</li>
)}
{formValues.pinswg_attachsoc === "true" && (
<li>{t("newappeal:statement-of-case")}</li>
)}
{formValues.pinswg_attachcostapplication === "true" && (
<li>{t("newappeal:cost-application")}</li>
)}
{formValues.pinswg_s106unilateralsubmitted === "true" && (
<li>Planning obligation (S106/Unilateral)</li>
)}
{/* Additional document list items from documentListObj if needed */}
{/* {Object.entries(documentListObj).map(([key, value]) => (
<li key={key}>{value}</li>
))} */}
<li>{t("newappeal:site-location-plan")}</li>
</>
);
};
return (
<>
@@ -40,16 +74,17 @@ const BuildProgress = (props) => {
<h2 className="govuk-heading-s govuk-!-font-weight-bold gov-font-dark-grey progress-heading">
{t("newappeal:new-appeal-progress-nav-label")}:{" "}
<span className="progress-case-reference">
{props.props.appealType.caseReference.ticketnumber}
{
outerProps?.props?.appealType?.caseReference
?.ticketnumber
}
</span>
</h2>
{/* <hr className="govuk-section-break govuk-section-break--m govuk-section-break--visible" /> */}
<div
id="step-by-step-navigation"
data-module="gemstepnav"
className="app-step-nav app-step-nav--active"
className="app-step-nav app-step-nav--active"
data-id="e01e924b-9c7c-4c71-8241-66a575c2f61f"
data-show-text="show"
data-hide-text="hide"
@@ -57,290 +92,105 @@ const BuildProgress = (props) => {
data-hide-all-text="Hide all"
>
<ol className="app-step-nav__steps">
{Object.keys(progObj).map((key, index) => (
<li
key={key}
className={
"app-step-nav__step js-step app-step-nav__step--active" +
(progObj[index].allFieldsComplete
? " sectionComplete"
: " sectionIncomplete")
}
aria-current="step"
data-show=""
id={FieldsTranslations(progObj[index].title)
.toString()
.replace(/\s+/g, "-")
.toLowerCase()}
>
<div
className="app-step-nav__header js-toggle-panel "
data-position={index}
{Object.keys(progObj).map((key, index) => {
const step = progObj[index];
const stepId = FieldsTranslations(step.title)
.toString()
.replace(/\s+/g, "-")
.toLowerCase();
return (
<li
key={key}
className={`app-step-nav__step js-step app-step-nav__step--active ${
step.allFieldsComplete
? "sectionComplete"
: "sectionIncomplete"
}`}
aria-current="step"
data-show=""
id={stepId}
>
<h3 className="app-step-nav__title ">
<span className="app-step-nav__circle app-step-nav__circle--number">
<span className="app-step-nav__circle-inner">
<span className="app-step-nav__circle-background">
<span className="app-step-nav__circle-step-label govuk-visually-hidden">
Step
</span>{" "}
{index + 1}
<span
className="app-step-nav__circle-step-colon govuk-visually-hidden"
aria-hidden="true"
>
:
<div
className="app-step-nav__header js-toggle-panel"
data-position={index}
>
<h3 className="app-step-nav__title">
<span className="app-step-nav__circle app-step-nav__circle--number">
<span className="app-step-nav__circle-inner">
<span className="app-step-nav__circle-background">
<span className="app-step-nav__circle-step-label govuk-visually-hidden">
Step
</span>{" "}
{index + 1}
<span
className="app-step-nav__circle-step-colon govuk-visually-hidden"
aria-hidden="true"
>
:
</span>
</span>
</span>
</span>
</span>
<span className="js-step-title">
<a
href="#"
onClick={() => {
gotoSection(
parseInt(key) + 1
);
}}
className="app-step-nav__button app-step-nav__button--title js-step-title-button"
aria-expanded="false"
aria-controls={
"step-panel-" +
FieldsTranslations(
progObj[index].title
)
.toString()
.replace(/\s+/g, "-")
.toLowerCase()
}
>
<span className="js-step-title-text govuk-!-font-size-16">
{FieldsTranslations(
progObj[index].title
)}{" "}
</span>
</a>
</span>
</h3>
</div>
</li>
))}
{/* <li
className={
"app-step-nav__step js-step app-step-nav__step--active"
}
>
<div
className="app-step-nav__header js-toggle-panel "
data-position={10}
>
<h3 className="app-step-nav__title ">
<span className="app-step-nav__circle app-step-nav__circle--number">
<span className="app-step-nav__circle-inner">
<span className="app-step-nav__circle-background">
<span className="app-step-nav__circle-step-label govuk-visually-hidden">
Step
</span>{" "}
{progObj.length + 1}
<span
className="app-step-nav__circle-step-colon govuk-visually-hidden"
aria-hidden="true"
<span className="js-step-title">
<a
href="#"
onClick={(e) => {
e.preventDefault();
gotoSection(
parseInt(key, 10) +
1
);
}}
className="app-step-nav__button app-step-nav__button--title js-step-title-button"
aria-expanded="false"
aria-controls={`step-panel-${stepId}`}
>
:
</span>
<span className="js-step-title-text govuk-!-font-size-16">
{FieldsTranslations(
step.title
)}{" "}
</span>
</a>
</span>
</span>
</span>
<span className="js-step-title">
<a
href="#"
onClick={() => {
gotoSection(progObj.length + 1);
}}
className="app-step-nav__button app-step-nav__button--title js-step-title-button"
aria-expanded="false"
aria-controls={
"step-panel-confirmation"
}
>
<span className="js-step-title-text govuk-!-font-size-16">
Confirmation
</span>
</a>
</span>
</h3>
</div>
</li> */}
</h3>
</div>
</li>
);
})}
</ol>
</div>
</nav>
<div>
<section>
<h3 className="govuk-heading-s govuk-!-font-weight-bold gov-font-dark-grey">
{t("newappeal:new-appeal-documentlist-nav")}:
</h3>
<hr className="govuk-section-break govuk-section-break--m govuk-section-break--visible" />
<ol className="govuk-list document-list">
<ul className="govuk-list ">
<li className="at-nav__page">
<ol className="govuk-list govuk-list--bullet">
<li>{t("newappeal:application-form")}</li>
{props.props.props.form.hasOwnProperty(
"appealForm"
) &&
props.props.props.form[
"appealForm"
].hasOwnProperty("values") &&
props.props.props.form[
"appealForm"
].values.hasOwnProperty(
"pinswg_developmentdescriptionchanged"
)
? props.props.props.form["appealForm"]
.values
.pinswg_developmentdescriptionchanged ==
"true" && (
<li>
Description of development change
confirmation
</li>
)
: ""}
{props.props.props.form.hasOwnProperty(
"appealForm"
) &&
props.props.props.form[
"appealForm"
].hasOwnProperty("values") &&
props.props.props.form[
"appealForm"
].values.hasOwnProperty("pinswg_caseworkreason")
? props.props.props.form["appealForm"]
.values.pinswg_caseworkreason ==
"846040005" && (
<li>
{t(
"newappeal:registration-of-application-letter"
)}
</li>
)
: ""}
{props.props.props.form.hasOwnProperty(
"appealForm"
) &&
props.props.props.form[
"appealForm"
].hasOwnProperty("values") &&
props.props.props.form[
"appealForm"
].values.hasOwnProperty("pinswg_caseworkreason")
? props.props.props.form["appealForm"]
.values.pinswg_caseworkreason ==
"846040000" && (
<li>Decision notice</li>
)
: ""}
{props.props.props.form.hasOwnProperty(
"appealForm"
) &&
props.props.props.form[
"appealForm"
].hasOwnProperty("values") &&
props.props.props.form[
"appealForm"
].values.hasOwnProperty("pinswg_attachsoc")
? props.props.props.form["appealForm"]
.values.pinswg_attachsoc ==
"true" && (
<li>
{t("newappeal:statement-of-case")}
</li>
)
: ""}
{props.props.props.form.hasOwnProperty(
"appealForm"
) &&
props.props.props.form[
"appealForm"
].hasOwnProperty("values") &&
props.props.props.form[
"appealForm"
].values.hasOwnProperty(
"pinswg_attachcostapplication"
)
? props.props.props.form["appealForm"]
.values
.pinswg_attachcostapplication ==
"true" && (
<li>
{t("newappeal:cost-application")}
</li>
)
: ""}
{props.props.props.form.hasOwnProperty(
"appealForm"
) &&
props.props.props.form[
"appealForm"
].hasOwnProperty("values") &&
props.props.props.form[
"appealForm"
].values.hasOwnProperty(
"pinswg_s106unilateralsubmitted"
)
? props.props.props.form["appealForm"]
.values
.pinswg_s106unilateralsubmitted ==
"true" && (
<li>
Planning obligation
(S106/Unilateral)
</li>
)
: ""}
{/* {Object.keys(documentListObj).length > 0 &&
Object.entries(documentListObj).map(
([key, value]) => {
return <li key={key}>{value}</li>;
}
)} */}
<li>{t("newappeal:site-location-plan")}</li>
</ol>
</li>
</ul>
<li className="at-nav__page">
<ol className="govuk-list govuk-list--bullet">
{renderDocumentList()}
</ol>
</li>
</ol>
</div>
</section>
</>
);
};
const mapStateToProps = (state) => {
return {
search: state.search,
searchResultsObj: state.searchResultsObj,
formData: state.formData,
appealType: state.appealType,
initialValues: state.appealType.caseReference.caseDetails,
//form: state.form,
};
};
const mapStateToProps = (state) => ({
search: state.search,
searchResultsObj: state.searchResultsObj,
formData: state.formData,
appealType: state.appealType,
initialValues: state.appealType.caseReference.caseDetails,
//form: state.form,
});
const mapDispatchToProps = (dispatch) => {
return {
gotoSection: (thisSection) => {
dispatch(setCurrentSection(thisSection));
},
};
};
const mapDispatchToProps = (dispatch) => ({
gotoSection: (thisSection) => dispatch(setCurrentSection(thisSection)),
});
export default connect(mapStateToProps, mapDispatchToProps)(BuildProgress);
+8 -18
View File
@@ -376,25 +376,15 @@ let CreateCase = (props) => {
const { LPAData, onSubmit, handleSubmit, formData } = props;
const appealOptionsObj = _.isEmpty(props)
? [{}]
: _.isEmpty(props.appealType)
? [{}]
: _.isEmpty(props.appealType.appealTypeOptions)
? [{}]
: _.isEmpty(props.appealType.appealTypeOptions.value)
? [{}]
: props.appealType.appealTypeOptions.value;
const appealOptionsObj =
props?.appealType?.appealTypeOptions?.value?.length > 0
? props.appealType.appealTypeOptions.value
: [{}];
let lpaOptionsObj = _.isEmpty(props)
? [{}]
: _.isEmpty(props.LPAData)
? [{}]
: _.isEmpty(props.LPAData.LPAData)
? [{}]
: _.isEmpty(props.LPAData.LPAData)
? [{}]
: props.LPAData.LPAData.value;
const lpaOptionsObj =
props?.LPAData?.LPAData?.value?.length > 0
? props.LPAData.LPAData.value
: [{}];
const required = (value) => (value ? undefined : "Required");
+12 -27
View File
@@ -166,35 +166,20 @@ let AdvancedSearch = (props) => {
submitting,
} = props;
const appealOptionsObj = _.isEmpty(props)
? [{}]
: _.isEmpty(props.appealType)
? [{}]
: _.isEmpty(props.appealType.appealTypeOptions)
? [{}]
: _.isEmpty(props.appealType.appealTypeOptions.value)
? [{}]
: props.appealType.appealTypeOptions.value;
const appealOptionsObj =
props?.appealType?.appealTypeOptions?.value?.length > 0
? props.appealType.appealTypeOptions.value
: [{}];
const projecttypeOptionsObj = _.isEmpty(props)
? [{}]
: _.isEmpty(props.appealType)
? [{}]
: _.isEmpty(props.appealType.projectTypeOptions)
? [{}]
: _.isEmpty(props.appealType.projectTypeOptions.value)
? [{}]
: props.appealType.projectTypeOptions.value;
const projecttypeOptionsObj =
props?.appealType?.projectTypeOptions?.value?.length > 0
? props.appealType.projectTypeOptions.value
: [{}];
let lpaOptionsObj = _.isEmpty(props)
? [{}]
: _.isEmpty(props.LPAData)
? [{}]
: _.isEmpty(props.LPAData.LPAData)
? [{}]
: _.isEmpty(props.LPAData.LPAData)
? [{}]
: props.LPAData.LPAData.value;
const lpaOptionsObj =
props?.LPAData?.LPAData?.value?.length > 0
? props.LPAData.LPAData.value
: [{}];
const RenderLPAList = ({
name,
+1 -1
View File
@@ -41,7 +41,7 @@ class MyDocument extends Document {
//const generatedNonce = nanoid();
const generatedNonce = this.props.generatedNonce;
console.log("this is the nonce:", generatedNonce);
//console.log("this is the nonce:", generatedNonce);
let csp = ``;
csp += `base-uri 'self';`;
+165 -362
View File
@@ -1,4 +1,3 @@
import _ from "lodash";
import { getSession, useSession } from "next-auth/react";
import useTranslation from "next-translate/useTranslation";
import Head from "next/head";
@@ -6,7 +5,6 @@ import { useRouter } from "next/router";
import { connect } from "react-redux";
import {
createContainerProxy,
getAwaitingSubmission,
getAwaitingSubmissionFromBlob,
getCase,
getIP,
@@ -30,15 +28,10 @@ import {
setLoggedInUserId,
} from "../../store/accountDetails/action";
import {
setAwaitingSubmission,
setAwaitingSubmissionDetails,
setAwaitingSubmissionFromBlob,
} from "../../store/awaitingSubmission/action";
import {
setShowReps,
setLocale,
setFilesForRepresentation,
} from "../../store/currentView/action";
import { setShowReps, setLocale } from "../../store/currentView/action";
import { setMyCases, setMyCasesDetails } from "../../store/myCases/action";
import {
setMyRepresentations,
@@ -56,7 +49,6 @@ import pLimit from "p-limit";
const Home = (props) => {
const {
footerLinks,
pages,
myCases,
myRepresentations,
watchedCases,
@@ -67,13 +59,11 @@ const Home = (props) => {
currentView,
mySubmittedReps,
} = props;
let { t, lang } = useTranslation();
// const mySubmittedReps = myRepresentations.mySubmittedReps;
const { t } = useTranslation();
const router = useRouter();
const { locale } = router;
const { appealtypes } = router.query;
const { locale, query } = router;
const { appealtypes } = query;
const { data: session } = useSession();
@@ -91,9 +81,8 @@ const Home = (props) => {
<meta
key="og:locale"
property="og:locale"
content={router.locale}
content={locale}
/>
{/* If they have a Twitter Handle, include the meta details below */}
<meta
key="og:site_name"
property="og:site_name"
@@ -171,113 +160,76 @@ const Home = (props) => {
export const getServerSideProps = wrapper.getServerSideProps(
(store) => async (ctx) => {
const { query, req, res } = ctx;
const { query, req, locale } = ctx;
getIP(req);
console.log("The query", query);
const { cookies } = req;
let loggedInUserCookie = cookies.pinsUser;
let thisSession = await getSession(ctx);
let loggedInUser = {};
const cookies = req.cookies || {};
const thisSession = await getSession(ctx);
if (!thisSession) {
console.log("not has sesssion.......");
return {
redirect: {
destination: "/auth/signin",
permanent: false,
},
};
} else {
console.log(" has sesssion.......");
[loggedInUser] = await Promise.all([
await getPortalLogin(thisSession.user.email),
]);
//grabs first contact on this list
//jump out page for duplicates....
console.log(
"Number of contacts with this email:",
loggedInUser.value.length
);
if (loggedInUser.value.length > 1) {
return {
redirect: {
destination:
ctx.locale == "cy"
? "/cy/manylionpellach"
: "/furtherdetails",
permanent: false,
},
};
}
loggedInUser = loggedInUser.value[0].contactid;
//console.log("nextAuth Session:", thisSession);
}
//Create Storage container for logged in user
await createContainerProxy(thisSession.user.id);
const loggedInUserResponse = await getPortalLogin(
thisSession.user.email
);
const contacts = loggedInUserResponse?.value || [];
if (contacts.length > 1) {
return {
redirect: {
destination:
locale === "cy"
? "/cy/manylionpellach"
: "/furtherdetails",
permanent: false,
},
};
}
const loggedInUser = contacts[0]?.contactid;
await createContainerProxy(thisSession.user.id);
const accountDetails = await getPersonalAccount(loggedInUser);
//console.log("----------", accountDetails);
const lpaid =
const lpaId =
accountDetails[
"pinswg_contact_associatedlpa@OData.Community.Display.V1.FormattedValue"
];
const isLPA = accountDetails.pinswg_typeofinvolvement === 846040012;
// Fetch cases, reps, watched cases, awaiting submission concurrently
const [
myCases,
myRepresentations,
watchedCases,
//awaitingSubmission,
awaitingSubmissionFromBlob,
] = await Promise.all([
accountDetails.pinswg_typeofinvolvement == 846040012
? await getMyLPACases(lpaid)
: await getMyCases(loggedInUser),
await getRepsFromBlob(thisSession.user.id),
await getWatchedCases(loggedInUser),
//await getAwaitingSubmission(loggedInUser),
await getAwaitingSubmissionFromBlob(thisSession.user.id),
isLPA ? getMyLPACases(lpaId) : getMyCases(loggedInUser),
getRepsFromBlob(thisSession.user.id),
getWatchedCases(loggedInUser),
getAwaitingSubmissionFromBlob(thisSession.user.id),
]);
//console.log(
// "/////////////////////////\n ",
// awaitingSubmissionFromBlob.value,
// awaitingSubmissionFromBlob.case
// );
console.log(
"preferred language:",
accountDetails.pinswg_preferredlanguage
);
console.log(
"locale :",
accountDetails.pinswg_preferredlanguage == "846040000" ? "cy" : "en"
);
console.log("req locale :", ctx.locale);
console.log("cookie locale :", cookies.pedw_locale);
store.dispatch(setLocale(ctx.locale));
// Set locale to store
store.dispatch(setLocale(locale));
// Determine preferred locale (cookie overrides)
let preferredLocale =
accountDetails.pinswg_preferredlanguage == "846040000"
accountDetails.pinswg_preferredlanguage === "846040000"
? "cy"
: "en";
if (cookies.pedw_locale) {
preferredLocale = cookies.pedw_locale;
}
// added to redirect if not the users preferred language
cookies.hasOwnProperty("pedw_locale") &&
(preferredLocale = cookies.pedw_locale);
if (preferredLocale != ctx.locale) {
if (preferredLocale !== locale) {
return {
redirect: {
destination: `/${preferredLocale}`,
@@ -286,290 +238,141 @@ export const getServerSideProps = wrapper.getServerSideProps(
};
}
const showLoginCheck = process.env.SHOWLOGIN || false;
const showMapCheck = process.env.SHOWMAPS || false;
const showReps = process.env.SHOWREPRESENTATIONS || false;
const showLoginCheck = Boolean(process.env.SHOWLOGIN);
const showReps = Boolean(process.env.SHOWREPRESENTATIONS);
store.dispatch(setShowReps(showReps, showLoginCheck));
let showWatchedCases = (submittedArr) => {
const required = submittedArr.value.filter((el) => {
return el.pinswg_representationsubmitted == null;
});
let newObj = {};
return Object.assign(newObj, {
"@odata.count": required.length,
"value": required,
});
// Filter watched cases where reps not submitted
const filteredWatchedCases = {
"@odata.count": watchedCases.value.filter(
(c) => c.pinswg_representationsubmitted == null
).length,
value: watchedCases.value.filter(
(c) => c.pinswg_representationsubmitted == null
),
};
let filteredWatchedCases = showWatchedCases(watchedCases);
// Get submitted reps from watched cases
const mySubmittedReps = watchedCases.value.filter((el) => {
return el.pinswg_representationsubmitted != null;
});
let showSubmittedReps = (submittedArr) => {
submittedArr = submittedArr.value;
const required = submittedArr.filter((el) => {
let IsSubmittedRep = _.has(el, "pinswg_representationsubmitted")
? el.pinswg_representationsubmitted != null &&
el.pinswg_representationsubmitted
: "";
return IsSubmittedRep;
});
return required;
};
const mySubmittedReps = showSubmittedReps(watchedCases);
if (_.has(accountDetails, "errorCode") != false) {
if (accountDetails.errorCode) {
return {
redirect: {
destination: "/myportal/error",
permanent: false,
},
};
} else {
const [
myCasesDetails,
watchedCasesDetails,
mySubmittedRepsDetails,
myRepresentationsDetails,
] = await Promise.all([
await getDetails(myCases, "myCases"),
await getDetails(filteredWatchedCases, "myWatchedCases"),
await getDetails(mySubmittedReps, "mySubmittedReps"),
await getDetails(myRepresentations, "myRepresentations"),
]);
// console.log(
// "=================================\nmySubmittedRepsDetails:",
// mySubmittedRepsDetails
// );
store.dispatch(setAccountDetails(accountDetails));
store.dispatch(setLoggedInUserId(loggedInUser));
store.dispatch(setMyCases(myCases));
store.dispatch(setMyCasesDetails(myCasesDetails));
store.dispatch(setMyRepresentations(myRepresentations));
store.dispatch(
setMyRepresentationsDetails(myRepresentationsDetails)
);
store.dispatch(setWatchedCases(filteredWatchedCases));
store.dispatch(setWatchedCasesDetails(watchedCasesDetails));
store.dispatch(setMySubmittedReps(mySubmittedReps));
store.dispatch(setMySubmittedRepsDetails(mySubmittedRepsDetails));
//store.dispatch(setAwaitingSubmission(awaitingSubmission));
store.dispatch(
setAwaitingSubmissionFromBlob(awaitingSubmissionFromBlob)
);
store.dispatch(
setAwaitingSubmissionDetails(awaitingSubmissionFromBlob)
);
store.dispatch(setContainerID(thisSession.user.id));
return {
props: {
showFileUpload: process.env.SHOWFILEUPLOAD,
containerID: thisSession.user.id,
showLoginCheck: process.env.SHOWLOGIN,
},
};
}
// Helper function for fetching details with concurrency limit
const getDetails = async (resultsObj, detailsType) => {
const limitRequests = pLimit(5);
const arr = [];
resultsObj =
detailsType === "mySubmittedReps"
? resultsObj
: resultsObj.value;
const tasks = resultsObj.map((item) =>
limitRequests(async () => {
try {
let caseID = "";
switch (detailsType) {
case "myCases":
caseID = item.pinswg_title;
break;
case "myWatchedCases":
case "mySubmittedReps":
caseID =
item[
"_pinswg_watchedcase_value@OData.Community.Display.V1.FormattedValue"
];
break;
case "awaitingSubmission":
caseID = item.ticketnumber;
break;
case "myRepresentations":
caseID = item.casereference;
break;
default:
caseID = item.pinswg_title;
}
if (!item.pinswg_appealcasetype) return;
const collectionName = getFormCollectionByID(
item.pinswg_appealcasetype
).LogicalCollectionName;
const details = await getPortalModuleDetails(
collectionName,
caseID
);
arr.push(details);
} catch (err) {
console.error("Error fetching details:", err);
}
})
);
await Promise.all(tasks);
return arr;
};
const [
myCasesDetails,
watchedCasesDetails,
mySubmittedRepsDetails,
myRepresentationsDetails,
] = await Promise.all([
getDetails(myCases, "myCases"),
getDetails(filteredWatchedCases, "myWatchedCases"),
getDetails(mySubmittedReps, "mySubmittedReps"),
getDetails(myRepresentations, "myRepresentations"),
]);
store.dispatch(setAccountDetails(accountDetails));
store.dispatch(setLoggedInUserId(loggedInUser));
store.dispatch(setMyCases(myCases));
store.dispatch(setMyCasesDetails(myCasesDetails));
store.dispatch(setMyRepresentations(myRepresentations));
store.dispatch(setMyRepresentationsDetails(myRepresentationsDetails));
store.dispatch(setWatchedCases(filteredWatchedCases));
store.dispatch(setWatchedCasesDetails(watchedCasesDetails));
store.dispatch(setMySubmittedReps(mySubmittedReps));
store.dispatch(setMySubmittedRepsDetails(mySubmittedRepsDetails));
store.dispatch(
setAwaitingSubmissionFromBlob(awaitingSubmissionFromBlob)
);
store.dispatch(
setAwaitingSubmissionDetails(awaitingSubmissionFromBlob)
);
store.dispatch(setContainerID(thisSession.user.id));
return {
props: {
showFileUpload: Boolean(process.env.SHOWFILEUPLOAD),
containerID: thisSession.user.id,
showLoginCheck,
},
};
}
);
// const getDetails = async (resultsObj, detailsType) => {
// let detailsArr = [];
// const limitRequests = pLimit(1); // Limit to 5 concurrent requests
// resultsObj =
// detailsType == "mySubmittedReps" ? resultsObj : resultsObj.value;
// if (detailsType == "myRepresentations") {
// limitRequests(async () => {
// resultsObj.map((searchDetail, index) => {
// detailsArr.push(
// getCase(searchDetail["incidentID"])
// .then(async (data) => {
// let caseID = "";
// switch (detailsType) {
// case "myCases":
// caseID = data.pinswg_title;
// break;
// case "myWatchedCases":
// case "mySubmittedReps":
// caseID =
// data[
// "_pinswg_watchedcase_value@OData.Community.Display.V1.FormattedValue"
// ];
// break;
// case "awaitingSubmission":
// case "myRepresentations":
// try {
// caseID = data.ticketnumber;
// } catch {
// console.log("missing:", data);
// }
// break;
// default:
// caseID = data.pinswg_title;
// }
// return await getPortalModuleDetails(
// getFormCollectionByID(
// data.pinswg_appealcasetype
// ).LogicalCollectionName,
// caseID
// ).catch((error) => {
// console.log(
// "=============================\ngetPortalModuleDetails error",
// error
// );
// });
// })
// .catch((error) => {
// console.log(
// "=============================\ngetCase error",
// error
// );
// })
// );
// });
// });
// }
// //debugger;
// await Promise.all(
// resultsObj.map(async (searchDetail, index) => {
// limitRequests(async () => {
// try {
// let caseID = "";
// switch (detailsType) {
// case "myCases":
// caseID = searchDetail.pinswg_title;
// break;
// case "myWatchedCases":
// case "mySubmittedReps":
// caseID =
// searchDetail[
// "_pinswg_watchedcase_value@OData.Community.Display.V1.FormattedValue"
// ];
// break;
// case "awaitingSubmission":
// caseID = searchDetail.ticketnumber;
// break;
// case "myRepresentations":
// caseID = searchDetail.casereference;
// break;
// default:
// caseID = searchDetail.pinswg_title;
// }
// console.log(detailsType, " case id : ", caseID);
// searchDetail.pinswg_appealcasetype != null &&
// detailsArr.push(
// getPortalModuleDetails(
// getFormCollectionByID(
// searchDetail.pinswg_appealcasetype
// ).LogicalCollectionName,
// caseID
// )
// );
// } catch (error) {
// console.log("Error processing case:", error);
// }
// });
// })
// );
// let detArr = Promise.all(detailsArr);
// // console.log(detArr);
// return detArr;
// };
const getDetails = async (resultsObj, detailsType) => {
let detailsArr = [];
const limitRequests = pLimit(5); // Allow up to 5 concurrent requests
// Adjust resultsObj based on detailsType
resultsObj =
detailsType === "mySubmittedReps" ? resultsObj : resultsObj.value;
const getDetailsForCase = async (searchDetail) => {
try {
let caseID = "";
// Determine the case ID based on the detailsType
switch (detailsType) {
case "myCases":
caseID = searchDetail.pinswg_title;
break;
case "myWatchedCases":
case "mySubmittedReps":
caseID =
searchDetail[
"_pinswg_watchedcase_value@OData.Community.Display.V1.FormattedValue"
];
break;
case "awaitingSubmission":
caseID = searchDetail.ticketnumber;
break;
case "myRepresentations":
caseID = searchDetail.casereference;
break;
default:
caseID = searchDetail.pinswg_title;
}
console.log(detailsType, " case id: ", caseID);
// If the appeal case type is valid, fetch the portal module details
if (searchDetail.pinswg_appealcasetype != null) {
const formCollectionName = getFormCollectionByID(
searchDetail.pinswg_appealcasetype
).LogicalCollectionName;
const details = await getPortalModuleDetails(
formCollectionName,
caseID
);
detailsArr.push(details);
}
} catch (error) {
console.log("Error processing case:", error);
}
};
// Use limitRequests to manage concurrency
const promises = resultsObj.map((searchDetail) => {
return limitRequests(() => getDetailsForCase(searchDetail));
});
// Wait for all the requests to complete
await Promise.all(promises);
return detailsArr;
};
const mapStateToProps = (state) => {
//console.log(state);
return {
accountDetails: state.accountDetails,
currentView: state.currentView,
search: state.search,
searchResultsObj: state.searchResultsObj,
formData: state.formData,
appealType: state.appealType,
form: state.form,
myCases: state.myCases,
watchedCases: state.watchedCases,
myRepresentations: state.myRepresentations,
mySubmittedReps: state.myRepresentations.mySubmittedReps,
awaitingSubmission: state.awaitingSubmission,
};
};
const mapStateToProps = (state) => ({
accountDetails: state.accountDetails,
currentView: state.currentView,
search: state.search,
searchResultsObj: state.searchResultsObj,
formData: state.formData,
appealType: state.appealType,
form: state.form,
myCases: state.myCases,
watchedCases: state.watchedCases,
myRepresentations: state.myRepresentations,
mySubmittedReps: state.myRepresentations.mySubmittedReps,
awaitingSubmission: state.awaitingSubmission,
});
export default connect(mapStateToProps)(Home);