diff --git a/components/case/representation/index.js b/components/case/representation/index.js index 0a8f8245..bd8b4a37 100644 --- a/components/case/representation/index.js +++ b/components/case/representation/index.js @@ -9,7 +9,7 @@ import { formValueSelector, reduxForm } from "redux-form"; import { signIn, useSession } from "next-auth/react"; import { generateRepPDF, sendEmail, uploadRepFiles } from "../../../actions"; -import { formatDates } from "../../../components/utils"; +import { formatDates, updateLinks } from "../../../components/utils"; import { setRepresentationCapacity, setRepresentationMessageSent, @@ -1100,6 +1100,8 @@ let MakeRepresentation = (props) => { ? cleanFilesList(values) : values; + values = updateLinks(values); + // get filelists from values object let fileListObj = _.filter(values, function (v, key) { return _.includes(key, "representationDocuments"); diff --git a/components/case/representation/representationElements.js b/components/case/representation/representationElements.js index 0ada8933..fd97ae60 100644 --- a/components/case/representation/representationElements.js +++ b/components/case/representation/representationElements.js @@ -16,7 +16,16 @@ import { getFilesFromBlobproxy, } from "../../../actions"; -const ReactQuill = dynamic(() => import("react-quill-new"), { ssr: false }); +const LoadingMessage = () =>
Loading the editor...
; + +// Dynamically import ReactQuill with a proper loading state +const ReactQuill = dynamic( + () => import("react-quill-new").then((mod) => mod.default), + { + ssr: false, + loading: () => , // This is valid as long as it's a valid React component + } +); import { useDispatch } from "react-redux"; // Import the useDispatch hook import { diff --git a/components/case/summary.js b/components/case/summary.js index 4c838f75..44f0201e 100644 --- a/components/case/summary.js +++ b/components/case/summary.js @@ -258,9 +258,13 @@ const CaseSummary = (props) => { : t("case:summary-applicant-label")}
- {detailsObj[ - "_pinswg_appellant_value@OData.Community.Display.V1.FormattedValue" - ] || "not entered"} + {casesObj.pinswg_appellantagent == 846040001 + ? casesObj.pinswg_appellantfirstname + + " " + + casesObj.pinswg_appellantlastname + : detailsObj[ + "_pinswg_appellant_value@OData.Community.Display.V1.FormattedValue" + ] || "not entered"}
{detailsObj.pinswg_agentcontactname != null && diff --git a/components/newappeal/buildsection.js b/components/newappeal/buildsection.js index 98c000c2..91498eb0 100644 --- a/components/newappeal/buildsection.js +++ b/components/newappeal/buildsection.js @@ -13,7 +13,7 @@ import { setNewAppealProgress, setFileCount, } from "../../store/appealType/action"; -import { getFormCollectionByID, getProgressObj } from "../utils"; +import { getFormCollectionByID, getProgressObj, updateLinks } from "../utils"; import BuildRow from "./buildrow"; import { FieldsTranslations } from "../elements"; @@ -141,6 +141,8 @@ let BuildSection = (props) => { let buildAppealFilesArray = []; //console.log("attached docs: - ", buildAppealFilesArray); + values = updateLinks(values); + let filesUploadObj = Object.keys(values) .filter(function (k) { return k.indexOf("pinswg_fileUpload") == 0; diff --git a/components/utils/index.js b/components/utils/index.js index a684a3a7..51280560 100644 --- a/components/utils/index.js +++ b/components/utils/index.js @@ -550,3 +550,67 @@ export const getDocumentTypeFromFilename = (filename) => { return doctypeCode; }; + +export const updateLinks = (jsonObject) => { + const wrapPlainUrlsInAnchorTags = (htmlString) => { + return htmlString + .replace( + /(?<=^|>|\s)(?=\S)(?:https?:\/\/)?(?:www\.)?[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}(?:\/[^\s]*)?(?=\s|<|$)/g, + (match) => { + // If the match is already wrapped in tag, return it as is + if (match.includes(' tag + return `${match}`; + } + ) + .replace( + /]*>]*>(.*?)<\/a><\/a>/g, + (match, innerContent) => { + return `${innerContent}`; + } + ); + }; + // Helper function to ensure that any href attributes in tags have https/http + const ensureHttpsInLinks = (inputString) => { + // Match tags with href attributes and check if they lack a scheme (http:// or https://) + return inputString.replace( + /]*href=["']([^"']*)["'][^>]*>/g, + (match, url) => { + // If the URL doesn't already have a scheme (http:// or https://), add https:// + if (!/^https?:\/\//.test(url)) { + const newUrl = `https://${url}`; + return match.replace(url, newUrl); + } + return match; // Return the unchanged anchor tag if it already has a scheme + } + ); + }; + + // Iterate through all properties of the JSON object + Object.keys(jsonObject).forEach((key) => { + const value = jsonObject[key]; + + // If the value is a string and contains plain URLs that are not wrapped + if (typeof value === "string") { + // Step 1: Wrap plain URLs in anchor tags if not already wrapped + let updatedValue = wrapPlainUrlsInAnchorTags(value); + + // Step 2: Ensure that hrefs in anchor tags have https:// or http:// + updatedValue = ensureHttpsInLinks(updatedValue); + + // Assign the updated value back to the key + jsonObject[key] = updatedValue; + } + }); + + return jsonObject; +};