Rock v18 Icon Change

Rock v18 replaces Font Awesome with Tabler Icons. Custom content—block HTML, Lava, and attribute values—may still reference Font Awesome classes (fa fa-*, fas fa-*, etc.). Use the SQL queries below to find those references so you can update them to Tabler equivalents before or after upgrading.

Why This Matters

After upgrading to Rock v18:

  • Icons may not render: Font Awesome classes in your content will no longer match the new icon set.
  • Three places to check: Icons live in HTML content (e.g., HTML blocks, Lava output), in attribute values (e.g., block settings, custom attributes whose name or key includes "icon"), and in table columns (e.g., IconCssClass, AchievementIconCssClass, TopSignalIconCssClass on core Rock entities).
  • Proactive cleanup: Running these queries before or after upgrade helps you build a list of pages and blocks to update, so nothing is missed.

What the Queries Find

  • Query 1 – HTML content: Blocks that have Font Awesome markup in their stored HTML (e.g., <i class="fa fa-*"> or <i class="fas fa-*">).
  • Query 2 – Attribute values: Attribute values that contain Font Awesome class text (fa fa-* or fas fa-*), limited to attributes whose name or key includes "icon", and optionally linked to block/page and HTML content for context.
  • Query 3 – IconCssClass table columns: Rows in core Rock tables whose icon column (IconCssClass, AchievementIconCssClass, TopSignalIconCssClass, SignalIconCssClass) contains Font Awesome (fa fa-*, fas fa-*, far fa-*). Returns TableName, EntityId, EntityName, and IconCssClass so you can find and update each record in Rock Admin.

Read-only: These queries only SELECT data. They do not change any content. Run them in SQL Server Management Studio, Azure Data Studio, or another tool that can execute SELECT against your Rock database.

Query 1: Font Awesome Icons in HTML Content

Use this to find blocks whose HTML content contains Font Awesome icon markup. Results include Block Id, Block Name, Block Type, Page Id, Page Title, Zone, admin path, and timestamps.

SQL: Find blocks with Font Awesome in HtmlContent

-- Finds all blocks that contain Font Awesome icons in stored HTML.
SELECT DISTINCT
    b.[Id] AS [BlockId],
    b.[Name] AS [BlockName],
    bt.[Name] AS [BlockType],
    pg.[Id] AS [PageId],
    pg.[PageTitle] AS [PageName],
    b.[Zone] AS [PageZone],
    CONCAT(
        (SELECT TOP 1 av.Value FROM [AttributeValue] av
         INNER JOIN [Attribute] a ON av.[AttributeId] = a.[Id] AND a.[Key] = 'InternalApplicationRoot'),
        'page/', pg.[Id]
    ) AS [Path],
    b.CreatedDateTime,
    b.ModifiedDateTime
FROM [AttributeValue] av
INNER JOIN [Attribute] a ON av.[AttributeId] = a.[Id]
INNER JOIN [Block] b ON b.[Id] = av.[EntityId]
INNER JOIN [Page] pg ON pg.[Id] = b.[PageId]
INNER JOIN [BlockType] bt ON bt.[Id] = b.[BlockTypeId]
INNER JOIN [PersonAlias] pa ON pa.[Id] = b.[CreatedByPersonAliasId]
INNER JOIN [Person] p ON p.[Id] = pa.[PersonId]
INNER JOIN [HtmlContent] hc ON hc.[BlockId] = b.[Id]
WHERE
    (hc.[Content] LIKE '%<i class="fa fa-%' OR hc.[Content] LIKE '%<i class="fas fa-%')
ORDER BY
    bt.[Name] DESC,
    b.[ModifiedDateTime] DESC

Note: The LIKE patterns look for <i class="fa fa- and <i class="fas fa-. If your content uses different formatting (e.g., single quotes, extra spaces), you may need to add or adjust LIKE conditions.

Query 2: Font Awesome Icons in Attribute Values

Use this to find attribute values that store Font Awesome icon classes (e.g., icon picker or text attributes). It focuses on attributes whose name or key contains "icon" and returns the stored value, related block/page when the attribute is on a block, and a link to the admin page.

SQL: Find attribute values containing Font Awesome

