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];

// 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.");
  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("accept","application/json, text/plain, */*");

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.");
  // Ensure annotation is loaded to viewer.

return "Approval stamp added. Document Approved.";