Back to view formats
View formattingSharePoint Online

Project Health Dashboard

This is a template for Project health statuses; it has nice features such as Risk scoring, Severity of the project, Schedule timing, Hover effects that provide the latest project updates, Theme Colors, Project Team members, and the cost of the project.

Project Health Dashboard formatting preview
Sample preview · View original image

Copy. Apply. Make it yours.

Get this format

1 definition

Review the requirements below, then paste this JSON into the matching formatting panel. Show me where.

Use your list's internal column names and replace any tenant-specific URLs or flow IDs. Formatting is presentation, not a way to secure data.

View formatting
Download JSON
{
  "$schema": "https://developer.microsoft.com/json-schemas/sp/v2/row-formatting.schema.json",
  "hideColumnHeader": true,
  "hideSelection": true,
  "rowFormatter": {
    "elmType": "div",
    "style": {
      "flex-wrap": "wrap",
      "margin-bottom": "25px"
    },
    "attributes": {
      "class": "sp-row-card ms-fontColor-themePrimary"
    },
    "children": [
      {
        "elmType": "div",
        "style": {
          "text-align": "left",
          "padding-bottom": "15px",
          "width": "100%"
        },
        "children": [
          {
            "elmType": "span",
            "txtContent": "[$Title]",
            "attributes": {
              "class": "ms-fontSize-32"
            },
            "style": {
              "float": "left"
            }
          },
          {
            "elmType": "span",
            "txtContent": "[$ProjectCost.displayValue]",
            "style": {
              "float": "right"
            },
            "attributes": {
              "class": "ms-fontSize-20"
            }
          }
        ]
      },
      {
        "elmType": "div",
        "style": {
          "display": "flex",
          "padding-bottom": "15px"
        },
        "children": [
          {
            "forEach": "projectIterator in [$ProjectMembers]",
            "elmType": "div",
            "style": {
              "width": "100px",
              "height": "100px",
              "overflow": "hidden",
              "border-radius": "50%",
              "margin": "2px"
            },
            "children": [
              {
                "elmType": "img",
                "attributes": {
                  "src": "=getUserImage([$projectIterator.email],'large')"
                },
                "style": {
                  "position": "relative",
                  "top": "50%",
                  "left": "50%",
                  "width": "100%",
                  "height": "100%",
                  "margin-left": "-50%",
                  "margin-top": "-50%",
                  "display": "=if(loopIndex('projectIterator') >= 5, 'none', '')"
                },
                "defaultHoverField": "[$projectIterator]"
              },
              {
                "elmType": "div",
                "attributes": {
                  "title": "=join([$ProjectMembers.title], ', ')",
                  "class": "ms-bgColor-neutralLight ms-fontColor-neutralSecondary"
                },
                "style": {
                  "width": "100%",
                  "height": "100%",
                  "font-size": "28px",
                  "line-height": "28px",
                  "display": "=if(loopIndex('projectIterator') == 5, 'flex', 'none')",
                  "align-items": "center",
                  "justify-content": "center"
                },
                "children": [
                  {
                    "elmType": "div",
                    "txtContent": "='+' + toString(length([$ProjectMembers]) - 5)"
                  }
                ]
              }
            ]
          }
        ]
      },
      {
        "elmType": "div",
        "style": {
          "text-align": "center",
          "margin-top": "10px",
          "margin-left": "10px",
          "width": "30%",
          "display": "flex",
          "column-gap": "10px"
        },
        "children": [
          {
            "elmType": "div",
            "style": {
              "flex": "1",
              "display": "flex",
              "flex-direction": "column",
              "justify-content": "space-between"
            },
            "attributes": {
              "class": "='sp-row-card ' + if([$Risk] <= 3,'sp-field-severity--good', if([$Risk] >= 4 && [$Risk] <= 7,'sp-field-severity--warning', 'sp-field-severity--blocked'))"
            },
            "children": [
              {
                "elmType": "span",
                "attributes": {
                  "iconName": "=if([$Risk] <= 3, 'DoubleChevronDown8', if([$Risk] >= 4 && [$Risk] <= 7,'Remote', 'DoubleChevronUp8'))"
                },
                "style": {
                  "font-size": "xx-large"
                }
              },
              {
                "elmType": "span",
                "txtContent": "=if([$Risk] <= 3, 'Risk Low', if([$Risk] >= 4 && [$Risk] <= 7, 'Risk Medium', 'Risk High'))",
                "style": {
                  "font-size": "x-large"
                }
              }
            ]
          },
          {
            "elmType": "div",
            "style": {
              "flex": "1",
              "display": "flex",
              "flex-direction": "column",
              "justify-content": "space-between"
            },
            "children": [
              {
                "elmType": "span",
                "attributes": {
                  "iconName": "=if([$OnSchedule], 'LikeSolid', 'DislikeSolid')"
                },
                "style": {
                  "font-size": "xx-large"
                }
              },
              {
                "elmType": "span",
                "txtContent": "=if([$OnSchedule], 'On-Time', 'Delayed')",
                "style": {
                  "font-size": "x-large"
                }
              }
            ],
            "attributes": {
              "class": "='sp-row-card ' + if([$OnSchedule], 'sp-field-severity--good',' sp-field-severity--warning')"
            }
          }
        ]
      },
      {
        "elmType": "div",
        "style": {
          "display": "flex",
          "width": "100%",
          "margin-left": "-15px"
        },
        "children": [
          {
            "elmType": "span",
            "style": {
              "font-size": "xx-large",
              "width": "100%",
              "margin-left": "=if([$Severity] == 'Critical', '12.5%', if([$Severity] == 'Poor', '37.5%', if([$Severity] == 'Fair', '62.5%', '87.5%')))"
            },
            "children": [
              {
                "elmType": "span",
                "attributes": {
                  "iconName": "DrillDownSolid",
                  "class": "ms-motion-slideRightIn ms-motion-duration-4 ms-fontColor-themePrimary"
                },
                "customCardProps": {
                  "directionalHint": "bottomCenter",
                  "isBeakVisible": true,
                  "openOnEvent": "hover",
                  "formatter": {
                    "elmType": "div",
                    "style": {
                      "display": "flex",
                      "flex-direction": "column",
                      "height": "200px",
                      "width": "450px"
                    },
                    "attributes": {
                      "class": "ms-fontWeight-regular"
                    },
                    "children": [
                      {
                        "elmType": "span",
                        "style": {
                          "background-colord": "=if([$Severity] == 'Critical', '#a4262c', if([$Severity] == 'Poor', '#d83b01', if([$Severity] == 'Fair', '#ffb900', if([$Severity] == 'Good', '#107c10', 'white'))))",
                          "display": "flex",
                          "width": "100%",
                          "justify-content": "center",
                          "padding-bottom": "4px",
                          "margin-bottom": "5px"
                        },
                        "attributes": {
                          "class": "='ms-fontColor-white ms-fontWeight-semibold ms-fontSize-20 ' + if([$Severity] == 'Critical', 'ms-bgColor-sharedRed20', if([$Severity] == 'Poor', 'ms-bgColor-orange', if([$Severity] == 'Fair', 'ms-bgColor-yellow', if([$Severity] == 'Good', 'ms-bgColor-green', ''))))"
                        },
                        "txtContent": "Project Updates"
                      },
                      {
                        "elmType": "span",
                        "txtContent": "[$ProjectUpdates]",
                        "attributes": {
                          "class": "ms-fontWeight-regular ms-fontSize-16"
                        }
                      }
                    ]
                  }
                }
              }
            ]
          }
        ]
      },
      {
        "elmType": "div",
        "style": {
          "display": "flex",
          "width": "100%",
          "height": "15px"
        },
        "children": [
          {
            "elmType": "div",
            "style": {
              "border-bottom-left-radius": "15px",
              "border-top-left-radius": "15px",
              "flex": "1"
            },
            "attributes": {
              "class": "ms-bgColor-sharedRed20"
            }
          },
          {
            "elmType": "div",
            "style": {
              "flex": "1"
            },
            "attributes": {
              "class": "ms-bgColor-orange"
            }
          },
          {
            "elmType": "div",
            "style": {
              "flex": "1"
            },
            "attributes": {
              "class": "ms-bgColor-yellow"
            }
          },
          {
            "elmType": "div",
            "style": {
              "border-bottom-right-radius": "15px",
              "border-top-right-radius": "15px",
              "flex": "1"
            },
            "attributes": {
              "class": "ms-bgColor-green"
            }
          }
        ]
      },
      {
        "elmType": "div",
        "style": {
          "display": "flex",
          "width": "100%"
        },
        "children": [
          {
            "elmType": "span",
            "style": {
              "text-align": "center",
              "flex": "1"
            },
            "attributes": {
              "class": "ms-fontSize-28 ms-fontColor-sharedRed20"
            },
            "txtContent": "Critical"
          },
          {
            "elmType": "span",
            "style": {
              "text-align": "center",
              "flex": "1"
            },
            "attributes": {
              "class": "ms-fontSize-28 ms-fontColor-orange"
            },
            "txtContent": "Poor"
          },
          {
            "elmType": "span",
            "style": {
              "text-align": "center",
              "flex": "1"
            },
            "attributes": {
              "class": "ms-fontSize-28 ms-fontColor-yellow"
            },
            "txtContent": "Fair"
          },
          {
            "elmType": "span",
            "style": {
              "text-align": "center",
              "flex": "1"
            },
            "attributes": {
              "class": "ms-fontSize-28 ms-fontColor-green"
            },
            "txtContent": "Good"
          }
        ]
      }
    ]
  }
}

From the contributor

How to use this sample

Summary

This is a template for Project health statuses; it has nice features such as Risk scoring, Severity of the project, Schedule timing, Hover effects that provide the latest project updates, Theme Colors, Project Team members, and the cost of the project.

screenshot of the sample

Hover Display

screenshot of format with hover

View requirements

This format expects the following columns to be part of the view:

Type Internal Name Required Details
Single line of text Title Yes
Mulit-Person ProjectMembers Yes
Currency ProjectCost Yes
Number Risk Yes
Yes/No OnSchedule Yes
Choice Severity Yes Critical, Poor, Fair, Good
Multi-Text ProjectUpdates Yes

Sample

Solution Author(s)
project-health-dashboard.json Andres Ibarra

Version history

Version Date Comments
1.0 December 29, 2020 Initial release

Disclaimer

THIS CODE IS PROVIDED AS IS WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING ANY IMPLIED WARRANTIES OF FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABILITY, OR NON-INFRINGEMENT.


Additional notes

None