-- Finds all attribute values that contain Font Awesome icons
-- (attributes with "icon" in name or key).
SELECT DISTINCT
    av.[Value] AS [IconValue],
    pg.[Id] AS [PageId],
    pg.[PageTitle] AS [PageName],
    b.[Zone] AS [PageZone],
    hc.[Content] AS [HtmlContent],
    CONCAT(
        (SELECT TOP 1 av2.Value FROM [AttributeValue] av2
         INNER JOIN [Attribute] a2 ON av2.[AttributeId] = a2.[Id] AND a2.[Key] = 'InternalApplicationRoot'),
        'page/', pg.[Id]
    ) AS [Path],
    b.[CreatedDateTime],
    b.[ModifiedDateTime]
FROM [Attribute] a
INNER JOIN [AttributeValue] av ON av.[AttributeId] = a.[Id]
    AND av.[Value] IS NOT NULL
    AND LTRIM(RTRIM(av.[Value])) <> ''
    AND (av.[Value] LIKE '%fa fa-%' OR av.[Value] LIKE '%fas fa-%')
LEFT JOIN [EntityType] e ON a.[EntityTypeId] = e.[Id]
LEFT JOIN [Block] b ON (
    a.[EntityTypeId] = (SELECT [Id] FROM [EntityType] WHERE [Name] = 'Rock.Model.Block')
    AND av.[EntityId] = b.[Id]
)
LEFT JOIN [BlockType] bt ON b.[BlockTypeId] = bt.[Id]
LEFT JOIN [Page] pg ON b.[PageId] = pg.[Id]
LEFT JOIN [HtmlContent] hc ON hc.[BlockId] = b.[Id]
    AND (hc.[Content] LIKE '%fa fa-%' OR hc.[Content] LIKE '%fas fa-%')
WHERE (LOWER(a.[Name]) LIKE '%icon%' OR LOWER(a.[Key]) LIKE '%icon%')
ORDER BY e.[Name], a.[Name], b.[ModifiedDateTime] DESC

Results include the raw IconValue, so you can see exactly which Font Awesome class is stored and then look up the Tabler equivalent.

Query 3: Font Awesome Icons in IconCssClass Table Columns

Use this to find table columns (not attribute values) that store Font Awesome icon classes. Rock stores icon CSS on many entity types in columns such as IconCssClass, AchievementIconCssClass (AchievementType), TopSignalIconCssClass (Person), and SignalIconCssClass (SignalType). The query returns one row per matching record with TableName, EntityId, EntityName, and IconCssClass. Use TableName and EntityId to open the record in Rock Admin (e.g., Pages, Workflow Types, Categories) and update the icon to the Tabler equivalent.

SQL: Find IconCssClass (and similar) column values containing Font Awesome

