From a19b9fb5fe162d21776cdfd269cbed8e41cc1a25 Mon Sep 17 00:00:00 2001 From: Copilot <198982749+Copilot@users.noreply.github.com> Date: Tue, 14 Oct 2025 16:35:42 +0000 Subject: [PATCH] UFM: Add camelCase aliases for UFM filters to support UFMJS expressions (closes #20500) (#20501) * Initial plan * Add camelCase aliases for UFM filters with hyphens (stripHtml, titleCase, wordLimit) Co-authored-by: iOvergaard <752371+iOvergaard@users.noreply.github.com> * Add manifest tests for camelCase filter aliases Co-authored-by: iOvergaard <752371+iOvergaard@users.noreply.github.com> * discards tests that are not useful * test: updates imports for stripHtml api * Exports `UmbUfmStripHtmlFilterApi` class --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: iOvergaard <752371+iOvergaard@users.noreply.github.com> Co-authored-by: leekelleher --- .../src/packages/ufm/filters/manifests.ts | 24 ++++++++++ .../ufm/filters/strip-html.filter.test.ts | 47 +++++++++++++++++++ .../packages/ufm/filters/strip-html.filter.ts | 1 + 3 files changed, 72 insertions(+) create mode 100644 src/Umbraco.Web.UI.Client/src/packages/ufm/filters/strip-html.filter.test.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/ufm/filters/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/ufm/filters/manifests.ts index 265b99358c..8efad58bd0 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/ufm/filters/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/ufm/filters/manifests.ts @@ -29,6 +29,14 @@ export const manifests: Array = [ api: () => import('./strip-html.filter.js'), meta: { alias: 'strip-html' }, }, + // TODO: Remove in V18 - replaced by camelCase alias below for UFMJS compatibility + { + type: 'ufmFilter', + alias: 'Umb.Filter.StripHtmlCamelCase', + name: 'Strip HTML UFM Filter (camelCase)', + api: () => import('./strip-html.filter.js'), + meta: { alias: 'stripHtml' }, + }, { type: 'ufmFilter', alias: 'Umb.Filter.TitleCase', @@ -36,6 +44,14 @@ export const manifests: Array = [ api: () => import('./title-case.filter.js'), meta: { alias: 'title-case' }, }, + // TODO: Remove in V18 - replaced by camelCase alias below for UFMJS compatibility + { + type: 'ufmFilter', + alias: 'Umb.Filter.TitleCaseCamelCase', + name: 'Title Case UFM Filter (camelCase)', + api: () => import('./title-case.filter.js'), + meta: { alias: 'titleCase' }, + }, { type: 'ufmFilter', alias: 'Umb.Filter.Truncate', @@ -57,4 +73,12 @@ export const manifests: Array = [ api: () => import('./word-limit.filter.js'), meta: { alias: 'word-limit' }, }, + // TODO: Remove in V18 - replaced by camelCase alias below for UFMJS compatibility + { + type: 'ufmFilter', + alias: 'Umb.Filter.WordLimitCamelCase', + name: 'Word Limit UFM Filter (camelCase)', + api: () => import('./word-limit.filter.js'), + meta: { alias: 'wordLimit' }, + }, ]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/ufm/filters/strip-html.filter.test.ts b/src/Umbraco.Web.UI.Client/src/packages/ufm/filters/strip-html.filter.test.ts new file mode 100644 index 0000000000..45c39844b6 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/ufm/filters/strip-html.filter.test.ts @@ -0,0 +1,47 @@ +import { expect } from '@open-wc/testing'; +import { UmbUfmStripHtmlFilterApi } from './strip-html.filter.js'; + +describe('UmbUfmStripHtmlFilter', () => { + let filter: UmbUfmStripHtmlFilterApi; + + beforeEach(() => { + filter = new UmbUfmStripHtmlFilterApi(); + }); + + describe('filter', () => { + it('should strip HTML tags from string', () => { + const result = filter.filter('

Hello World

'); + expect(result).to.equal('Hello World'); + }); + + it('should handle empty string', () => { + const result = filter.filter(''); + expect(result).to.equal(''); + }); + + it('should handle null input', () => { + const result = filter.filter(null); + expect(result).to.equal(''); + }); + + it('should handle undefined input', () => { + const result = filter.filter(undefined); + expect(result).to.equal(''); + }); + + it('should handle markup object', () => { + const result = filter.filter({ markup: '

Test

' }); + expect(result).to.equal('Test'); + }); + + it('should strip complex HTML', () => { + const result = filter.filter('

Title

Paragraph with link

'); + expect(result).to.equal('TitleParagraph with link'); + }); + + it('should handle plain text without HTML', () => { + const result = filter.filter('Plain text'); + expect(result).to.equal('Plain text'); + }); + }); +}); diff --git a/src/Umbraco.Web.UI.Client/src/packages/ufm/filters/strip-html.filter.ts b/src/Umbraco.Web.UI.Client/src/packages/ufm/filters/strip-html.filter.ts index 98b7e394d8..a65969e522 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/ufm/filters/strip-html.filter.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/ufm/filters/strip-html.filter.ts @@ -13,3 +13,4 @@ class UmbUfmStripHtmlFilterApi extends UmbUfmFilterBase { } export { UmbUfmStripHtmlFilterApi as api }; +export { UmbUfmStripHtmlFilterApi };