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

            }

          ]

        }

      ]

    }

  ]

}

356 views

Comments


bottom of page