import { JSONPath as jsonpath } from "jsonpath-plus"; import { v4 as uuidv4 } from "uuid"; import { getBasicPartSavedDetails, getBasicSearchDetails, getBasicSearchDetailsPaged, getPortalModuleDetailsProxy, getPortalModuleDetails, } from "../../actions"; import data from "../../data/collections.json"; import { useRouter } from "next/router"; import xpath from "xpath"; /* * Get the lookup collection by the appeal type entity * @param String formtype - string from appeal entity name */ export const getFormCollection = (formtype) => { const collectionName = jsonpath({ path: "$..[?(@ && @.LogicalName=='" + formtype + "')]", json: data, eval: true, }); return collectionName[0]; }; export const getFormCollectionByID = (appealTypeID) => { const collectionName = jsonpath({ path: "$..[?(@ && @.appealTypeID =='" + appealTypeID + "')]", json: data, eval: true, }); return collectionName[0]; }; export const getFormIDByLogicalName = (appealTypeLogicalName) => { const collectionName = jsonpath({ path: "$..[?(@ && @.LogicalName =='" + appealTypeLogicalName + "')]", json: data, eval: true, }); return collectionName[0]; }; export const getPickListLabel = (data, picklistType, picklistID) => { const pickListData = jsonpath({ path: "$..[?(@ && @.LogicalName=='" + picklistType + "')]", json: data, eval: true, }); const pickListLabel = jsonpath({ path: "$..[?(@ && @.Value=='" + picklistID + "')].Label.LocalizedLabels..Label", json: pickListData, eval: true, }); return pickListLabel[0]; }; export const getRadioLabel = (data, radiotListName, radioListID) => { const radioListData = jsonpath({ path: "$..[?(@ && @.LogicalName=='" + radiotListName + "')]", json: data, eval: true, }); const pickListLabel = jsonpath({ path: "$..[?(@ && @.Value=='" + radioListID + "')].Label.LocalizedLabels..Label", json: radioListData, eval: true, }); return pickListLabel[0]; }; /* * Get the details of a case from the appeal type * @param object searchResultsObj */ export const getSearchDetails = async (searchResultsObj) => { let detailsArr = []; searchResultsObj = searchResultsObj.value; const detailsObj = searchResultsObj.map((searchDetail, index) => { let formMeta = getFormCollectionByID( searchDetail.pinswg_appealcasetype ); // console.log( // "------------------- Details: ", // formMeta.LogicalCollectionName, // searchDetail.title, // formMeta.PrimaryIdAttribute, // searchDetail.incidentid, // searchDetail.pinswg_appealcasetype // ); if (searchDetail.pinswg_appealcasetype == null) { detailsArr.push( getBasicSearchDetails( "pinswg_dnses", searchDetail.title, "pinswg_dnsid", searchDetail.incidentid ) || { "@odata.count": 1, "value": [{ "title": searchDetail.title }], } ); } else { detailsArr.push( getBasicSearchDetails( formMeta.LogicalCollectionName, searchDetail.title, formMeta.PrimaryIdAttribute, searchDetail.incidentid ) || { "@odata.count": 1, "value": [{ "title": searchDetail.title }], } ); } }); // Promise.all(detailsArr).then((data) => { // console.log(data); // console.log(detailsArr); // return data; // }); return Promise.all(detailsArr); }; /* * Get the partially saved details of a case from the appeal type * @param object searchResultsObj */ export const getPartSavedDetails = (searchResultsObj) => { let detailsArr = []; searchResultsObj = searchResultsObj.value; const detailsObj = searchResultsObj.map((searchDetail, index) => { if (searchDetail.pinswg_appealcasetype == null) { console.log(searchDetail.title); } else { let formMeta = getFormCollectionByID( searchDetail.pinswg_appealcasetype ); console.log(formMeta); detailsArr.push( getBasicPartSavedDetails( formMeta.LogicalCollectionName, searchDetail.title, formMeta.PrimaryIdAttribute, searchDetail.incidentid ) ); } }); return Promise.all(detailsArr); }; /* * Get the details of a case from the appeal type * @param object searchResultsObj */ export const getSearchDetailsPaged = (searchResultsObj) => { let detailsArr = []; searchResultsObj = searchResultsObj.value; const detailsObj = searchResultsObj.map((searchDetail, index) => { if (searchDetail.pinswg_appealcasetype == null) { console.log(searchDetail.title); } else { let formMeta = getFormCollectionByID( searchDetail.pinswg_appealcasetype ); detailsArr.push( getBasicSearchDetailsPaged( formMeta.LogicalCollectionName, searchDetail.title, formMeta.PrimaryIdAttribute, searchDetail.incidentid ) ); } }); return Promise.all(detailsArr); }; // export const absoluteUrl = (req, setLocalhost) => { // var protocol = "https:"; // var host = req // ? req.headers["x-forwarded-host"] || req.headers["host"] // : window.location.host; // if (host.indexOf("localhost") > -1) { // if (setLocalhost) host = setLocalhost; // protocol = "http:"; // } // return { // protocol: protocol, // host: host, // origin: protocol + "//" + host, // }; // }; export const getProgressObj = ( formObjXML, titleList, mandatoryFieldsData, props ) => { const parser = new DOMParser(); const BuildFormObj = (formObjXML) => { var doc = parser.parseFromString(formObjXML, "text/xml"); var tabs = xpath.select("//form/tabs/tab[*]", doc); const formObj = Object.keys(tabs).map((key, index) => { var sectionXML = xpath.select( "//tabs/tab[" + (index + 1) + "]//rows/row/control[not(@parentField)]/..", doc ); return BuildRowObj(sectionXML, titleList[key].value); }); const progressObj = Object.keys(formObj).map((key, index) => { let fieldObj = formObj[key].fieldsrowObj; let rowCount = 0; !props.dirty && typeof props.initialValues != "undefined" && Object.keys(fieldObj).map((key, index) => { fieldObj[key].datafieldname in props.initialValues && props.initialValues[fieldObj[key].datafieldname] != null && rowCount++; }); props.dirty && Object.keys(fieldObj).map((key, index) => { fieldObj[key].datafieldname in props.props.form["appealForm"].values && props.props.form["appealForm"].values[ fieldObj[key].datafieldname ] != null && rowCount++; }); return { "title": titleList[key].value, rowCount, "totalFields": formObj[key].fieldsTotal, "allFieldsComplete": titleList[key].value == "Upload documents" ? (_.has(props.props.appealType.fileList, "value") && props.props.appealType.fileList.value.length > 0) || (_.has(props.props.form.appealForm, "values") && Object.keys( props.props.form.appealForm.values ).filter((k) => k.startsWith("pinswg_fileUpload")) .length > 0) : rowCount == formObj[key].fieldsTotal, }; }); return progressObj; }; const BuildRowObj = (rowXML, titleList) => { let rowObj = Object.keys(rowXML).map((key, index) => { var doc = parser.parseFromString(rowXML[key].outerHTML, "text/xml"); if (_.isEmpty(rowXML[key].innerHTML)) { (""); } else { var rows = xpath.select("//label/@description", doc); var fieldtype = xpath.select("//@classid", doc); var validation = xpath.select("//@validation", doc); var datafieldname = xpath.select("//@datafieldname", doc); var datafieldcontent = xpath.select("//@datafieldcontent", doc); var parentField = xpath.select("//@parentField", doc); var parentFieldShowOnValue = xpath.select( "//@parentFieldShowOnValue", doc ); var requiredDocumentValue = xpath.select( "//@requiredDocumentValue", doc ); var requiredDocumentLabel = xpath.select( "//@requiredDocumentLabel", doc ); var hint = xpath.select("//label/@hint", doc); var dateStart = xpath.select("//@dateStart", doc); var dateEnd = xpath.select("//@dateEnd", doc); hint = !_.isEmpty(hint) && hint[0].value; validation = !_.isEmpty(validation) ? validation[0].value : []; parentField = !_.isEmpty(parentField) && parentField[0].value; parentFieldShowOnValue = !_.isEmpty(parentFieldShowOnValue) && parentFieldShowOnValue[0].value; datafieldcontent = !_.isEmpty(datafieldcontent) && datafieldcontent[0].value; requiredDocumentValue = !_.isEmpty(requiredDocumentValue) && requiredDocumentValue[0].value; requiredDocumentLabel = !_.isEmpty(requiredDocumentLabel) && requiredDocumentLabel[0].value; dateStart = !_.isEmpty(dateStart) && dateStart[0].value; dateEnd = !_.isEmpty(dateEnd) && dateEnd[0].value; const isRequiredField = jsonpath({ path: "$..value[?(@ && @.LogicalName=='" + datafieldname[0].value + "')]", json: mandatoryFieldsData, eval: true, }); if (datafieldname[0].value.includes("pinswg_fileUpload")) { if (typeof isRequiredField[0] != "undefined") { if (isRequiredField[0].RequiredLevel.Value != "None") { //console.log(datafieldname[0].value, validation); return { "fieldType": fieldtype[0].value, "label": rows[0].value, "datafieldname": datafieldname[0].value, "datafieldcontent": datafieldcontent, "validation": validation, }; } } else { return { "fieldType": fieldtype[0].value, "label": rows[0].value, "datafieldname": datafieldname[0].value, "key": key, "picklistData": props.props.formData.pickListData, "mandatoryFieldsData": mandatoryFieldsData, }; } } else { if (typeof isRequiredField[0] != "undefined") { if (isRequiredField[0].RequiredLevel.Value != "None") { //console.log(datafieldname[0].value, validation); return { "fieldType": fieldtype[0].value, "label": rows[0].value, "datafieldname": datafieldname[0].value, "datafieldcontent": datafieldcontent, "validation": validation, }; } else { return null; } } else { return null; } } } }); rowObj = rowObj.filter(function (el) { return el != null; }); rowObj = rowObj.filter(function (el) { return typeof el.validation != "undefined"; }); rowObj = rowObj.filter(function (el) { return el.validation.indexOf("required") > -1; }); const filterUnwanted = (rowObj) => { const required = rowObj.filter((el) => { return !_.isEmpty(el.validation); }); return required; }; return { "title": titleList, "validationFieldsTotal": filterUnwanted(rowObj).length, "fieldsTotal": rowObj.length, "fieldsrowObj": rowObj, }; }; const progObj = BuildFormObj(formObjXML); //console.log(progObj); return progObj; }; export const getTempCaseRef = () => { function randomString(length) { return Math.random().toString(36).substr(2, length); } const randomGUID = uuidv4(); return "TMP-" + randomString(5).toUpperCase(); }; export const getThumbnailIconByExtension = (blobName) => { let fileType = blobName.slice(blobName.lastIndexOf(".") + 1); switch (fileType) { case "html": return "/assets/images/documenttypes/html.png"; break; case "txt": return "/assets/images/documenttypes/txt.png"; break; case "doc": return "/assets/images/documenttypes/doc.png"; break; case "pdf": return "/assets/images/documenttypes/pdf.png"; break; case "docx": return "/assets/images/documenttypes/docx.png"; break; case "csv": return "/assets/images/documenttypes/csv.png"; break; case "xlsx": return "/assets/images/documenttypes/xlsx.png"; break; case "zip": return "/assets/images/documenttypes/zip.png"; break; case "jpeg": case "jpg": return "/assets/images/documenttypes/jpg.png"; case "png": return "/assets/images/documenttypes/png.png"; case "tiff": case "tif": return "/assets/images/documenttypes/tif.png"; break; default: return "/assets/images/documenttypes/default.png"; break; } }; export const bytesToSize = (bytes) => { var sizes = ["Bytes", "KB", "MB", "GB", "TB"]; if (bytes == 0) return "0 Byte"; var i = parseInt(Math.floor(Math.log(bytes) / Math.log(1024))); return Math.round(bytes / Math.pow(1024, i), 2) + " " + sizes[i]; }; export const formatDates = (dateObj, showTime) => { var dateObj = new Date(dateObj); var dd = String(dateObj.getDate()).padStart(2, "0"); var mm = String(dateObj.getMonth() + 1).padStart(2, "0"); //January is 0! var yyyy = dateObj.getFullYear(); var hh = dateObj.getHours(); hh = ("0" + hh).slice(-2); var mins = dateObj.getMinutes(); mins = ("0" + mins).slice(-2); const dateStr = showTime ? hh == 0 && mins == 0 ? "" : hh + ":" + mins : dd + "/" + mm + "/" + yyyy + " "; return dateStr; }; export const getDetailsProxy = (resultsObj, detailsType) => { let detailsArr = []; resultsObj = resultsObj.value; const detailsObj = resultsObj.map((searchDetail, index) => { if (searchDetail.pinswg_appealcasetype == null) { console.log( detailsType != "myWatchedCases" ? searchDetail.ticketnumber : searchDetail[ "_pinswg_watchedcase_value@OData.Community.Display.V1.FormattedValue" ] ); } else { detailsArr.push( getPortalModuleDetailsProxy( getFormCollectionByID(searchDetail.pinswg_appealcasetype) .LogicalCollectionName, detailsType != "myWatchedCases" ? searchDetail.ticketnumber : searchDetail[ "_pinswg_watchedcase_value@OData.Community.Display.V1.FormattedValue" ] ) ); } }); return Promise.all(detailsArr); }; export const getDocumentTypeFromFilename = (filename) => { var doctypeCode = "000000"; if (typeof filename != "undefined") { if (filename.indexOf("_-_Statement_of_Case") > 0) doctypeCode = "000000"; else if (filename.indexOf("_-_Application_Form") > 0) doctypeCode = "000001"; else if (filename.indexOf("_-_Site_Ownership_Certificate") > 0) doctypeCode = "000002"; else if (filename.indexOf("_-_Decision_Notice") > 0) doctypeCode = "000003"; else if (filename.indexOf("_-_Site_Location_Plan") > 0) doctypeCode = "000004"; else if (filename.indexOf("_-_Plans_Drawing_Documents") > 0) doctypeCode = "000005"; else if (filename.indexOf("_-_Additional_Plans_Drawings_Documents") > 0) doctypeCode = "000006"; else if (filename.indexOf("_-_Design_and_Access_Statement") > 0) doctypeCode = "000007"; else if (filename.indexOf("_-_NSB_LPA_Additional_Documents") > 0) doctypeCode = "000008"; else if (filename.indexOf("_-_LPA_Correspondence") > 0) doctypeCode = "000009"; else if (filename.indexOf("_-_LPA_Original_Permission") > 0) doctypeCode = "000010"; else if (filename.indexOf("_-_LPA's_Registration_Letter") > 0) doctypeCode = "000011"; else if (filename.indexOf("_-_Environmental_Statement") > 0) doctypeCode = "000012"; else if (filename.indexOf("_-_Cost_of_Application") > 0) doctypeCode = "000013"; else if (filename.indexOf("_-_Other_Relevant_Material") > 0) doctypeCode = "000014"; else if ( filename.indexOf("_-_S106_Agreement_or_Unilateral_Undertaking") > 0 ) doctypeCode = "000015"; } return doctypeCode; }; export const updateLinks = (jsonObj) => { const parser = new DOMParser(); // Function to process the HTML string and replace URLs with tags const processHtmlString = (htmlString) => { const doc = parser.parseFromString(htmlString, "text/html"); // Find all text nodes in the document const walk = (node) => { if (node.nodeType === Node.TEXT_NODE) { const urlRegex = /(?:https?:\/\/)?(?:www\.)?([a-zA-Z0-9.-]+\.[a-zA-Z]{2,})(\/[^\s]*)?/g; let match; let currentText = node.textContent; let lastIndex = 0; let newNodeContent = []; // Process all URLs found in the current text node while ((match = urlRegex.exec(currentText)) !== null) { // Before the URL if (match.index > lastIndex) { newNodeContent.push( currentText.slice(lastIndex, match.index) ); } // Construct the full URL (default to https://) let fullUrl = match[0]; if ( !fullUrl.startsWith("http://") && !fullUrl.startsWith("https://") ) { fullUrl = `https://${match[1]}${match[2] || ""}`; // Default to https } // Create the anchor element const anchor = document.createElement("a"); anchor.href = fullUrl; anchor.textContent = match[0]; anchor.target = "_blank"; anchor.setAttribute("rel", "noopener noreferrer"); // Add the anchor tag to the node content newNodeContent.push(anchor); // Update the last index processed lastIndex = urlRegex.lastIndex; } // Add the remaining text after the last URL if (lastIndex < currentText.length) { newNodeContent.push(currentText.slice(lastIndex)); } // If there were any replacements, update the text node if (newNodeContent.length > 0) { const fragment = document.createDocumentFragment(); newNodeContent.forEach((item) => { if (typeof item === "string") { fragment.appendChild(document.createTextNode(item)); } else { fragment.appendChild(item); } }); node.parentNode.replaceChild(fragment, node); } } // Traverse child nodes for (let i = 0; i < node.childNodes.length; i++) { walk(node.childNodes[i]); } }; walk(doc.body); return doc.body.innerHTML; }; // Iterate over the JSON object and process values that are strings (HTML content) for (const key in jsonObj) { if (jsonObj.hasOwnProperty(key)) { const value = jsonObj[key]; // If the value is a string and contains HTML, process it if (typeof value === "string" && /<[^>]*>/g.test(value)) { jsonObj[key] = processHtmlString(value); } } } return jsonObj; }; export const whichRepType = (props) => { const router = useRouter(); const { locale } = router; let repType; let whichBaseType = props.currentView?.caseReference.repDetails.representationType || formObj.representationForm.values.representationType; switch (whichBaseType) { case "Statement": repType = router.locale == "cy" ? "Datganiad" : "Statment"; break; case "Questionnaire": repType = router.locale == "cy" ? "Holiadur" : "Questionnaire"; break; case "Final comments": repType = router.locale == "cy" ? "Sylwadau terfynol" : "Final comments"; break; default: // code block } return repType; };