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 = (
containerName,
getblobshash,
+91 -45
View File
@@ -14,6 +14,7 @@ import {
deleteBlob,
getFilesFromBlobHashed,
uploadSingleFile,
getFilesFromBlobproxy,
} from "../../actions";
import fieldLookup from "../../data/crmfieldlookuptranslations.json";
import pickListLookup from "../../data/picklistLookups.json";
@@ -1765,6 +1766,7 @@ export function FileUploadField(props) {
containerID={props.containerID}
uploadCount={props.uploadCount}
setFileCount={props.setFileCount}
props={props.props}
/>
</>
);
@@ -2040,7 +2042,53 @@ const RenderFileUpload = (field) => {
field.ticketnumber
).then((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}
@@ -2074,7 +2122,7 @@ const RenderFileUpload = (field) => {
)}
{completedUploadFiles > 0 && (
<div className="govuk-body govuk-!-font-size-14">
{uploadCountMessage} files completed{" "}
{uploadCountMessage} files uploaded{" "}
</div>
)}
</section>
@@ -2093,54 +2141,52 @@ const RenderFileUpload = (field) => {
{field.meta.touched && field.meta.error && (
<span className="error">{field.meta.error}</span>
)}
{filesList.length > 0 &&
(completedUploadFiles ? (
"Done"
) : (
<p className="govuk-body textloading">Uploading</p>
))}
{files && Array.isArray(files) && (
<>
{/* {(files = removeEmptyObjects(files))} */}
<br />
{files.map(
(file, i) =>
typeof file.name != "undefined" && (
<div
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)}
{!completedUploadFiles &&
files.map(
(file, i) =>
typeof file.name != "undefined" && (
<div
key={file.name}
className="govuk-!-margin-bottom-5 fileThumb"
>
&minus;
</span>
<img
src={getThumbnailIcon(file, file.type)}
alt={file.name}
width="50"
/>
<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>
{" "}
{}
<span
className="govuk-summary-list__actionLink watched_link govuk-!-margin-right-5 govuk-!-text-align-left"
onClick={() => removeFile(file)}
>
&minus;
</span>
<img
src={getThumbnailIcon(
file,
file.type
)}
</div>
</span>
</div>
)
)}
alt={file.name}
width="50"
/>
<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 && (
+156 -155
View File
@@ -127,116 +127,116 @@ let BuildCheckRow = (props) => {
// ]
// );
if (
typeof props.props.form["appealForm"].values[
datafieldname[0].value
] != "undefined"
) {
return (
<div className="govuk-summary-list__row" key={key}>
<dt className="govuk-summary-list__key">
{FieldsTranslations(rows[0].value)}
</dt>
// if (
// typeof props.props.form["appealForm"].values[
// datafieldname[0].value
// ] != "undefined"
// ) {
return (
<div className="govuk-summary-list__row" key={key}>
<dt className="govuk-summary-list__key">
{FieldsTranslations(rows[0].value)}
</dt>
<dd className="govuk-summary-list__value">
{fieldtype[0].value ==
"{E0DECE4B-6666-4a8f-A065-082708572369}" ? (
<div
dangerouslySetInnerHTML={{
__html: props.props.form[
"appealForm"
].values[
datafieldname[0].value
],
}}
/>
) : fieldtype[0].value ==
"{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}" ? (
<dd className="govuk-summary-list__value">
{fieldtype[0].value ==
"{E0DECE4B-6666-4a8f-A065-082708572369}" ? (
<div
dangerouslySetInnerHTML={{
__html: props.props.form[
"appealForm"
].values[datafieldname[0].value],
}}
/>
) : fieldtype[0].value ==
"{5B773807-9FB2-42db-97C3-7A91EFF8ADFF}" ? (
formatDate(
props.props.form["appealForm"].values[
datafieldname[0].value
] == "false" ? (
router.locale == "cy" ? (
"Nac ydw"
) : (
"No"
)
) : router.locale == "cy" ? (
"Oes"
]
)
) : 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[
datafieldname[0].value
] == "false" ? (
router.locale == "cy" ? (
"Nac ydw"
) : (
"Yes"
"No"
)
) : fieldtype[0].value ==
"{16D63FD6-119B-4353-BDCA-18358721C3FE}" ? (
<>
{props.filesArray.map((blob, i) => (
<div key={i}>
{getDocumentTypeFromFilename(
blob.name
) ===
documentTypeCode[0]
.value && (
<div
) : router.locale == "cy" ? (
"Oes"
) : (
"Yes"
)
) : fieldtype[0].value ==
"{16D63FD6-119B-4353-BDCA-18358721C3FE}" ? (
<>
{props.filesArray.map((blob, i) => (
<div key={i}>
{getDocumentTypeFromFilename(
blob.name
) ===
documentTypeCode[0]
.value && (
<div
style={{
display: "flex",
alignItems:
"flex-start",
}}
className="govuk-!-margin-bottom-2"
>
<img
style={{
display: "flex",
alignItems:
"flex-start",
minWidth: "50",
width: "50",
}}
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
style={{
minWidth:
"50",
width: "50",
}}
src={getThumbnailIconByExtension(
blob.name
)}
alt={blob.name}
width="50"
/>
<span
style={{
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[
{blob.name} -{" "}
{bytesToSize(
blob.size
)}{" "}
</span>
</div>
)}
</div>
))}
<br />
{typeof props.props.form["appealForm"]
.values[datafieldname[0].value] !=
"undefined" &&
props.props.form[
"appealForm"
].values[
datafieldname[0].value
@@ -294,62 +294,63 @@ let BuildCheckRow = (props) => {
</div>
)
)}
</>
) : fieldtype[0].value ==
"{0273EDBD-AC1D-40d3-9FB2-095C621B552D}" ? (
props.props.form["appealForm"].values[
datafieldname[0].value
].map((tenant, index) => {
return (
<div
key={index}
style={{
display: "flex",
}}
>
<div className="govuk-!-width-one-half">
{tenant.pinswg_agriculturaltenantname ||
tenant.pinswg_owners}
</div>
<div className="govuk-!-width-one-half">
Served:{" "}
{formatDate(
tenant.dateserved
)}
</div>
</>
) : fieldtype[0].value ==
"{0273EDBD-AC1D-40d3-9FB2-095C621B552D}" ? (
typeof props.props.form["appealForm"]
.values[datafieldname[0].value] !=
"undefined" &&
props.props.form["appealForm"].values[
datafieldname[0].value
].map((tenant, index) => {
return (
<div
key={index}
style={{
display: "flex",
}}
>
<div className="govuk-!-width-one-half">
{tenant.pinswg_agriculturaltenantname ||
tenant.pinswg_owners}
</div>
);
})
) : (
props.props.form["appealForm"].values[
datafieldname[0].value
]
)}
</dd>
<div className="govuk-!-width-one-half">
Served:{" "}
{formatDate(
tenant.dateserved
)}
</div>
</div>
);
})
) : (
props.props.form["appealForm"].values[
datafieldname[0].value
]
)}
</dd>
<dd className="govuk-summary-list__actions">
{rows[0].value != "Temporary reference" && (
<a
className="govuk-link"
href="#"
onClick={() => {
setCurrentSection(whichSection);
}}
>
<dd className="govuk-summary-list__actions">
{rows[0].value != "Temporary reference" && (
<a
className="govuk-link"
href="#"
onClick={() => {
setCurrentSection(whichSection);
}}
>
{" "}
{t("newappeal:change-link-label")}
<span className="govuk-visually-hidden">
{" "}
{t("newappeal:change-link-label")}
<span className="govuk-visually-hidden">
{" "}
{FieldsTranslations(
rows[0].value
)}
</span>
</a>
)}
</dd>
</div>
);
}
{FieldsTranslations(rows[0].value)}
</span>
</a>
)}
</dd>
</div>
);
// }
}
})}
</>
+1 -3
View File
@@ -315,9 +315,7 @@ let BuildCheckSection = (props) => {
<a
className="govuk-link"
href="#"
onClick={() =>
setCurrentSection(sectionCount - 1)
}
onClick={() => setCurrentSection(sectionCount)}
>
{t("common:back-link")}
</a>
+1
View File
@@ -217,6 +217,7 @@ export default function BuildField(props) {
uploadCount={props.uploadCount}
setFileCount={props.props.setFileCount}
setUploadCount={props.setUploadCount}
props={props.props.props.props}
/>
</div>
);
+105 -124
View File
@@ -173,143 +173,124 @@ let BuildSection = (props) => {
setSavingStatus(useSaveStatus);
setShowCompletedUploadFiles(true);
//not sure we need this here if it does it on drop of file
//uploadAppealFiles(values);
uploadAppealFiles(values)
.then((data) => {
// console.log(
// "\n////////////////////////\n appeal pdf payload",
// values,
// props.props.accountDetails.containerID,
// props.appealType.caseReference.ticketnumber,
// props.appealType,
// "\n////////////////////////\n"
// );
// console.log(
// "\n////////////////////////\n appeal pdf payload",
// values,
// props.props.accountDetails.containerID,
// props.appealType.caseReference.ticketnumber,
// props.appealType,
// "\n////////////////////////\n"
// );
// let pdfObj = values;
// let pdfObj = values;
// Object.assign(pdfObj, {
// "containerID": props.props.accountDetails.containerID,
// "casefolderID": props.appealType.caseReference.ticketnumber,
// });
// Object.assign(pdfObj, {
// "containerID": props.props.accountDetails.containerID,
// "casefolderID": props.appealType.caseReference.ticketnumber,
// });
// generateAppealPDF(
// pdfObj,
// props.props.accountDetails.containerID,
// props.appealType.caseReference.ticketnumber,
// router.query.appealtypes,
// props.appealType.fileList
// ),
// generateAppealPDF(
// pdfObj,
// props.props.accountDetails.containerID,
// props.appealType.caseReference.ticketnumber,
// router.query.appealtypes,
// props.appealType.fileList
// ),
props.setNewAppealProgress(
getProgressObj(
formXML,
titleList,
mandatoryFieldsData,
props
)
);
props.setNewAppealProgress(
getProgressObj(formXML, titleList, mandatoryFieldsData, props)
);
let appTypeCollection = getFormCollectionByID(
props.appealType.appealTypeID
);
let updateBindAppealTypeToIncident =
appTypeCollection.NavigationProperty;
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 + ")",
});
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);
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];
}
});
Object.keys(updateBody).forEach((key) => {
if (updateBody[key] === null) {
delete updateBody[key];
}
if (key.indexOf("_") == 0) {
delete updateBody[key];
}
});
//console.log(updateBody);
//console.log(updateBody);
let updateFormCollection =
appTypeCollection.LogicalCollectionName;
let primaryAttribute = appTypeCollection.PrimaryIdAttribute;
let updateFormCollection = appTypeCollection.LogicalCollectionName;
let primaryAttribute = appTypeCollection.PrimaryIdAttribute;
const reference = "PEDW-PARTIAL";
const templateId = "021b0a7b-df00-41f1-b94e-c269bee98c75";
const templateIdCY = "f3c4a56b-bfb8-4d39-97dd-888df3062b0a";
const emailAddress =
props.props.accountDetails.loggedinUserEmail;
const personalisation = {
"caseReference":
props.appealType.caseReference.ticketnumber,
"emailAddress":
props.props.accountDetails.loggedinUserEmail,
"returnLink":
props.props.url +
(router.locale != "en"
? "/cy/fymhorth/"
: "/myportal/") +
appTypeCollection.UrlName +
"?lpa=" +
props.appealType.appealLPA +
"&apt=" +
appTypeCollection.appealTypeID +
"&casereference=" +
props.appealType.caseReference.ticketnumber +
"&inid=" +
props.appealType.caseReference.incidentid,
"linkExpiry": 10 * 60,
};
const reference = "PEDW-PARTIAL";
const templateId = "021b0a7b-df00-41f1-b94e-c269bee98c75";
const templateIdCY = "f3c4a56b-bfb8-4d39-97dd-888df3062b0a";
const emailAddress = props.props.accountDetails.loggedinUserEmail;
const personalisation = {
"caseReference": props.appealType.caseReference.ticketnumber,
"emailAddress": props.props.accountDetails.loggedinUserEmail,
"returnLink":
props.props.url +
(router.locale != "en" ? "/cy/fymhorth/" : "/myportal/") +
appTypeCollection.UrlName +
"?lpa=" +
props.appealType.appealLPA +
"&apt=" +
appTypeCollection.appealTypeID +
"&casereference=" +
props.appealType.caseReference.ticketnumber +
"&inid=" +
props.appealType.caseReference.incidentid,
"linkExpiry": 10 * 60,
};
// console.log(
// "/////////////////////////////////",
// "returnLink:",
// props.props.url +
// (router.locale != "en" ? "/cy/fymhorth/" : "/myportal/") +
// appTypeCollection.UrlName +
// "?lpa=" +
// props.appealType.appealLPA +
// "&apt=" +
// appTypeCollection.appealTypeID +
// "&casereference=" +
// props.appealType.caseReference.ticketnumber +
// "&inid=" +
// props.appealType.caseReference.incidentid,
// "/////////////////////////////////"
// );
})
.then(() => {
sendSavedEmail == true &&
sendEmail(
router.locale != "en" ? templateIdCY : templateId,
emailAddress,
personalisation,
reference
);
// console.log(
// "/////////////////////////////////",
// "returnLink:",
// props.props.url +
// (router.locale != "en" ? "/cy/fymhorth/" : "/myportal/") +
// appTypeCollection.UrlName +
// "?lpa=" +
// props.appealType.appealLPA +
// "&apt=" +
// appTypeCollection.appealTypeID +
// "&casereference=" +
// props.appealType.caseReference.ticketnumber +
// "&inid=" +
// props.appealType.caseReference.incidentid,
// "/////////////////////////////////"
// );
useSaveStatus &&
router.replace(
router.locale != "en"
? "/" + router.locale + "/myportal"
: "/myportal"
);
})
.then(() => {
setCompletedUploadFiles(true);
});
sendSavedEmail == true &&
sendEmail(
router.locale != "en" ? templateIdCY : templateId,
emailAddress,
personalisation,
reference
);
useSaveStatus &&
router.replace(
router.locale != "en"
? "/" + router.locale + "/myportal"
: "/myportal"
);
};
const onHandleSubmit = (values) => {
@@ -617,7 +598,7 @@ let BuildSection = (props) => {
"_pinswg_appellant_value"
];
console.log("on save:", valuesObj);
//console.log("on save:", valuesObj);
updateCaseProgress(
valuesObj,
true,
+1 -1
View File
@@ -111,5 +111,5 @@
"planning-obligation-(s106/unilateral)": "Rhwymedigaeth gynllunio (S106/Unochrog)",
"site-location-plan": "Cynllun Lleoliad Safle",
"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)",
"site-location-plan": "Site Location Plan",
"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);
});
}