top of page
Writer's pictureStephen Port

Add a document confirmation feature to your policy library

OK so in this scenario, I was just playing around with a bit of SP list formatting and wanted a method to track if users have read documents assigned to them in SharePoint. I quite liked this approach as it gives the document owner a view against each document with who it has been assigned to and if those people have confirmed to have read it or not.

It's a pretty straight forward one here. You need two people pick columns with multiple select turned on. In this example I have a column called Read and a column called Assigned To.


In the Read column I paste the below advanced formatting in, and I now have a nice tracker with interactive button for my users to confirm they have read the document.

Here's what we have achieve with this.

  • A button to confirm or unconfirm reading of the document that changes colour and icon depending on status.

  • A counter showing how many people have confirmed against the assigned to.

  • A view of assignees.

  • A view of confirmed people.


Code below as always!


{

  "$schema": "https://developer.microsoft.com/json-schemas/sp/v2/column-formatting.schema.json",

  "elmType": "div",

  "style": {

    "display": "flex",

    "flex-direction": "column",

    "align-items": "flex-start"

  },

  "children": [

    {

      "elmType": "div",

      "style": {

        "display": "flex",

        "flex-direction": "row",

        "align-items": "center",

        "cursor": "pointer",

        "padding": "3px 5px",

        "border-radius": "5px",

        "background-color": "=if(indexOf([$Read.email], @me) > -1, '#d4edda', '#f8d7da')",

        "color": "=if(indexOf([$Read.email], @me) > -1, '#155724', '#721c24')",

        "margin-bottom": "5px"

      },

      "attributes": {

        "title": "=if(indexOf([$Read.email], @me) > -1, 'Click to mark as unread', 'Click to mark as read')"

      },

      "customRowAction": {

        "action": "setValue",

        "actionInput": {

          "Read": "=if(indexOf([$Read.email], @me) > -1, removeFrom([$Read], @me), appendTo([$Read], @me))"

        }

      },

      "children": [

        {

          "elmType": "div",

          "attributes": {

            "iconName": "=if(indexOf([$Read.email], @me) > -1, 'CheckMark', 'StatusCircleErrorX')"

          },

          "style": {

            "margin-right": "5px"

          }

        },

        {

          "elmType": "span",

          "txtContent": "=if(indexOf([$Read.email], @me) > -1, 'Confirmed', 'Click to confirm')"

        }

      ]

    },

    {

      "elmType": "div",

      "style": {

        "margin-top": "10px",

        "font-weight": "bold"

      },

      "txtContent": "=length([$Read]) + ' out of ' + length([$AssignedTo]) + ' people confirmed'"

    },

    {

      "elmType": "div",

      "style": {

        "margin-top": "10px"

      },

      "children": [

        {

          "elmType": "div",

          "style": {

            "font-weight": "bold",

            "margin-bottom": "5px"

          },

          "txtContent": "Assigned to:"

        },

        {

          "forEach": "person in [$AssignedTo]",

          "elmType": "span",

          "style": {

            "margin-right": "5px",

            "padding": "2px 4px",

            "border": "none",

            "border-radius": "3px",

            "display": "inline-block"

          },

          "children": [

            {

              "elmType": "img",

              "attributes": {

                "src": "=getUserImage([$person.email], 'S')",

                "title": "[$person.title]"

              },

              "style": {

                "width": "20px",

                "height": "20px",

                "border-radius": "50%",

                "margin-right": "5px"

              }

            },

            {

              "elmType": "span",

              "txtContent": "[$person.title]"

            }

          ]

        }

      ]

    },

    {

      "elmType": "div",

      "style": {

        "margin-top": "10px"

      },

      "children": [

        {

          "elmType": "div",

          "style": {

            "font-weight": "bold",

            "margin-bottom": "5px"

          },

          "txtContent": "Confirmed by:"

        },

        {

          "forEach": "person in [$Read]",

          "elmType": "span",

          "style": {

            "margin-right": "5px",

            "padding": "2px 4px",

            "border": "none",

            "border-radius": "3px",

            "display": "inline-block"

          },

          "children": [

            {

              "elmType": "img",

              "attributes": {

                "src": "=getUserImage([$person.email], 'S')",

                "title": "[$person.title]"

              },

              "style": {

                "width": "20px",

                "height": "20px",

                "border-radius": "50%",

                "margin-right": "5px"

              }

            },

            {

              "elmType": "span",

              "txtContent": "[$person.title]"

            }

          ]

        }

      ]

    }

  ]

}

396 views

Proven expertise across all applications

Or send a quick email
info@dapt.uk

Our consultants have worked across multiple sectors and disciplines to bring best in class consultancy to our clients. We understand that Microsoft 365 is much more than individual applications and help organisations bring these varied applications together into usable solutions.

  • LinkedIn
  • YouTube
  • Facebook
  • Instagram
  • Twitter
bottom of page