import Link from "next/link"; import _, { has, last } from "lodash"; import { useRouter } from "next/router"; import useTranslation from "next-translate/useTranslation"; import { useState, useEffect } from "react"; import xpath from "xpath"; import BuildRow from "./buildrow"; import { reduxForm, formValueSelector, getFormSubmitErrors } from "redux-form"; import { useDispatch, useSelector, shallowEqual, connect } from "react-redux"; import { setCaseReference, setCurrentSection, setDocumentsList, setFilesForAppeal, setNewAppealProgress, } from "../../store/appealType/action"; import { getFormCollectionByID, getProgressObj } from "../utils"; import { updateCase, patchCase, uploadFiles, sendEmail } from "../../actions"; import { FieldsTranslations } from "../elements"; import jsonpath from "jsonpath"; import BuildProgress from "./buildprogress"; let BuildSection = (props) => { const [currentSectionSelected, setCurrentSectionSelected] = useState(1); const [pickupWhereLeftOff, setPickupWhereLeftOff] = useState(true); const [savingStatus, setSavingStatus] = useState(false); useEffect(() => { progObj = getProgressObj( formXML, titleList, mandatoryFieldsData, props ); // const lastIndex = progObj // .map((whichIsLast) => whichIsLast.allFieldsComplete == true) // .lastIndexOf(true); // setCurrentSection(currentSectionSelected + 1); // pickupWhereLeftOff == true && setCurrentSection(lastIndex + 1), // setPickupWhereLeftOff(false); // // lastIndex != currentSectionSelected // // ? (setCurrentSectionSelected(lastIndex), // // setPickupWhereLeftOff(true)) // // : setPickupWhereLeftOff(false); }); let { t } = useTranslation(); const router = useRouter(); const { locale } = router; const { formXML, sectionCount, onSubmit, handleSubmit, load, pristine, reset, formTitle, setCurrentSection, refno, gotoSection, mandatoryFieldsData, } = props; const documentListObj = props.appealType.documentList; const currentSection = props.appealType.currentSection; const parser = new DOMParser(); var doc = parser.parseFromString(props.formXML, "text/xml"); var titles = xpath.select( "//form/tabs/tab[" + currentSection + " ]/labels/label/@description", doc ); var rowXML = xpath.select( "/form/tabs/tab[" + currentSection + "]/columns//sections/section/rows/row", //"/form/tabs/tab/columns//sections/section/rows/row", doc ); var formObjXML = xpath.select("/form/tabs", doc); var titleList = xpath.select( "//form/tabs/tab[*]/labels/label/@description", doc ); const progObj = getProgressObj( formXML, titleList, mandatoryFieldsData, props ); const isProgressComplete = (progObj) => { const progressCount = 0; for (let key in progObj) { progObj[key].allFieldsComplete === true && progressCount++; } return progObj.length == progressCount; }; const lastIndex = progObj .map((whichIsLast) => whichIsLast.allFieldsComplete == true) .lastIndexOf(true); const handleParam = (setValue) => (e) => setValue(e.target.value); const uploadAppealFiles = (values) => { // get filelists from values object let fileListObj = _.filter(values, function (v, key) { return _.includes(key, "pinswg_fileUpload"); }); //console.log(fileListObj); console.log( "\n////////////////////////\n upload files:", props.props.accountDetails.containerID ); var dataObj = values; for (let key in dataObj) { _.includes(key, "pinswg_fileUpload") == true && delete dataObj[key]; } uploadFiles( dataObj, fileListObj, props.props.accountDetails.containerID, props.props.appealType.caseReference.ticketnumber ).then((data) => { //console.log("hello", data); return data; }); }; const updateCaseProgress = (values, sendSavedEmail, useSaveStatus) => { let incidentId = props.appealType.caseReference.incidentid; let updateBody = values || {}; setSavingStatus(useSaveStatus); uploadAppealFiles(values); props.setNewAppealProgress( getProgressObj(formXML, titleList, mandatoryFieldsData, props) ); let appTypeCollection = getFormCollectionByID( props.appealType.appealTypeID ); let updateBindAppealTypeToIncident = appTypeCollection.NavigationProperty; Object.assign(updateBody, { "pinswg_appealcasetype": props.appealType.appealTypeID, "pinswg_Appellant@odata.bind": "/contacts(" + props.props.accountDetails.loggedinUserId + ")", "pinswg_name": props.appealType.caseReference.ticketnumber, [updateBindAppealTypeToIncident + "@odata.bind"]: "/incidents(" + incidentId + ")", }); updateBody = JSON.stringify(updateBody); updateBody = updateBody.replace(/:"Yes"/gm, `:true`); updateBody = updateBody.replace(/:"No"/gm, `:false`); updateBody = JSON.parse(updateBody); Object.keys(updateBody).forEach((key) => { if (updateBody[key] === null) { delete updateBody[key]; } if (key.indexOf("_") == 0) { delete updateBody[key]; } }); //console.log(updateBody); let updateFormCollection = appTypeCollection.LogicalCollectionName; let primaryAttribute = appTypeCollection.PrimaryIdAttribute; // updateCase( // incidentId, // updateBody, // updateFormCollection, // primaryAttribute, // props.appealType.caseReference.ticketnumber // ); sendSavedEmail == true && sendEmail( props.props.accountDetails.loggedinUserEmail, "Saved progress for appeal " + props.appealType.caseReference.ticketnumber, "Your saved appeal " + props.appealType.caseReference.ticketnumber, "You can resume your application at a later date from here " ); useSaveStatus && router.replace( router.locale != "en" ? router.locale + "/myportal" : "/myportal" ); }; const onHandleSubmit = (values) => { //if (currentSection == sectionCount) { let valuesObj = values || {}; delete valuesObj["_pinswg_appellant_value"]; console.log("has errors:", props.invalid); props.invalid == false && updateCaseProgress(valuesObj, false, false); setCurrentSection(currentSection + 1); }; const [hasErrors, setHasErrors] = useState(""); const getErrors = () => { let errorsobj = props.props.form["appealForm"]; //setHasErrors(errorsobj.hasOwnProperty("syncErrors")); window.scrollTo(0, 0); }; let errorsobj = {}; const ShowErrorHeader = (props) => { errorsobj = props.props.appealForm.syncErrors; errorsobj = _.keys(errorsobj); const getErrorLabel = (whichField) => { var doc = parser.parseFromString(props.formXML, "text/xml"); var errorFieldLabel = xpath.select( "//*[control/@id='" + whichField + "']//@description", doc ); return errorFieldLabel[0].value; }; const ShowErrors = () => { let errorList = []; for (let i = 0; i < errorsobj.length; ++i) { //get label from error key - search rowxml for id = errorobj errorList.push(
) : (
)}