UTCM.Format.ps1xml

<?xml version="1.0" encoding="utf-8"?>
<Configuration>
  <ViewDefinitions>

    <!-- ═══════════════════════════════════════════════════════════════════════ -->
    <!-- Configuration Monitors -->
    <!-- ═══════════════════════════════════════════════════════════════════════ -->
    <View>
      <Name>ConfigurationMonitor-TableView</Name>
      <ViewSelectedBy>
        <TypeName>Microsoft.Graph.Beta.ConfigurationMonitor</TypeName>
      </ViewSelectedBy>
      <TableControl>
        <TableHeaders>
          <TableColumnHeader>
            <Label>DisplayName</Label>
            <Width>30</Width>
          </TableColumnHeader>
          <TableColumnHeader>
            <Label>State</Label>
            <Width>12</Width>
          </TableColumnHeader>
          <TableColumnHeader>
            <Label>Resources</Label>
            <Width>10</Width>
            <Alignment>Right</Alignment>
          </TableColumnHeader>
          <TableColumnHeader>
            <Label>Schedule</Label>
            <Width>15</Width>
          </TableColumnHeader>
          <TableColumnHeader>
            <Label>Created</Label>
            <Width>20</Width>
          </TableColumnHeader>
        </TableHeaders>
        <TableRowEntries>
          <TableRowEntry>
            <TableColumnItems>
              <TableColumnItem>
                <PropertyName>displayName</PropertyName>
              </TableColumnItem>
              <TableColumnItem>
                <ScriptBlock>
                  switch ($_.state) {
                    'active' { "`e[32m$($_.state)`e[0m" }
                    'inactive' { "`e[90m$($_.state)`e[0m" }
                    'paused' { "`e[33m$($_.state)`e[0m" }
                    default { $_.state }
                  }
                </ScriptBlock>
              </TableColumnItem>
              <TableColumnItem>
                <ScriptBlock>
                  if ($_.resourceTypes) { $_.resourceTypes.Count } else { 0 }
                </ScriptBlock>
              </TableColumnItem>
              <TableColumnItem>
                <ScriptBlock>
                  if ($_.schedule.interval) { "$($_.schedule.interval) hours" } else { 'N/A' }
                </ScriptBlock>
              </TableColumnItem>
              <TableColumnItem>
                <ScriptBlock>
                  if ($_.createdDateTime) {
                    [datetime]::Parse($_.createdDateTime).ToString('yyyy-MM-dd HH:mm')
                  } else { 'N/A' }
                </ScriptBlock>
              </TableColumnItem>
            </TableColumnItems>
          </TableRowEntry>
        </TableRowEntries>
      </TableControl>
    </View>

    <!-- ═══════════════════════════════════════════════════════════════════════ -->
    <!-- Snapshot Jobs -->
    <!-- ═══════════════════════════════════════════════════════════════════════ -->
    <View>
      <Name>SnapshotJob-TableView</Name>
      <ViewSelectedBy>
        <TypeName>Microsoft.Graph.Beta.ConfigurationSnapshotJob</TypeName>
      </ViewSelectedBy>
      <TableControl>
        <TableHeaders>
          <TableColumnHeader>
            <Label>ID</Label>
            <Width>10</Width>
          </TableColumnHeader>
          <TableColumnHeader>
            <Label>Status</Label>
            <Width>18</Width>
          </TableColumnHeader>
          <TableColumnHeader>
            <Label>Resources</Label>
            <Width>10</Width>
            <Alignment>Right</Alignment>
          </TableColumnHeader>
          <TableColumnHeader>
            <Label>Types</Label>
            <Width>8</Width>
            <Alignment>Right</Alignment>
          </TableColumnHeader>
          <TableColumnHeader>
            <Label>Created</Label>
            <Width>20</Width>
          </TableColumnHeader>
          <TableColumnHeader>
            <Label>Duration</Label>
            <Width>10</Width>
          </TableColumnHeader>
        </TableHeaders>
        <TableRowEntries>
          <TableRowEntry>
            <TableColumnItems>
              <TableColumnItem>
                <ScriptBlock>
                  $_.id.Substring(0, [Math]::Min(8, $_.id.Length))
                </ScriptBlock>
              </TableColumnItem>
              <TableColumnItem>
                <ScriptBlock>
                  switch ($_.status) {
                    'succeeded' { "`e[32m✓ $($_.status)`e[0m" }
                    'partiallySuccessful' { "`e[33m⚠ $($_.status)`e[0m" }
                    'failed' { "`e[31m✗ $($_.status)`e[0m" }
                    'inProgress' { "`e[36m◌ $($_.status)`e[0m" }
                    'notStarted' { "`e[90m○ $($_.status)`e[0m" }
                    default { $_.status }
                  }
                </ScriptBlock>
              </TableColumnItem>
              <TableColumnItem>
                <ScriptBlock>
                  if ($_.resourceCount) { $_.resourceCount } else { 'N/A' }
                </ScriptBlock>
              </TableColumnItem>
              <TableColumnItem>
                <ScriptBlock>
                  if ($_.resourceTypeCount) { $_.resourceTypeCount } else { 'N/A' }
                </ScriptBlock>
              </TableColumnItem>
              <TableColumnItem>
                <ScriptBlock>
                  if ($_.createdDateTime) {
                    [datetime]::Parse($_.createdDateTime).ToString('yyyy-MM-dd HH:mm')
                  } else { 'N/A' }
                </ScriptBlock>
              </TableColumnItem>
              <TableColumnItem>
                <ScriptBlock>
                  if ($_.createdDateTime -and $_.lastActionDateTime) {
                    $start = [datetime]::Parse($_.createdDateTime)
                    $end = [datetime]::Parse($_.lastActionDateTime)
                    $duration = $end - $start
                    if ($duration.TotalMinutes -lt 1) {
                      "$([int]$duration.TotalSeconds)s"
                    } else {
                      "$([int]$duration.TotalMinutes)m"
                    }
                  } else { 'N/A' }
                </ScriptBlock>
              </TableColumnItem>
            </TableColumnItems>
          </TableRowEntry>
        </TableRowEntries>
      </TableControl>
    </View>

    <!-- ═══════════════════════════════════════════════════════════════════════ -->
    <!-- Configuration Drifts -->
    <!-- ═══════════════════════════════════════════════════════════════════════ -->
    <View>
      <Name>ConfigurationDrift-TableView</Name>
      <ViewSelectedBy>
        <TypeName>Microsoft.Graph.Beta.ConfigurationDrift</TypeName>
      </ViewSelectedBy>
      <TableControl>
        <TableHeaders>
          <TableColumnHeader>
            <Label>Resource</Label>
            <Width>35</Width>
          </TableColumnHeader>
          <TableColumnHeader>
            <Label>Type</Label>
            <Width>35</Width>
          </TableColumnHeader>
          <TableColumnHeader>
            <Label>Status</Label>
            <Width>15</Width>
          </TableColumnHeader>
          <TableColumnHeader>
            <Label>Detected</Label>
            <Width>20</Width>
          </TableColumnHeader>
        </TableHeaders>
        <TableRowEntries>
          <TableRowEntry>
            <TableColumnItems>
              <TableColumnItem>
                <PropertyName>displayName</PropertyName>
              </TableColumnItem>
              <TableColumnItem>
                <PropertyName>resourceType</PropertyName>
              </TableColumnItem>
              <TableColumnItem>
                <ScriptBlock>
                  switch ($_.status) {
                    'inScope' { "`e[32m✓ $($_.status)`e[0m" }
                    'drifted' { "`e[33m⚠ $($_.status)`e[0m" }
                    'outOfScope' { "`e[90m○ $($_.status)`e[0m" }
                    default { $_.status }
                  }
                </ScriptBlock>
              </TableColumnItem>
              <TableColumnItem>
                <ScriptBlock>
                  if ($_.lastModifiedDateTime) {
                    [datetime]::Parse($_.lastModifiedDateTime).ToString('yyyy-MM-dd HH:mm')
                  } else { 'N/A' }
                </ScriptBlock>
              </TableColumnItem>
            </TableColumnItems>
          </TableRowEntry>
        </TableRowEntries>
      </TableControl>
    </View>

    <!-- ═══════════════════════════════════════════════════════════════════════ -->
    <!-- Snapshot Comparison Summary -->
    <!-- ═══════════════════════════════════════════════════════════════════════ -->
    <View>
      <Name>SnapshotComparison-Summary</Name>
      <ViewSelectedBy>
        <TypeName>UTCM.SnapshotComparison</TypeName>
      </ViewSelectedBy>
      <TableControl>
        <TableHeaders>
          <TableColumnHeader>
            <Label>Total Changes</Label>
            <Width>15</Width>
            <Alignment>Right</Alignment>
          </TableColumnHeader>
          <TableColumnHeader>
            <Label>Added</Label>
            <Width>10</Width>
            <Alignment>Right</Alignment>
          </TableColumnHeader>
          <TableColumnHeader>
            <Label>Removed</Label>
            <Width>10</Width>
            <Alignment>Right</Alignment>
          </TableColumnHeader>
          <TableColumnHeader>
            <Label>Modified</Label>
            <Width>10</Width>
            <Alignment>Right</Alignment>
          </TableColumnHeader>
          <TableColumnHeader>
            <Label>Coverage Gaps</Label>
            <Width>15</Width>
            <Alignment>Right</Alignment>
          </TableColumnHeader>
          <TableColumnHeader>
            <Label>Shared Types</Label>
            <Width>15</Width>
            <Alignment>Right</Alignment>
          </TableColumnHeader>
        </TableHeaders>
        <TableRowEntries>
          <TableRowEntry>
            <TableColumnItems>
              <TableColumnItem>
                <ScriptBlock>
                  if ($_.Summary.TotalChanges -eq 0) {
                    "`e[32m$($_.Summary.TotalChanges)`e[0m"
                  } else {
                    "`e[33m$($_.Summary.TotalChanges)`e[0m"
                  }
                </ScriptBlock>
              </TableColumnItem>
              <TableColumnItem>
                <ScriptBlock>
                  if ($_.Summary.AddedCount -gt 0) {
                    "`e[32m+$($_.Summary.AddedCount)`e[0m"
                  } else {
                    $_.Summary.AddedCount
                  }
                </ScriptBlock>
              </TableColumnItem>
              <TableColumnItem>
                <ScriptBlock>
                  if ($_.Summary.RemovedCount -gt 0) {
                    "`e[31m-$($_.Summary.RemovedCount)`e[0m"
                  } else {
                    $_.Summary.RemovedCount
                  }
                </ScriptBlock>
              </TableColumnItem>
              <TableColumnItem>
                <ScriptBlock>
                  if ($_.Summary.ModifiedCount -gt 0) {
                    "`e[33m~$($_.Summary.ModifiedCount)`e[0m"
                  } else {
                    $_.Summary.ModifiedCount
                  }
                </ScriptBlock>
              </TableColumnItem>
              <TableColumnItem>
                <PropertyName>Summary.CoverageGapsCount</PropertyName>
              </TableColumnItem>
              <TableColumnItem>
                <PropertyName>Summary.SharedTypes</PropertyName>
              </TableColumnItem>
            </TableColumnItems>
          </TableRowEntry>
        </TableRowEntries>
      </TableControl>
    </View>

  </ViewDefinitions>
</Configuration>