From 5f82c59abbb07f34f0f15d55b8640e1726731185 Mon Sep 17 00:00:00 2001 From: rdbsolutions Date: Tue, 16 Jan 2024 14:23:11 +0000 Subject: [PATCH] rich text field and pdf create for appeal --- actions/azurestorage.js | 46 +++ actions/index.js | 51 ++- components/elements/index.js | 386 +++++++++++++----- components/newappeal/aboutyou.js | 6 + components/newappeal/buildfield.js | 19 + components/newappeal/buildrow.js | 5 + components/newappeal/buildsection.js | 59 ++- components/pdftemplates/appealRow_pdf.js | 60 ++- .../pdftemplates/planningappeals78_pdf.js | 76 +--- data/formsxml/adverts.xml | 6 +- data/formsxml/callinss77.xml | 8 +- data/formsxml/commercialappealcas.xml | 12 +- data/formsxml/commonland.xml | 4 +- .../communityinfrastructurelevys117118119.xml | 4 +- data/formsxml/compulsorypurchaseorders.xml | 4 +- data/formsxml/enforcementnoticeappeals174.xml | 8 +- data/formsxml/environmentalpermitting.xml | 4 +- ...edgeshedgerowstreepreservationreplacem.xml | 4 +- data/formsxml/householderappealhas.xml | 14 +- .../formsxml/lawfuldevelopmentcertificate.xml | 6 +- ...istedbuildingandconservationareaconsen.xml | 10 +- data/formsxml/maintenanceoflands217.xml | 4 +- data/formsxml/miscellaneouscasework.xml | 4 +- data/formsxml/nonvalidation.xml | 2 +- data/formsxml/planningappeals78.xml | 20 +- data/formsxml/planningconditionss73s79.xml | 6 +- .../formsxml/planningobligationappeals106.xml | 4 +- data/formsxml/row.xml | 4 +- data/formsxml/wayleave.xml | 4 +- pages/api/file/generateappealpdf.js | 40 +- 30 files changed, 592 insertions(+), 288 deletions(-) diff --git a/actions/azurestorage.js b/actions/azurestorage.js index c4855bb6..0180709e 100644 --- a/actions/azurestorage.js +++ b/actions/azurestorage.js @@ -474,6 +474,52 @@ export const uploadPDFRepFiles = async ( ); }; +export const uploadPDFAppealFiles = async ( + formContent, + containerName, + foldername, + repType +) => { + const containerToken = await createContainerSas(containerName); + const sasUrl = `${STORAGE_PATH}/${containerName}?${containerToken}`; + const containerClient = new ContainerClient(sasUrl); + + const files = formContent; + + console.log(formContent, containerName, foldername); + console.log( + "rep pdf files...", + files, + Object.keys(files).length, + foldername + ); + + // console.log(`files[${prop}] = ${files[prop][0].size}`); + console.log(foldername + "/files/" + formContent.split("tmp/")[1]); + + const blobName = foldername + "/" + formContent.split("tmp/")[1]; + console.log(blobName); + + const blockBlobClient = containerClient.getBlockBlobClient(blobName); + const uploadBlobResponse = await blockBlobClient.uploadFile(formContent); + + const tags = { + containerid: containerName, + caseID: foldername.split("/")[0], + documentType: repType, + blobType: "RepresentationPDF", + }; + + console.log("the tags:", tags); + const withTags = await blockBlobClient.setTags(tags); + const withMeta = await blockBlobClient.setMetadata(tags); + + console.log( + `Uploaded block blob ${files} successfully`, + uploadBlobResponse.requestId + ); +}; + export const uploadPDFCaseFiles = async ( formContent, containerName, diff --git a/actions/index.js b/actions/index.js index 4abdb165..0d663350 100644 --- a/actions/index.js +++ b/actions/index.js @@ -742,8 +742,7 @@ export const getWatchedCases = (loggedInUserId) => { export const getWatchedCasesProxy = (loggedInUserId) => { return axios .get( - BASE_URL + - "/api/endpoint/getwatchedcasesproxy_api?loggedInUserId=" + + "/api/endpoint/getwatchedcasesproxy_api?loggedInUserId=" + loggedInUserId ) .then((res) => res.data) @@ -1373,7 +1372,7 @@ export const generateRepPDF = async (formValues, containerID, casefolderID) => { method: "post", url: queryUrl, data: formValues, - headers: { "content-type": "multipart/form-data" }, + //headers: { "content-type": "multipart/form-data" }, }; //console.log(config); @@ -1384,6 +1383,38 @@ export const generateRepPDF = async (formValues, containerID, casefolderID) => { console.log("this serror", error); } }; + +export const generateAppealPDF = async ( + formValues, + containerID, + casefolderID +) => { + //let files = filesObj; + + //console.log("generateAppealPDF function: " + formValues); + // var formData = new FormData(); + // formValues.append("appealData", JSON.stringify(formValues)); + // formValues.append("containerID", containerID); + // formValues.append("casefolderID", casefolderID); + + var queryUrl = "/api/file/generateappealpdf"; + + const config = { + method: "post", + url: queryUrl, + data: formValues, + //headers: { "content-type": "multipart/form-data" }, + }; + + //console.log(config); + try { + const res = await axios(config); + return res.data; + } catch (error) { + console.log("this serror", error); + } +}; + export const getFilesFromBlob = (containerName, casefolderID) => { console.log( " get files from blob", @@ -1542,13 +1573,13 @@ export const sendEmail = async ( "personalisation": personalisation, }; - console.log( - "hwewwew: ", - templateId, - emailAddress, - personalisation, - reference - ); + // console.log( + // "hwewwew: ", + // templateId, + // emailAddress, + // personalisation, + // reference + // ); var queryUrl = "/api/email/notify"; var config = { diff --git a/components/elements/index.js b/components/elements/index.js index eca03b17..2220b699 100644 --- a/components/elements/index.js +++ b/components/elements/index.js @@ -25,6 +25,7 @@ import { getThumbnailIconByExtension, bytesToSize, } from "../utils"; +import dynamic from "next/dynamic"; import { addYears, @@ -35,6 +36,8 @@ import { subDays, parseISO, } from "date-fns"; +const ReactQuill = dynamic(() => import("react-quill"), { ssr: false }); +import "react-quill/dist/quill.snow.css"; const RenderTextfield = ({ id, @@ -66,7 +69,16 @@ const RenderTextfield = ({ {errorMsg} )} - + ); @@ -82,6 +94,7 @@ export function Textfield(props) { formProps, parentField, parentFieldShowOnValue, + maxFieldLength, hint, } = props; const required = (value) => (value ? undefined : "Required"); @@ -134,6 +147,7 @@ export function Textfield(props) { validate={eval(validation)} label={props.label} errorMsg="Is required" + maxFieldLength={props.maxFieldLength} /> ) ) : ( @@ -146,6 +160,7 @@ export function Textfield(props) { validate={eval(validation)} label={props.label} errorMsg="Is required" + maxFieldLength={props.maxFieldLength} /> )} @@ -193,6 +208,11 @@ const RenderMultiline = ({ rows={rows} className={className} {...input} + maxLength={ + custom.hasOwnProperty("maxFieldLength") + ? custom.maxFieldLength + : "" + } > @@ -208,6 +228,7 @@ export function MultiLinefield(props) { parentField, parentFieldShowOnValue, validation, + maxFieldLength, } = props; const required = (value) => (value ? undefined : "Is required"); @@ -249,6 +270,7 @@ export function MultiLinefield(props) { className="govuk-textarea govuk-input--width-30" aria-describedby={props.name + "-hint"} validate={eval(validation)} + maxFieldLength={props.maxFieldLength} /> ) @@ -275,6 +297,146 @@ export function MultiLinefield(props) { className="govuk-textarea govuk-input--width-30" aria-describedby={props.name + "-hint"} validate={eval(validation)} + maxFieldLength={props.maxFieldLength} + /> + + )} + + ); +} + +export const RenderRichMultiline = ({ + id, + className, + rows, + datafieldname, + name, + label, + input, + meta: { touched, error }, + ...custom +}) => { + const [editValue, setEditValue] = useState( + input.value != null ? input.value : "" + ); + + const changeEdit = (valStr) => { + setEditValue(valStr); + input.onChange(valStr); + }; + + var modules = { + toolbar: [ + [{ "header": [1, 2, false] }], + ["bold", "italic", "underline", "blockquote"], + [{ "list": "ordered" }, { "list": "bullet" }], + ["clean"], + ], + }; + + return ( + <> + + + + + ); +}; + +export function RichMultiLinefield(props) { + const { + name, + label, + form, + formProps, + parentField, + parentFieldShowOnValue, + validation, + maxFieldLength, + } = props; + const required = (value) => (value ? undefined : "Is required"); + + var showIfHasParentShowValue = + parentField != false && + !_.isEmpty(formProps[form]) && + _.has(formProps[form].values, parentField) && + parentFieldShowOnValue.indexOf( + formProps[form].values[parentField].toString() + ) > -1; + + (showIfHasParentShowValue == parentField) != false && + showIfHasParentShowValue; + + //console.log(showIfHasParentShowValue, formProps[form].values[parentField]); + + return ( + <> + {parentField != false ? ( + showIfHasParentShowValue && ( +
+

+ +

+
+ Do not include personal or financial information. +
+ +
+ ) + ) : ( +
+

+ +

+
+ Do not include personal or financial information. +
+ +
)} @@ -1087,6 +1249,7 @@ export function NumericField(props) { validate={eval(validation)} component={RenderTextfield} label={label} + maxFieldLength={props.maxFieldLength} /> ) @@ -1121,6 +1284,7 @@ export function DecimalField(props) { formProps, parentFieldShowOnValue, parentField, + maxFieldLength, } = props; const required = (value) => (value ? undefined : "Required"); @@ -1157,6 +1321,7 @@ export function DecimalField(props) { validate={eval(validation)} component={RenderTextfield} label={props.label} + maxFieldLength={props.maxFieldLength} /> ) @@ -1431,121 +1596,124 @@ const RenderFileUpload = (field) => { }); }; - return <> - { - const renamedAcceptedFiles = filesToUpload.map( - (file) => - new File( - [file], - `${getDocumentType(field.documentTypeCode)}_${ - file.name - }`, - { - type: file.type, - } - ) - ); - field.input.onChange(renamedAcceptedFiles); - }} - > - {({ getRootProps, getInputProps }) => ( - <> - {/* {field.hint != false && ( + return ( + <> + { + const renamedAcceptedFiles = filesToUpload.map( + (file) => + new File( + [file], + `${getDocumentType(field.documentTypeCode)}_${ + file.name + }`, + { + type: file.type, + } + ) + ); + field.input.onChange(renamedAcceptedFiles); + }} + > + {({ getRootProps, getInputProps }) => ( + <> + {/* {field.hint != false && (
ss{t(field.hint)}
)}
*/} -
-
- {" "} - -
- {t( - "newappeal:new-appeal-fileupload-drop-label" - )} +
+
+ {" "} + +
+ {t( + "newappeal:new-appeal-fileupload-drop-label" + )} +
+ + ( + {t( + "newappeal:new-appeal-fileupload-file-list-label" + )} + ) +
- - ( - {t( - "newappeal:new-appeal-fileupload-file-list-label" - )} - ) - -
- -
- + + + + )} +
+ {field.meta.touched && field.meta.error && ( + {field.meta.error} )} -
- {field.meta.touched && field.meta.error && ( - {field.meta.error} - )} - {files && Array.isArray(files) && ( - - )} - {blobList.map((blob, i) => ( -
-
- { - deleteThisBlob( - field.containerID, - blob.name, - blob.hasheddeletepath, - blob.hashgetblobs, - field.ticketnumber - ); - }} - title="Remove this file" + {blob.name} + + - − - + {blob.name.slice(blob.name.indexOf("_") + 1)}( + {bytesToSize(blob.contentLength)}) +
- {blob.name} - - - - {blob.name.slice(blob.name.indexOf("_") + 1)}({bytesToSize(blob.contentLength)}) - -
- ))}{" "} - ; + ))}{" "} + + ); }; diff --git a/components/newappeal/aboutyou.js b/components/newappeal/aboutyou.js index 639f1f2d..04fc7098 100644 --- a/components/newappeal/aboutyou.js +++ b/components/newappeal/aboutyou.js @@ -24,6 +24,7 @@ const RenderTextfield = ({ meta: { touched, error }, ...custom }) => { + console.log(custom); return ( <>
@@ -469,6 +474,7 @@ let AboutYou = (props) => { className="govuk-input govuk-input--width-20" validate={[required]} label={t("newappeal:about-you-on-behalf-label")} + maxFieldLength="25" />
diff --git a/components/newappeal/buildfield.js b/components/newappeal/buildfield.js index 2963c81e..14247df0 100644 --- a/components/newappeal/buildfield.js +++ b/components/newappeal/buildfield.js @@ -10,6 +10,7 @@ import { PickList, Radiofield, ReadOnlyfield, + RichMultiLinefield, Textfield, YesNofield, } from "../elements"; @@ -114,6 +115,7 @@ export default function BuildField(props) { parentFieldShowOnValue={props.parentFieldShowOnValue} validation={props.validation} hint={props.hint} + maxFieldLength={props.maxFieldLength} /> ); break; @@ -142,6 +144,21 @@ export default function BuildField(props) { parentField={props.parentField} parentFieldShowOnValue={props.parentFieldShowOnValue} validation={props.validation} + maxFieldLength={props.maxFieldLength} + /> + ); + break; + case "{E0DECE4B-6666-4a8f-A065-082708572369}": + return ( + ); break; @@ -155,6 +172,7 @@ export default function BuildField(props) { validation={props.validation} parentField={props.parentField} parentFieldShowOnValue={props.parentFieldShowOnValue} + maxFieldLength={props.maxFieldLength} /> ); break; @@ -168,6 +186,7 @@ export default function BuildField(props) { validation={props.validation} parentField={props.parentField} parentFieldShowOnValue={props.parentFieldShowOnValue} + maxFieldLength={props.maxFieldLength} /> ); break; diff --git a/components/newappeal/buildrow.js b/components/newappeal/buildrow.js index 946aeadf..71a11819 100644 --- a/components/newappeal/buildrow.js +++ b/components/newappeal/buildrow.js @@ -36,6 +36,7 @@ export default function BuildRow(props) { var rows = xpath.select("//label/@description", doc); var fieldtype = xpath.select("//@classid", doc); var validation = xpath.select("//@validation", doc); + var maxFieldLength = xpath.select("//@maxFieldLength", doc); var datafieldname = xpath.select("//@datafieldname", doc); var datafieldcontent = xpath.select( "//@datafieldcontent", @@ -73,6 +74,9 @@ export default function BuildRow(props) { ? validation[0].value : []; + maxFieldLength = + !_.isEmpty(maxFieldLength) && maxFieldLength[0].value; + parentField = !_.isEmpty(parentField) && parentField[0].value; @@ -150,6 +154,7 @@ export default function BuildRow(props) { requiredDocumentLabel={requiredDocumentLabel} requiredDocumentValue={requiredDocumentValue} validation={validation} + maxFieldLength={maxFieldLength} dateStart={dateStart} dateEnd={dateEnd} setDocumentsList={props.props.setDocumentsList} diff --git a/components/newappeal/buildsection.js b/components/newappeal/buildsection.js index 05302282..5a95132b 100644 --- a/components/newappeal/buildsection.js +++ b/components/newappeal/buildsection.js @@ -15,7 +15,13 @@ import { setNewAppealProgress, } from "../../store/appealType/action"; import { getFormCollectionByID, getProgressObj } from "../utils"; -import { updateCase, patchCase, uploadFiles, sendEmail } from "../../actions"; +import { + updateCase, + patchCase, + uploadFiles, + sendEmail, + generateAppealPDF, +} from "../../actions"; import { FieldsTranslations } from "../elements"; import jsonpath from "jsonpath"; @@ -132,13 +138,60 @@ let BuildSection = (props) => { ) => { let incidentId = props.appealType.caseReference.incidentid; let updateBody = values || {}; + let buildAppealFilesArray = []; + console.log("attached docs: - ", buildAppealFilesArray); + + let filesUplaodObj = Object.keys(values) + .filter(function (k) { + return k.indexOf("pinswg_fileUpload") == 0; + }) + .reduce(function (newData, k) { + newData[k] = values[k]; + return newData; + }, {}); + + console.log(filesUplaodObj); + + for (let key in filesUplaodObj) { + for (let j in filesUplaodObj[key]) { + buildAppealFilesArray.push({ + "name": filesUplaodObj[key][j].name, + "size": filesUplaodObj[key][j].size, + }); + } + } + + console.log(buildAppealFilesArray); + + Object.assign(values, { "filesList": buildAppealFilesArray }); setSavingStatus(useSaveStatus); + uploadAppealFiles(values); - props.setNewAppealProgress( - getProgressObj(formXML, titleList, mandatoryFieldsData, props) + console.log( + "\n////////////////////////\n appeal pdf payload", + values, + props.props.accountDetails.containerID, + props.appealType.caseReference.ticketnumber, + "\n////////////////////////\n" ); + let pdfObj = values; + + Object.assign(pdfObj, { + "containerID": props.props.accountDetails.containerID, + "casefolderID": props.appealType.caseReference.ticketnumber, + }); + + generateAppealPDF( + pdfObj, + props.props.accountDetails.containerID, + props.appealType.caseReference.ticketnumber + ), + props.setNewAppealProgress( + getProgressObj(formXML, titleList, mandatoryFieldsData, props) + ); + let appTypeCollection = getFormCollectionByID( props.appealType.appealTypeID ); diff --git a/components/pdftemplates/appealRow_pdf.js b/components/pdftemplates/appealRow_pdf.js index 80b3019b..9284c54f 100644 --- a/components/pdftemplates/appealRow_pdf.js +++ b/components/pdftemplates/appealRow_pdf.js @@ -22,6 +22,7 @@ import ReactPDF, { Font, } from "@react-pdf/renderer"; import _ from "lodash"; +import Html from "react-pdf-html"; import { DOMParser, XMLSerializer } from "@xmldom/xmldom"; @@ -59,7 +60,11 @@ export const AppealRow_pdf = (props) => { }, logoImage: { width: "200pt" }, questionBullet: { width: "5%", fontSize: 12 }, - questionText: { width: "30%", fontSize: 12 }, + questionText: { + width: "35%", + fontSize: 12, + marginRight: 5, + }, questionTextMid: { width: "80%", fontSize: 12 }, questionTextWide: { width: "95%", fontSize: 12, marginBottom: 5 }, questionAnswer: { @@ -84,9 +89,8 @@ export const AppealRow_pdf = (props) => { }, questionAnswerWide: { color: "#757575", - width: "95%", + width: "100%", fontSize: 12, - marginLeft: "5%", border: 1, borderColor: "#eee", backgroundColor: "white", @@ -182,7 +186,6 @@ export const AppealRow_pdf = (props) => { case "{5B773807-9FB2-42db-97C3-7A91EFF8ADFF}": return ( { ); break; - + case "{E0DECE4B-6666-4a8f-A065-082708572369}": + return ( + + + + {rows[0].value} + + + + + { + props.props[ + datafieldname[0] + .value + ] + }{" "} + + + + ); + break; default: return ( { {/* {FieldsTranslations(rows[0].value)} */} {rows[0].value} - - + + {" "} { props.props[ datafieldname[0].value diff --git a/components/pdftemplates/planningappeals78_pdf.js b/components/pdftemplates/planningappeals78_pdf.js index 72667bd3..9743253d 100644 --- a/components/pdftemplates/planningappeals78_pdf.js +++ b/components/pdftemplates/planningappeals78_pdf.js @@ -61,7 +61,7 @@ const styles = StyleSheet.create({ }, questionAnswerWide: { color: "#757575", - width: "95%", + width: "100%", fontSize: 12, marginLeft: "5%", border: 1, @@ -121,7 +121,7 @@ export const planningappeals78_pdf = ({ docProps }) => { xmlStr = xmlStr.replace(/> <"/g, "><"); xmlStr = xmlStr.toString(); - console.log(xmlStr); + //console.log(xmlStr); const parser = new DOMParser(); var doc = parser.parseFromString(xmlStr, "text/xml"); @@ -177,74 +177,6 @@ export const planningappeals78_pdf = ({ docProps }) => { /> - - - Case details - - - - 1. - - {t( - "myrepresentations:s78-section-question-1" - )} - : - - - {values.caseRef} - - - - - 3. - - Site address/grid ref: - - - {values.siteAddress} - - - - 4. - - Case Type: - - - {appealTypeValue.value} - - - - - {Object.keys(titles).map((key) => ( { }} > 11. - + List of attached files diff --git a/data/formsxml/adverts.xml b/data/formsxml/adverts.xml index 00a2bfd0..f6f09f7c 100644 --- a/data/formsxml/adverts.xml +++ b/data/formsxml/adverts.xml @@ -64,7 +64,7 @@ - + @@ -166,7 +166,7 @@ - + @@ -250,7 +250,7 @@ - + diff --git a/data/formsxml/callinss77.xml b/data/formsxml/callinss77.xml index d243ea2f..e760d254 100644 --- a/data/formsxml/callinss77.xml +++ b/data/formsxml/callinss77.xml @@ -594,7 +594,7 @@ - + @@ -606,7 +606,7 @@ - + @@ -861,7 +861,7 @@ - + @@ -878,7 +878,7 @@ - + diff --git a/data/formsxml/commercialappealcas.xml b/data/formsxml/commercialappealcas.xml index ca09fe37..1bd53182 100644 --- a/data/formsxml/commercialappealcas.xml +++ b/data/formsxml/commercialappealcas.xml @@ -61,7 +61,7 @@ - + @@ -73,7 +73,7 @@ - + @@ -211,7 +211,7 @@ - + @@ -223,7 +223,7 @@ - + @@ -253,7 +253,7 @@ - + @@ -331,7 +331,7 @@ - + diff --git a/data/formsxml/commonland.xml b/data/formsxml/commonland.xml index 5d90a032..42a887f2 100644 --- a/data/formsxml/commonland.xml +++ b/data/formsxml/commonland.xml @@ -360,7 +360,7 @@ - + @@ -372,7 +372,7 @@ - + diff --git a/data/formsxml/communityinfrastructurelevys117118119.xml b/data/formsxml/communityinfrastructurelevys117118119.xml index b8ce3ac6..dc72559e 100644 --- a/data/formsxml/communityinfrastructurelevys117118119.xml +++ b/data/formsxml/communityinfrastructurelevys117118119.xml @@ -594,7 +594,7 @@ - + @@ -606,7 +606,7 @@ - + diff --git a/data/formsxml/compulsorypurchaseorders.xml b/data/formsxml/compulsorypurchaseorders.xml index db8e8d57..a4b979e8 100644 --- a/data/formsxml/compulsorypurchaseorders.xml +++ b/data/formsxml/compulsorypurchaseorders.xml @@ -360,7 +360,7 @@ - + @@ -372,7 +372,7 @@ - + diff --git a/data/formsxml/enforcementnoticeappeals174.xml b/data/formsxml/enforcementnoticeappeals174.xml index 1784d5a3..766081b9 100644 --- a/data/formsxml/enforcementnoticeappeals174.xml +++ b/data/formsxml/enforcementnoticeappeals174.xml @@ -803,7 +803,7 @@ - + @@ -815,7 +815,7 @@ - + @@ -845,7 +845,7 @@ - + @@ -1122,7 +1122,7 @@ - + diff --git a/data/formsxml/environmentalpermitting.xml b/data/formsxml/environmentalpermitting.xml index 41992bb6..d7c5f66b 100644 --- a/data/formsxml/environmentalpermitting.xml +++ b/data/formsxml/environmentalpermitting.xml @@ -360,7 +360,7 @@ - + @@ -372,7 +372,7 @@ - + diff --git a/data/formsxml/hedgeshedgerowstreepreservationreplacem.xml b/data/formsxml/hedgeshedgerowstreepreservationreplacem.xml index 823af1c2..16659864 100644 --- a/data/formsxml/hedgeshedgerowstreepreservationreplacem.xml +++ b/data/formsxml/hedgeshedgerowstreepreservationreplacem.xml @@ -360,7 +360,7 @@ - + @@ -372,7 +372,7 @@ - + diff --git a/data/formsxml/householderappealhas.xml b/data/formsxml/householderappealhas.xml index 3445cfaa..43170f86 100644 --- a/data/formsxml/householderappealhas.xml +++ b/data/formsxml/householderappealhas.xml @@ -46,7 +46,7 @@ - + @@ -58,7 +58,7 @@ - + @@ -196,7 +196,7 @@ - + @@ -208,7 +208,7 @@ - + @@ -238,13 +238,13 @@ - + - + @@ -322,7 +322,7 @@ - + diff --git a/data/formsxml/lawfuldevelopmentcertificate.xml b/data/formsxml/lawfuldevelopmentcertificate.xml index 5e9cc2a1..cc8767b7 100644 --- a/data/formsxml/lawfuldevelopmentcertificate.xml +++ b/data/formsxml/lawfuldevelopmentcertificate.xml @@ -594,7 +594,7 @@ - + @@ -861,7 +861,7 @@ - + @@ -878,7 +878,7 @@ - + diff --git a/data/formsxml/listedbuildingandconservationareaconsen.xml b/data/formsxml/listedbuildingandconservationareaconsen.xml index 1eecc28d..cf10b1ae 100644 --- a/data/formsxml/listedbuildingandconservationareaconsen.xml +++ b/data/formsxml/listedbuildingandconservationareaconsen.xml @@ -40,7 +40,7 @@ - + @@ -52,7 +52,7 @@ - + @@ -172,7 +172,7 @@ - + @@ -184,7 +184,7 @@ - + @@ -262,7 +262,7 @@ - + diff --git a/data/formsxml/maintenanceoflands217.xml b/data/formsxml/maintenanceoflands217.xml index 5b8abfca..d430ad5d 100644 --- a/data/formsxml/maintenanceoflands217.xml +++ b/data/formsxml/maintenanceoflands217.xml @@ -360,7 +360,7 @@ - + @@ -372,7 +372,7 @@ - + diff --git a/data/formsxml/miscellaneouscasework.xml b/data/formsxml/miscellaneouscasework.xml index f854944b..b97105be 100644 --- a/data/formsxml/miscellaneouscasework.xml +++ b/data/formsxml/miscellaneouscasework.xml @@ -316,7 +316,7 @@ - + @@ -328,7 +328,7 @@ - + diff --git a/data/formsxml/nonvalidation.xml b/data/formsxml/nonvalidation.xml index 831ec1e6..7bc442fb 100644 --- a/data/formsxml/nonvalidation.xml +++ b/data/formsxml/nonvalidation.xml @@ -40,7 +40,7 @@ - + diff --git a/data/formsxml/planningappeals78.xml b/data/formsxml/planningappeals78.xml index 9c98729a..d992fb9e 100644 --- a/data/formsxml/planningappeals78.xml +++ b/data/formsxml/planningappeals78.xml @@ -40,7 +40,7 @@ - + @@ -52,7 +52,7 @@ - + @@ -190,7 +190,7 @@ - + @@ -202,7 +202,7 @@ - + @@ -232,13 +232,13 @@ - + - + @@ -316,7 +316,7 @@ - + @@ -342,6 +342,12 @@