Annotate Document
A common ask in approval workflows is to stamp a document approved when the document has completed the process. Live Fields solves this problem by calling the GlobalSearch API to add a new annotation to the active document. This is an advanced example designed to illustrate the power of Live Fields as a feature.
The top of this script includes 4 default parameters that should be changed to fit a customer’s specific environment. The values here must match exactly or results will be unexpected. Unless you are comfortable with authoring and debugging Javascript, a rule of this complexity shouldn’t be altered outside of setting the default parameters.
//Change these defaults
const approvalStatusField = "Approval Status APWF"; //The name of the list we are checking.
const fieldTriggerValue = "Approved"; //The list value that triggers annotation placement.
const fieldCompleteValue = "Release to Dynamics"; //The list value to change it to on approval.
const stampValue = "Approved"; //The text of the stamp.
const doc = $$inject.properties.document;
if (doc.id === 0) {
return "Approval flow disabled during import.";
}
const token = $$inject.properties.authToken;
const approvalKey = 'approval-' + doc.hash;
var hasStoredApprovalKey = !!sessionStorage.getItem(approvalKey);
const approvalValue = $$inject.fields[approvalStatusField];
//debugger;
// Clear the session key if the document is not approved, so that it can be reset without a new session.
if (hasStoredApprovalKey && approvalValue !== fieldTriggerValue && approvalValue !== fieldCompleteValue) {
console.debug("LiveField: Clearing annotated session flag, document is no longer approved.");
sessionStorage.removeItem(approvalKey);
hasStoredApprovalKey = false;
}
const needsStamp = !hasStoredApprovalKey && approvalValue == fieldTriggerValue;
if (!needsStamp) {
console.debug("LiveField: Skipping annotation, document doest not require stamp.");
return 'Document does not require stamp.';
}
const annotationData = {
"0": [
{
"type": "stamp",
"x": 816.1113834891682,
"y": 1565.9614899051453,
"height": 401.76366322008863,
"width": 856.0945347119645,
"rotation": 319,
"username": "",
"cornerradius": 0,
"burn": false,
"outline": {
"color": "#f08080",
"opacity": 1,
"width": 15
},
"fill": {
"color": "",
"opacity": 0
},
"text": {
"value": stampValue,
"align": "left",
"font": {
"bold": true,
"italic": false,
"strike": false,
"underline": false,
"color": "#f08080",
"family": "Arial",
"size": 140
}
}
}
],
"hasBurned": false
}
const xhr = new XMLHttpRequest();
xhr.open("PUT",window.location.origin + "/square9api/api/UpdateDocument/databases/"+doc.databaseId+"/archive/"+doc.archiveId+"/document/"+doc.id+"/AnnotationData?pageCount=1&filename="+doc.fileId, false);
xhr.withCredentials = true;
xhr.setRequestHeader("auth-token", token);
xhr.setRequestHeader("secureid", doc.hash);
xhr.setRequestHeader("session-actions","annotationdata");
xhr.setRequestHeader("session-id","00000000-0000-0000-0000-000000000000");
xhr.setRequestHeader("content-type","application/json;charset=UTF-8");
xhr.setRequestHeader("accept","application/json, text/plain, */*");
xhr.send(JSON.stringify(annotationData));
console.debug("LiveField: Added approval stamp, storing session flag.");
sessionStorage.setItem(approvalKey, true);
// Update the field value to approved and save in 2 seconds.
$$inject.fields[approvalStatusField] = fieldCompleteValue;
console.debug("LiveField: Setting approved and saving.");
setTimeout(()=>{
// Ensure annotation is loaded to viewer.
angular.element(document).injector().get('annotationsService').reload();
},0);
return "Approval stamp added. Document Approved.";