-- Finds IconCssClass / AchievementIconCssClass / TopSignalIconCssClass / SignalIconCssClass
-- table columns that contain Font Awesome (fa/fas/far). Queries table columns, not Attribute/AttributeValue.
SELECT [TableName], [EntityId], [EntityName], [IconCssClass] FROM (
  SELECT N'AchievementType' AS [TableName], [Id] AS [EntityId], [Name] AS [EntityName], [AchievementIconCssClass] AS [IconCssClass]
  FROM [AchievementType]
  WHERE [AchievementIconCssClass] IS NOT NULL AND LTRIM(RTRIM([AchievementIconCssClass])) <> ''
    AND ([AchievementIconCssClass] LIKE '%fa fa-%' OR [AchievementIconCssClass] LIKE '%fas fa-%' OR [AchievementIconCssClass] LIKE '%far fa-%')
  UNION ALL
  SELECT N'AssessmentType', [Id], ISNULL([Title], N''), [IconCssClass]
  FROM [AssessmentType]
  WHERE [IconCssClass] IS NOT NULL AND LTRIM(RTRIM([IconCssClass])) <> ''
    AND ([IconCssClass] LIKE '%fa fa-%' OR [IconCssClass] LIKE '%fas fa-%' OR [IconCssClass] LIKE '%far fa-%')
  UNION ALL
  SELECT N'Attribute', [Id], ISNULL([Name], [Key]), [IconCssClass]
  FROM [Attribute]
  WHERE [IconCssClass] IS NOT NULL AND LTRIM(RTRIM([IconCssClass])) <> ''
    AND ([IconCssClass] LIKE '%fa fa-%' OR [IconCssClass] LIKE '%fas fa-%' OR [IconCssClass] LIKE '%far fa-%')
  UNION ALL
  SELECT N'BinaryFileType', [Id], [Name], [IconCssClass]
  FROM [BinaryFileType]
  WHERE [IconCssClass] IS NOT NULL AND LTRIM(RTRIM([IconCssClass])) <> ''
    AND ([IconCssClass] LIKE '%fa fa-%' OR [IconCssClass] LIKE '%fas fa-%' OR [IconCssClass] LIKE '%far fa-%')
  UNION ALL
  SELECT N'Category', [Id], [Name], [IconCssClass]
  FROM [Category]
  WHERE [IconCssClass] IS NOT NULL AND LTRIM(RTRIM([IconCssClass])) <> ''
    AND ([IconCssClass] LIKE '%fa fa-%' OR [IconCssClass] LIKE '%fas fa-%' OR [IconCssClass] LIKE '%far fa-%')
  UNION ALL
  SELECT N'ConnectionOpportunity', [Id], [Name], [IconCssClass]
  FROM [ConnectionOpportunity]
  WHERE [IconCssClass] IS NOT NULL AND LTRIM(RTRIM([IconCssClass])) <> ''
    AND ([IconCssClass] LIKE '%fa fa-%' OR [IconCssClass] LIKE '%fas fa-%' OR [IconCssClass] LIKE '%far fa-%')
  UNION ALL
  SELECT N'ConnectionType', [Id], [Name], [IconCssClass]
  FROM [ConnectionType]
  WHERE [IconCssClass] IS NOT NULL AND LTRIM(RTRIM([IconCssClass])) <> ''
    AND ([IconCssClass] LIKE '%fa fa-%' OR [IconCssClass] LIKE '%fas fa-%' OR [IconCssClass] LIKE '%far fa-%')
  UNION ALL
  SELECT N'ContentChannel', [Id], [Name], [IconCssClass]
  FROM [ContentChannel]
  WHERE [IconCssClass] IS NOT NULL AND LTRIM(RTRIM([IconCssClass])) <> ''
    AND ([IconCssClass] LIKE '%fa fa-%' OR [IconCssClass] LIKE '%fas fa-%' OR [IconCssClass] LIKE '%far fa-%')
  UNION ALL
  SELECT N'DataView', [Id], [Name], [IconCssClass]
  FROM [DataView]
  WHERE [IconCssClass] IS NOT NULL AND LTRIM(RTRIM([IconCssClass])) <> ''
    AND ([IconCssClass] LIKE '%fa fa-%' OR [IconCssClass] LIKE '%fas fa-%' OR [IconCssClass] LIKE '%far fa-%')
  UNION ALL
  SELECT N'DocumentType', [Id], [Name], [IconCssClass]
  FROM [DocumentType]
  WHERE [IconCssClass] IS NOT NULL AND LTRIM(RTRIM([IconCssClass])) <> ''
    AND ([IconCssClass] LIKE '%fa fa-%' OR [IconCssClass] LIKE '%fas fa-%' OR [IconCssClass] LIKE '%far fa-%')
  UNION ALL
  SELECT N'EventCalendar', [Id], [Name], [IconCssClass]
  FROM [EventCalendar]
  WHERE [IconCssClass] IS NOT NULL AND LTRIM(RTRIM([IconCssClass])) <> ''
    AND ([IconCssClass] LIKE '%fa fa-%' OR [IconCssClass] LIKE '%fas fa-%' OR [IconCssClass] LIKE '%far fa-%')
  UNION ALL
  SELECT N'GroupRequirementType', [Id], [Name], [IconCssClass]
  FROM [GroupRequirementType]
  WHERE [IconCssClass] IS NOT NULL AND LTRIM(RTRIM([IconCssClass])) <> ''
    AND ([IconCssClass] LIKE '%fa fa-%' OR [IconCssClass] LIKE '%fas fa-%' OR [IconCssClass] LIKE '%far fa-%')
  UNION ALL
  SELECT N'GroupType', [Id], [Name], [IconCssClass]
  FROM [GroupType]
  WHERE [IconCssClass] IS NOT NULL AND LTRIM(RTRIM([IconCssClass])) <> ''
    AND ([IconCssClass] LIKE '%fa fa-%' OR [IconCssClass] LIKE '%fas fa-%' OR [IconCssClass] LIKE '%far fa-%')
  UNION ALL
  SELECT N'LearningProgram', [Id], [Name], [IconCssClass]
  FROM [LearningProgram]
  WHERE [IconCssClass] IS NOT NULL AND LTRIM(RTRIM([IconCssClass])) <> ''
    AND ([IconCssClass] LIKE '%fa fa-%' OR [IconCssClass] LIKE '%fas fa-%' OR [IconCssClass] LIKE '%far fa-%')
  UNION ALL
  SELECT N'Metric', [Id], ISNULL([Title], N''), [IconCssClass]
  FROM [Metric]
  WHERE [IconCssClass] IS NOT NULL AND LTRIM(RTRIM([IconCssClass])) <> ''
    AND ([IconCssClass] LIKE '%fa fa-%' OR [IconCssClass] LIKE '%fas fa-%' OR [IconCssClass] LIKE '%far fa-%')
  UNION ALL
  SELECT N'NoteType', [Id], [Name], [IconCssClass]
  FROM [NoteType]
  WHERE [IconCssClass] IS NOT NULL AND LTRIM(RTRIM([IconCssClass])) <> ''
    AND ([IconCssClass] LIKE '%fa fa-%' OR [IconCssClass] LIKE '%fas fa-%' OR [IconCssClass] LIKE '%far fa-%')
  UNION ALL
  SELECT N'Notification', [Id], CAST([Id] AS NVARCHAR(50)), [IconCssClass]
  FROM [Notification]
  WHERE [IconCssClass] IS NOT NULL AND LTRIM(RTRIM([IconCssClass])) <> ''
    AND ([IconCssClass] LIKE '%fa fa-%' OR [IconCssClass] LIKE '%fas fa-%' OR [IconCssClass] LIKE '%far fa-%')
  UNION ALL
  SELECT N'Page', [Id], ISNULL([PageTitle], [InternalName]), [IconCssClass]
  FROM [Page]
  WHERE [IconCssClass] IS NOT NULL AND LTRIM(RTRIM([IconCssClass])) <> ''
    AND ([IconCssClass] LIKE '%fa fa-%' OR [IconCssClass] LIKE '%fas fa-%' OR [IconCssClass] LIKE '%far fa-%')
  UNION ALL
  SELECT N'Person', [Id], CONCAT(ISNULL([NickName], [FirstName]), N' ', ISNULL([LastName], N'')), [TopSignalIconCssClass] AS [IconCssClass]
  FROM [Person]
  WHERE [TopSignalIconCssClass] IS NOT NULL AND LTRIM(RTRIM([TopSignalIconCssClass])) <> ''
    AND ([TopSignalIconCssClass] LIKE '%fa fa-%' OR [TopSignalIconCssClass] LIKE '%fas fa-%' OR [TopSignalIconCssClass] LIKE '%far fa-%')
  UNION ALL
  SELECT N'PersonalLinkSection', [Id], [Name], [IconCssClass]
  FROM [PersonalLinkSection]
  WHERE [IconCssClass] IS NOT NULL AND LTRIM(RTRIM([IconCssClass])) <> ''
    AND ([IconCssClass] LIKE '%fa fa-%' OR [IconCssClass] LIKE '%fas fa-%' OR [IconCssClass] LIKE '%far fa-%')
  UNION ALL
  SELECT N'RegistrationTemplatePlacement', [Id], [Name], [IconCssClass]
  FROM [RegistrationTemplatePlacement]
  WHERE [IconCssClass] IS NOT NULL AND LTRIM(RTRIM([IconCssClass])) <> ''
    AND ([IconCssClass] LIKE '%fa fa-%' OR [IconCssClass] LIKE '%fas fa-%' OR [IconCssClass] LIKE '%far fa-%')
  UNION ALL
  SELECT N'SignalType', [Id], [Name], [SignalIconCssClass] AS [IconCssClass]
  FROM [SignalType]
  WHERE [SignalIconCssClass] IS NOT NULL AND LTRIM(RTRIM([SignalIconCssClass])) <> ''
    AND ([SignalIconCssClass] LIKE '%fa fa-%' OR [SignalIconCssClass] LIKE '%fas fa-%' OR [SignalIconCssClass] LIKE '%far fa-%')
  UNION ALL
  SELECT N'StepProgram', [Id], [Name], [IconCssClass]
  FROM [StepProgram]
  WHERE [IconCssClass] IS NOT NULL AND LTRIM(RTRIM([IconCssClass])) <> ''
    AND ([IconCssClass] LIKE '%fa fa-%' OR [IconCssClass] LIKE '%fas fa-%' OR [IconCssClass] LIKE '%far fa-%')
  UNION ALL
  SELECT N'StepType', [Id], [Name], [IconCssClass]
  FROM [StepType]
  WHERE [IconCssClass] IS NOT NULL AND LTRIM(RTRIM([IconCssClass])) <> ''
    AND ([IconCssClass] LIKE '%fa fa-%' OR [IconCssClass] LIKE '%fas fa-%' OR [IconCssClass] LIKE '%far fa-%')
  UNION ALL
  SELECT N'Tag', [Id], [Name], [IconCssClass]
  FROM [Tag]
  WHERE [IconCssClass] IS NOT NULL AND LTRIM(RTRIM([IconCssClass])) <> ''
    AND ([IconCssClass] LIKE '%fa fa-%' OR [IconCssClass] LIKE '%fas fa-%' OR [IconCssClass] LIKE '%far fa-%')
  UNION ALL
  SELECT N'WorkflowType', [Id], [Name], [IconCssClass]
  FROM [WorkflowType]
  WHERE [IconCssClass] IS NOT NULL AND LTRIM(RTRIM([IconCssClass])) <> ''
    AND ([IconCssClass] LIKE '%fa fa-%' OR [IconCssClass] LIKE '%fas fa-%' OR [IconCssClass] LIKE '%far fa-%')
) AS t
ORDER BY [TableName], [EntityName], [IconCssClass];

