file upload fix... limit to 210mb updates file list from storage account

This commit is contained in:
2024-12-11 11:25:06 +00:00
parent 32664f73e6
commit beb5d6f809
9 changed files with 423 additions and 329 deletions
+18
View File
@@ -1686,6 +1686,24 @@ export const getFilesFromBlob = (containerName, casefolderID) => {
}); });
}; };
export const getFilesFromBlobproxy = (containerName, casefolderID) => {
return axios
.get(
BASE_URL +
"/api/file/getbloblistproxy?container=" +
containerName +
"&casefolderID=" +
casefolderID
)
.then((res) => {
//console.log("//////////----", res.data);
return res.data;
})
.catch((error) => {
consoleLogger(error);
});
};
export const getFilesFromBlobHashed = ( export const getFilesFromBlobHashed = (
containerName, containerName,
getblobshash, getblobshash,
+91 -45
View File
@@ -14,6 +14,7 @@ import {
deleteBlob, deleteBlob,
getFilesFromBlobHashed, getFilesFromBlobHashed,
uploadSingleFile, uploadSingleFile,
getFilesFromBlobproxy,
} from "../../actions"; } from "../../actions";
import fieldLookup from "../../data/crmfieldlookuptranslations.json"; import fieldLookup from "../../data/crmfieldlookuptranslations.json";
import pickListLookup from "../../data/picklistLookups.json"; import pickListLookup from "../../data/picklistLookups.json";
@@ -1765,6 +1766,7 @@ export function FileUploadField(props) {
containerID={props.containerID} containerID={props.containerID}
uploadCount={props.uploadCount} uploadCount={props.uploadCount}
setFileCount={props.setFileCount} setFileCount={props.setFileCount}
props={props.props}
/> />
</> </>
); );
@@ -2040,7 +2042,53 @@ const RenderFileUpload = (field) => {
field.ticketnumber field.ticketnumber
).then((data) => { ).then((data) => {
console.log(data); console.log(data);
setCompletedUploadFiles(true); let buildAppealFilesArray = [];
let values = field.form.appealForm.values;
let filesUploadObj = renamedAcceptedFiles;
for (let key in filesUploadObj) {
typeof filesUploadObj[key].name != "undefined" &&
buildAppealFilesArray.push({
"name": filesUploadObj[key].name,
"size": filesUploadObj[key].size,
});
}
//console.log(buildAppealFilesArray);
function removeDuplicates(arr, key) {
const seen = new Set();
return arr.filter((item) => {
const value = item[key];
if (seen.has(value)) {
return false; // Duplicate found
} else {
seen.add(value); // Add value to the set
return true; // Keep the item
}
});
}
buildAppealFilesArray = values.hasOwnProperty(
"filesList"
)
? buildAppealFilesArray.concat(values.filesList)
: buildAppealFilesArray;
buildAppealFilesArray = removeDuplicates(
buildAppealFilesArray,
"name"
);
Object.assign(values, {
"filesList": buildAppealFilesArray,
});
getFilesFromBlobproxy(
field.containerID,
field.ticketnumber
).then((data) => {
field.setFilesForAppeal(data);
setCompletedUploadFiles(true);
});
}); });
}} }}
onDropRejected={handleDropRejected} onDropRejected={handleDropRejected}
@@ -2074,7 +2122,7 @@ const RenderFileUpload = (field) => {
)} )}
{completedUploadFiles > 0 && ( {completedUploadFiles > 0 && (
<div className="govuk-body govuk-!-font-size-14"> <div className="govuk-body govuk-!-font-size-14">
{uploadCountMessage} files completed{" "} {uploadCountMessage} files uploaded{" "}
</div> </div>
)} )}
</section> </section>
@@ -2093,54 +2141,52 @@ const RenderFileUpload = (field) => {
{field.meta.touched && field.meta.error && ( {field.meta.touched && field.meta.error && (
<span className="error">{field.meta.error}</span> <span className="error">{field.meta.error}</span>
)} )}
{filesList.length > 0 &&
(completedUploadFiles ? (
"Done"
) : (
<p className="govuk-body textloading">Uploading</p>
))}
{files && Array.isArray(files) && ( {files && Array.isArray(files) && (
<> <>
{/* {(files = removeEmptyObjects(files))} */} {/* {(files = removeEmptyObjects(files))} */}
<br />
{files.map( {!completedUploadFiles &&
(file, i) => files.map(
typeof file.name != "undefined" && ( (file, i) =>
<div typeof file.name != "undefined" && (
key={file.name} <div
className="govuk-!-margin-bottom-5 fileThumb" key={file.name}
> className="govuk-!-margin-bottom-5 fileThumb"
{" "}
{}
<span
className="govuk-summary-list__actionLink watched_link govuk-!-margin-right-5 govuk-!-text-align-left"
onClick={() => removeFile(file)}
> >
&minus; {" "}
</span> {}
<img <span
src={getThumbnailIcon(file, file.type)} className="govuk-summary-list__actionLink watched_link govuk-!-margin-right-5 govuk-!-text-align-left"
alt={file.name} onClick={() => removeFile(file)}
width="50" >
/> &minus;
<span className="govuk-body govuk-!-font-size-14 govuk-!-padding-left-5"> </span>
{file.name} ({bytesToSize(file.size)}){" "} <img
<br /> src={getThumbnailIcon(
<div id={file.name + "_" + i}> file,
{completedUploadFiles ? ( file.type
<p className="govuk-body govuk-!-font-size-14">
Upload complete
</p>
) : (
<p className="govuk-body textloading govuk-!-font-size-14">
Uploading...
</p>
)} )}
</div> alt={file.name}
</span> width="50"
</div> />
) <span className="govuk-body govuk-!-font-size-14 govuk-!-padding-left-5">
)} {file.name} (
{bytesToSize(file.size)}) <br />
<div id={file.name + "_" + i}>
{completedUploadFiles ? (
<p className="govuk-body govuk-!-font-size-14">
Upload complete
</p>
) : (
<p className="govuk-body textloading govuk-!-font-size-14">
Uploading...
</p>
)}
</div>
</span>
</div>
)
)}
</> </>
)} )}
{blobList.length > 0 && ( {blobList.length > 0 && (
+156 -155
View File
@@ -127,116 +127,116 @@ let BuildCheckRow = (props) => {
// ] // ]
// ); // );
if ( // if (
typeof props.props.form["appealForm"].values[ // typeof props.props.form["appealForm"].values[
datafieldname[0].value // datafieldname[0].value
] != "undefined" // ] != "undefined"
) { // ) {
return ( return (
<div className="govuk-summary-list__row" key={key}> <div className="govuk-summary-list__row" key={key}>
<dt className="govuk-summary-list__key"> <dt className="govuk-summary-list__key">
{FieldsTranslations(rows[0].value)} {FieldsTranslations(rows[0].value)}
</dt> </dt>
<dd className="govuk-summary-list__value"> <dd className="govuk-summary-list__value">
{fieldtype[0].value == {fieldtype[0].value ==
"{E0DECE4B-6666-4a8f-A065-082708572369}" ? ( "{E0DECE4B-6666-4a8f-A065-082708572369}" ? (
<div <div
dangerouslySetInnerHTML={{ dangerouslySetInnerHTML={{
__html: props.props.form[ __html: props.props.form[
"appealForm" "appealForm"
].values[ ].values[datafieldname[0].value],
datafieldname[0].value }}
], />
}} ) : fieldtype[0].value ==
/> "{5B773807-9FB2-42db-97C3-7A91EFF8ADFF}" ? (
) : fieldtype[0].value == formatDate(
"{5B773807-9FB2-42db-97C3-7A91EFF8ADFF}" ? (
formatDate(
props.props.form["appealForm"]
.values[datafieldname[0].value]
)
) : fieldtype[0].value ==
"{3EF39988-22BB-4f0b-BBBE-64B5A3748AEE}" ? (
getPickListLabel(
props.props.formData.pickListData,
datafieldname[0].value,
props.props.form["appealForm"]
.values[datafieldname[0].value]
)
) : fieldtype[0].value ==
"{07FAC785-CD58-4f9f-ABB3-4B7DDC6ED5ED}" ? (
getRadioLabel(
props.props.formData.pickListData,
datafieldname[0].value,
props.props.form["appealForm"]
.values[datafieldname[0].value]
)
) : fieldtype[0].value ==
"{67FAC785-CD58-4f9f-ABB3-4B7DDC6ED5ED}" ? (
props.props.form["appealForm"].values[ props.props.form["appealForm"].values[
datafieldname[0].value datafieldname[0].value
] == "false" ? ( ]
router.locale == "cy" ? ( )
"Nac ydw" ) : fieldtype[0].value ==
) : ( "{3EF39988-22BB-4f0b-BBBE-64B5A3748AEE}" ? (
"No" getPickListLabel(
) props.props.formData.pickListData,
) : router.locale == "cy" ? ( datafieldname[0].value,
"Oes" props.props.form["appealForm"].values[
datafieldname[0].value
]
)
) : fieldtype[0].value ==
"{07FAC785-CD58-4f9f-ABB3-4B7DDC6ED5ED}" ? (
getRadioLabel(
props.props.formData.pickListData,
datafieldname[0].value,
props.props.form["appealForm"].values[
datafieldname[0].value
]
)
) : fieldtype[0].value ==
"{67FAC785-CD58-4f9f-ABB3-4B7DDC6ED5ED}" ? (
props.props.form["appealForm"].values[
datafieldname[0].value
] == "false" ? (
router.locale == "cy" ? (
"Nac ydw"
) : ( ) : (
"Yes" "No"
) )
) : fieldtype[0].value == ) : router.locale == "cy" ? (
"{16D63FD6-119B-4353-BDCA-18358721C3FE}" ? ( "Oes"
<> ) : (
{props.filesArray.map((blob, i) => ( "Yes"
<div key={i}> )
{getDocumentTypeFromFilename( ) : fieldtype[0].value ==
blob.name "{16D63FD6-119B-4353-BDCA-18358721C3FE}" ? (
) === <>
documentTypeCode[0] {props.filesArray.map((blob, i) => (
.value && ( <div key={i}>
<div {getDocumentTypeFromFilename(
blob.name
) ===
documentTypeCode[0]
.value && (
<div
style={{
display: "flex",
alignItems:
"flex-start",
}}
className="govuk-!-margin-bottom-2"
>
<img
style={{ style={{
display: "flex", minWidth: "50",
alignItems: width: "50",
"flex-start",
}} }}
className="govuk-!-margin-bottom-2" src={getThumbnailIconByExtension(
blob.name
)}
alt={blob.name}
width="50"
/>
<span
style={{
maxWidth: "85%",
}}
className="govuk-body govuk-!-font-size-14 govuk-!-margin-left-2"
> >
<img {blob.name} -{" "}
style={{ {bytesToSize(
minWidth: blob.size
"50", )}{" "}
width: "50", </span>
}} </div>
src={getThumbnailIconByExtension( )}
blob.name </div>
)} ))}
alt={blob.name} <br />
width="50" {typeof props.props.form["appealForm"]
/> .values[datafieldname[0].value] !=
<span "undefined" &&
style={{ props.props.form[
maxWidth:
"85%",
}}
className="govuk-body govuk-!-font-size-14 govuk-!-margin-left-2"
>
{blob.name} -{" "}
{bytesToSize(
blob.size
)}{" "}
</span>
</div>
)}
</div>
))}
<br />
{props.props.form[
"appealForm" "appealForm"
].values[ ].values[
datafieldname[0].value datafieldname[0].value
@@ -294,62 +294,63 @@ let BuildCheckRow = (props) => {
</div> </div>
) )
)} )}
</> </>
) : fieldtype[0].value == ) : fieldtype[0].value ==
"{0273EDBD-AC1D-40d3-9FB2-095C621B552D}" ? ( "{0273EDBD-AC1D-40d3-9FB2-095C621B552D}" ? (
props.props.form["appealForm"].values[ typeof props.props.form["appealForm"]
datafieldname[0].value .values[datafieldname[0].value] !=
].map((tenant, index) => { "undefined" &&
return ( props.props.form["appealForm"].values[
<div datafieldname[0].value
key={index} ].map((tenant, index) => {
style={{ return (
display: "flex", <div
}} key={index}
> style={{
<div className="govuk-!-width-one-half"> display: "flex",
{tenant.pinswg_agriculturaltenantname || }}
tenant.pinswg_owners} >
</div> <div className="govuk-!-width-one-half">
<div className="govuk-!-width-one-half"> {tenant.pinswg_agriculturaltenantname ||
Served:{" "} tenant.pinswg_owners}
{formatDate(
tenant.dateserved
)}
</div>
</div> </div>
); <div className="govuk-!-width-one-half">
}) Served:{" "}
) : ( {formatDate(
props.props.form["appealForm"].values[ tenant.dateserved
datafieldname[0].value )}
] </div>
)} </div>
</dd> );
})
) : (
props.props.form["appealForm"].values[
datafieldname[0].value
]
)}
</dd>
<dd className="govuk-summary-list__actions"> <dd className="govuk-summary-list__actions">
{rows[0].value != "Temporary reference" && ( {rows[0].value != "Temporary reference" && (
<a <a
className="govuk-link" className="govuk-link"
href="#" href="#"
onClick={() => { onClick={() => {
setCurrentSection(whichSection); setCurrentSection(whichSection);
}} }}
> >
{" "}
{t("newappeal:change-link-label")}
<span className="govuk-visually-hidden">
{" "} {" "}
{t("newappeal:change-link-label")} {FieldsTranslations(rows[0].value)}
<span className="govuk-visually-hidden"> </span>
{" "} </a>
{FieldsTranslations( )}
rows[0].value </dd>
)} </div>
</span> );
</a> // }
)}
</dd>
</div>
);
}
} }
})} })}
</> </>
+1 -3
View File
@@ -315,9 +315,7 @@ let BuildCheckSection = (props) => {
<a <a
className="govuk-link" className="govuk-link"
href="#" href="#"
onClick={() => onClick={() => setCurrentSection(sectionCount)}
setCurrentSection(sectionCount - 1)
}
> >
{t("common:back-link")} {t("common:back-link")}
</a> </a>
+1
View File
@@ -217,6 +217,7 @@ export default function BuildField(props) {
uploadCount={props.uploadCount} uploadCount={props.uploadCount}
setFileCount={props.props.setFileCount} setFileCount={props.props.setFileCount}
setUploadCount={props.setUploadCount} setUploadCount={props.setUploadCount}
props={props.props.props.props}
/> />
</div> </div>
); );
+105 -124
View File
@@ -173,143 +173,124 @@ let BuildSection = (props) => {
setSavingStatus(useSaveStatus); setSavingStatus(useSaveStatus);
setShowCompletedUploadFiles(true); //not sure we need this here if it does it on drop of file
//uploadAppealFiles(values);
uploadAppealFiles(values) // console.log(
.then((data) => { // "\n////////////////////////\n appeal pdf payload",
// console.log( // values,
// "\n////////////////////////\n appeal pdf payload", // props.props.accountDetails.containerID,
// values, // props.appealType.caseReference.ticketnumber,
// props.props.accountDetails.containerID, // props.appealType,
// props.appealType.caseReference.ticketnumber, // "\n////////////////////////\n"
// props.appealType, // );
// "\n////////////////////////\n"
// );
// let pdfObj = values; // let pdfObj = values;
// Object.assign(pdfObj, { // Object.assign(pdfObj, {
// "containerID": props.props.accountDetails.containerID, // "containerID": props.props.accountDetails.containerID,
// "casefolderID": props.appealType.caseReference.ticketnumber, // "casefolderID": props.appealType.caseReference.ticketnumber,
// }); // });
// generateAppealPDF( // generateAppealPDF(
// pdfObj, // pdfObj,
// props.props.accountDetails.containerID, // props.props.accountDetails.containerID,
// props.appealType.caseReference.ticketnumber, // props.appealType.caseReference.ticketnumber,
// router.query.appealtypes, // router.query.appealtypes,
// props.appealType.fileList // props.appealType.fileList
// ), // ),
props.setNewAppealProgress( props.setNewAppealProgress(
getProgressObj( getProgressObj(formXML, titleList, mandatoryFieldsData, props)
formXML, );
titleList,
mandatoryFieldsData,
props
)
);
let appTypeCollection = getFormCollectionByID( let appTypeCollection = getFormCollectionByID(
props.appealType.appealTypeID props.appealType.appealTypeID
); );
let updateBindAppealTypeToIncident = let updateBindAppealTypeToIncident =
appTypeCollection.NavigationProperty; appTypeCollection.NavigationProperty;
Object.assign(updateBody, { Object.assign(updateBody, {
"pinswg_appealcasetype": props.appealType.appealTypeID, "pinswg_appealcasetype": props.appealType.appealTypeID,
"pinswg_Appellant@odata.bind": "pinswg_Appellant@odata.bind":
"/contacts(" + "/contacts(" + props.props.accountDetails.loggedinUserId + ")",
props.props.accountDetails.loggedinUserId + "pinswg_name": props.appealType.caseReference.ticketnumber,
")", [updateBindAppealTypeToIncident + "@odata.bind"]:
"pinswg_name": props.appealType.caseReference.ticketnumber, "/incidents(" + incidentId + ")",
[updateBindAppealTypeToIncident + "@odata.bind"]: });
"/incidents(" + incidentId + ")",
});
updateBody = JSON.stringify(updateBody); updateBody = JSON.stringify(updateBody);
updateBody = updateBody.replace(/:"Yes"/gm, `:true`); updateBody = updateBody.replace(/:"Yes"/gm, `:true`);
updateBody = updateBody.replace(/:"No"/gm, `:false`); updateBody = updateBody.replace(/:"No"/gm, `:false`);
updateBody = JSON.parse(updateBody); updateBody = JSON.parse(updateBody);
Object.keys(updateBody).forEach((key) => { Object.keys(updateBody).forEach((key) => {
if (updateBody[key] === null) { if (updateBody[key] === null) {
delete updateBody[key]; delete updateBody[key];
} }
if (key.indexOf("_") == 0) { if (key.indexOf("_") == 0) {
delete updateBody[key]; delete updateBody[key];
} }
}); });
//console.log(updateBody); //console.log(updateBody);
let updateFormCollection = let updateFormCollection = appTypeCollection.LogicalCollectionName;
appTypeCollection.LogicalCollectionName; let primaryAttribute = appTypeCollection.PrimaryIdAttribute;
let primaryAttribute = appTypeCollection.PrimaryIdAttribute;
const reference = "PEDW-PARTIAL"; const reference = "PEDW-PARTIAL";
const templateId = "021b0a7b-df00-41f1-b94e-c269bee98c75"; const templateId = "021b0a7b-df00-41f1-b94e-c269bee98c75";
const templateIdCY = "f3c4a56b-bfb8-4d39-97dd-888df3062b0a"; const templateIdCY = "f3c4a56b-bfb8-4d39-97dd-888df3062b0a";
const emailAddress = const emailAddress = props.props.accountDetails.loggedinUserEmail;
props.props.accountDetails.loggedinUserEmail; const personalisation = {
const personalisation = { "caseReference": props.appealType.caseReference.ticketnumber,
"caseReference": "emailAddress": props.props.accountDetails.loggedinUserEmail,
props.appealType.caseReference.ticketnumber, "returnLink":
"emailAddress": props.props.url +
props.props.accountDetails.loggedinUserEmail, (router.locale != "en" ? "/cy/fymhorth/" : "/myportal/") +
"returnLink": appTypeCollection.UrlName +
props.props.url + "?lpa=" +
(router.locale != "en" props.appealType.appealLPA +
? "/cy/fymhorth/" "&apt=" +
: "/myportal/") + appTypeCollection.appealTypeID +
appTypeCollection.UrlName + "&casereference=" +
"?lpa=" + props.appealType.caseReference.ticketnumber +
props.appealType.appealLPA + "&inid=" +
"&apt=" + props.appealType.caseReference.incidentid,
appTypeCollection.appealTypeID + "linkExpiry": 10 * 60,
"&casereference=" + };
props.appealType.caseReference.ticketnumber +
"&inid=" +
props.appealType.caseReference.incidentid,
"linkExpiry": 10 * 60,
};
// console.log( // console.log(
// "/////////////////////////////////", // "/////////////////////////////////",
// "returnLink:", // "returnLink:",
// props.props.url + // props.props.url +
// (router.locale != "en" ? "/cy/fymhorth/" : "/myportal/") + // (router.locale != "en" ? "/cy/fymhorth/" : "/myportal/") +
// appTypeCollection.UrlName + // appTypeCollection.UrlName +
// "?lpa=" + // "?lpa=" +
// props.appealType.appealLPA + // props.appealType.appealLPA +
// "&apt=" + // "&apt=" +
// appTypeCollection.appealTypeID + // appTypeCollection.appealTypeID +
// "&casereference=" + // "&casereference=" +
// props.appealType.caseReference.ticketnumber + // props.appealType.caseReference.ticketnumber +
// "&inid=" + // "&inid=" +
// props.appealType.caseReference.incidentid, // props.appealType.caseReference.incidentid,
// "/////////////////////////////////" // "/////////////////////////////////"
// ); // );
})
.then(() => {
sendSavedEmail == true &&
sendEmail(
router.locale != "en" ? templateIdCY : templateId,
emailAddress,
personalisation,
reference
);
useSaveStatus && sendSavedEmail == true &&
router.replace( sendEmail(
router.locale != "en" router.locale != "en" ? templateIdCY : templateId,
? "/" + router.locale + "/myportal" emailAddress,
: "/myportal" personalisation,
); reference
}) );
.then(() => {
setCompletedUploadFiles(true); useSaveStatus &&
}); router.replace(
router.locale != "en"
? "/" + router.locale + "/myportal"
: "/myportal"
);
}; };
const onHandleSubmit = (values) => { const onHandleSubmit = (values) => {
@@ -617,7 +598,7 @@ let BuildSection = (props) => {
"_pinswg_appellant_value" "_pinswg_appellant_value"
]; ];
console.log("on save:", valuesObj); //console.log("on save:", valuesObj);
updateCaseProgress( updateCaseProgress(
valuesObj, valuesObj,
true, true,
+1 -1
View File
@@ -111,5 +111,5 @@
"planning-obligation-(s106/unilateral)": "Rhwymedigaeth gynllunio (S106/Unochrog)", "planning-obligation-(s106/unilateral)": "Rhwymedigaeth gynllunio (S106/Unochrog)",
"site-location-plan": "Cynllun Lleoliad Safle", "site-location-plan": "Cynllun Lleoliad Safle",
"registration-of-application-letter": "Llythyr Cofrestru Cais", "registration-of-application-letter": "Llythyr Cofrestru Cais",
"previously-added-files": "Ffeiliau a ychwanegwyd yn flaenorol" "previously-added-files": "Ffeiliau wedi'u llwytho i fyny"
} }
+1 -1
View File
@@ -111,5 +111,5 @@
"planning-obligation-(s106/unilateral)": "Planning obligation (S106/Unilateral)", "planning-obligation-(s106/unilateral)": "Planning obligation (S106/Unilateral)",
"site-location-plan": "Site Location Plan", "site-location-plan": "Site Location Plan",
"registration-of-application-letter": "Registration of Application letter", "registration-of-application-letter": "Registration of Application letter",
"previously-added-files": "Previously added files" "previously-added-files": "Uploaded files"
} }
+49
View File
@@ -0,0 +1,49 @@
import {
downloadAllProgressFiles,
getAllProgressBlobs,
} from "../../../actions/azurestorage";
import _ from "lodash";
import nextConnect from "next-connect";
import middleware from "../middleware/middleware";
import {
getToken,
azureHeaders,
consoleLogger,
hashAPIPath,
} from "../../../actions";
import axios from "axios";
import CryptoJS from "crypto-js";
const WORDKEY = process.env.HASHKEY;
const WEBAPI_URL =
process.env.RELAY_ROOT ||
"https://dev-pedw-ns.servicebus.windows.net/dev-pedw-hc/";
const BASE_URL = process.env.API_ROOT || `http://localhost:${port}`;
export default async function ApiProxy(req, res) {
var containerName = req.query.container;
var casefolderID = req.query.casefolderID;
var checkHash = req.query.hash;
var token = await getToken();
var queryUrl =
"/api/file/getbloblist?container=" +
containerName +
"&casefolderID=" +
casefolderID;
return axios
.get(
BASE_URL + queryUrl + hashAPIPath(queryUrl),
azureHeaders(token.access_token)
)
.then(({ data }) => {
res.status(200).json(data);
})
.catch((error) => {
consoleLogger(error);
res.status(400).json(error);
});
}