From f9b40d511d9a90b41508b8cfbb01b10ee11ed3f6 Mon Sep 17 00:00:00 2001 From: TamilRamGanesan-SF5080 Date: Tue, 12 Aug 2025 16:50:15 +0530 Subject: [PATCH 1/3] 972430: added markdown support for chatui --- .../chat-ui/EJ2_ASP.MVC/messages.md | 53 ++++++++++++++- .../chat-ui/EJ2_ASP.NETCORE/messages.md | 53 ++++++++++++++- ej2-asp-core-mvc/chat-ui/images/markdown.png | Bin 0 -> 46239 bytes .../chat-ui/messages/markdown/markdown.cs | 51 +++++++++++++++ .../chat-ui/messages/markdown/razor | 60 +++++++++++++++++ .../chat-ui/messages/markdown/tagHelper | 61 ++++++++++++++++++ 6 files changed, 276 insertions(+), 2 deletions(-) create mode 100644 ej2-asp-core-mvc/chat-ui/images/markdown.png create mode 100644 ej2-asp-core-mvc/code-snippet/chat-ui/messages/markdown/markdown.cs create mode 100644 ej2-asp-core-mvc/code-snippet/chat-ui/messages/markdown/razor create mode 100644 ej2-asp-core-mvc/code-snippet/chat-ui/messages/markdown/tagHelper diff --git a/ej2-asp-core-mvc/chat-ui/EJ2_ASP.MVC/messages.md b/ej2-asp-core-mvc/chat-ui/EJ2_ASP.MVC/messages.md index 3e33d9d901..e75782edc3 100644 --- a/ej2-asp-core-mvc/chat-ui/EJ2_ASP.MVC/messages.md +++ b/ej2-asp-core-mvc/chat-ui/EJ2_ASP.MVC/messages.md @@ -335,4 +335,55 @@ You can use the `ItemClicked` event when the toolbar item is clicked in the mess {% highlight c# tabtitle="ItemClicked.cs" %} {% include code-snippet/chat-ui/messages/itemClicked/itemClicked.cs %} {% endhighlight %} -{% endtabs %} \ No newline at end of file +{% endtabs %} + +## Displaying the markdown content + +The Syncfusion ChatUI supports `Markdown` formatting for messages, enabling rich text capabilities such as bold, italic, links, and more. + +### Prerequisites + +- Include the `marked` library: + + ```bash + + + + ``` + +- Include `DOMPurify` for sanitizing the Markdown output: + + ```bash + + + + ``` + +### Supported markdown formats + +The ChatUI supports the following Markdown formats via the `marked` library: + +- **Bold**: ** text ** or __ text __ +- *Italic*: * text * or _ text _ +- [Links](url): [Link text] (url) +- Lists: - Item or 1. item +- Code: 'code' or code + +For full list refer to the [marked documentation](https://marked.js.org/). + +### Configuring Markdown + +By integrating the [marked](https://github.com/markedjs/marked) library, you can parse Markdown text to enhance the chat experience. The `text` property of each message can accept HTML generated from Markdown, allowing for formatted text display. + +> To prevent XSS attacks, sanitize Markdown output using `DOMPurify` + +{% tabs %} +{% highlight razor tabtitle="CSHTML" %} +{% include code-snippet/chat-ui/messages/markdown/razor %} +{% endhighlight %} +{% highlight c# tabtitle="markdown.cs" %} +{% include code-snippet/chat-ui/messages/markdown/markdown.cs %} +{% endhighlight %} +{% endtabs %} + +![Markdown](images/markdown.png) \ No newline at end of file diff --git a/ej2-asp-core-mvc/chat-ui/EJ2_ASP.NETCORE/messages.md b/ej2-asp-core-mvc/chat-ui/EJ2_ASP.NETCORE/messages.md index de6ec6d715..1c6918dca4 100644 --- a/ej2-asp-core-mvc/chat-ui/EJ2_ASP.NETCORE/messages.md +++ b/ej2-asp-core-mvc/chat-ui/EJ2_ASP.NETCORE/messages.md @@ -335,4 +335,55 @@ You can use the `itemClicked` event when the toolbar item is clicked in the mess {% highlight c# tabtitle="ItemClicked.cs" %} {% include code-snippet/chat-ui/messages/itemClicked/itemClicked.cs %} {% endhighlight %} -{% endtabs %} \ No newline at end of file +{% endtabs %} + +## Displaying the markdown content + +The Syncfusion ChatUI supports `Markdown` formatting for messages, enabling rich text capabilities such as bold, italic, links, and more. + +### Prerequisites + +- Include the `marked` library: + + ```bash + + + + ``` + +- Include `DOMPurify` for sanitizing the Markdown output: + + ```bash + + + + ``` + +### Supported markdown formats + +The ChatUI supports the following Markdown formats via the `marked` library: + +- **Bold**: ** text ** or __ text __ +- *Italic*: * text * or _ text _ +- [Links](url): [Link text] (url) +- Lists: - Item or 1. item +- Code: 'code' or code + +For full list refer to the [marked documentation](https://marked.js.org/). + +### Configuring Markdown + +By integrating the [marked](https://github.com/markedjs/marked) library, you can parse Markdown text to enhance the chat experience. The `text` property of each message can accept HTML generated from Markdown, allowing for formatted text display. + +> To prevent XSS attacks, sanitize Markdown output using `DOMPurify` + +{% tabs %} +{% highlight razor tabtitle="CSHTML" %} +{% include code-snippet/chat-ui/messages/markdown/tagHelper %} +{% endhighlight %} +{% highlight c# tabtitle="ItemClicked.cs" %} +{% include code-snippet/chat-ui/messages/markdown/markdown.cs %} +{% endhighlight %} +{% endtabs %} + +![Markdown](images/markdown.png) \ No newline at end of file diff --git a/ej2-asp-core-mvc/chat-ui/images/markdown.png b/ej2-asp-core-mvc/chat-ui/images/markdown.png new file mode 100644 index 0000000000000000000000000000000000000000..a010dd3b0cb1ec59544d60f11c2db697f9176afc GIT binary patch literal 46239 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�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 z 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 literal 0 HcmV?d00001 diff --git a/ej2-asp-core-mvc/code-snippet/chat-ui/messages/markdown/markdown.cs b/ej2-asp-core-mvc/code-snippet/chat-ui/messages/markdown/markdown.cs new file mode 100644 index 0000000000..817d18db94 --- /dev/null +++ b/ej2-asp-core-mvc/code-snippet/chat-ui/messages/markdown/markdown.cs @@ -0,0 +1,51 @@ +using System; +using System.Collections.Generic; +using System.Web.Mvc; +using Syncfusion.EJ2.InteractiveChat; + +namespace EJ2MVCSampleBrowser.Controllers.ChatUI +{ + public partial class ChatUIController : Controller + { + public ActionResult Markdown() + { + ViewBag.CurrentUserModel = new ChatUIUser { Id = "user1", User = "Albert" }; + ViewBag.MichaleUserModel = new ChatUIUser { Id = "user2", User = "Michale Suyama" }; + ViewBag.Suggestions = new List + { + new SuggestionModel + { + DisplayText = "Share quick link", + MarkdownText = "Check out our [project dashboard](https://dashboard.example.com) for updates!" + }, + new SuggestionModel + { + DisplayText = "Emphasize priority", + MarkdownText = "This is **high priority** and needs _immediate attention_." + } + }; + ViewBag.ChatMessagesData = new List + { + new ChatUIMessage + { + Text = "Hey Michale, did you review the _new API documentation_?", + Author = (ChatUIUser)ViewBag.CurrentUserModel, + TimeStamp = new DateTime(2024, 1, 15, 9, 30, 0) + }, + new ChatUIMessage + { + Text = "Yes! The **endpoint specifications** look great. Check the [integration guide](https://api.example.com/docs) when you get a chance.", + Author = (ChatUIUser)ViewBag.MichaleUserModel, + TimeStamp = new DateTime(2024, 1, 15, 9, 32, 0) + } + }; + return View(); + } + + public class SuggestionModel + { + public string DisplayText { get; set; } = string.Empty; + public string MarkdownText { get; set; } = string.Empty; + } + } +} \ No newline at end of file diff --git a/ej2-asp-core-mvc/code-snippet/chat-ui/messages/markdown/razor b/ej2-asp-core-mvc/code-snippet/chat-ui/messages/markdown/razor new file mode 100644 index 0000000000..557ada2bb8 --- /dev/null +++ b/ej2-asp-core-mvc/code-snippet/chat-ui/messages/markdown/razor @@ -0,0 +1,60 @@ +@using Syncfusion.EJ2.InteractiveChat +@using Syncfusion.EJ2 +@using Newtonsoft.Json + +
+
+ @Html.EJS().ChatUI("markdown").HeaderText("Chat UI with Markdown").User((ChatUIUser)ViewBag.CurrentUserModel).Created("onCreated").MessageSend("onMessageSend").Render() +
+
+ + + + + + \ No newline at end of file diff --git a/ej2-asp-core-mvc/code-snippet/chat-ui/messages/markdown/tagHelper b/ej2-asp-core-mvc/code-snippet/chat-ui/messages/markdown/tagHelper new file mode 100644 index 0000000000..5cba70a480 --- /dev/null +++ b/ej2-asp-core-mvc/code-snippet/chat-ui/messages/markdown/tagHelper @@ -0,0 +1,61 @@ +@using Syncfusion.EJ2.InteractiveChat +@using Newtonsoft.Json + +
+
+ + + +
+
+ + + + + + \ No newline at end of file From 951a68025f8aa7f8ddabd0f3911250e8a385719b Mon Sep 17 00:00:00 2001 From: TamilRamGanesan-SF5080 Date: Tue, 12 Aug 2025 23:50:30 +0530 Subject: [PATCH 2/3] 972430: changes for dompurify --- .../code-snippet/chat-ui/messages/markdown/razor | 5 ++++- .../code-snippet/chat-ui/messages/markdown/tagHelper | 7 ++++--- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/ej2-asp-core-mvc/code-snippet/chat-ui/messages/markdown/razor b/ej2-asp-core-mvc/code-snippet/chat-ui/messages/markdown/razor index 557ada2bb8..ec4c85d057 100644 --- a/ej2-asp-core-mvc/code-snippet/chat-ui/messages/markdown/razor +++ b/ej2-asp-core-mvc/code-snippet/chat-ui/messages/markdown/razor @@ -11,7 +11,6 @@ @@ -58,4 +55,8 @@ .control-section.chat-ui { padding: 20px; } + p { + margin: 0; + display: inline-block; + } \ No newline at end of file From c367960aff27f9077abaf3cf593e9b10e4c1965c Mon Sep 17 00:00:00 2001 From: Deepak Raj Sundar Date: Wed, 13 Aug 2025 18:55:30 +0530 Subject: [PATCH 3/3] Added the release notes MD file and corresponding node entry in the TOC.html file --- .../Release-notes/EJ2_ASP.MVC/30.2.4.md | 93 ++++++++++++++++++ .../Release-notes/EJ2_ASP.NETCORE/30.2.4.md | 94 +++++++++++++++++++ 2 files changed, 187 insertions(+) create mode 100644 ej2-asp-core-mvc/Release-notes/EJ2_ASP.MVC/30.2.4.md create mode 100644 ej2-asp-core-mvc/Release-notes/EJ2_ASP.NETCORE/30.2.4.md diff --git a/ej2-asp-core-mvc/Release-notes/EJ2_ASP.MVC/30.2.4.md b/ej2-asp-core-mvc/Release-notes/EJ2_ASP.MVC/30.2.4.md new file mode 100644 index 0000000000..275a53a68e --- /dev/null +++ b/ej2-asp-core-mvc/Release-notes/EJ2_ASP.MVC/30.2.4.md @@ -0,0 +1,93 @@ +--- +title: Essential Studio for ##Platform_Name## 2025 Volume 2 SP Release Release Notes +description: Essential Studio for ##Platform_Name## 2025 Volume 2 SP Release Release Notes +platform: ej2-asp-core-mvc +documentation: ug +--- + +# Essential Studio for ##Platform_Name## Release Notes + +{% include release-info.html date="August 07, 2025" version="v30.2.4" passed="245642" failed="0" %} + +{% directory path: _includes/release-notes/v30.2.4 %} + +{% include {{file.url}} %} + +{% enddirectory %} + +## Test Results + +| Component Name | Test Cases | Passed | Failed | Remarks | +|---------------|------------|--------|--------|---------| +| 3D Chart | 232 | 232 | 0 | All Passed | +| 3D Circular Chart | 374 | 374 | 0 | All Passed | +| Accordion | 205 | 205 | 0 | All Passed | +| AI Assist View | 431 | 431 | 0 | All Passed | +| AutoComplete | 200 | 200 | 0 | All Passed | +| Breadcrumb | 160 | 160 | 0 | All Passed | +| Bullet Chart | 164 | 164 | 0 | All Passed | +| Button | 145 | 145 | 0 | All Passed | +| ButtonGroup | 120 | 120 | 0 | All Passed | +| calendar | 177 | 177 | 0 | All Passed | +| Chart | 4494 | 4494 | 0 | All Passed | +| Chat UI | 184 | 184 | 0 | All Passed | +| CircularGauge | 429 | 429 | 0 | All Passed | +| ColorPicker | 130 | 130 | 0 | All Passed | +| Combo Box | 136 | 136 | 0 | All Passed | +| Common | 713 | 713 | 0 | All Passed | +| Context Menu | 105 | 105 | 0 | All Passed | +| Data Grid | 2754 | 2754 | 0 | All Passed | +| Date Picker | 425 | 425 | 0 | All Passed | +| Date Range Picker | 396 | 396 | 0 | All Passed | +| Date Time Picker | 323 | 323 | 0 | All Passed | +| Diagram | 19122 | 19122 | 0 | All Passed | +| Document Editor | 4212 | 4212 | 0 | All Passed | +| DropDown Button | 132 | 132 | 0 | All Passed | +| Dropdown List | 191 | 191 | 0 | All Passed | +| Dropdown Tree | 105 | 105 | 0 | All Passed | +| File Manager | 2187 | 2187 | 0 | All Passed | +| Floating Action Button | 174 | 174 | 0 | All Passed | +| Gantt | 3011 | 3011 | 0 | All Passed | +| HeatMap Chart | 478 | 478 | 0 | All Passed | +| Image Editor | 1085 | 1085 | 0 | All Passed | +| In-place Editor | 642 | 642 | 0 | All Passed | +| Kanban | 268 | 268 | 0 | All Passed | +| LinearGauge | 426 | 426 | 0 | All Passed | +| Listbox | 115 | 115 | 0 | All Passed | +| Maps | 1247 | 1247 | 0 | All Passed | +| Menu | 187 | 187 | 0 | All Passed | +| Multicolumn Combo Box | 254 | 254 | 0 | All Passed | +| Multiselect Dropdown | 365 | 365 | 0 | All Passed | +| OTP Input | 240 | 240 | 0 | All Passed | +| PDF Viewer | 18612 | 18612 | 0 | All Passed | +| Pivot Table | 5294 | 5294 | 0 | All Passed | +| Progress Button | 132 | 132 | 0 | All Passed | +| Query Builder | 480 | 480 | 0 | All Passed | +| RangeNavigator | 140 | 140 | 0 | All Passed | +| Rating | 201 | 201 | 0 | All Passed | +| Ribbon | 496 | 496 | 0 | All Passed | +| Rich Text Editor | 4564 | 4564 | 0 | All Passed | +| schedule | 3356 | 3356 | 0 | All Passed | +| Signature | 105 | 105 | 0 | All Passed | +| Skeleton | 144 | 144 | 0 | All Passed | +| Slider | 147 | 147 | 0 | All Passed | +| Speech To Text | 200 | 200 | 0 | All Passed | +| Speed Dial | 366 | 366 | 0 | All Passed | +| Split Button | 144 | 144 | 0 | All Passed | +| Spreadsheet | 10393 | 10393 | 0 | All Passed | +| Stepper | 117 | 117 | 0 | All Passed | +| Stock Chart | 379 | 379 | 0 | All Passed | +| Tab | 192 | 192 | 0 | All Passed | +| Text Area | 107 | 107 | 0 | All Passed | +| Time Picker | 180 | 180 | 0 | All Passed | +| Timeline | 213 | 213 | 0 | All Passed | +| Toast | 139 | 139 | 0 | All Passed | +| Toolbar | 132 | 132 | 0 | All Passed | +| ToolTip | 131 | 131 | 0 | All Passed | +| TreeGrid | 3655 | 3655 | 0 | All Passed | +| Treemap | 264 | 264 | 0 | All Passed | +| Treeview | 370 | 370 | 0 | All Passed | +| DocIO | 39839 | 39839 | 0 | All Passed | +| PDF | 14387 | 14387 | 0 | All Passed | +| Presentation | 49923 | 49923 | 0 | All Passed | +| XlsIO | 44102 | 44102 | 0 | All Passed | \ No newline at end of file diff --git a/ej2-asp-core-mvc/Release-notes/EJ2_ASP.NETCORE/30.2.4.md b/ej2-asp-core-mvc/Release-notes/EJ2_ASP.NETCORE/30.2.4.md new file mode 100644 index 0000000000..16ae56074b --- /dev/null +++ b/ej2-asp-core-mvc/Release-notes/EJ2_ASP.NETCORE/30.2.4.md @@ -0,0 +1,94 @@ +--- +title: Essential Studio for ##Platform_Name## 2025 Volume 2 SP Release Release Notes +description: Essential Studio for ##Platform_Name## 2025 Volume 2 SP Release Release Notes +platform: ej2-asp-core-mvc +documentation: ug +--- + +# Essential Studio for ##Platform_Name## Release Notes + +{% include release-info.html date="August 07, 2025" version="v30.2.4" passed="150185" failed="0" %} + +{% directory path: _includes/release-notes/v30.2.4 %} + +{% include {{file.url}} %} + +{% enddirectory %} + +## Test Results + +| Component Name | Test Cases | Passed | Failed | Remarks | +|---------------|------------|--------|--------|---------| +| 3D Chart | 232 | 232 | 0 | All Passed | +| 3D Circular Chart | 374 | 374 | 0 | All Passed | +| Accordion | 205 | 205 | 0 | All Passed | +| AI Assist View | 431 | 431 | 0 | All Passed | +| AutoComplete | 200 | 200 | 0 | All Passed | +| Breadcrumb | 160 | 160 | 0 | All Passed | +| Bullet Chart | 164 | 164 | 0 | All Passed | +| Button | 145 | 145 | 0 | All Passed | +| ButtonGroup | 120 | 120 | 0 | All Passed | +| calendar | 177 | 177 | 0 | All Passed | +| Chart | 4494 | 4494 | 0 | All Passed | +| Chat UI | 184 | 184 | 0 | All Passed | +| CircularGauge | 429 | 429 | 0 | All Passed | +| ColorPicker | 130 | 130 | 0 | All Passed | +| Combo Box | 136 | 136 | 0 | All Passed | +| Common | 713 | 713 | 0 | All Passed | +| Context Menu | 105 | 105 | 0 | All Passed | +| Data Grid | 2754 | 2754 | 0 | All Passed | +| Date Picker | 425 | 425 | 0 | All Passed | +| Date Range Picker | 396 | 396 | 0 | All Passed | +| Date Time Picker | 323 | 323 | 0 | All Passed | +| Diagram | 19122 | 19122 | 0 | All Passed | +| Document Editor | 4212 | 4212 | 0 | All Passed | +| DropDown Button | 132 | 132 | 0 | All Passed | +| Dropdown List | 191 | 191 | 0 | All Passed | +| Dropdown Tree | 105 | 105 | 0 | All Passed | +| File Manager | 2187 | 2187 | 0 | All Passed | +| Floating Action Button | 174 | 174 | 0 | All Passed | +| Gantt | 3011 | 3011 | 0 | All Passed | +| HeatMap Chart | 478 | 478 | 0 | All Passed | +| Image Editor | 1085 | 1085 | 0 | All Passed | +| In-place Editor | 642 | 642 | 0 | All Passed | +| Kanban | 268 | 268 | 0 | All Passed | +| LinearGauge | 426 | 426 | 0 | All Passed | +| Listbox | 115 | 115 | 0 | All Passed | +| Maps | 1247 | 1247 | 0 | All Passed | +| Menu | 187 | 187 | 0 | All Passed | +| Multicolumn Combo Box | 254 | 254 | 0 | All Passed | +| Multiselect Dropdown | 365 | 365 | 0 | All Passed | +| OTP Input | 240 | 240 | 0 | All Passed | +| PDF Viewer | 18612 | 18612 | 0 | All Passed | +| Pivot Table | 5294 | 5294 | 0 | All Passed | +| Progress Button | 132 | 132 | 0 | All Passed | +| Query Builder | 480 | 480 | 0 | All Passed | +| RangeNavigator | 140 | 140 | 0 | All Passed | +| Rating | 201 | 201 | 0 | All Passed | +| Ribbon | 496 | 496 | 0 | All Passed | +| Rich Text Editor | 4564 | 4564 | 0 | All Passed | +| schedule | 3356 | 3356 | 0 | All Passed | +| Signature | 105 | 105 | 0 | All Passed | +| Skeleton | 144 | 144 | 0 | All Passed | +| Slider | 147 | 147 | 0 | All Passed | +| Speech To Text | 200 | 200 | 0 | All Passed | +| Speed Dial | 366 | 366 | 0 | All Passed | +| Split Button | 144 | 144 | 0 | All Passed | +| Spreadsheet | 10393 | 10393 | 0 | All Passed | +| Stepper | 117 | 117 | 0 | All Passed | +| Stock Chart | 379 | 379 | 0 | All Passed | +| Tab | 192 | 192 | 0 | All Passed | +| Text Area | 107 | 107 | 0 | All Passed | +| Time Picker | 180 | 180 | 0 | All Passed | +| Timeline | 213 | 213 | 0 | All Passed | +| Toast | 139 | 139 | 0 | All Passed | +| Toolbar | 132 | 132 | 0 | All Passed | +| ToolTip | 131 | 131 | 0 | All Passed | +| TreeGrid | 3655 | 3655 | 0 | All Passed | +| Treemap | 264 | 264 | 0 | All Passed | +| Treeview | 370 | 370 | 0 | All Passed | +| DocIO | 16354 | 16354 | 0 | All Passed | +| Metafilerenderer | 863 | 863 | 0 | All Passed | +| PDF | 12900 | 12900 | 0 | All Passed | +| Presentation | 5408 | 5408 | 0 | All Passed | +| XlsIO | 17269 | 17269 | 0 | All Passed | \ No newline at end of file