How to Use the Results

1. Run as a Report and Triage

  • Add a Dynamic Data block to an admin page and configure it to run one of these queries as a report. You can use a second block (or separate page) for the other query. The block will show the result set so you can work through it directly in Rock.
  • Use the Path column to open the block in Rock Admin (e.g., .../page/123).
  • For Query 2, use IconValue to see the exact Font Awesome class (e.g., fa fa-heart, fas fa-user).
  • For Query 3, use TableName and EntityId to locate the record (e.g., open the corresponding admin area—Pages, Workflow Types, Categories, etc.—and edit the entity by Id; IconCssClass shows the value to replace with the Tabler equivalent).

2. Map Font Awesome to Tabler

  • Tabler uses different class names and markup (e.g., ti ti-icon-name and often inline SVG).
  • Use the Tabler Icons site to find the closest match for each Font Awesome icon name.
  • Rock’s block and Lava documentation for v18 will describe the correct Tabler usage (e.g., icon picker, Lava filters).

3. Update Content

  • HTML blocks: Edit the block’s HTML and replace Font Awesome markup with Tabler markup or classes as recommended for v18.
  • Attribute values: Edit the block or entity attribute (e.g., icon picker) and choose the Tabler equivalent; save.
  • IconCssClass columns (Query 3): Edit the entity in Rock Admin (e.g., Page settings, Workflow Type, Category) and update the icon field to the Tabler class or icon picker value.
  • Lava: If Lava outputs Font Awesome classes, update the Lava to use Tabler icon syntax or the appropriate Rock v18 filter/shortcode.

Extending the Queries

You can broaden or narrow the search:

  • More Font Awesome patterns: Add OR hc.[Content] LIKE '%far fa-%' (or similar) if you use other FA styles (e.g., far, fab).
  • Other entities: Query 2 is built to join blocks and pages when the attribute is on a block; for other entity types (e.g., Group, Person), you’d join the corresponding tables instead of Block/Page.
  • Specific block types: Add AND bt.[Name] = 'YourBlockType' (or IN (...)) to focus on certain blocks.

Related Resources

Pro tip: Before upgrading to v18, add a page with Dynamic Data blocks that run these three queries. Use the reports as your working list: after upgrade, open the page and work through each Block Id, Icon Value, and IconCssClass row (TableName + EntityId) so every custom Font Awesome usage is converted to Tabler.