From b650aa766d0b915326b46b761bbb64fd7702aaa4 Mon Sep 17 00:00:00 2001 From: Arun Kumar Ragu Date: Tue, 16 Dec 2025 19:12:11 +0530 Subject: [PATCH 01/10] 999291: Reverted the smart components in hotfix. --- .../smart-paste/EJ2_ASP.NETCORE/annotation.md | 77 +++++ .../EJ2_ASP.NETCORE/claude-service.md | 252 +++++++++++++++ .../custom-inference-backend.md | 77 +++++ .../EJ2_ASP.NETCORE/customization.md | 20 ++ .../EJ2_ASP.NETCORE/deepseek-service.md | 249 +++++++++++++++ .../EJ2_ASP.NETCORE/gemini-service.md | 297 ++++++++++++++++++ .../EJ2_ASP.NETCORE/getting-started.md | 285 +++++++++++++++++ .../EJ2_ASP.NETCORE/groq-service.md | 250 +++++++++++++++ .../smart-paste/images/SmartPaste.gif | Bin 0 -> 52285 bytes .../images/SmartPaste_Annotation.gif | Bin 0 -> 42667 bytes .../EJ2_ASP.NETCORE/claude-service.md | 208 ++++++++++++ .../custom-inference-backend.md | 80 +++++ .../EJ2_ASP.NETCORE/customization.md | 68 ++++ .../EJ2_ASP.NETCORE/deepseek-service.md | 206 ++++++++++++ .../EJ2_ASP.NETCORE/features.md | 19 ++ .../EJ2_ASP.NETCORE/gemini-service.md | 255 +++++++++++++++ .../EJ2_ASP.NETCORE/getting-started.md | 237 ++++++++++++++ .../EJ2_ASP.NETCORE/groq-service.md | 207 ++++++++++++ .../images/SmartTextArea-Inline.gif | Bin 0 -> 46939 bytes .../images/SmartTextArea-Popup.gif | Bin 0 -> 53407 bytes .../smart-textarea/images/SmartTextArea.gif | Bin 0 -> 46939 bytes ej2-asp-core-toc.html | 33 +- 22 files changed, 2819 insertions(+), 1 deletion(-) create mode 100644 ej2-asp-core-mvc/smart-paste/EJ2_ASP.NETCORE/annotation.md create mode 100644 ej2-asp-core-mvc/smart-paste/EJ2_ASP.NETCORE/claude-service.md create mode 100644 ej2-asp-core-mvc/smart-paste/EJ2_ASP.NETCORE/custom-inference-backend.md create mode 100644 ej2-asp-core-mvc/smart-paste/EJ2_ASP.NETCORE/customization.md create mode 100644 ej2-asp-core-mvc/smart-paste/EJ2_ASP.NETCORE/deepseek-service.md create mode 100644 ej2-asp-core-mvc/smart-paste/EJ2_ASP.NETCORE/gemini-service.md create mode 100644 ej2-asp-core-mvc/smart-paste/EJ2_ASP.NETCORE/getting-started.md create mode 100644 ej2-asp-core-mvc/smart-paste/EJ2_ASP.NETCORE/groq-service.md create mode 100644 ej2-asp-core-mvc/smart-paste/images/SmartPaste.gif create mode 100644 ej2-asp-core-mvc/smart-paste/images/SmartPaste_Annotation.gif create mode 100644 ej2-asp-core-mvc/smart-textarea/EJ2_ASP.NETCORE/claude-service.md create mode 100644 ej2-asp-core-mvc/smart-textarea/EJ2_ASP.NETCORE/custom-inference-backend.md create mode 100644 ej2-asp-core-mvc/smart-textarea/EJ2_ASP.NETCORE/customization.md create mode 100644 ej2-asp-core-mvc/smart-textarea/EJ2_ASP.NETCORE/deepseek-service.md create mode 100644 ej2-asp-core-mvc/smart-textarea/EJ2_ASP.NETCORE/features.md create mode 100644 ej2-asp-core-mvc/smart-textarea/EJ2_ASP.NETCORE/gemini-service.md create mode 100644 ej2-asp-core-mvc/smart-textarea/EJ2_ASP.NETCORE/getting-started.md create mode 100644 ej2-asp-core-mvc/smart-textarea/EJ2_ASP.NETCORE/groq-service.md create mode 100644 ej2-asp-core-mvc/smart-textarea/images/SmartTextArea-Inline.gif create mode 100644 ej2-asp-core-mvc/smart-textarea/images/SmartTextArea-Popup.gif create mode 100644 ej2-asp-core-mvc/smart-textarea/images/SmartTextArea.gif diff --git a/ej2-asp-core-mvc/smart-paste/EJ2_ASP.NETCORE/annotation.md b/ej2-asp-core-mvc/smart-paste/EJ2_ASP.NETCORE/annotation.md new file mode 100644 index 0000000000..10656dde36 --- /dev/null +++ b/ej2-asp-core-mvc/smart-paste/EJ2_ASP.NETCORE/annotation.md @@ -0,0 +1,77 @@ +--- +layout: post +title: Annotations in ##Platform_Name## Smart Paste Button Control | Syncfusion +description: Learn how to use annotations with the ##Platform_Name## Smart Paste Button control of Syncfusion Essential JS 2 and more details. +platform: ej2-asp-core-mvc +control: Annotations +publishingplatform: ##Platform_Name## +documentation: ug +--- + +# Annotations in ASP.NET Core Smart Paste Button Control + +The Syncfusion ASP.NET Core Smart Paste Button control leverages AI to intelligently parse clipboard content and populate form fields, enhancing user productivity. By default, the control analyzes form fields (e.g., ``, ` + +
+ + +
+
+ +
+ + +
+
+ + +
+
+
+ + +
+ + + + + +
+
+ I am John Doe from the United States. My email is johndoe@example.com, and my phone number is 555-123-4567. I’d like to inquire about your services and have a detailed discussion regarding your product offerings. Please contact me via email. I’m happy to subscribe to your newsletter for updates. Thank you! +
+ +{% endhighlight %} +{% endtabs %} + +![Syncfusion ASP.NET Core Smart Paste Button with Annotation](images/SmartPaste_Annotation.gif) diff --git a/ej2-asp-core-mvc/smart-paste/EJ2_ASP.NETCORE/claude-service.md b/ej2-asp-core-mvc/smart-paste/EJ2_ASP.NETCORE/claude-service.md new file mode 100644 index 0000000000..b42deedf6b --- /dev/null +++ b/ej2-asp-core-mvc/smart-paste/EJ2_ASP.NETCORE/claude-service.md @@ -0,0 +1,252 @@ +--- +layout: post +title: Claude AI in ##Platform_Name## Smart Paste Button Control | Syncfusion +description: Learn how to implement a custom AI service using Claude AI with ##Platform_Name## Smart Paste Button control of Syncfusion Essential JS 2 and more details. +platform: ej2-asp-core-mvc +control: Claude AI +publishingplatform: ##Platform_Name## +documentation: ug +--- + +# Claude AI Integration with ASP.NET Core Smart Paste Button + +The Syncfusion ASP.NET Core SmartPaste Button control enables AI-powered, context-aware content pasting into forms, typically using OpenAI or Azure OpenAI. This guide explains how to integrate the Anthropic Claude AI service with the Smart Paste Button using the `IChatInferenceService` interface, enabling custom AI-driven responses in a ASP.NET Core App. + +## Setting Up Claude + +1. **Create an Anthropic Account** + Visit [Anthropic Console](https://console.anthropic.com), sign up, and complete the verification process. +2. **Obtain an API Key** + Navigate to [API Keys](https://console.anthropic.com/settings/keys) and click "Create Key." +3. **Review Model Specifications** + Refer to [Claude Models Documentation](https://docs.anthropic.com/claude/docs/models-overview) for details on available models. + +## Create a Claude AI Service + +Create a service class to manage interactions with the Claude API, including authentication and response processing for the Smart Paste Button. + +1. Create a `Services` folder in your project. +2. Add a new file named `ClaudeAIService.cs` in the `Services` folder. +3. Implement the service as shown below, storing the API key securely in a configuration file or environment variable (e.g., `appsettings.json`). + +```csharp +using Microsoft.Extensions.AI; +using System.Net; +using System.Text; +using System.Text.Json; + +public class ClaudeAIService +{ + private readonly string _apiKey; + private readonly string _modelName = "claude-3-5-sonnet-20241022"; // Example model + private readonly string _endpoint = "https://api.anthropic.com/v1/messages"; + private static readonly HttpClient HttpClient = new(new SocketsHttpHandler + { + PooledConnectionLifetime = TimeSpan.FromMinutes(30), + EnableMultipleHttp2Connections = true + }) + { + DefaultRequestVersion = HttpVersion.Version20 // Fallback to HTTP/2 for compatibility + }; + private static readonly JsonSerializerOptions JsonOptions = new() + { + PropertyNamingPolicy = JsonNamingPolicy.CamelCase + }; + + public ClaudeAIService(IConfiguration configuration) + { + _apiKey = configuration["Claude:ApiKey"] ?? throw new ArgumentNullException("Claude API key is missing."); + if (!HttpClient.DefaultRequestHeaders.Contains("x-api-key")) + { + HttpClient.DefaultRequestHeaders.Clear(); + HttpClient.DefaultRequestHeaders.Add("x-api-key", _apiKey); + HttpClient.DefaultRequestHeaders.Add("anthropic-version", "2023-06-01"); // Check latest version in Claude API docs + } + } + + public async Task CompleteAsync(IList chatMessages) + { + var requestBody = new ClaudeChatRequest + { + Model = _modelName, + Max_tokens = 1000, // Maximum tokens in response + Messages = chatMessages.Select(m => new ClaudeMessage + { + Role = m.Role == ChatRole.User ? "user" : "assistant", + Content = m.Text + }).ToList(), + Stop_sequences = new List { "END_INSERTION", "NEED_INFO", "END_RESPONSE" } // Configurable stop sequences + }; + + var content = new StringContent(JsonSerializer.Serialize(requestBody, JsonOptions), Encoding.UTF8, "application/json"); + + try + { + var response = await HttpClient.PostAsync(_endpoint, content); + response.EnsureSuccessStatusCode(); + var responseString = await response.Content.ReadAsStringAsync(); + var responseObject = JsonSerializer.Deserialize(responseString, JsonOptions); + return responseObject?.Content?.FirstOrDefault()?.Text ?? "No response from Claude model."; + } + catch (Exception ex) when (ex is HttpRequestException || ex is JsonException) + { + throw new InvalidOperationException("Failed to communicate with Claude API.", ex); + } + } +} +``` + +N> Store the Claude API key in `appsettings.json` (e.g., `{ "Claude": { "ApiKey": "your-api-key" } }`) or as an environment variable to ensure security. Verify the `anthropic-version` header in [Claude API Documentation](https://docs.anthropic.com/claude/docs) for the latest version. + +## Define Request and Response Models + +Define C# classes to match the Claude API’s JSON request and response format. + +1. Create a new file named `ClaudeModels.cs` in the `Services` folder. +2. Add the following model classes: + +```csharp +public class ClaudeChatRequest +{ + public string Model { get; set; } + public int Max_tokens { get; set; } + public List Messages { get; set; } + public List Stop_sequences { get; set; } +} + +public class ClaudeMessage +{ + public string Role { get; set; } + public string Content { get; set; } +} + +public class ClaudeChatResponse +{ + public List Content { get; set; } +} + +public class ClaudeContentBlock +{ + public string Text { get; set; } +} +``` + +## Create a Custom AI Service + +Implement the `IChatInferenceService` interface to connect the Smart Paste Button to the Claude service, acting as a bridge for AI-generated responses. + +1. Create a new file named `ClaudeInferenceService.cs` in the `Services` folder. +2. Add the following implementation: + +```csharp +using Syncfusion.EJ2.AI; +using System.Threading.Tasks; + +public class ClaudeInferenceService : IChatInferenceService +{ + private readonly ClaudeAIService _claudeService; + + public ClaudeInferenceService(ClaudeAIService claudeService) + { + _claudeService = claudeService; + } + + public async Task GenerateResponseAsync(ChatParameters options) + { + return await _claudeService.CompleteAsync(options.Messages); + } +} +``` + +## Configure the ASP.NET Core App + +Register the Claude service and `IChatInferenceService` implementation in the dependency injection container. + +Update the **~/Program.cs** file as follows: + +```csharp +using Syncfusion.EJ2; +using Syncfusion.EJ2.AI; + +builder.Services.AddRazorPages(); +builder.Services.AddSyncfusionSmartComponents(); +builder.Services.AddSingleton(); +builder.Services.AddSingleton(); + +var app = builder.Build(); +// ... +``` + +## Add the Smart Paste Button + +Add the Smart Paste Button to a form in the **~/Pages/Index.cshtml** file to test the Claude AI integration. + +{% tabs %} +{% highlight cshtml tabtitle="CSHTML" %} + +

Contact Form

+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ +
+ + +
+
+ + +
+
+
+ + +
+ + + +
+ +
+
+ I am John Doe from the United States. My email is johndoe@example.com, and my phone number is 555-123-4567. I’d like to inquire about your services and have a detailed discussion regarding your product offerings. Please contact me via email. I’m happy to subscribe to your newsletter for updates. Thank you! +
+ +{% endhighlight %} +{% endtabs %} + +Press Ctrl+F5 (Windows) or +F5 (macOS) to run the app. Then, the Syncfusion® ASP.NET Core +Smart Paste Button control will be rendered in the default web browser. + +![ASP.NET Core Smart Paste Button Control](images/SmartPaste.gif) + +## Troubleshooting + +If the Claude AI integration does not work, try the following: +- **No Suggestions Displayed**: Verify that the Claude API key and model name are correct in the configuration. Check the `ClaudeAIService` implementation for errors. +- **HTTP Request Failures**: Ensure a stable internet connection and that the Claude API endpoint (`https://api.anthropic.com/v1/messages`) is accessible. Test with HTTP/2 if compatibility issues arise. +- **Service Registration Errors**: Confirm that `ClaudeAIService` and `ClaudeInferenceService` are registered in **Program.cs**. \ No newline at end of file diff --git a/ej2-asp-core-mvc/smart-paste/EJ2_ASP.NETCORE/custom-inference-backend.md b/ej2-asp-core-mvc/smart-paste/EJ2_ASP.NETCORE/custom-inference-backend.md new file mode 100644 index 0000000000..a8b829f83b --- /dev/null +++ b/ej2-asp-core-mvc/smart-paste/EJ2_ASP.NETCORE/custom-inference-backend.md @@ -0,0 +1,77 @@ +--- +layout: post +title: Custom AI with ##Platform_Name## Smart Paste Button Control | Syncfusion +description: Learn how to integrate custom AI services with ##Platform_Name## Smart Paste Button control of Syncfusion Essential JS 2 and more details. +platform: ej2-asp-core-mvc +control: Custom AI Service +publishingplatform: ##Platform_Name## +documentation: ug +--- + +# Custom AI Service Integration with ASP.NET Core Smart Paste Button + +The Syncfusion ASP.NET Core Smart Paste Button leverages AI to parse clipboard content and populate form fields, enhancing user productivity. By default, it supports OpenAI and Azure OpenAI services, but you can integrate custom AI services using the `IChatInferenceService` interface. This interface facilitates communication between the Smart Paste Button and your custom AI provider, enabling precise mapping of clipboard data to form fields. + +## IChatInferenceService Interface + +The `IChatInferenceService` interface defines a contract for integrating AI services with the Smart Paste Button, enabling the control to process clipboard data for form field mapping. + +```csharp +public interface IChatInferenceService +{ + Task GenerateResponseAsync(ChatParameters options); +} +``` + +The `GenerateResponseAsync` method takes `ChatParameters` (containing clipboard data and form field metadata) and returns a string response from the AI service, which the Smart Paste Button uses to populate form fields. + +## Simple Implementation of a Custom AI Service + +Below is a sample implementation of a mock AI service named `MockAIService`. This service demonstrates how to implement the `IChatInferenceService` interface by returning sample, context-aware responses. You can replace the logic with your own AI integration. + +```csharp +using Syncfusion.EJ2.AI; +using System.Threading.Tasks; + +public class MockAIService : IChatInferenceService +{ + public Task GenerateResponseAsync(ChatParameters options) + { + + } +} +``` + +## Registering the Custom AI Service + +Register the custom AI service in the **~/Program.cs** file of your ASP.NET Core Application: + +```csharp +using Syncfusion.EJ2; +using Syncfusion.EJ2.AI; + +builder.Services.AddRazorPages(); +builder.Services.AddSyncfusionSmartComponents(); +builder.Services.AddSingleton(); + +var app = builder.Build(); +// ... +``` + +## Implemented AI Services + +Here are examples of AI services integrated using the `IChatInferenceService` interface: + +| Service | Documentation | +|---------|---------------| +| Claude | [Claude Integration](claude-service) | +| DeepSeek | [DeepSeek Integration](deepseek-service) | +| Groq | [Groq Integration](groq-service) | +| Gemini | [Gemini Integration](gemini-service) | + +## Troubleshooting + +If the custom AI integration does not work as expected, try the following: +- **Fields Not Populating**: Verify that the custom AI service’s endpoint, model, and API key are correct in `appsettings.json`. Ensure the `GenerateResponseAsync` method returns valid data. +- **Service Registration Errors**: Confirm that `CustomAIService` and `CustomInferenceService` are registered in **Program.cs**. +- **AI Parsing Errors**: Check the AI service’s response format and ensure it matches the expected `CustomAIResponse` structure. Test the API independently to verify connectivity. diff --git a/ej2-asp-core-mvc/smart-paste/EJ2_ASP.NETCORE/customization.md b/ej2-asp-core-mvc/smart-paste/EJ2_ASP.NETCORE/customization.md new file mode 100644 index 0000000000..6788ca4a80 --- /dev/null +++ b/ej2-asp-core-mvc/smart-paste/EJ2_ASP.NETCORE/customization.md @@ -0,0 +1,20 @@ +--- +layout: post +title: Customization in ##Platform_Name## Smart Paste Button Control | Syncfusion +description: Explore styles and appearance customization options with ##Platform_Name## Smart Paste Button control of Syncfusion Essential JS 2 and more details. +platform: ej2-asp-core-mvc +control: Types and Appearance +publishingplatform: ##Platform_Name## +documentation: ug +--- + +# Types and Appearance + +The Syncfusion® ASP.NET Core Smart Paste Button control inherits all properties, types, and styling options of the Syncfusion® ASP.NET Core Button control. This allows users to utilize the existing features and flexibility of the Syncfusion® ASP.NET Core Button while taking advantage of the enhanced Smart Paste Button functionality. + +- [Types and Styles](https://ej2.syncfusion.com/aspnetcore/documentation/button/types-and-styles) +- [Style and Appearance](https://ej2.syncfusion.com/aspnetcore/documentation/button/style-and-appearance) + +## See Also + +- [ASP.NET Core Button Control: Types and Styles](https://ej2.syncfusion.com/aspnetcore/documentation/button/types-and-styles) \ No newline at end of file diff --git a/ej2-asp-core-mvc/smart-paste/EJ2_ASP.NETCORE/deepseek-service.md b/ej2-asp-core-mvc/smart-paste/EJ2_ASP.NETCORE/deepseek-service.md new file mode 100644 index 0000000000..86e8c9f153 --- /dev/null +++ b/ej2-asp-core-mvc/smart-paste/EJ2_ASP.NETCORE/deepseek-service.md @@ -0,0 +1,249 @@ +--- +layout: post +title: DeepSeek AI in ##Platform_Name## Smart Paste Button Control | Syncfusion +description: Learn how to implement a custom AI service using DeepSeek AI with ##Platform_Name## Smart Paste Button control of Syncfusion Essential JS 2 and more details. +platform: ej2-asp-core-mvc +control: DeepSeek AI +publishingplatform: ##Platform_Name## +documentation: ug +--- + +# DeepSeek AI Integration with ASP.NET Core Smart Paste Button + +The Syncfusion ASP.NET Core SmartPaste Button control enables AI-powered, context-aware content pasting into forms, typically using OpenAI or Azure OpenAI. This guide explains how to integrate the DeepSeek AI service with the Smart Paste Button using the `IChatInferenceService` interface, enabling custom AI-driven responses in a ASP.NET Core App. + +## Setting Up DeepSeek + +1. **Obtain a DeepSeek API Key** + Create an account at [DeepSeek Platform](https://platform.deepseek.com), sign in, and navigate to [API Keys](https://platform.deepseek.com/api_keys) to generate an API key. +2. **Review Model Specifications** + Refer to [DeepSeek Models Documentation](https://api-docs.deepseek.com/quick_start/pricing) for details on available models (e.g., `deepseek-chat`). + +## Create a DeepSeek AI Service + +Create a service class to manage interactions with the DeepSeek API, including authentication and response processing for the Smart Paste Button. + +1. Create a `Services` folder in your project. +2. Add a new file named `DeepSeekAIService.cs` in the `Services` folder. +3. Implement the service as shown below, storing the API key securely in a configuration file or environment variable (e.g., `appsettings.json`). + +```csharp +using System.Net; +using System.Text; +using System.Text.Json; +using Microsoft.Extensions.AI; + +public class DeepSeekAIService +{ + private readonly string _apiKey; + private readonly string _modelName = "deepseek-chat"; // Example model + private readonly string _endpoint = "https://api.deepseek.com/chat/completions"; + private static readonly HttpClient HttpClient = new(new SocketsHttpHandler + { + PooledConnectionLifetime = TimeSpan.FromMinutes(30), + EnableMultipleHttp2Connections = true + }) + { + DefaultRequestVersion = HttpVersion.Version20 // Fallback to HTTP/2 for compatibility + }; + private static readonly JsonSerializerOptions JsonOptions = new() + { + PropertyNamingPolicy = JsonNamingPolicy.CamelCase + }; + + public DeepSeekAIService(IConfiguration configuration) + { + _apiKey = configuration["DeepSeek:ApiKey"] ?? throw new ArgumentNullException("DeepSeek API key is missing."); + if (!HttpClient.DefaultRequestHeaders.Contains("Authorization")) + { + HttpClient.DefaultRequestHeaders.Clear(); + HttpClient.DefaultRequestHeaders.Add("Authorization", $"Bearer {_apiKey}"); + } + } + + public async Task CompleteAsync(IList chatMessages) + { + var requestBody = new DeepSeekChatRequest + { + Model = _modelName, + Temperature = 0.7f, // Controls response randomness (0.0 to 1.0) + Messages = chatMessages.Select(m => new DeepSeekMessage + { + Role = m.Role == ChatRole.User ? "user" : "system", // Align with DeepSeek API roles + Content = m.Text + }).ToList() + }; + + var content = new StringContent(JsonSerializer.Serialize(requestBody, JsonOptions), Encoding.UTF8, "application/json"); + + try + { + var response = await HttpClient.PostAsync(_endpoint, content); + response.EnsureSuccessStatusCode(); + var responseString = await response.Content.ReadAsStringAsync(); + var responseObject = JsonSerializer.Deserialize(responseString, JsonOptions); + return responseObject?.Choices?.FirstOrDefault()?.Message?.Content ?? "No response from DeepSeek."; + } + catch (Exception ex) when (ex is HttpRequestException || ex is JsonException) + { + throw new InvalidOperationException("Failed to communicate with DeepSeek API.", ex); + } + } +} +``` + +N> Store the DeepSeek API key in `appsettings.json` (e.g., `{ "DeepSeek": { "ApiKey": "your-api-key" } }`) or as an environment variable to ensure security. + +## Define Request and Response Models + +Define C# classes to match the DeepSeek API’s JSON request and response format. + +1. Create a new file named `DeepSeekModels.cs` in the `Services` folder. +2. Add the following model classes: + +```csharp +public class DeepSeekMessage +{ + public string Role { get; set; } + public string Content { get; set; } +} + +public class DeepSeekChatRequest +{ + public string Model { get; set; } + public float Temperature { get; set; } + public List Messages { get; set; } +} + +public class DeepSeekChatResponse +{ + public List Choices { get; set; } +} + +public class DeepSeekChoice +{ + public DeepSeekMessage Message { get; set; } +} +``` + +## Create a Custom AI Service + +Implement the `IChatInferenceService` interface to connect the Smart Paste Button to the DeepSeek service, acting as a bridge for AI-generated responses. + +1. Create a new file named `DeepSeekInferenceService.cs` in the `Services` folder. +2. Add the following implementation: + +```csharp +using Syncfusion.EJ2.AI; +using System.Threading.Tasks; + +public class DeepSeekInferenceService : IChatInferenceService +{ + private readonly DeepSeekAIService _deepSeekService; + + public DeepSeekInferenceService(DeepSeekAIService deepSeekService) + { + _deepSeekService = deepSeekService; + } + + public async Task GenerateResponseAsync(ChatParameters options) + { + return await _deepSeekService.CompleteAsync(options.Messages); + } +} +``` + +## Configure the Blazor App + +Register the DeepSeek service and `IChatInferenceService` implementation in the dependency injection container. + +Update the **~/Program.cs** file as follows: + +```csharp +using Syncfusion.EJ2; +using Syncfusion.EJ2.AI; + +var builder = WebApplication.CreateBuilder(args); + +builder.Services.AddRazorPages(); +builder.Services.AddSyncfusionSmartComponents(); +builder.Services.AddSingleton(); +builder.Services.AddSingleton(); + +var app = builder.Build(); +// ... +``` + +## Add the Smart Paste Button + +Add the Smart Paste Button to a form in the **~/Pages/Index.cshtml** file to test the DeepSeek AI integration. + +{% tabs %} +{% highlight cshtml tabtitle="CSHTML" %} + +

Contact Form

+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ +
+ + +
+
+ + +
+
+
+ + +
+ + + +
+ +
+
+ I am John Doe from the United States. My email is johndoe@example.com, and my phone number is 555-123-4567. I’d like to inquire about your services and have a detailed discussion regarding your product offerings. Please contact me via email. I’m happy to subscribe to your newsletter for updates. Thank you! +
+ +{% endhighlight %} +{% endtabs %} + +Press Ctrl+F5 (Windows) or +F5 (macOS) to run the app. Then, the Syncfusion® ASP.NET Core +Smart Paste Button control will be rendered in the default web browser. + +![ASP.NET Core Smart Paste Button Control](images/SmartPaste.gif) + +## Troubleshooting + +If the DeepSeek AI integration does not work, try the following: +- **No Suggestions Displayed**: Verify that the DeepSeek API key and model name are correct in the configuration. Check the `DeepSeekAIService` implementation for errors. +- **HTTP Request Failures**: Ensure a stable internet connection and that the DeepSeek API endpoint (`https://api.deepseek.com/v1/chat/completions`) is accessible. Test with HTTP/2 if compatibility issues arise. +- **Service Registration Errors**: Confirm that `DeepSeekAIService` and `DeepSeekInferenceService` are registered in **Program.cs**. \ No newline at end of file diff --git a/ej2-asp-core-mvc/smart-paste/EJ2_ASP.NETCORE/gemini-service.md b/ej2-asp-core-mvc/smart-paste/EJ2_ASP.NETCORE/gemini-service.md new file mode 100644 index 0000000000..2257eb586e --- /dev/null +++ b/ej2-asp-core-mvc/smart-paste/EJ2_ASP.NETCORE/gemini-service.md @@ -0,0 +1,297 @@ +--- +layout: post +title: Gemini AI in ##Platform_Name## Smart Paste Button Control | Syncfusion +description: Learn how to implement a custom AI service using Google's Gemini API with ##Platform_Name## Smart Paste Button control of Syncfusion Essential JS 2 and more details. +platform: ej2-asp-core-mvc +control: Gemini AI +publishingplatform: ##Platform_Name## +documentation: ug +--- + +# Gemini AI Integration with ASP.NET Core Smart Paste Button + +The Syncfusion ASP.NET Core SmartPaste Button control enables AI-powered, context-aware content pasting into forms, typically using OpenAI or Azure OpenAI. This guide explains how to integrate the Google Gemini AI service with the Smart Paste Button using the `IChatInferenceService` interface, enabling custom AI-driven responses in a ASP.NET Core Web App. + +## Setting Up Gemini + +1. **Obtain a Gemini API Key** + Visit [Google AI Studio](https://ai.google.dev/gemini-api/docs/api-key), sign in, and generate an API key. +2. **Review Model Specifications** + Refer to [Gemini Models Documentation](https://ai.google.dev/gemini-api/docs/models) for details on available models. + +## Create a Gemini AI Service + +Create a service class to manage interactions with the Gemini API, including authentication, request/response handling, and safety settings for the Smart Paste Button. + +1. Create a `Services` folder in your project. +2. Add a new file named `GeminiService.cs` in the `Services` folder. +3. Implement the service as shown below, storing the API key securely in a configuration file or environment variable (e.g., `appsettings.json`). + +```csharp +using System.Net; +using System.Text; +using System.Text.Json; +using Microsoft.Extensions.AI; + +public class GeminiService +{ + private readonly string _apiKey; + private readonly string _modelName = "gemini-2.0-flash"; // Example model + private readonly string _endpoint = "https://generativelanguage.googleapis.com/v1beta/models/"; + private static readonly HttpClient HttpClient = new(new SocketsHttpHandler + { + PooledConnectionLifetime = TimeSpan.FromMinutes(30), + EnableMultipleHttp2Connections = true + }) + { + DefaultRequestVersion = HttpVersion.Version20 // Fallback to HTTP/2 for compatibility + }; + private static readonly JsonSerializerOptions JsonOptions = new() + { + PropertyNamingPolicy = JsonNamingPolicy.CamelCase + }; + + public GeminiService(IConfiguration configuration) + { + _apiKey = configuration["Gemini:ApiKey"] ?? throw new ArgumentNullException("Gemini API key is missing."); + HttpClient.DefaultRequestHeaders.Clear(); + HttpClient.DefaultRequestHeaders.Add("x-goog-api-key", _apiKey); + } + + public async Task CompleteAsync(IList chatMessages) + { + var requestUri = $"{_endpoint}{_modelName}:generateContent"; + var parameters = BuildGeminiChatParameters(chatMessages); + var payload = new StringContent( + JsonSerializer.Serialize(parameters, JsonOptions), + Encoding.UTF8, + "application/json" + ); + + try + { + using var response = await HttpClient.PostAsync(requestUri, payload); + response.EnsureSuccessStatusCode(); + var json = await response.Content.ReadAsStringAsync(); + var result = JsonSerializer.Deserialize(json, JsonOptions); + return result?.Candidates?.FirstOrDefault()?.Content?.Parts?.FirstOrDefault()?.Text + ?? "No response from model."; + } + catch (Exception ex) when (ex is HttpRequestException or JsonException) + { + throw new InvalidOperationException("Gemini API error.", ex); + } + } + + private GeminiChatParameters BuildGeminiChatParameters(IList messages) + { + var contents = messages.Select(m => new ResponseContent( + m.Text, + m.Role == ChatRole.User ? "user" : "model" + )).ToList(); + + return new GeminiChatParameters + { + Contents = contents, + GenerationConfig = new GenerationConfig + { + MaxOutputTokens = 2000, + StopSequences = new List { "END_INSERTION", "NEED_INFO", "END_RESPONSE" } // Configurable stop sequences + }, + SafetySettings = new List + { + new() { Category = "HARM_CATEGORY_HARASSMENT", Threshold = "BLOCK_ONLY_HIGH" }, + new() { Category = "HARM_CATEGORY_HATE_SPEECH", Threshold = "BLOCK_ONLY_HIGH" }, + new() { Category = "HARM_CATEGORY_SEXUALLY_EXPLICIT", Threshold = "BLOCK_ONLY_HIGH" }, + new() { Category = "HARM_CATEGORY_DANGEROUS_CONTENT", Threshold = "BLOCK_ONLY_HIGH" } + } + }; + } +} +``` + +N> Store the Gemini API key in `appsettings.json` (e.g., `{ "Gemini": { "ApiKey": "your-api-key" } }`) or as an environment variable to ensure security. The `SafetySettings` filter harmful content; adjust thresholds based on your application’s needs. + +## Define Request and Response Models + +Define C# classes to match the Gemini API’s JSON request and response format. + +1. Create a new file named `GeminiModels.cs` in the `Services` folder. +2. Add the following model classes: + +```csharp +public class Part +{ + public string Text { get; set; } +} + +public class Content +{ + public Part[] Parts { get; init; } = Array.Empty(); +} + +public class Candidate +{ + public Content Content { get; init; } = new(); +} + +public class GeminiResponseObject +{ + public Candidate[] Candidates { get; init; } = Array.Empty(); +} + +public class ResponseContent +{ + public List Parts { get; init; } + public string Role { get; init; } + + public ResponseContent(string text, string role) + { + Parts = new List { new Part { Text = text } }; + Role = role; + } +} + +public class GenerationConfig +{ + public int Temperature { get; init; } = 0; + public int TopK { get; init; } = 0; + public int TopP { get; init; } = 0; + public int MaxOutputTokens { get; init; } = 2048; + public List StopSequences { get; init; } = new(); +} + +public class SafetySetting +{ + public string Category { get; init; } = string.Empty; + public string Threshold { get; init; } = string.Empty; +} + +public class GeminiChatParameters +{ + public List Contents { get; init; } = new(); + public GenerationConfig GenerationConfig { get; init; } = new(); + public List SafetySettings { get; init; } = new(); +} +``` + +## Create a Custom AI Service + +Implement the `IChatInferenceService` interface to connect the Smart Paste Button to the Gemini service, acting as a bridge for AI-generated responses. + +1. Create a new file named `GeminiInferenceService.cs` in the `Services` folder. +2. Add the following implementation: + +```csharp +using Syncfusion.EJ2.AI; +using System.Threading.Tasks; + +public class GeminiInferenceService : IChatInferenceService +{ + private readonly GeminiService _geminiService; + + public GeminiInferenceService(GeminiService geminiService) + { + _geminiService = geminiService; + } + + public async Task GenerateResponseAsync(ChatParameters options) + { + return await _geminiService.CompleteAsync(options.Messages); + } +} +``` + +## Configure the ASP.NET Core App + +Register the Gemini service and `IChatInferenceService` implementation in the dependency injection container. + +Update the **~/Program.cs** file as follows: + +```csharp +using Syncfusion.EJ2; +using Syncfusion.EJ2.AI; + +builder.Services.AddRazorPages(); + +builder.Services.AddSyncfusionSmartComponents(); +builder.Services.AddSingleton(); +builder.Services.AddSingleton(); + +var app = builder.Build(); +// ... +``` + +## Add the Smart Paste Button + +Add the Smart Paste Button to a form in the **~/Pages/Index.cshtml** file to test the Gemini AI integration. + +{% tabs %} +{% highlight cshtml tabtitle="CSHTML" %} + +

Contact Form

+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ +
+ + +
+
+ + +
+
+
+ + +
+ + + +
+ +
+
+ I am John Doe from the United States. My email is johndoe@example.com, and my phone number is 555-123-4567. I’d like to inquire about your services and have a detailed discussion regarding your product offerings. Please contact me via email. I’m happy to subscribe to your newsletter for updates. Thank you! +
+ +{% endhighlight %} +{% endtabs %} + +Press Ctrl+F5 (Windows) or +F5 (macOS) to run the app. Then, the Syncfusion® ASP.NET Core +Smart Paste Button control will be rendered in the default web browser. + +![ASP.NET Core Smart Paste Button Control](images/SmartPaste.gif) + +## Troubleshooting + +If the Gemini AI integration does not work, try the following: +- **No Suggestions Displayed**: Verify that the Gemini API key and model name are correct in the configuration. Check the `GeminiService` implementation for errors. +- **HTTP Request Failures**: Ensure a stable internet connection and that the Gemini API endpoint (`https://generativelanguage.googleapis.com/v1beta/models/`) is accessible. Test with HTTP/2 if compatibility issues arise. +- **Service Registration Errors**: Confirm that `GeminiService` and `GeminiInferenceService` are registered in **Program.cs**. \ No newline at end of file diff --git a/ej2-asp-core-mvc/smart-paste/EJ2_ASP.NETCORE/getting-started.md b/ej2-asp-core-mvc/smart-paste/EJ2_ASP.NETCORE/getting-started.md new file mode 100644 index 0000000000..6f736a385c --- /dev/null +++ b/ej2-asp-core-mvc/smart-paste/EJ2_ASP.NETCORE/getting-started.md @@ -0,0 +1,285 @@ +--- +layout: post +title: Getting Started with ##Platform_Name## Smart Paste Button | Syncfusion +description: Checkout and learn about getting started with ##Platform_Name## Smart Paste Button control of Syncfusion Essential JS 2 and more details. +platform: ej2-asp-core-mvc +control: Getting Started +publishingplatform: ##Platform_Name## +documentation: ug +--- + +# Getting Started with ASP.NET Core Smart Paste Button Control + +This section briefly explains about how to include `ASP.NET Core Smart Paste Button` control in your ASP.NET Core application using Visual Studio. + +## Prerequisites + +[System requirements for ASP.NET Core controls](https://ej2.syncfusion.com/aspnetcore/documentation/system-requirements) + +## Create ASP.NET Core web application with Razor pages + +* [Create a Project using Microsoft Templates](https://learn.microsoft.com/en-us/aspnet/core/tutorials/razor-pages/razor-pages-start?view=aspnetcore-8.0&tabs=visual-studio#create-a-razor-pages-web-app) + +* [Create a Project using Syncfusion® ASP.NET Core Extension](https://ej2.syncfusion.com/aspnetcore/documentation/visual-studio-integration/create-project) + +## Install ASP.NET Core package in the application + +To add `ASP.NET Core` controls in the application, open the NuGet package manager in Visual Studio (Tools → NuGet Package Manager → Manage NuGet Packages for Solution), search for [Syncfusion.EJ2.AspNet.Core](https://www.nuget.org/packages/Syncfusion.EJ2.AspNet.Core/) and then install it. Alternatively, you can utilize the following package manager command to achieve the same. + +{% tabs %} +{% highlight C# tabtitle="Package Manager" %} + +Install-Package Syncfusion.EJ2.AspNet.Core -Version {{ site.releaseversion }} + +{% endhighlight %} +{% endtabs %} + +N> Syncfusion® ASP.NET Core controls are available in [nuget.org.](https://www.nuget.org/packages?q=syncfusion.EJ2) Refer to [NuGet packages topic](https://ej2.syncfusion.com/aspnetcore/documentation/nuget-packages) to learn more about installing NuGet packages in various OS environments. The Syncfusion.EJ2.AspNet.Core NuGet package has dependencies, [Newtonsoft.Json](https://www.nuget.org/packages/Newtonsoft.Json/) for JSON serialization and [Syncfusion.Licensing](https://www.nuget.org/packages/Syncfusion.Licensing/) for validating Syncfusion® license key. + +## Add Syncfusion® ASP.NET Core Tag Helper +Open `~/Pages/_ViewImports.cshtml` file and import the `Syncfusion.EJ2` TagHelper. + +{% tabs %} +{% highlight C# tabtitle="~/_ViewImports.cshtml" %} + +@addTagHelper *, Syncfusion.EJ2 + +{% endhighlight %} +{% endtabs %} + +## Add stylesheet and script resources + +Here, the theme and script is referred using CDN inside the `` of `~/Pages/Shared/_Layout.cshtml` file as follows, + +{% tabs %} +{% highlight cshtml tabtitle="~/_Layout.cshtml" %} + + + ... + + + + + + +{% endhighlight %} +{% endtabs %} + +N> Checkout the [Themes topic](https://ej2.syncfusion.com/aspnetcore/documentation/appearance/theme) to learn different ways ([CDN](https://ej2.syncfusion.com/aspnetcore/documentation/common/adding-script-references#cdn-reference), [NPM package](https://ej2.syncfusion.com/aspnetcore/documentation/common/adding-script-references#node-package-manager-npm), and [CRG](https://ej2.syncfusion.com/aspnetcore/documentation/common/custom-resource-generator)) to refer styles in ASP.NET Core application, and to have the expected appearance for Syncfusion® ASP.NET Core controls. + +N> Checkout the [Adding Script Reference](https://ej2.syncfusion.com/aspnetcore/documentation/common/adding-script-references) topic to learn different approaches for adding script references in your ASP.NET Core application. + +## Register Syncfusion® Script Manager + +Also, register the script manager `` at the end of `` in the ASP.NET Core application as follows. + +{% tabs %} +{% highlight cshtml tabtitle="~/_Layout.cshtml" %} + + + ... + + + + +{% endhighlight %} +{% endtabs %} + +## Configure AI Service + +The Smart Paste Button requires an AI service (OpenAI, Azure OpenAI, or Ollama) to analyze and map copied text to form fields. Follow the instructions below to configure an AI model in your application. + +### Install AI Service NuGet Packages + +Install the following NuGet packages based on your chosen AI provider: + +{% tabs %} +{% highlight c# tabtitle="Package Manager" %} + +Install-Package Microsoft.Extensions.AI +Install-Package Microsoft.Extensions.AI.OpenAI +@* For Azure OpenAI only *@ +Install-Package Azure.AI.OpenAI +@* For Ollama only *@ +Install-Package OllamaSharp + +{% endhighlight %} +{% endtabs %} + +### OpenAI Configuration + +For OpenAI, obtain an API key from [OpenAI](https://help.openai.com/en/articles/4936850-where-do-i-find-my-openai-api-key) and specify the desired model (e.g., `gpt-3.5-turbo`, `gpt-4`). Store the API key securely in a configuration file or environment variable. + +Add the following to the **~/Program.cs** file: + +{% tabs %} +{% highlight cshtml tabtitle="CSHTML" %} + +using Microsoft.Extensions.AI; +using OpenAI; +using Syncfusion.EJ2; + + +builder.Services.AddRazorPages(); + +string openAIApiKey = "API-KEY"; +string openAIModel = "OPENAI_MODEL"; +OpenAIClient openAIClient = new OpenAIClient(openAIApiKey); +IChatClient openAIChatClient = openAIClient.GetChatClient(openAIModel).AsIChatClient(); +builder.Services.AddChatClient(openAIChatClient); + +builder.Services.AddSyncfusionSmartComponents() + .InjectOpenAIInference(); + +var app = builder.Build(); +.... + +{% endhighlight %} +{% endtabs %} + +### Azure OpenAI Configuration + +For Azure OpenAI, deploy a resource and model as described in [Azure OpenAI documentation](https://learn.microsoft.com/en-us/azure/ai-services/openai/how-to/create-resource). Obtain the API key, endpoint, and model name from your Azure portal. + +Add the following to the **~/Program.cs** file: + +{% tabs %} +{% highlight cshtml tabtitle="CSHTML" %} + +using Syncfusion.EJ2; +using Microsoft.Extensions.AI; +using Azure.AI.OpenAI; +using System.ClientModel; + +builder.Services.AddRazorPages(); + +string azureOpenAIKey = "AZURE_OPENAI_KEY"; +string azureOpenAIEndpoint = "AZURE_OPENAI_ENDPOINT"; +string azureOpenAIModel = "AZURE_OPENAI_MODEL"; +AzureOpenAIClient azureOpenAIClient = new AzureOpenAIClient( + new Uri(azureOpenAIEndpoint), + new ApiKeyCredential(azureOpenAIKey) +); +IChatClient azureOpenAIChatClient = azureOpenAIClient.GetChatClient(azureOpenAIModel).AsIChatClient(); +builder.Services.AddChatClient(azureOpenAIChatClient); + +builder.Services.AddSyncfusionSmartComponents() + .InjectOpenAIInference(); + +var app = builder.Build(); +.... + +{% endhighlight %} +{% endtabs %} + +### Ollama Configuration + +To use Ollama for self-hosted models: + +1. Download and install Ollama from [Ollama's official website](https://ollama.com). +2. Install a model from the [Ollama Library](https://ollama.com/library) (e.g., `llama2:13b`, `mistral:7b`). +3. Configure the endpoint URL (e.g., `http://localhost:11434`) and model name. + +Add the following to the **~/Program.cs** file: + +{% tabs %} +{% highlight cshtml tabtitle="CSHTML" %} + +using Syncfusion.EJ2; +using Microsoft.Extensions.AI; +using OllamaSharp; + +builder.Services.AddRazorPages(); + +string ModelName = "MODEL_NAME"; +IChatClient chatClient = new OllamaApiClient("http://localhost:11434", ModelName); +builder.Services.AddChatClient(chatClient); + +builder.Services.AddSyncfusionSmartComponents() + .InjectOpenAIInference(); + +var app = builder.Build(); +.... + +{% endhighlight %} +{% endtabs %} + +## Add ASP.NET Core Smart Paste Button Control + +Now, add the Syncfusion® ASP.NET Core Smart Paste Button tag helper in `~/Pages/Index.cshtml` page. + +{% tabs %} +{% highlight cshtml tabtitle="CSHTML" %} + +

Contact Form

+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ +
+ + +
+
+ + +
+
+
+ + +
+ + + +
+ +
+
+ I am John Doe from the United States. My email is johndoe@example.com, and my phone number is 555-123-4567. I’d like to inquire about your services and have a detailed discussion regarding your product offerings. Please contact me via email. I’m happy to subscribe to your newsletter for updates. Thank you! +
+ +{% endhighlight %} +{% endtabs %} + +Press Ctrl+F5 (Windows) or +F5 (macOS) to run the app. Then, the Syncfusion® ASP.NET Core +Smart Paste Button control will be rendered in the default web browser. + +![ASP.NET Core Smart Paste Button Control](images/SmartPaste.gif) + +## Performance Considerations + +For optimal performance with the Smart Paste Button: +- Use lightweight AI models (e.g., `gpt-3.5-turbo` or `mistral:7b`) for faster processing. +- Limit form complexity to reduce AI parsing time, especially for large datasets. +- Cache AI model responses where possible to minimize repeated API calls. + +## Troubleshooting Common Issues + +- **AI Service Configuration Errors**: Verify the API key, endpoint, and model name in `Program.cs`. Check for typos or incorrect values. +- **Network Failures**: Ensure a stable internet connection for OpenAI or Azure OpenAI. For Ollama, confirm the local server is running at the specified endpoint (e.g., `http://localhost:11434`). +- **Form Not Populating**: Confirm that the copied text matches the form field structure and that the AI model is correctly configured. diff --git a/ej2-asp-core-mvc/smart-paste/EJ2_ASP.NETCORE/groq-service.md b/ej2-asp-core-mvc/smart-paste/EJ2_ASP.NETCORE/groq-service.md new file mode 100644 index 0000000000..20c3163380 --- /dev/null +++ b/ej2-asp-core-mvc/smart-paste/EJ2_ASP.NETCORE/groq-service.md @@ -0,0 +1,250 @@ +--- +layout: post +title: Groq AI in ##Platform_Name## Smart Paste Button Control | Syncfusion +description: Learn how to implement a custom AI service using Groq AI with ##Platform_Name## Smart Paste Button control of Syncfusion Essential JS 2 and more details. +platform: ej2-asp-core-mvc +control: Groq AI +publishingplatform: ##Platform_Name## +documentation: ug +--- + +# Groq AI Integration with ASP.NET Core Smart Paste Button + +The Syncfusion ASP.NET Core Smart Paste Button control enables AI-powered, context-aware content pasting into forms, typically using OpenAI or Azure OpenAI. This guide explains how to integrate the Groq AI service with the Smart Paste Button using the `IChatInferenceService` interface, enabling custom AI-driven responses in a ASP.NET Core app. + +## Setting Up Groq + +1. **Create a Groq Account** + Visit [Groq Cloud Console](https://console.groq.com), sign up or sign in, and complete the verification process. +2. **Obtain an API Key** + Navigate to [API Keys](https://console.groq.com/keys) in the Groq Console and click "Create API Key." +3. **Review Model Specifications** + Refer to [Groq Models Documentation](https://console.groq.com/docs/models) for details on available models (e.g., `llama3-8b-8192`). + +## Create a Groq AI Service + +Create a service class to manage interactions with the Groq API, including authentication and response processing for the Smart Paste Button. + +1. Create a `Services` folder in your project. +2. Add a new file named `GroqService.cs` in the `Services` folder. +3. Implement the service as shown below, storing the API key securely in a configuration file or environment variable (e.g., `appsettings.json` or environment variables). + +```csharp +using Microsoft.Extensions.AI; +using System.Net; +using System.Text; +using System.Text.Json; + +public class GroqService +{ + private readonly string _apiKey; + private readonly string _modelName = "llama-3.3-70b-versatile"; // Example model + private readonly string _endpoint = "https://api.groq.com/openai/v1/chat/completions"; + private static readonly HttpClient HttpClient = new(new SocketsHttpHandler + { + PooledConnectionLifetime = TimeSpan.FromMinutes(30), + EnableMultipleHttp2Connections = true + }) + { + DefaultRequestVersion = HttpVersion.Version20 // Fallback to HTTP/2 for broader compatibility + }; + private static readonly JsonSerializerOptions JsonOptions = new() + { + PropertyNamingPolicy = JsonNamingPolicy.CamelCase + }; + + public GroqService(IConfiguration configuration) + { + _apiKey = configuration["Groq:ApiKey"] ?? throw new ArgumentNullException("Groq API key is missing."); + if (!HttpClient.DefaultRequestHeaders.Contains("Authorization")) + { + HttpClient.DefaultRequestHeaders.Clear(); + HttpClient.DefaultRequestHeaders.Add("Authorization", $"Bearer {_apiKey}"); + } + } + + public async Task CompleteAsync(IList chatMessages) + { + var requestPayload = new GroqChatParameters + { + Model = _modelName, + Messages = chatMessages.Select(m => new Message + { + Role = m.Role == ChatRole.User ? "user" : "assistant", + Content = m.Text + }).ToList(), + Stop = new List { "END_INSERTION", "NEED_INFO", "END_RESPONSE" } // Configurable stop sequences + }; + + var content = new StringContent(JsonSerializer.Serialize(requestPayload, JsonOptions), Encoding.UTF8, "application/json"); + + try + { + var response = await HttpClient.PostAsync(_endpoint, content); + response.EnsureSuccessStatusCode(); + var responseString = await response.Content.ReadAsStringAsync(); + var responseObject = JsonSerializer.Deserialize(responseString, JsonOptions); + return responseObject?.Choices?.FirstOrDefault()?.Message?.Content ?? "No response from model."; + } + catch (Exception ex) when (ex is HttpRequestException || ex is JsonException) + { + throw new InvalidOperationException("Failed to communicate with Groq API.", ex); + } + } +} +``` + +N> Store the Groq API key in `appsettings.json` (e.g., `{ "Groq": { "ApiKey": "your-api-key" } }`) or as an environment variable to ensure security. + +## Define Request and Response Models + +Define C# classes to match the Groq API’s request and response format. + +1. Create a new file named `GroqModels.cs` in the `Services` folder. +2. Add the following model classes: + +```csharp +public class Choice +{ + public Message Message { get; set; } +} + +public class Message +{ + public string Role { get; set; } + public string Content { get; set; } +} + +public class GroqChatParameters +{ + public string Model { get; set; } + public List Messages { get; set; } + public List Stop { get; set; } +} + +public class GroqResponseObject +{ + public string Model { get; set; } + public List Choices { get; set; } +} +``` + +## Create a Custom AI Service + +Implement the `IChatInferenceService` interface to connect the Smart Paste Button to the Groq service. + +1. Create a new file named `GroqInferenceService.cs` in the `Services` folder. +2. Add the following implementation: + +```csharp +using Syncfusion.EJ2.AI; +using System.Threading.Tasks; + +public class GroqInferenceService : IChatInferenceService +{ + private readonly GroqService _groqService; + + public GroqInferenceService(GroqService groqService) + { + _groqService = groqService; + } + + public async Task GenerateResponseAsync(ChatParameters options) + { + return await _groqService.CompleteAsync(options.Messages); + } +} +``` + +## Configure the ASP.NET Core App + +Register the Groq service and `IChatInferenceService` implementation in the dependency injection container. + +Update the **~/Program.cs** file as follows: + +```csharp +using Syncfusion.EJ2; +using Syncfusion.EJ2.AI; + +builder.Services.AddRazorPages(); +builder.Services.AddSyncfusionSmartComponents(); +builder.Services.AddSingleton(); +builder.Services.AddSingleton(); + +var app = builder.Build(); +// ... +``` + +## Add the Smart Paste Button + +Add the Smart Paste Button to a form in the **~/Pages/Index.cshtml** file to test the Gemini AI integration. + +{% tabs %} +{% highlight cshtml tabtitle="CSHTML" %} + +

Contact Form

+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ +
+ + +
+
+ + +
+
+
+ + +
+ + + +
+ +
+
+ I am John Doe from the United States. My email is johndoe@example.com, and my phone number is 555-123-4567. I’d like to inquire about your services and have a detailed discussion regarding your product offerings. Please contact me via email. I’m happy to subscribe to your newsletter for updates. Thank you! +
+ +{% endhighlight %} +{% endtabs %} + +Press Ctrl+F5 (Windows) or +F5 (macOS) to run the app. Then, the Syncfusion® ASP.NET Core +Smart Paste Button control will be rendered in the default web browser. + +![ASP.NET Core Smart Paste Button Control](images/SmartPaste.gif) + +## Troubleshooting + +If the Groq AI integration does not work, try the following: +- **No Suggestions Displayed**: Verify that the Groq API key and model name are correct in the configuration. Check the `GroqService` implementation for errors. +- **HTTP Request Failures**: Ensure a stable internet connection and that the Groq API endpoint (`https://api.groq.com/openai/v1/chat/completions`) is accessible. Test with HTTP/2 instead of HTTP/3 if compatibility issues arise. +- **Service Registration Errors**: Confirm that `GroqService` and `GroqInferenceService` are registered in **Program.cs**. \ No newline at end of file diff --git a/ej2-asp-core-mvc/smart-paste/images/SmartPaste.gif b/ej2-asp-core-mvc/smart-paste/images/SmartPaste.gif new file mode 100644 index 0000000000000000000000000000000000000000..0a177a1633acea6410021796d743a0549eed4183 GIT binary patch literal 52285 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 J`|k(x{{hkL>M;NS literal 0 HcmV?d00001 diff --git a/ej2-asp-core-mvc/smart-textarea/EJ2_ASP.NETCORE/claude-service.md b/ej2-asp-core-mvc/smart-textarea/EJ2_ASP.NETCORE/claude-service.md new file mode 100644 index 0000000000..828e8b673a --- /dev/null +++ b/ej2-asp-core-mvc/smart-textarea/EJ2_ASP.NETCORE/claude-service.md @@ -0,0 +1,208 @@ +--- +layout: post +title: Claude AI in ##Platform_Name## Smart TextArea Control | Syncfusion +description: Learn how to implement a custom AI service using Claude AI with ##Platform_Name## Smart TextArea control of Syncfusion Essential JS 2 and more details. +platform: ej2-asp-core-mvc +control: Claude AI +publishingplatform: ##Platform_Name## +documentation: ug +--- + +# Claude AI Integration with ASP.NET Core Smart TextArea + +The Syncfusion ASP.NET Core Smart TextArea control provides AI-powered autocompletion for context-aware text input, typically using OpenAI or Azure OpenAI. This guide explains how to integrate the Anthropic Claude AI service with the Smart TextArea using the `IChatInferenceService` interface, enabling custom AI-driven responses in a ASP.NET Core App. + +## Setting Up Claude + +1. **Create an Anthropic Account** + Visit [Anthropic Console](https://console.anthropic.com), sign up, and complete the verification process. +2. **Obtain an API Key** + Navigate to [API Keys](https://console.anthropic.com/settings/keys) and click "Create Key." +3. **Review Model Specifications** + Refer to [Claude Models Documentation](https://docs.anthropic.com/claude/docs/models-overview) for details on available models. + +## Create a Claude AI Service + +Create a service class to manage interactions with the Claude API, including authentication and response processing for the Smart TextArea. + +1. Create a `Services` folder in your project. +2. Add a new file named `ClaudeAIService.cs` in the `Services` folder. +3. Implement the service as shown below, storing the API key securely in a configuration file or environment variable (e.g., `appsettings.json`). + +```csharp +using Microsoft.Extensions.AI; +using System.Net; +using System.Text; +using System.Text.Json; + +public class ClaudeAIService +{ + private readonly string _apiKey; + private readonly string _modelName = "claude-3-5-sonnet-20241022"; // Example model + private readonly string _endpoint = "https://api.anthropic.com/v1/messages"; + private static readonly HttpClient HttpClient = new(new SocketsHttpHandler + { + PooledConnectionLifetime = TimeSpan.FromMinutes(30), + EnableMultipleHttp2Connections = true + }) + { + DefaultRequestVersion = HttpVersion.Version20 // Fallback to HTTP/2 for compatibility + }; + private static readonly JsonSerializerOptions JsonOptions = new() + { + PropertyNamingPolicy = JsonNamingPolicy.CamelCase + }; + + public ClaudeAIService(IConfiguration configuration) + { + _apiKey = configuration["Claude:ApiKey"] ?? throw new ArgumentNullException("Claude API key is missing."); + if (!HttpClient.DefaultRequestHeaders.Contains("x-api-key")) + { + HttpClient.DefaultRequestHeaders.Clear(); + HttpClient.DefaultRequestHeaders.Add("x-api-key", _apiKey); + HttpClient.DefaultRequestHeaders.Add("anthropic-version", "2023-06-01"); // Check latest version in Claude API docs + } + } + + public async Task CompleteAsync(IList chatMessages) + { + var requestBody = new ClaudeChatRequest + { + Model = _modelName, + Max_tokens = 1000, // Maximum tokens in response + Messages = chatMessages.Select(m => new ClaudeMessage + { + Role = m.Role == ChatRole.User ? "user" : "assistant", + Content = m.Text + }).ToList(), + Stop_sequences = new List { "END_INSERTION", "NEED_INFO", "END_RESPONSE" } // Configurable stop sequences + }; + + var content = new StringContent(JsonSerializer.Serialize(requestBody, JsonOptions), Encoding.UTF8, "application/json"); + + try + { + var response = await HttpClient.PostAsync(_endpoint, content); + response.EnsureSuccessStatusCode(); + var responseString = await response.Content.ReadAsStringAsync(); + var responseObject = JsonSerializer.Deserialize(responseString, JsonOptions); + return responseObject?.Content?.FirstOrDefault()?.Text ?? "No response from Claude model."; + } + catch (Exception ex) when (ex is HttpRequestException || ex is JsonException) + { + throw new InvalidOperationException("Failed to communicate with Claude API.", ex); + } + } +} +``` + +N> Store the Claude API key in `appsettings.json` (e.g., `{ "Claude": { "ApiKey": "your-api-key" } }`) or as an environment variable to ensure security. Verify the `anthropic-version` header in [Claude API Documentation](https://docs.anthropic.com/claude/docs) for the latest version. + +## Define Request and Response Models + +Define C# classes to match the Claude API’s JSON request and response format. + +1. Create a new file named `ClaudeModels.cs` in the `Services` folder. +2. Add the following model classes: + +```csharp +public class ClaudeChatRequest +{ + public string Model { get; set; } + public int Max_tokens { get; set; } + public List Messages { get; set; } + public List Stop_sequences { get; set; } +} + +public class ClaudeMessage +{ + public string Role { get; set; } + public string Content { get; set; } +} + +public class ClaudeChatResponse +{ + public List Content { get; set; } +} + +public class ClaudeContentBlock +{ + public string Text { get; set; } +} +``` + +## Create a Custom AI Service + +Implement the `IChatInferenceService` interface to connect the Smart TextArea to the Claude service, acting as a bridge for AI-generated responses. + +1. Create a new file named `ClaudeInferenceService.cs` in the `Services` folder. +2. Add the following implementation: + +```csharp +using Syncfusion.EJ2.AI; +using System.Threading.Tasks; + +public class ClaudeInferenceService : IChatInferenceService +{ + private readonly ClaudeAIService _claudeService; + + public ClaudeInferenceService(ClaudeAIService claudeService) + { + _claudeService = claudeService; + } + + public async Task GenerateResponseAsync(ChatParameters options) + { + return await _claudeService.CompleteAsync(options.Messages); + } +} +``` + +## Configure the ASP.NET Core App + +Register the Claude service and `IChatInferenceService` implementation in the dependency injection container. + +Update the **~/Program.cs** file as follows: + +```csharp +using Syncfusion.EJ2.AI; + +builder.Services.AddRazorPages(); +builder.Services.AddSyncfusionSmartComponents(); +builder.Services.AddSingleton(); +builder.Services.AddSingleton(); + +var app = builder.Build(); +// ... +``` + +## Add ASP.NET Core Smart TextArea Control + +Add the Smart TextArea in the **~/Pages/Index.cshtml** file to test the Claude AI integration. + +{% tabs %} +{% highlight cshtml tabtitle="CSHTML" %} + +@{ + var presets = new { + userRole = "Maintainer of an open-source project replying to GitHub issues", + userPhrases = new[] { "Thank you for contacting us.", "To investigate, we'll need a repro as a public Git repo.", "Could you please post a screenshot of NEED_INFO?", "This sounds like a usage question. This issue tracker is intended for bugs and feature proposals. Unfortunately, we don't have the capacity to answer general usage questions and would recommend StackOverflow for a faster response.", "We don't accept ZIP files as repros." }, + placeHolder = "Write your response to the GitHub issue..." }; +} + + + +{% endhighlight %} +{% endtabs %} + +Press Ctrl+F5 (Windows) or +F5 (macOS) to run the app. Then, the Syncfusion® ASP.NET Core +Smart TextArea control will be rendered in the default web browser. + +![ASP.NET Core Smart TextArea Control](images/SmartTextArea.gif) + +## Troubleshooting + +If the Claude AI integration does not work, try the following: +- **No Suggestions Displayed**: Verify that the Claude API key and model name are correct in the configuration. Check the `ClaudeAIService` implementation for errors. +- **HTTP Request Failures**: Ensure a stable internet connection and that the Claude API endpoint (`https://api.anthropic.com/v1/messages`) is accessible. Test with HTTP/2 if compatibility issues arise. +- **Service Registration Errors**: Confirm that `ClaudeAIService` and `ClaudeInferenceService` are registered in **Program.cs**. diff --git a/ej2-asp-core-mvc/smart-textarea/EJ2_ASP.NETCORE/custom-inference-backend.md b/ej2-asp-core-mvc/smart-textarea/EJ2_ASP.NETCORE/custom-inference-backend.md new file mode 100644 index 0000000000..083a4f2c9e --- /dev/null +++ b/ej2-asp-core-mvc/smart-textarea/EJ2_ASP.NETCORE/custom-inference-backend.md @@ -0,0 +1,80 @@ +--- +layout: post +title: Custom AI with ##Platform_Name## Smart TextArea Control | Syncfusion +description: Learn how to integrate custom AI services with ##Platform_Name## Smart TextArea control of Syncfusion Essential JS 2 and more details. +platform: ej2-asp-core-mvc +control: Custom AI Service +publishingplatform: ##Platform_Name## +documentation: ug +--- + +# Custom AI Service Integration with ASP.NET Core Smart TextArea + +The Syncfusion ASP.NET Core Smart TextArea control leverages AI to provide context-aware autocompletion, typically using OpenAI or Azure OpenAI services. Developers can integrate custom AI services using the `IChatInferenceService` interface, which standardizes communication between the Smart TextArea and third-party AI providers. This section explains how to implement and register a custom AI service for the Smart TextArea. + +## IChatInferenceService Interface + +The `IChatInferenceService` interface defines a contract for integrating custom AI services with Syncfusion Smart Controls. It enables the Smart TextArea to request and receive AI-generated responses. + +```csharp +public interface IChatInferenceService +{ + Task GenerateResponseAsync(ChatParameters options); +} +``` + +- **Purpose**: Standardizes communication for AI-generated responses. +- **Parameters**: The `ChatParameters` type includes properties like user input and context. +- **Benefits**: Enables seamless switching between AI providers without modifying component code. + +## Simple Implementation of a Custom AI Service + +Below is a sample implementation of a mock AI service named `MockAIService`. This service demonstrates how to implement the `IChatInferenceService` interface by returning sample, context-aware responses. You can replace the logic with your own AI integration. + +```csharp +using Syncfusion.EJ2.AI; +using System.Threading.Tasks; + +public class MockAIService : IChatInferenceService +{ + public Task GenerateResponseAsync(ChatParameters options) + { + + } +} +``` + +## Registering the Custom AI Service + +Register the custom AI service in the **~/Program.cs** file of your ASP.NET Core Application: + +```csharp +using Syncfusion.EJ2; +using Syncfusion.EJ2.AI; + +builder.Services.AddRazorPages(); +builder.Services.AddSyncfusionSmartComponents(); +builder.Services.AddSingleton(); + +var app = builder.Build(); +// ... +``` + +## Implemented AI Services + +Here are examples of AI services integrated using the `IChatInferenceService` interface: + +| Service | Documentation | +|---------|---------------| +| Claude | [Claude Integration](claude-service) | +| DeepSeek | [DeepSeek Integration](deepseek-service) | +| Groq | [Groq Integration](groq-service) | +| Gemini | [Gemini Integration](gemini-service) | + +## Troubleshooting + +If the custom AI service does not work as expected, try the following: +- **No Suggestions Displayed**: Ensure the `IChatInferenceService` implementation is registered in **Program.cs** and returns valid responses. Check for errors in the `GenerateResponseAsync` method. +- **Dependency Issues**: Verify that all required NuGet packages are installed. Run `dotnet restore` to resolve dependencies. +- **Incorrect Responses**: Debug the custom AI service implementation to ensure it processes `ChatParameters` correctly and returns expected responses. + diff --git a/ej2-asp-core-mvc/smart-textarea/EJ2_ASP.NETCORE/customization.md b/ej2-asp-core-mvc/smart-textarea/EJ2_ASP.NETCORE/customization.md new file mode 100644 index 0000000000..b0c3341f63 --- /dev/null +++ b/ej2-asp-core-mvc/smart-textarea/EJ2_ASP.NETCORE/customization.md @@ -0,0 +1,68 @@ +--- +layout: post +title: Customize Suggestions ##Platform_Name## Smart TextArea Control | Syncfusion +description: Learn how to customize suggestion display in ##Platform_Name## Smart TextArea of Syncfusion Essential JS 2 and more details. +platform: ej2-asp-core-mvc +control: Customizaion +publishingplatform: ##Platform_Name## +documentation: ug +--- + +# Customize Suggestions in ASP.NET Core Smart TextArea + +The Syncfusion ASP.NET Core Smart TextArea control provides AI-powered autocompletion for context-aware text input, with customizable suggestion display options. This section explains how to configure the appearance and behavior of suggestions to enhance user experience in applications like issue trackers or customer support systems. + +## Configure Suggestion Display + +The `show-suggestion-on-popup` attribute controls how AI-generated suggestions are presented to users in the Smart TextArea control. Suggestions are based on the `user-role` and optional `user-phrases` attributes, which define the context and predefined phrases for autocompletion. + +### Pop-up Suggestions + +Set `show-suggestion-on-popup="true"` to display suggestions in a pop-up window above the text area, ideal for scenarios where users need to select from multiple suggestions without cluttering the input area. + +Add the following code in the `~/Pages/Index.cshtml`: + +{% tabs %} +{% highlight cshtml tabtitle="CSHTML" %} + +@{ + var presets = new { + userRole = "Maintainer of an open-source project replying to GitHub issues", + userPhrases = new[] { "Thank you for contacting us.", "To investigate, we'll need a repro as a public Git repo.", "Could you please post a screenshot of NEED_INFO?", "This sounds like a usage question. This issue tracker is intended for bugs and feature proposals. Unfortunately, we don't have the capacity to answer general usage questions and would recommend StackOverflow for a faster response.", "We don't accept ZIP files as repros." }, + placeHolder = "Write your response to the GitHub issue..." }; +} + + + +{% endhighlight %} +{% endtabs %} + +![ASP.NET Core Smart TextArea Control Suggestion on popup](images/SmartTextArea-Popup.gif) + +### Inline Suggestions + +Set `show-suggestion-on-popup="false"` (default) to display suggestions inline within the text area, suitable for seamless text entry where users can accept suggestions by continuing to type or pressing a tab key. + +Add the following code in the `~/Pages/Index.cshtml`: + +{% tabs %} +{% highlight cshtml tabtitle="CSHTML" %} + +@{ + var presets = new { + userRole = "Maintainer of an open-source project replying to GitHub issues", + userPhrases = new[] { "Thank you for contacting us.", "To investigate, we'll need a repro as a public Git repo.", "Could you please post a screenshot of NEED_INFO?", "This sounds like a usage question. This issue tracker is intended for bugs and feature proposals. Unfortunately, we don't have the capacity to answer general usage questions and would recommend StackOverflow for a faster response.", "We don't accept ZIP files as repros." }, + placeHolder = "Write your response to the GitHub issue..." }; +} + + + +{% endhighlight %} +{% endtabs %} + +![ASP.NET Core Smart TextArea Control Suggestion on inline](images/SmartTextArea-Inline.gif) + +## Troubleshooting + +If suggestions do not appear, try the following: +- **AI Configuration Errors**: Verify that the API key, endpoint, and model name are correctly configured in **Program.cs**. Check for typos or invalid credentials. \ No newline at end of file diff --git a/ej2-asp-core-mvc/smart-textarea/EJ2_ASP.NETCORE/deepseek-service.md b/ej2-asp-core-mvc/smart-textarea/EJ2_ASP.NETCORE/deepseek-service.md new file mode 100644 index 0000000000..ed2bb4c284 --- /dev/null +++ b/ej2-asp-core-mvc/smart-textarea/EJ2_ASP.NETCORE/deepseek-service.md @@ -0,0 +1,206 @@ +--- +layout: post +title: DeepSeek AI in ##Platform_Name## Smart TextArea Control | Syncfusion +description: Learn how to implement a custom AI service using DeepSeek AI with ##Platform_Name## Smart TextArea control of Syncfusion Essential JS 2 and more details. +platform: ej2-asp-core-mvc +control: DeepSeek AI +publishingplatform: ##Platform_Name## +documentation: ug +--- + +# DeepSeek AI Integration with ASP.NET Core Smart TextArea + +The Syncfusion ASP.NET Core Smart TextArea control provides AI-powered autocompletion for context-aware text input, typically using OpenAI or Azure OpenAI. This guide explains how to integrate the DeepSeek AI service with the Smart TextArea using the `IChatInferenceService` interface, enabling custom AI-driven responses in a ASP.NET Core App. + +## Setting Up DeepSeek + +1. **Obtain a DeepSeek API Key** + Create an account at [DeepSeek Platform](https://platform.deepseek.com), sign in, and navigate to [API Keys](https://platform.deepseek.com/api_keys) to generate an API key. +2. **Review Model Specifications** + Refer to [DeepSeek Models Documentation](https://api-docs.deepseek.com/quick_start/pricing) for details on available models (e.g., `deepseek-chat`). + +## Create a DeepSeek AI Service + +Implement the `IChatInferenceService` interface to connect the Smart TextArea to the DeepSeek service, acting as a bridge for AI-generated responses. + +1. Create a `Services` folder in your project. +2. Add a new file named `DeepSeekAIService.cs` in the `Services` folder. +3. Implement the service as shown below, storing the API key securely in a configuration file or environment variable (e.g., `appsettings.json`). + +```csharp +using System.Net; +using System.Text; +using System.Text.Json; +using Microsoft.Extensions.AI; + +public class DeepSeekAIService +{ + private readonly string _apiKey; + private readonly string _modelName = "deepseek-chat"; // Example model + private readonly string _endpoint = "https://api.deepseek.com/chat/completions"; + private static readonly HttpClient HttpClient = new(new SocketsHttpHandler + { + PooledConnectionLifetime = TimeSpan.FromMinutes(30), + EnableMultipleHttp2Connections = true + }) + { + DefaultRequestVersion = HttpVersion.Version20 // Fallback to HTTP/2 for compatibility + }; + private static readonly JsonSerializerOptions JsonOptions = new() + { + PropertyNamingPolicy = JsonNamingPolicy.CamelCase + }; + + public DeepSeekAIService(IConfiguration configuration) + { + _apiKey = configuration["DeepSeek:ApiKey"] ?? throw new ArgumentNullException("DeepSeek API key is missing."); + if (!HttpClient.DefaultRequestHeaders.Contains("Authorization")) + { + HttpClient.DefaultRequestHeaders.Clear(); + HttpClient.DefaultRequestHeaders.Add("Authorization", $"Bearer {_apiKey}"); + } + } + + public async Task CompleteAsync(IList chatMessages) + { + var requestBody = new DeepSeekChatRequest + { + Model = _modelName, + Temperature = 0.7f, // Controls response randomness (0.0 to 1.0) + Messages = chatMessages.Select(m => new DeepSeekMessage + { + Role = m.Role == ChatRole.User ? "user" : "system", // Align with DeepSeek API roles + Content = m.Text + }).ToList() + }; + + var content = new StringContent(JsonSerializer.Serialize(requestBody, JsonOptions), Encoding.UTF8, "application/json"); + + try + { + var response = await HttpClient.PostAsync(_endpoint, content); + response.EnsureSuccessStatusCode(); + var responseString = await response.Content.ReadAsStringAsync(); + var responseObject = JsonSerializer.Deserialize(responseString, JsonOptions); + return responseObject?.Choices?.FirstOrDefault()?.Message?.Content ?? "No response from DeepSeek."; + } + catch (Exception ex) when (ex is HttpRequestException || ex is JsonException) + { + throw new InvalidOperationException("Failed to communicate with DeepSeek API.", ex); + } + } +} +``` + +N> Store the DeepSeek API key in `appsettings.json` (e.g., `{ "DeepSeek": { "ApiKey": "your-api-key" } }`) or as an environment variable to ensure security. + +## Define Request and Response Models + +Define C# classes to match the DeepSeek API’s JSON request and response format. + +1. Create a new file named `DeepSeekModels.cs` in the `Services` folder. +2. Add the following model classes: + +```csharp +public class DeepSeekMessage +{ + public string Role { get; set; } + public string Content { get; set; } +} + +public class DeepSeekChatRequest +{ + public string Model { get; set; } + public float Temperature { get; set; } + public List Messages { get; set; } +} + +public class DeepSeekChatResponse +{ + public List Choices { get; set; } +} + +public class DeepSeekChoice +{ + public DeepSeekMessage Message { get; set; } +} +``` + +## Create a Custom AI Service + +Implement the `IChatInferenceService` interface to connect the Smart TextArea to the DeepSeek service, acting as a bridge for AI-generated responses. + +1. Create a new file named `DeepSeekInferenceService.cs` in the `Services` folder. +2. Add the following implementation: + +```csharp +using Syncfusion.EJ2.AI; +using System.Threading.Tasks; + +public class DeepSeekInferenceService : IChatInferenceService +{ + private readonly DeepSeekAIService _deepSeekService; + + public DeepSeekInferenceService(DeepSeekAIService deepSeekService) + { + _deepSeekService = deepSeekService; + } + + public async Task GenerateResponseAsync(ChatParameters options) + { + return await _deepSeekService.CompleteAsync(options.Messages); + } +} +``` + +## Configure the ASP.NET Core App + +Register the DeepSeek service and `IChatInferenceService` implementation in the dependency injection container. + +Update the **~/Program.cs** file as follows: + +```csharp +using Syncfusion.EJ2; +using Syncfusion.EJ2.AI; + +var builder = WebApplication.CreateBuilder(args); + +builder.Services.AddRazorPages(); +builder.Services.AddSyncfusionSmartComponents(); +builder.Services.AddSingleton(); +builder.Services.AddSingleton(); + +var app = builder.Build(); +// ... +``` + +## Add ASP.NET Core Smart TextArea Control + +Add the Smart TextArea in the **~/Pages/Index.cshtml** file to test the DeepSeek AI integration. + +{% tabs %} +{% highlight cshtml tabtitle="CSHTML" %} + +@{ + var presets = new { + userRole = "Maintainer of an open-source project replying to GitHub issues", + userPhrases = new[] { "Thank you for contacting us.", "To investigate, we'll need a repro as a public Git repo.", "Could you please post a screenshot of NEED_INFO?", "This sounds like a usage question. This issue tracker is intended for bugs and feature proposals. Unfortunately, we don't have the capacity to answer general usage questions and would recommend StackOverflow for a faster response.", "We don't accept ZIP files as repros." }, + placeHolder = "Write your response to the GitHub issue..." }; +} + + + +{% endhighlight %} +{% endtabs %} + +Press Ctrl+F5 (Windows) or +F5 (macOS) to run the app. Then, the Syncfusion® ASP.NET Core +Smart TextArea control will be rendered in the default web browser. + +![ASP.NET Core Smart TextArea Control](images/SmartTextArea.gif) + +## Troubleshooting + +If the DeepSeek AI integration does not work, try the following: +- **No Suggestions Displayed**: Verify that the DeepSeek API key and model name are correct in the configuration. Check the `DeepSeekAIService` implementation for errors. +- **HTTP Request Failures**: Ensure a stable internet connection and that the DeepSeek API endpoint (`https://api.deepseek.com/v1/chat/completions`) is accessible. Test with HTTP/2 if compatibility issues arise. +- **Service Registration Errors**: Confirm that `DeepSeekAIService` and `DeepSeekInferenceService` are registered in **Program.cs**. diff --git a/ej2-asp-core-mvc/smart-textarea/EJ2_ASP.NETCORE/features.md b/ej2-asp-core-mvc/smart-textarea/EJ2_ASP.NETCORE/features.md new file mode 100644 index 0000000000..2120fa3d33 --- /dev/null +++ b/ej2-asp-core-mvc/smart-textarea/EJ2_ASP.NETCORE/features.md @@ -0,0 +1,19 @@ +--- +layout: post +title: Styles and Appearances in ##Platform_Name## Smart TextArea | Syncfusion +description: Checkout and learn here all about Styles and Appearances in ##Platform_Name## Smart TextArea of Syncfusion Essential JS 2 and more details. +platform: ej2-asp-core-mvc +control: Features +publishingplatform: ##Platform_Name## +documentation: ug +--- + +# Inherited Features from TextArea + +The Syncfusion® ASP.NET Core Smart TextArea control fully inherits all the properties, features, and styling options of the Syncfusion® ASP.NET Core TextArea control. This means that you can leverage the existing features of the Syncfusion® ASP.NET Core TextArea while benefiting from the enhanced functionality of the Smart TextArea. + +* [Form Support](https://ej2.syncfusion.com/aspnetcore/documentation/textarea/form-support) +* [Floating Labels](https://ej2.syncfusion.com/aspnetcore/documentation/textarea/floating-label) +* [Events](https://ej2.syncfusion.com/aspnetcore/documentation/textarea/events) +* [Methods](https://ej2.syncfusion.com/aspnetcore/documentation/textarea/methods) +* [Style and Appearance](https://ej2.syncfusion.com/aspnetcore/documentation/textarea/style-appearance) \ No newline at end of file diff --git a/ej2-asp-core-mvc/smart-textarea/EJ2_ASP.NETCORE/gemini-service.md b/ej2-asp-core-mvc/smart-textarea/EJ2_ASP.NETCORE/gemini-service.md new file mode 100644 index 0000000000..19984f4ebe --- /dev/null +++ b/ej2-asp-core-mvc/smart-textarea/EJ2_ASP.NETCORE/gemini-service.md @@ -0,0 +1,255 @@ +--- +layout: post +title: Gemini AI in ##Platform_Name## Smart TextArea Control | Syncfusion +description: Learn how to implement a custom AI service using Google's Gemini AI with ##Platform_Name## Smart TextArea control of Syncfusion Essential JS 2 and more details. +platform: ej2-asp-core-mvc +control: Gemini AI +publishingplatform: ##Platform_Name## +documentation: ug +--- + +# Gemini AI Integration with ASP.NET Core Smart TextArea + +The Syncfusion ASP.NET Core Smart TextArea control provides AI-powered autocompletion for context-aware text input, typically using OpenAI or Azure OpenAI. This guide explains how to integrate the Google Gemini AI service with the Smart TextArea using the `IChatInferenceService` interface, enabling custom AI-driven responses in a ASP.NET Core Web App. + +## Setting Up Gemini + +1. **Obtain a Gemini API Key** + Visit [Google AI Studio](https://ai.google.dev/gemini-api/docs/api-key), sign in, and generate an API key. +2. **Review Model Specifications** + Refer to [Gemini Models Documentation](https://ai.google.dev/gemini-api/docs/models) for details on available models. + +## Create a Gemini AI Service + +Create a service class to manage interactions with the Gemini API, including authentication, request/response handling, and safety settings for the Smart TextArea. + +1. Create a `Services` folder in your project. +2. Add a new file named `GeminiService.cs` in the `Services` folder. +3. Implement the service as shown below, storing the API key securely in a configuration file or environment variable (e.g., `appsettings.json`). + + +```csharp +using System.Net; +using System.Text; +using System.Text.Json; +using Microsoft.Extensions.AI; + +public class GeminiService +{ + private readonly string _apiKey; + private readonly string _modelName = "gemini-2.0-flash"; // Example model + private readonly string _endpoint = "https://generativelanguage.googleapis.com/v1beta/models/"; + private static readonly HttpClient HttpClient = new(new SocketsHttpHandler + { + PooledConnectionLifetime = TimeSpan.FromMinutes(30), + EnableMultipleHttp2Connections = true + }) + { + DefaultRequestVersion = HttpVersion.Version20 // Fallback to HTTP/2 for compatibility + }; + private static readonly JsonSerializerOptions JsonOptions = new() + { + PropertyNamingPolicy = JsonNamingPolicy.CamelCase + }; + + public GeminiService(IConfiguration configuration) + { + _apiKey = configuration["Gemini:ApiKey"] ?? throw new ArgumentNullException("Gemini API key is missing."); + HttpClient.DefaultRequestHeaders.Clear(); + HttpClient.DefaultRequestHeaders.Add("x-goog-api-key", _apiKey); + } + + public async Task CompleteAsync(IList chatMessages) + { + var requestUri = $"{_endpoint}{_modelName}:generateContent"; + var parameters = BuildGeminiChatParameters(chatMessages); + var payload = new StringContent( + JsonSerializer.Serialize(parameters, JsonOptions), + Encoding.UTF8, + "application/json" + ); + + try + { + using var response = await HttpClient.PostAsync(requestUri, payload); + response.EnsureSuccessStatusCode(); + var json = await response.Content.ReadAsStringAsync(); + var result = JsonSerializer.Deserialize(json, JsonOptions); + return result?.Candidates?.FirstOrDefault()?.Content?.Parts?.FirstOrDefault()?.Text + ?? "No response from model."; + } + catch (Exception ex) when (ex is HttpRequestException or JsonException) + { + throw new InvalidOperationException("Gemini API error.", ex); + } + } + + private GeminiChatParameters BuildGeminiChatParameters(IList messages) + { + var contents = messages.Select(m => new ResponseContent( + m.Text, + m.Role == ChatRole.User ? "user" : "model" + )).ToList(); + + return new GeminiChatParameters + { + Contents = contents, + GenerationConfig = new GenerationConfig + { + MaxOutputTokens = 2000, + StopSequences = new List { "END_INSERTION", "NEED_INFO", "END_RESPONSE" } // Configurable stop sequences + }, + SafetySettings = new List + { + new() { Category = "HARM_CATEGORY_HARASSMENT", Threshold = "BLOCK_ONLY_HIGH" }, + new() { Category = "HARM_CATEGORY_HATE_SPEECH", Threshold = "BLOCK_ONLY_HIGH" }, + new() { Category = "HARM_CATEGORY_SEXUALLY_EXPLICIT", Threshold = "BLOCK_ONLY_HIGH" }, + new() { Category = "HARM_CATEGORY_DANGEROUS_CONTENT", Threshold = "BLOCK_ONLY_HIGH" } + } + }; + } +} +``` + +N> Store the Gemini API key in `appsettings.json` (e.g., `{ "Gemini": { "ApiKey": "your-api-key" } }`) or as an environment variable to ensure security. The `SafetySettings` filter harmful content; adjust thresholds based on your application’s needs. + +## Define Request and Response Models + +Define C# classes to match the Gemini API’s JSON request and response format. + +1. Create a new file named `GeminiModels.cs` in the `Services` folder. +2. Add the following model classes: + +```csharp +public class Part +{ + public string Text { get; set; } +} + +public class Content +{ + public Part[] Parts { get; init; } = Array.Empty(); +} + +public class Candidate +{ + public Content Content { get; init; } = new(); +} + +public class GeminiResponseObject +{ + public Candidate[] Candidates { get; init; } = Array.Empty(); +} + +public class ResponseContent +{ + public List Parts { get; init; } + public string Role { get; init; } + + public ResponseContent(string text, string role) + { + Parts = new List { new Part { Text = text } }; + Role = role; + } +} + +public class GenerationConfig +{ + public int Temperature { get; init; } = 0; + public int TopK { get; init; } = 0; + public int TopP { get; init; } = 0; + public int MaxOutputTokens { get; init; } = 2048; + public List StopSequences { get; init; } = new(); +} + +public class SafetySetting +{ + public string Category { get; init; } = string.Empty; + public string Threshold { get; init; } = string.Empty; +} + +public class GeminiChatParameters +{ + public List Contents { get; init; } = new(); + public GenerationConfig GenerationConfig { get; init; } = new(); + public List SafetySettings { get; init; } = new(); +} +``` + +## Create a Custom AI Service + +Implement the `IChatInferenceService` interface to connect the Smart TextArea to the Gemini service, acting as a bridge for AI-generated responses. + +1. Create a new file named `GeminiInferenceService.cs` in the `Services` folder. +2. Add the following implementation: + +```csharp +using Syncfusion.EJ2.AI; +using System.Threading.Tasks; + +public class GeminiInferenceService : IChatInferenceService +{ + private readonly GeminiService _geminiService; + + public GeminiInferenceService(GeminiService geminiService) + { + _geminiService = geminiService; + } + + public async Task GenerateResponseAsync(ChatParameters options) + { + return await _geminiService.CompleteAsync(options.Messages); + } +} +``` + +## Configure the ASP.NET Core App + +Register the Gemini service and `IChatInferenceService` implementation in the dependency injection container. + +Update the **~/Program.cs** file as follows: + +```csharp +using Syncfusion.EJ2; +using Syncfusion.EJ2.AI; + +builder.Services.AddRazorPages(); + +builder.Services.AddSyncfusionSmartComponents(); +builder.Services.AddSingleton(); +builder.Services.AddSingleton(); + +var app = builder.Build(); +// ... +``` + +## Add ASP.NET Core Smart TextArea Control + +Add the Smart TextArea in the **~/Pages/Index.cshtml** file to test the Gemini AI integration. + +{% tabs %} +{% highlight cshtml tabtitle="CSHTML" %} + +@{ + var presets = new { + userRole = "Maintainer of an open-source project replying to GitHub issues", + userPhrases = new[] { "Thank you for contacting us.", "To investigate, we'll need a repro as a public Git repo.", "Could you please post a screenshot of NEED_INFO?", "This sounds like a usage question. This issue tracker is intended for bugs and feature proposals. Unfortunately, we don't have the capacity to answer general usage questions and would recommend StackOverflow for a faster response.", "We don't accept ZIP files as repros." }, + placeHolder = "Write your response to the GitHub issue..." }; +} + + + +{% endhighlight %} +{% endtabs %} + +Press Ctrl+F5 (Windows) or +F5 (macOS) to run the app. Then, the Syncfusion® ASP.NET Core +Smart TextArea control will be rendered in the default web browser. + +![ASP.NET Core Smart TextArea Control](images/SmartTextArea.gif) + +## Troubleshooting + +If the Gemini AI integration does not work, try the following: +- **No Suggestions Displayed**: Verify that the Gemini API key and model name are correct in the configuration. Check the `GeminiService` implementation for errors. +- **HTTP Request Failures**: Ensure a stable internet connection and that the Gemini API endpoint (`https://generativelanguage.googleapis.com/v1beta/models/`) is accessible. Test with HTTP/2 if compatibility issues arise. +- **Service Registration Errors**: Confirm that `GeminiService` and `GeminiInferenceService` are registered in **Program.cs**. diff --git a/ej2-asp-core-mvc/smart-textarea/EJ2_ASP.NETCORE/getting-started.md b/ej2-asp-core-mvc/smart-textarea/EJ2_ASP.NETCORE/getting-started.md new file mode 100644 index 0000000000..227a08d68d --- /dev/null +++ b/ej2-asp-core-mvc/smart-textarea/EJ2_ASP.NETCORE/getting-started.md @@ -0,0 +1,237 @@ +--- +layout: post +title: Getting Started with ##Platform_Name## Smart TextArea Control | Syncfusion +description: Checkout and learn about getting started with ##Platform_Name## Smart TextArea of Syncfusion Essential JS 2 and more details. +platform: ej2-asp-core-mvc +control: Getting Started +publishingplatform: ##Platform_Name## +documentation: ug +--- + +# Getting Started with ASP.NET Core Smart TextArea Control + +This section briefly explains about how to include `ASP.NET Core Smart TextArea` control in your ASP.NET Core application using Visual Studio. + +## Prerequisites + +[System requirements for ASP.NET Core controls](https://ej2.syncfusion.com/aspnetcore/documentation/system-requirements) + +## Create ASP.NET Core web application with Razor pages + +* [Create a Project using Microsoft Templates](https://learn.microsoft.com/en-us/aspnet/core/tutorials/razor-pages/razor-pages-start?view=aspnetcore-8.0&tabs=visual-studio#create-a-razor-pages-web-app) + +* [Create a Project using Syncfusion® ASP.NET Core Extension](https://ej2.syncfusion.com/aspnetcore/documentation/visual-studio-integration/create-project) + +## Install ASP.NET Core package in the application + +To add `ASP.NET Core` controls in the application, open the NuGet package manager in Visual Studio (Tools → NuGet Package Manager → Manage NuGet Packages for Solution), search for [Syncfusion.EJ2.AspNet.Core](https://www.nuget.org/packages/Syncfusion.EJ2.AspNet.Core/) and then install it. Alternatively, you can utilize the following package manager command to achieve the same. + +{% tabs %} +{% highlight C# tabtitle="Package Manager" %} + +Install-Package Syncfusion.EJ2.AspNet.Core -Version {{ site.releaseversion }} + +{% endhighlight %} +{% endtabs %} + +N> Syncfusion® ASP.NET Core controls are available in [nuget.org.](https://www.nuget.org/packages?q=syncfusion.EJ2) Refer to [NuGet packages topic](https://ej2.syncfusion.com/aspnetcore/documentation/nuget-packages) to learn more about installing NuGet packages in various OS environments. The Syncfusion.EJ2.AspNet.Core NuGet package has dependencies, [Newtonsoft.Json](https://www.nuget.org/packages/Newtonsoft.Json/) for JSON serialization and [Syncfusion.Licensing](https://www.nuget.org/packages/Syncfusion.Licensing/) for validating Syncfusion® license key. + +## Add Syncfusion® ASP.NET Core Tag Helper +Open `~/Pages/_ViewImports.cshtml` file and import the `Syncfusion.EJ2` TagHelper. + +{% tabs %} +{% highlight C# tabtitle="~/_ViewImports.cshtml" %} + +@addTagHelper *, Syncfusion.EJ2 + +{% endhighlight %} +{% endtabs %} + +## Add stylesheet and script resources + +Here, the theme and script is referred using CDN inside the `` of `~/Pages/Shared/_Layout.cshtml` file as follows, + +{% tabs %} +{% highlight cshtml tabtitle="~/_Layout.cshtml" %} + + + ... + + + + + + +{% endhighlight %} +{% endtabs %} + +N> Checkout the [Themes topic](https://ej2.syncfusion.com/aspnetcore/documentation/appearance/theme) to learn different ways ([CDN](https://ej2.syncfusion.com/aspnetcore/documentation/common/adding-script-references#cdn-reference), [NPM package](https://ej2.syncfusion.com/aspnetcore/documentation/common/adding-script-references#node-package-manager-npm), and [CRG](https://ej2.syncfusion.com/aspnetcore/documentation/common/custom-resource-generator)) to refer styles in ASP.NET Core application, and to have the expected appearance for Syncfusion® ASP.NET Core controls. + +N> Checkout the [Adding Script Reference](https://ej2.syncfusion.com/aspnetcore/documentation/common/adding-script-references) topic to learn different approaches for adding script references in your ASP.NET Core application. + +## Register Syncfusion® Script Manager + +Also, register the script manager `` at the end of `` in the ASP.NET Core application as follows. + +{% tabs %} +{% highlight cshtml tabtitle="~/_Layout.cshtml" %} + + + ... + + + + +{% endhighlight %} +{% endtabs %} + +## Configure AI Service + +To enable AI-powered autocompletion in the Smart TextArea, configure an AI model (OpenAI, Azure OpenAI, or Ollama) in your application. Install the required NuGet packages and update the **~/Program.cs** file as described below. + +### Install AI Service NuGet Packages + +Install the following NuGet packages based on your chosen AI provider: + +{% tabs %} +{% highlight c# tabtitle="Package Manager" %} + +Install-Package Microsoft.Extensions.AI +Install-Package Microsoft.Extensions.AI.OpenAI +@* For Azure OpenAI only *@ +Install-Package Azure.AI.OpenAI +@* For Ollama only *@ +Install-Package OllamaSharp + +{% endhighlight %} +{% endtabs %} + +### OpenAI Configuration + +For OpenAI, obtain an API key from [OpenAI](https://help.openai.com/en/articles/4936850-where-do-i-find-my-openai-api-key) and specify the desired model (e.g., `gpt-3.5-turbo`, `gpt-4`). Store the API key securely in a configuration file or environment variable. + +Add the following to the **~/Program.cs** file: + +{% tabs %} +{% highlight cshtml tabtitle="CSHTML" %} + +using Microsoft.Extensions.AI; +using OpenAI; +using Syncfusion.EJ2; + + +builder.Services.AddRazorPages(); + +string openAIApiKey = "API-KEY"; +string openAIModel = "OPENAI_MODEL"; +OpenAIClient openAIClient = new OpenAIClient(openAIApiKey); +IChatClient openAIChatClient = openAIClient.GetChatClient(openAIModel).AsIChatClient(); +builder.Services.AddChatClient(openAIChatClient); + +builder.Services.AddSyncfusionSmartComponents() + .InjectOpenAIInference(); + +var app = builder.Build(); +.... + +{% endhighlight %} +{% endtabs %} + +### Azure OpenAI Configuration + +For Azure OpenAI, deploy a resource and model as described in [Azure OpenAI documentation](https://learn.microsoft.com/en-us/azure/ai-services/openai/how-to/create-resource). Obtain the API key, endpoint, and model name from your Azure portal. + +Add the following to the **~/Program.cs** file: + +{% tabs %} +{% highlight cshtml tabtitle="CSHTML" %} + +using Syncfusion.EJ2; +using Microsoft.Extensions.AI; +using Azure.AI.OpenAI; +using System.ClientModel; + +builder.Services.AddRazorPages(); + +string azureOpenAIKey = "AZURE_OPENAI_KEY"; +string azureOpenAIEndpoint = "AZURE_OPENAI_ENDPOINT"; +string azureOpenAIModel = "AZURE_OPENAI_MODEL"; +AzureOpenAIClient azureOpenAIClient = new AzureOpenAIClient( + new Uri(azureOpenAIEndpoint), + new ApiKeyCredential(azureOpenAIKey) +); +IChatClient azureOpenAIChatClient = azureOpenAIClient.GetChatClient(azureOpenAIModel).AsIChatClient(); +builder.Services.AddChatClient(azureOpenAIChatClient); + +builder.Services.AddSyncfusionSmartComponents() + .InjectOpenAIInference(); + +var app = builder.Build(); +.... + +{% endhighlight %} +{% endtabs %} + +### Ollama Configuration + +To use Ollama for self-hosted models: + +1. Download and install Ollama from [Ollama's official website](https://ollama.com). +2. Install a model from the [Ollama Library](https://ollama.com/library) (e.g., `llama2:13b`, `mistral:7b`). +3. Configure the endpoint URL (e.g., `http://localhost:11434`) and model name. + +Add the following to the **~/Program.cs** file: + +{% tabs %} +{% highlight cshtml tabtitle="CSHTML" %} + +using Syncfusion.EJ2; +using Microsoft.Extensions.AI; +using OllamaSharp; + +builder.Services.AddRazorPages(); + +string ModelName = "MODEL_NAME"; +IChatClient chatClient = new OllamaApiClient("http://localhost:11434", ModelName); +builder.Services.AddChatClient(chatClient); + +builder.Services.AddSyncfusionSmartComponents() + .InjectOpenAIInference(); + +var app = builder.Build(); +.... + +{% endhighlight %} +{% endtabs %} + +## Add ASP.NET Core Smart TextArea Control + +The **user-role** attribute (required) defines the context for AI autocompletion based on the user's role. The **user-phrases** attribute (optional) provides predefined expressions aligned with the application's tone and common phrases. + +Now, add the Syncfusion® ASP.NET Core Smart TextArea tag helper in `~/Pages/Index.cshtml` page. + +{% tabs %} +{% highlight cshtml tabtitle="CSHTML" %} + +@{ + var presets = new { + userRole = "Maintainer of an open-source project replying to GitHub issues", + userPhrases = new[] { "Thank you for contacting us.", "To investigate, we'll need a repro as a public Git repo.", "Could you please post a screenshot of NEED_INFO?", "This sounds like a usage question. This issue tracker is intended for bugs and feature proposals. Unfortunately, we don't have the capacity to answer general usage questions and would recommend StackOverflow for a faster response.", "We don't accept ZIP files as repros." }, + placeHolder = "Write your response to the GitHub issue..." }; +} + + + +{% endhighlight %} +{% endtabs %} + +Press Ctrl+F5 (Windows) or +F5 (macOS) to run the app. Then, the Syncfusion® ASP.NET Core +Smart TextArea control will be rendered in the default web browser. + +![ASP.NET Core Smart TextArea Control](images/SmartTextArea.gif) + +## Troubleshooting + +If you encounter issues, try the following: +- **NuGet Installation Errors**: Ensure a stable internet connection and set the NuGet package source to `https://www.nuget.org`. Run `dotnet restore` again. +- **AI Service Configuration Errors**: Verify the API key, endpoint, and model name in **Program.cs**. Check for typos or incorrect values. diff --git a/ej2-asp-core-mvc/smart-textarea/EJ2_ASP.NETCORE/groq-service.md b/ej2-asp-core-mvc/smart-textarea/EJ2_ASP.NETCORE/groq-service.md new file mode 100644 index 0000000000..8229b14c71 --- /dev/null +++ b/ej2-asp-core-mvc/smart-textarea/EJ2_ASP.NETCORE/groq-service.md @@ -0,0 +1,207 @@ +--- +layout: post +title: Groq AI in ##Platform_Name## Smart TextArea Control | Syncfusion +description: Learn how to implement a custom AI service using Groq AI with ##Platform_Name## Smart TextArea control of Syncfusion Essential JS 2 and more details. +platform: ej2-asp-core-mvc +control: Groq AI +publishingplatform: ##Platform_Name## +documentation: ug +--- + +# Groq AI Integration with ASP.NET Core Smart TextArea + +The Syncfusion ASP.NET Core Smart TextArea control provides AI-powered autocompletion for context-aware text input, typically using OpenAI or Azure OpenAI. This guide explains how to integrate the Groq AI service with the Smart TextArea using the `IChatInferenceService` interface, enabling custom AI-driven responses in a ASP.NET Core App. + +## Setting Up Groq + +1. **Create a Groq Account** + Visit [Groq Cloud Console](https://console.groq.com), sign up or sign in, and complete the verification process. +2. **Obtain an API Key** + Navigate to [API Keys](https://console.groq.com/keys) in the Groq Console and click "Create API Key." +3. **Review Model Specifications** + Refer to [Groq Models Documentation](https://console.groq.com/docs/models) for details on available models (e.g., `llama3-8b-8192`). + +## Create a Groq AI Service + +Create a service class to manage interactions with the Groq API, including authentication and response processing for the Smart TextArea. + +1. Create a `Services` folder in your project. +2. Add a new file named `GroqService.cs` in the `Services` folder. +3. Implement the service as shown below, storing the API key securely in a configuration file or environment variable (e.g., `appsettings.json` or environment variables). + +```csharp +using Microsoft.Extensions.AI; +using System.Net; +using System.Text; +using System.Text.Json; + +public class GroqService +{ + private readonly string _apiKey; + private readonly string _modelName = "llama-3.3-70b-versatile"; // Example model + private readonly string _endpoint = "https://api.groq.com/openai/v1/chat/completions"; + private static readonly HttpClient HttpClient = new(new SocketsHttpHandler + { + PooledConnectionLifetime = TimeSpan.FromMinutes(30), + EnableMultipleHttp2Connections = true + }) + { + DefaultRequestVersion = HttpVersion.Version20 // Fallback to HTTP/2 for broader compatibility + }; + private static readonly JsonSerializerOptions JsonOptions = new() + { + PropertyNamingPolicy = JsonNamingPolicy.CamelCase + }; + + public GroqService(IConfiguration configuration) + { + _apiKey = configuration["Groq:ApiKey"] ?? throw new ArgumentNullException("Groq API key is missing."); + if (!HttpClient.DefaultRequestHeaders.Contains("Authorization")) + { + HttpClient.DefaultRequestHeaders.Clear(); + HttpClient.DefaultRequestHeaders.Add("Authorization", $"Bearer {_apiKey}"); + } + } + + public async Task CompleteAsync(IList chatMessages) + { + var requestPayload = new GroqChatParameters + { + Model = _modelName, + Messages = chatMessages.Select(m => new Message + { + Role = m.Role == ChatRole.User ? "user" : "assistant", + Content = m.Text + }).ToList(), + Stop = new List { "END_INSERTION", "NEED_INFO", "END_RESPONSE" } // Configurable stop sequences + }; + + var content = new StringContent(JsonSerializer.Serialize(requestPayload, JsonOptions), Encoding.UTF8, "application/json"); + + try + { + var response = await HttpClient.PostAsync(_endpoint, content); + response.EnsureSuccessStatusCode(); + var responseString = await response.Content.ReadAsStringAsync(); + var responseObject = JsonSerializer.Deserialize(responseString, JsonOptions); + return responseObject?.Choices?.FirstOrDefault()?.Message?.Content ?? "No response from model."; + } + catch (Exception ex) when (ex is HttpRequestException || ex is JsonException) + { + throw new InvalidOperationException("Failed to communicate with Groq API.", ex); + } + } +} +``` + +N> Store the Groq API key in `appsettings.json` (e.g., `{ "Groq": { "ApiKey": "your-api-key" } }`) or as an environment variable to ensure security. + +## Define Request and Response Models + +Define C# classes to match the Groq API’s request and response format. + +1. Create a new file named `GroqModels.cs` in the `Services` folder. +2. Add the following model classes: + +```csharp +public class Choice +{ + public Message Message { get; set; } +} + +public class Message +{ + public string Role { get; set; } + public string Content { get; set; } +} + +public class GroqChatParameters +{ + public string Model { get; set; } + public List Messages { get; set; } + public List Stop { get; set; } +} + +public class GroqResponseObject +{ + public string Model { get; set; } + public List Choices { get; set; } +} +``` + +## Create a Custom AI Service + +Implement the `IChatInferenceService` interface to connect the Smart TextArea to the Groq service. + +1. Create a new file named `GroqInferenceService.cs` in the `Services` folder. +2. Add the following implementation: + +```csharp +using Syncfusion.EJ2.AI; +using System.Threading.Tasks; + +public class GroqInferenceService : IChatInferenceService +{ + private readonly GroqService _groqService; + + public GroqInferenceService(GroqService groqService) + { + _groqService = groqService; + } + + public async Task GenerateResponseAsync(ChatParameters options) + { + return await _groqService.CompleteAsync(options.Messages); + } +} +``` + +## Configure the ASP.NET Core App + +Register the Groq service and `IChatInferenceService` implementation in the dependency injection container. + +Update the **~/Program.cs** file as follows: + +```csharp +using Syncfusion.EJ2; +using Syncfusion.EJ2.AI; + +builder.Services.AddRazorPages(); +builder.Services.AddSyncfusionSmartComponents(); +builder.Services.AddSingleton(); +builder.Services.AddSingleton(); + +var app = builder.Build(); +// ... +``` + +## Add ASP.NET Core Smart TextArea Control + +Add the Smart TextArea in the **~/Pages/Index.cshtml** file to test the Groq AI integration. + +{% tabs %} +{% highlight cshtml tabtitle="CSHTML" %} + +@{ + var presets = new { + userRole = "Maintainer of an open-source project replying to GitHub issues", + userPhrases = new[] { "Thank you for contacting us.", "To investigate, we'll need a repro as a public Git repo.", "Could you please post a screenshot of NEED_INFO?", "This sounds like a usage question. This issue tracker is intended for bugs and feature proposals. Unfortunately, we don't have the capacity to answer general usage questions and would recommend StackOverflow for a faster response.", "We don't accept ZIP files as repros." }, + placeHolder = "Write your response to the GitHub issue..." }; +} + + + +{% endhighlight %} +{% endtabs %} + +Press Ctrl+F5 (Windows) or +F5 (macOS) to run the app. Then, the Syncfusion® ASP.NET Core +Smart TextArea control will be rendered in the default web browser. + +![ASP.NET Core Smart TextArea Control](images/SmartTextArea.gif) + +## Troubleshooting + +If the Groq AI integration does not work, try the following: +- **No Suggestions Displayed**: Verify that the Groq API key and model name are correct in the configuration. Check the `GroqService` implementation for errors. +- **HTTP Request Failures**: Ensure a stable internet connection and that the Groq API endpoint (`https://api.groq.com/openai/v1/chat/completions`) is accessible. Test with HTTP/2 instead of HTTP/3 if compatibility issues arise. +- **Service Registration Errors**: Confirm that `GroqService` and `GroqInferenceService` are registered in **Program.cs**. diff --git a/ej2-asp-core-mvc/smart-textarea/images/SmartTextArea-Inline.gif b/ej2-asp-core-mvc/smart-textarea/images/SmartTextArea-Inline.gif new file mode 100644 index 0000000000000000000000000000000000000000..8b1ff768fe5e473ee43599124fbb3264a8f99443 GIT binary patch literal 46939 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 z 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 literal 0 HcmV?d00001 diff --git a/ej2-asp-core-mvc/smart-textarea/images/SmartTextArea-Popup.gif b/ej2-asp-core-mvc/smart-textarea/images/SmartTextArea-Popup.gif new file mode 100644 index 0000000000000000000000000000000000000000..efcbf7fbeb515ff387fe7c4d2c9a1d6a79012223 GIT binary patch literal 53407 zcmeFYWl&tvy0D2f&_DwXK^ku)xCVj~+=5GR3n76JAP^vUaCZq1v~hwvjk~*BFZ^dw=b&Rl95LcdvJ?RnN1Rf|9(D@LN6%Gt?U-%0I$w8p~^z zn1qSO9!^Wk0Hu|J(wah{f>65GP$oVovlmn-0xBC1RY-%Hl|mic>1e6xpmub0oOJB= zbo}mgYMBf&@{G@4G4d)izc6Nj(y}PJunV}eJ9ThK+H$>A;Cf}i^|pYAmYPS_=!J$4 zA2Z!cO-BKTS|N2)A+J6$S{gACA+hjTaR!=KVxq6iq9nw{BwvY3aY#z>GD%BI%g{q* zq$FgeCFNyh6y#(TOdORIq2`#ambIzQ zMysx_uA$7WsivyM|6EH$P20gqJD^QRN9T>UmM)Z5SCU8XjkbRFo`If$Vd0*Unv9XY zu8FacDG!a=*Hm*;8!#%0*4 zy!cE@`&pLmv)w0$W~8H&larmd^B0G&%rsx!+`gvNf2}`p)#P$@G;lW%b9ejd>G9Rm z)6={2-sdS=4t!e={rPGAeSHG;WdZ{OgL0dLMv=j-`ynAAp}|36VPO$gVv*sIQIV0+ zVl**Y&*Kvk65?VK%3G4-rjnDBQ`V5Fj{K?KcBzBMY4S8_s?XEZXw%Zt(k*y1)6=q? zRbWwO+1c57d3pJ@odpK;1<8(uPqBwAe~P(Z6@J>4@2D#a!mB=TR%cb#R8`c})YMmH z)z`usE|731@y2-P#)g`vr&zmfMIzfAplxk!?O&gFc6N5v2KDsx^!kbR_4N(*_6}t_ z4i68HjEszadp>&dF#dp?h!mfinwl*MoQo2g`=LEw`EGuGetCHrQSfbTZEZ6}Y7>dv zg8Of8Z|_XD@3kfG=V*U4!4=-u|hw`t$eZZaMXSr~dx_{$a@X;m`WR!^2~<-Qz{i<5M6nkc*MX zwN&JG7V@wNc~y;kn0k5?Byt0ZM4}*3=#aQ-ayr^FQW|nExOmV}pUQ#m4*&z}sfpts zwegQK3Hisx|1OgMT_pd1EfOFSWd)l`u@cr90DQ(~JW!e49Rg-}ovv7w(;ETdvq210 z<@U!wWx}bHs`CaDShS0c2dndklX>0^r7P7GjHU@W9U=y63dge~18}Hc*A`9YD$4a4 z4b}dfF4V|WpDe?jj#fvT8-A^I1mM!DwZPA}1`^oK##$OL_9k+bv(#Ff zu8tOJKCO+lHsAbO?~Xvys<*ZLx!9jBF&l4dy}LQv8qQL0Z+p1Ay*OGMZ*PB^N-$a0 zeF3D_>wZ9{qIG|e!2WswSe|7gkeFhBJP7ikXd{^F>;6UvG?-;GlrhPAGmNF6XfvFn zet$E9r;lYTl7G&6D@tg$Xe(OmdVecM5|ed1R+jYRcAO&9&+T{>frIS?4SCj`L>=9a zJKyy`{M<=0{(7*JY#z+In_`*tarcLH!Oz`P+xmmuG>1Ocy>#cfk9!$zyFd3by{-@T zvV1Yw_F;jfHv8G3OvU>-kphSNxv}zW2YHFQHV64BABqnO(!U-a6vBep4vX@VYz}`G z6%-#9m)0L1mQ?m3*^WwU=WLG3;Jd{~+NpI zueST^qhIYPSR7{^05aRNP9SsXSr@P3$ZFa@1t@(KJSNyaQq%% zOt$?!$WmDPdx)dq`1deRKgY!g|Ge$RsL)>N#hBR5@x{0#7U$)JEScTqq#|?K<&=ux z$>p?$0_V#nSnOo)tiDy*)ts^G$<@4h2

JWwPD%qIF@}^^$GF$@Q{BKj#g?dEV}3 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 z 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 literal 0 HcmV?d00001 diff --git a/ej2-asp-core-toc.html b/ej2-asp-core-toc.html index deadfbc892..1fa47c38a7 100644 --- a/ej2-asp-core-toc.html +++ b/ej2-asp-core-toc.html @@ -2396,7 +2396,38 @@ - +

  • Smart Paste Button + +
  • +
  • Smart TextArea + +
  • Smith Chart
    • Getting Started
    • From 220635fc716b3f7a174fe8727b8ab950aad849b6 Mon Sep 17 00:00:00 2001 From: KaviBharathi-SF5060 Date: Wed, 17 Dec 2025 10:10:07 +0530 Subject: [PATCH 02/10] 998697: ensured sample and updated changes accordingly to the hotfix branch --- .../blockeditor/EJ2_ASP.MVC/appearance.md | 2 +- .../built-in-blocks/built-in-blocks.md | 14 +- .../EJ2_ASP.MVC/built-in-blocks/code-block.md | 12 +- .../EJ2_ASP.MVC/built-in-blocks/embed.md | 30 ++- .../built-in-blocks/inline-content.md | 62 +++++- .../EJ2_ASP.MVC/built-in-blocks/list-types.md | 91 ++++++++- .../built-in-blocks/table-block.md | 15 +- .../EJ2_ASP.MVC/built-in-blocks/typography.md | 192 ++++++++++++++++-- .../blockeditor/EJ2_ASP.MVC/drag-drop.md | 2 +- .../blockeditor/EJ2_ASP.MVC/editor-menus.md | 6 +- .../EJ2_ASP.MVC/getting-started.md | 2 +- .../blockeditor/EJ2_ASP.MVC/globalization.md | 4 +- .../blockeditor/EJ2_ASP.MVC/methods.md | 8 +- .../blockeditor/EJ2_ASP.MVC/paste-cleanup.md | 14 +- .../blockeditor/EJ2_ASP.MVC/undo-redo.md | 2 +- .../blockeditor/EJ2_ASP.NETCORE/appearance.md | 2 +- .../built-in-blocks/built-in-blocks.md | 12 +- .../built-in-blocks/code-block.md | 12 +- .../EJ2_ASP.NETCORE/built-in-blocks/embed.md | 30 ++- .../built-in-blocks/inline-content.md | 62 +++++- .../built-in-blocks/list-types.md | 89 +++++++- .../built-in-blocks/table-block.md | 15 +- .../built-in-blocks/typography.md | 192 ++++++++++++++++-- .../blockeditor/EJ2_ASP.NETCORE/drag-drop.md | 2 +- .../EJ2_ASP.NETCORE/editor-menus.md | 6 +- .../EJ2_ASP.NETCORE/getting-started.md | 2 +- .../EJ2_ASP.NETCORE/globalization.md | 4 +- .../blockeditor/EJ2_ASP.NETCORE/methods.md | 8 +- .../EJ2_ASP.NETCORE/paste-cleanup.md | 4 +- .../blockeditor/EJ2_ASP.NETCORE/undo-redo.md | 2 +- .../blockeditor/images/block-table.png | Bin 0 -> 15390 bytes .../code-snippet/blockeditor/appearance/razor | 2 +- .../blocks/blockTypes/callout-block/razor | 2 +- .../blocks/blockTypes/code-block/razor | 2 +- .../blocks/blockTypes/divider-block/razor | 2 +- .../blocks/blockTypes/heading-block/razor | 2 +- .../blocks/blockTypes/image-block/razor | 2 +- .../blocks/blockTypes/list-block/razor | 2 +- .../blocks/blockTypes/paragraph-block/razor | 2 +- .../blocks/blockTypes/quote-block/razor | 2 +- .../blocks/blockTypes/table-block/razor | 11 + .../blocks/blockTypes/table-block/table.cs | 51 +++++ .../blocks/blockTypes/table-block/tagHelper | 11 + .../blocks/blockTypes/template-block/razor | 2 +- .../blocks/blockTypes/toggle-block/razor | 2 +- .../blockeditor/blocks/children/children.cs | 128 ++++++------ .../blockeditor/blocks/children/razor | 2 +- .../blockeditor/blocks/cssClass/cssclass.cs | 1 + .../blockeditor/blocks/cssClass/razor | 2 +- .../blockeditor/blocks/cssClass/tagHelper | 10 +- .../blockeditor/blocks/indent/indent.cs | 9 +- .../blockeditor/blocks/indent/razor | 2 +- .../blockeditor/blocks/indent/tagHelper | 11 +- .../blockeditor/blocks/isChecked/razor | 2 +- .../blockeditor/blocks/isChecked/tagHelper | 11 +- .../blocks/label-settings/label.cs | 8 +- .../blockeditor/blocks/label-settings/razor | 2 +- .../blocks/placeholder/placeholder.cs | 17 +- .../blockeditor/blocks/placeholder/razor | 2 +- .../blockeditor/blocks/placeholder/tagHelper | 11 +- .../blockeditor/drag-drop/dragdrop.cs | 7 +- .../code-snippet/blockeditor/drag-drop/razor | 2 +- .../editor-menus/block-action/blockAction.cs | 11 +- .../editor-menus/block-action/razor | 2 +- .../editor-menus/block-action/tagHelper | 8 +- .../editor-menus/context-menu/contextMenu.cs | 10 +- .../editor-menus/context-menu/razor | 2 +- .../editor-menus/context-menu/tagHelper | 8 +- .../inline-toolbar/inlineToolbar.cs | 9 +- .../editor-menus/inline-toolbar/razor | 2 +- .../editor-menus/inline-toolbar/tagHelper | 8 +- .../editor-menus/slash-command/razor | 2 +- .../slash-command/slashCommand.cs | 3 +- .../editor-menus/slash-command/tagHelper | 8 +- .../blockeditor/globalization/locale/razor | 2 +- .../blockeditor/globalization/rtl/razor | 2 +- .../blockeditor/methods/block/razor | 2 +- .../blockeditor/methods/block/tagHelper | 8 +- .../blockeditor/methods/data/razor | 2 +- .../blockeditor/methods/data/tagHelper | 8 +- .../blockeditor/methods/formatting/razor | 2 +- .../blockeditor/methods/formatting/tagHelper | 9 +- .../blockeditor/methods/selection/razor | 2 +- .../blockeditor/methods/selection/tagHelper | 9 +- .../paste-cleanup/allowedStyle/razor | 2 +- .../paste-cleanup/allowedStyle/tagHelper | 8 +- .../blockeditor/paste-cleanup/plainText/razor | 2 +- .../paste-cleanup/plainText/tagHelper | 8 +- .../code-snippet/blockeditor/undo-redo/razor | 2 +- 89 files changed, 989 insertions(+), 372 deletions(-) create mode 100644 ej2-asp-core-mvc/blockeditor/images/block-table.png create mode 100644 ej2-asp-core-mvc/code-snippet/blockeditor/blocks/blockTypes/table-block/razor create mode 100644 ej2-asp-core-mvc/code-snippet/blockeditor/blocks/blockTypes/table-block/table.cs create mode 100644 ej2-asp-core-mvc/code-snippet/blockeditor/blocks/blockTypes/table-block/tagHelper diff --git a/ej2-asp-core-mvc/blockeditor/EJ2_ASP.MVC/appearance.md b/ej2-asp-core-mvc/blockeditor/EJ2_ASP.MVC/appearance.md index 763fe05678..b637230844 100644 --- a/ej2-asp-core-mvc/blockeditor/EJ2_ASP.MVC/appearance.md +++ b/ej2-asp-core-mvc/blockeditor/EJ2_ASP.MVC/appearance.md @@ -62,4 +62,4 @@ You can use the [CssClass](https://help.syncfusion.com/cr/aspnetmvc-js2/Syncfusi {% endhighlight %} {% endtabs %} -![Appearance](images/appearance.png) +![Appearance](./../images/appearance.png) diff --git a/ej2-asp-core-mvc/blockeditor/EJ2_ASP.MVC/built-in-blocks/built-in-blocks.md b/ej2-asp-core-mvc/blockeditor/EJ2_ASP.MVC/built-in-blocks/built-in-blocks.md index 25cd9f1b3e..af5328d00f 100644 --- a/ej2-asp-core-mvc/blockeditor/EJ2_ASP.MVC/built-in-blocks/built-in-blocks.md +++ b/ej2-asp-core-mvc/blockeditor/EJ2_ASP.MVC/built-in-blocks/built-in-blocks.md @@ -11,13 +11,13 @@ domainurl: ##DomainURL## # Blocks in ##Platform_Name## Block Editor control -The Block Editor control enables you to create block-based content editing solution using various types of blocks. The [Blocks](https://help.syncfusion.com/cr/aspnetmvc-js2/Syncfusion.EJ2.BlockEditor.Blocks.html) property allows you to define and manage the content structure of your editor. +The Block Editor control enables you to create block-based content editing solution using various types of blocks. The [Blocks](https://help.syncfusion.com/cr/aspnetmvc-js2/Syncfusion.EJ2.BlockEditor.BlockEditor.html#Syncfusion_EJ2_BlockEditor_BlockEditor_Blocks) property allows you to define and manage the content structure of your editor. ## Blocks Blocks are the fundamental building elements of the Block Editor. Each block represents a distinct content unit such as a `Paragraph`, `Heading`, `List`, or specialized content like `Code Snippets` or `Images`. The Block Editor organizes content as a collection of `blocks`, allowing for better structure and formatting options. -You can configure blocks with various properties such as `id`, `blockType`, `content` and more to create rich and structured editor. +You can configure blocks with various properties such as `id`, [blockType](https://help.syncfusion.com/cr/aspnetmvc-js2/Syncfusion.EJ2.BlockEditor.BlockType.html), `content` and more to create rich and structured editor. ## Block types @@ -53,11 +53,11 @@ By default, the `indent` property is set to `0`. {% endhighlight %} {% endtabs %} -![Block Indent](images/block-indent.png) +![Block Indent](./../../images/block-indent.png) ## Configure CSS Class -You can apply custom styling to individual blocks using the `cssClass` property. This property accepts a string containing one or more CSS class names. +You can apply custom styling to individual blocks using the [cssClass](https://help.syncfusion.com/cr/aspnetmvc-js2/Syncfusion.EJ2.BlockEditor.BlockEditor.html#Syncfusion_EJ2_BlockEditor_BlockEditor_CssClass) property. This property accepts a string containing one or more CSS class names. Custom CSS classes allow you to define specialized styling for specific blocks in your editor. @@ -70,11 +70,11 @@ Custom CSS classes allow you to define specialized styling for specific blocks i {% endhighlight %} {% endtabs %} -![Block cssClass](images/block-cssClass.png) +![Block cssClass](./../../images/block-cssClass.png) ## Configure templates -The Block Editor allows you to use custom templates for specialized content using the `template` property. Templates can be defined as strings, functions, or HTML elements. +The Block Editor allows you to use custom templates for specialized content using the [template](https://help.syncfusion.com/cr/aspnetmvc-js2/Syncfusion.EJ2.BlockEditor.BlockType.html#Syncfusion_EJ2_BlockEditor_BlockType_Template) property. Templates can be defined as strings, functions, or HTML elements. {% tabs %} {% highlight razor tabtitle="CSHTML" %} @@ -85,4 +85,4 @@ The Block Editor allows you to use custom templates for specialized content usin {% endhighlight %} {% endtabs %} -![Template Block](images/block-template.png) \ No newline at end of file +![Template Block](./../../images/block-template.png) \ No newline at end of file diff --git a/ej2-asp-core-mvc/blockeditor/EJ2_ASP.MVC/built-in-blocks/code-block.md b/ej2-asp-core-mvc/blockeditor/EJ2_ASP.MVC/built-in-blocks/code-block.md index df3e3d1dea..5e8949d68b 100644 --- a/ej2-asp-core-mvc/blockeditor/EJ2_ASP.MVC/built-in-blocks/code-block.md +++ b/ej2-asp-core-mvc/blockeditor/EJ2_ASP.MVC/built-in-blocks/code-block.md @@ -11,18 +11,18 @@ domainurl: ##DomainURL## # Code Blocks in ##Platform_Name## Block Editor control -You can render Code blocks by setting the `blockType` property as `Code`. By setting the `properties` property, you can configure the default language. The default language is `plainText`. +You can render Code blocks by setting the [blockType](https://help.syncfusion.com/cr/aspnetmvc-js2/Syncfusion.EJ2.BlockEditor.BlockType.html)property as [Code](https://help.syncfusion.com/cr/aspnetmvc-js2/Syncfusion.EJ2.BlockEditor.BlockType.html#Syncfusion_EJ2_BlockEditor_BlockType_Code). By setting the `properties` property, you can configure the default language. The default language is `plainText`. ## Global Code Settings -You can configure global settings for code blocks using the `CodeBlockSettings` property in the Block Editor root configuration. This ensures consistent behavior for syntax highlighting and language options across all code blocks. +You can configure global settings for code blocks using the [CodeBlockSettings](https://help.syncfusion.com/cr/aspnetmvc-js2/Syncfusion.EJ2.BlockEditor.BlockEditor.html#Syncfusion_EJ2_BlockEditor_BlockEditor_CodeBlockSettings) property in the Block Editor root configuration. This ensures consistent behavior for syntax highlighting and language options across all code blocks. -The `CodeBlockSettings` property supports the following options: +The [CodeBlockSettings](https://help.syncfusion.com/cr/aspnetmvc-js2/Syncfusion.EJ2.BlockEditor.BlockEditor.html#Syncfusion_EJ2_BlockEditor_BlockEditor_CodeBlockSettings) property supports the following options: | Property | Description | Default Value | |----------|-------------|---------------| -| [languages](https://help.syncfusion.com/cr/aspnetmvc-js2/Syncfusion.EJ2.BlockEditor.CodeBlockSettingsModel.html#Syncfusion_EJ2_BlockEditor_CodeBlockSettingsModel_Languages) | Specifies the array of language options for syntax highlighting. | [] | -| [defaultLanguage](https://help.syncfusion.com/cr/aspnetmvc-js2/Syncfusion.EJ2.BlockEditor.CodeBlockSettingsModel.html#Syncfusion_EJ2_BlockEditor_CodeBlockSettingsModel_DefaultLanguage) | Defines the default language to use for syntax highlighting. | 'plaintext' | +| `languages` | Specifies the array of language options for syntax highlighting. | [] | +| `defaultLanguage`| Defines the default language to use for syntax highlighting. | 'plaintext' | Each language object in the `languages` array should have: - `language`: The language value used for syntax highlighting @@ -49,4 +49,4 @@ Below example illustrates how to render the different code block in the Block Ed {% endhighlight %} {% endtabs %} -![Code Block](images/block-code.png) \ No newline at end of file +![Code Block](./../../images/block-code.png) \ No newline at end of file diff --git a/ej2-asp-core-mvc/blockeditor/EJ2_ASP.MVC/built-in-blocks/embed.md b/ej2-asp-core-mvc/blockeditor/EJ2_ASP.MVC/built-in-blocks/embed.md index b05f8d7b16..8d2abb7245 100644 --- a/ej2-asp-core-mvc/blockeditor/EJ2_ASP.MVC/built-in-blocks/embed.md +++ b/ej2-asp-core-mvc/blockeditor/EJ2_ASP.MVC/built-in-blocks/embed.md @@ -15,17 +15,17 @@ Block Editor supports addition of embeds to help you organize, showcase contents ## Image Block -You can use the `Image` block to showcase an image content within your editor. +You can use the [Image](https://help.syncfusion.com/cr/aspnetmvc-js2/Syncfusion.EJ2.BlockEditor.BlockType.html#Syncfusion_EJ2_BlockEditor_BlockType_Image) block to showcase an image content within your editor. ### Configure Image Block -You can render an `Image` block by setting the `blockType` property to `Image` in the block model. The `properties` property allows you to configure the image source, allowed file types, display dimensions, and more. +You can render an [Image](https://help.syncfusion.com/cr/aspnetmvc-js2/Syncfusion.EJ2.BlockEditor.BlockType.html#Syncfusion_EJ2_BlockEditor_BlockType_Image) block by setting the [blockType](https://help.syncfusion.com/cr/aspnetmvc-js2/Syncfusion.EJ2.BlockEditor.BlockType.html) property to [Image](https://help.syncfusion.com/cr/aspnetmvc-js2/Syncfusion.EJ2.BlockEditor.BlockType.html#Syncfusion_EJ2_BlockEditor_BlockType_Image) in the block model. The `properties` property allows you to configure the image source, allowed file types, display dimensions, and more. #### Global Image Settings -You can configure global settings for image blocks using the `ImageBlockSettings` property in the Block Editor root configuration. This ensures consistent behavior for image uploads, resizing, and display. +You can configure global settings for image blocks using the [ImageBlockSettings](https://help.syncfusion.com/cr/aspnetmvc-js2/Syncfusion.EJ2.BlockEditor.BlockEditor.html#Syncfusion_EJ2_BlockEditor_BlockEditor_ImageBlockSettings) property in the Block Editor root configuration. This ensures consistent behavior for image uploads, resizing, and display. -The `ImageBlockSettings` property supports the following options: +The [ImageBlockSettings](https://help.syncfusion.com/cr/aspnetmvc-js2/Syncfusion.EJ2.BlockEditor.BlockEditor.html#Syncfusion_EJ2_BlockEditor_BlockEditor_ImageBlockSettings) property supports the following options: | Property | Description | Default Value | |----------|-------------|---------------| @@ -41,7 +41,7 @@ The `ImageBlockSettings` property supports the following options: #### Configure Image Block Properties -The `Image` block `properties` property in the block model supports the following options: +The [Image](https://help.syncfusion.com/cr/aspnetmvc-js2/Syncfusion.EJ2.BlockEditor.BlockType.html#Syncfusion_EJ2_BlockEditor_BlockType_Image) block `properties` property in the block model supports the following options: | Property | Description | Default Value | |----------|-------------|---------------| @@ -50,6 +50,24 @@ The `Image` block `properties` property in the block model supports the followin | height | Specifies the display height of the image. | `''` | | altText | Specifies the alternative text to display when the image cannot be loaded. | `''` | +### BlockType & Properties + +The following example demonstrates how to pre-configure an [Image](https://help.syncfusion.com/cr/aspnetmvc-js2/Syncfusion.EJ2.BlockEditor.BlockType.html#Syncfusion_EJ2_BlockEditor_BlockType_Image) block in the editor. + +```typescript +// Adding image block + { + blockType = "Image", + properties = new + { + src = "https://cdn.syncfusion.com/ej2/richtexteditor-resources/RTE-Overview.png", + width = '200px', + height = '100px', + altText = '', + } +} +``` + The below sample demonstrates the configuration of image block in the Block Editor. {% tabs %} @@ -61,4 +79,4 @@ The below sample demonstrates the configuration of image block in the Block Edit {% endhighlight %} {% endtabs %} -![Image Block](images/block-image.png) \ No newline at end of file +![Image Block](./../../images/block-image.png) \ No newline at end of file diff --git a/ej2-asp-core-mvc/blockeditor/EJ2_ASP.MVC/built-in-blocks/inline-content.md b/ej2-asp-core-mvc/blockeditor/EJ2_ASP.MVC/built-in-blocks/inline-content.md index c9395e2ee5..c8277fd929 100644 --- a/ej2-asp-core-mvc/blockeditor/EJ2_ASP.MVC/built-in-blocks/inline-content.md +++ b/ej2-asp-core-mvc/blockeditor/EJ2_ASP.MVC/built-in-blocks/inline-content.md @@ -28,6 +28,19 @@ You can specify the type of content using the `contentType` property. The Block > By default, the content type is set to `Text`. +### ContentType + +```typescript +// Adding inline text +{ + blockType = "Paragraph", + content = new List() + { + new { contentType = 'Text', content = "Inline Text" } + } +} +``` + ## Configure text content You can configure Text content by setting the `contentType` property to `Text`. The default content type is `Text`. @@ -46,6 +59,25 @@ Link settings accepts the following options: | ------------------------- | ----------------------------------------------------------------- | ------------- | |`url`| Specifies the destination URL of the link. | `''` | +### ContentType & Properties + +```typescript +{ + blockType = "Paragraph", + content = new List() + { + new + { + contentType = 'Link', + content = 'hyperlinks', + properties = { + url = 'https://ej2.syncfusion.com/documentation', + } + } + } +} +``` + ## Configure Label You can render labels by setting the `contentType` property as `Label`. Additionally, by configuring the `properties` property, you can customize how labels behave in your editor. This setup allows you to define the trigger character and specify the available label items. @@ -61,6 +93,19 @@ The Block Editor comes with offers different built-in options. These include: You can customize the labels by using the `properties` property with type `Label`. +### ContentType & Properties + +```typescript +// Adding inline label +{ + blockType = "Paragraph", + content = new List() + { + new {contentType = 'Label', properties = { lableId = "progress" }} + } +} +``` + ### Trigger Character configuration You can use the `triggerChar` property to specify the character that will trigger the label suggestions popup while typing. The default trigger character is `$`. @@ -94,7 +139,7 @@ The below sample demonstrates the customization of labels in the Block Editor. {% endhighlight %} {% endtabs %} -![Block label-settings](images/block-label.png) +![Block label-settings](./../../images/block-label.png) ## Configure mention @@ -102,6 +147,21 @@ Mentions are references to users or entities that can be inserted into your cont Mentions are typically triggered by the `@` character and are linked to the `Users` collection defined in the Block Editor. +### ContentType + +```typescript +// Adding inline code +{ + blockType = "Paragraph", + content = new List() + { + new { + contentType = "Mention", properties = new { userId = "user1" } + } + } +} +``` + ## Applying inline styles The Block Editor allows you to apply rich formatting to block contents using the `styles` property. diff --git a/ej2-asp-core-mvc/blockeditor/EJ2_ASP.MVC/built-in-blocks/list-types.md b/ej2-asp-core-mvc/blockeditor/EJ2_ASP.MVC/built-in-blocks/list-types.md index 9f23413fe9..4fc10778e8 100644 --- a/ej2-asp-core-mvc/blockeditor/EJ2_ASP.MVC/built-in-blocks/list-types.md +++ b/ej2-asp-core-mvc/blockeditor/EJ2_ASP.MVC/built-in-blocks/list-types.md @@ -11,31 +11,98 @@ domainurl: ##DomainURL## # Lists in ##Platform_Name## Block Editor control -List blocks in the BlockEditor component are used to organize content into structured lists. You can render List blocks by setting the `blockType` property as `BulletList`, `NumberedList`, or `Checklist`. Bullet lists and numbered lists are ideal for unordered and ordered items, respectively, while checklist blocks enable interactive to-do lists with checkable items. +List blocks in the BlockEditor component are used to organize content into structured lists. You can render List blocks by setting the [blockType](https://help.syncfusion.com/cr/aspnetmvc-js2/Syncfusion.EJ2.BlockEditor.BlockType.html) property as [BulletList](https://help.syncfusion.com/cr/aspnetmvc-js2/Syncfusion.EJ2.BlockEditor.BlockType.html#Syncfusion_EJ2_BlockEditor_BlockType_BulletList), [NumberedList](https://help.syncfusion.com/cr/aspnetmvc-js2/Syncfusion.EJ2.BlockEditor.BlockType.html#Syncfusion_EJ2_BlockEditor_BlockType_NumberedList), or [Checklist](https://help.syncfusion.com/cr/aspnetmvc-js2/Syncfusion.EJ2.BlockEditor.BlockType.html#Syncfusion_EJ2_BlockEditor_BlockType_Checklist). Bullet lists and numbered lists are ideal for unordered and ordered items, respectively, while checklist blocks enable interactive to-do lists with checkable items. ## Configure bullet list -You can render Bullet List block by setting the `blockType` property as `BulletList`. This block type is used for unordered lists. +You can render Bullet List block by setting the [blockType](https://help.syncfusion.com/cr/aspnetmvc-js2/Syncfusion.EJ2.BlockEditor.BlockType.html) property as [BulletList](https://help.syncfusion.com/cr/aspnetmvc-js2/Syncfusion.EJ2.BlockEditor.BlockType.html#Syncfusion_EJ2_BlockEditor_BlockType_BulletList). This block type is used for unordered lists. + +### BlockType + +```typescript +// Adding bulletlist block +{ + blockType = 'BulletList', + content = new List() + { + new + { + contentType = "Text" + content = 'your content' + } + } +} +``` ### Configure placeholder You can configure placeholder text for block using the `placeholder` in the `properties` property. This text appears when the block is empty. The default placeholder for bullet list is `Add item`. +```typescript +// Adding placeholder value +{ + blockType = 'BulletList', + properties = new { placeholder = "Add item" } +} +``` + ## Configure numbered list -You can render Numbered List block by setting the `blockType` property as `NumberedList`. This block type is used for ordered lists. +You can render Numbered List block by setting the [blockType](https://help.syncfusion.com/cr/aspnetmvc-js2/Syncfusion.EJ2.BlockEditor.BlockType.html) property as [NumberedList](https://help.syncfusion.com/cr/aspnetmvc-js2/Syncfusion.EJ2.BlockEditor.BlockType.html#Syncfusion_EJ2_BlockEditor_BlockType_NumberedList),. This block type is used for ordered lists. + +### BlockType + +```typescript +// Adding bulletlist block +{ + blockType = 'NumberedList', + content = new List() + { + new + { + contentType = "Text" + content = 'your content' + } + } +} +``` ### Configure placeholder You can configure placeholder text for block using the `placeholder` in the `properties` property. This text appears when the block is empty. The default placeholder for numbered list is `Add item`. +```typescript +// Adding placeholder value +{ + blockType = 'NumberedList', + properties = new { placeholder = "Add item" } +} +``` + ## Configure checklist -You can render Checklist block by setting the `blockType` property as `Checklist`. This block type is used for creating interactive to-do lists. +You can render Checklist block by setting the [blockType](https://help.syncfusion.com/cr/aspnetmvc-js2/Syncfusion.EJ2.BlockEditor.BlockType.html) property as [Checklist](https://help.syncfusion.com/cr/aspnetmvc-js2/Syncfusion.EJ2.BlockEditor.BlockType.html#Syncfusion_EJ2_BlockEditor_BlockType_Checklist). This block type is used for creating interactive to-do lists. + +### BlockType + +```typescript +// Adding bulletlist block +{ + blockType = 'CheckList', + content = new List() + { + new + { + contentType = "Text" + content = 'your content' + } + } +} +``` ### Configure checked state -For blocks that support selection states such as `Checklist`, you can configure the checked state using the `properties` property with `isChecked`. +For blocks that support selection states such as [Checklist](https://help.syncfusion.com/cr/aspnetmvc-js2/Syncfusion.EJ2.BlockEditor.BlockType.html#Syncfusion_EJ2_BlockEditor_BlockType_Checklist), you can configure the checked state using the `properties` property with `isChecked`. By default, the `isChecked` property is set to `false`. @@ -48,23 +115,31 @@ By default, the `isChecked` property is set to `false`. {% endhighlight %} {% endtabs %} -![Block isChecked](images/block-ischecked.png) +![Block isChecked](./../../images/block-ischecked.png) ### Configure placeholder You can configure placeholder text for block using the `placeholder` in the `properties` property. This text appears when the block is empty. The default placeholder for check list is `Todo`. +```typescript +// Adding placeholder value +{ + blockType = 'Checklist', + properties = new { placeholder = "Todo" } +} +``` + ## Configure list blocks Below example illustrates how to render the different types of list blocks in the Block Editor. {% tabs %} {% highlight razor tabtitle="CSHTML" %} -{% include code-snippet/blockeditor/blocks/blockTypes/paragraph-block/razor %} +{% include code-snippet/blockeditor/blocks/blockTypes/list-block/razor %} {% endhighlight %} {% highlight c# tabtitle="List.cs" %} {% include code-snippet/blockeditor/blocks/blockTypes/list-block/list.cs %} {% endhighlight %} {% endtabs %} -![List Block](images/block-list.png) \ No newline at end of file +![List Block](./../../images/block-list.png) \ No newline at end of file diff --git a/ej2-asp-core-mvc/blockeditor/EJ2_ASP.MVC/built-in-blocks/table-block.md b/ej2-asp-core-mvc/blockeditor/EJ2_ASP.MVC/built-in-blocks/table-block.md index 575de645b3..95c531550a 100644 --- a/ej2-asp-core-mvc/blockeditor/EJ2_ASP.MVC/built-in-blocks/table-block.md +++ b/ej2-asp-core-mvc/blockeditor/EJ2_ASP.MVC/built-in-blocks/table-block.md @@ -11,7 +11,7 @@ domainurl: ##DomainURL## # Table Blocks in ##Platform_Name## Block Editor control -The Block Editor control allows you to render structured data in rows and columns by setting the block's `blockType` property to `Table`. You can customize the table layout, header, row numbers, and define columns and rows using the `properties` property. +The Block Editor control allows you to render structured data in rows and columns by setting the block's [blockType](https://help.syncfusion.com/cr/aspnetmvc-js2/Syncfusion.EJ2.BlockEditor.BlockType.html) property to [Table](https://help.syncfusion.com/cr/aspnetmvc-js2/Syncfusion.EJ2.BlockEditor.BlockType.html#Syncfusion_EJ2_BlockEditor_BlockType_Table). You can customize the table layout, header, row numbers, and define columns and rows using the `properties` property. ### Configure Table Block @@ -26,4 +26,15 @@ For Table blocks, you can configure layout and structure using the `properties` | columns | Defines the columns of the table, including their types and headers. | `[]` | | rows | Defines the rows of the table, each containing cells tied to columns. | `[]` | -This sample demonstrates the configuration of the `Table` block in the Block Editor. +This sample demonstrates the configuration of the [Table](https://help.syncfusion.com/cr/aspnetmvc-js2/Syncfusion.EJ2.BlockEditor.BlockType.html#Syncfusion_EJ2_BlockEditor_BlockType_Table) block in the Block Editor. + +{% tabs %} +{% highlight razor tabtitle="CSHTML" %} +{% include code-snippet/blockeditor/blocks/blockTypes/table-block/razor %} +{% endhighlight %} +{% highlight c# tabtitle="Table.cs" %} +{% include code-snippet/blockeditor/blocks/blockTypes/table-block/table.cs %} +{% endhighlight %} +{% endtabs %} + +![Table Block](./../../images/block-table.png) \ No newline at end of file diff --git a/ej2-asp-core-mvc/blockeditor/EJ2_ASP.MVC/built-in-blocks/typography.md b/ej2-asp-core-mvc/blockeditor/EJ2_ASP.MVC/built-in-blocks/typography.md index 27c4724e65..4a75c3a72a 100644 --- a/ej2-asp-core-mvc/blockeditor/EJ2_ASP.MVC/built-in-blocks/typography.md +++ b/ej2-asp-core-mvc/blockeditor/EJ2_ASP.MVC/built-in-blocks/typography.md @@ -15,7 +15,24 @@ Typography blocks are essential for organizing and presenting text-based content ## Configure paragraph block -You can render Paragraph blocks by setting the `blockType` property as `Paragraph`. Paragraph blocks are the most common type, used for regular text content. They provide standard text formatting options and serve as the default block type. +You can render Paragraph blocks by setting the [blockType](https://help.syncfusion.com/cr/aspnetmvc-js2/Syncfusion.EJ2.BlockEditor.BlockType.html) property as [Paragraph](https://help.syncfusion.com/cr/aspnetmvc-js2/Syncfusion.EJ2.BlockEditor.BlockType.html#Syncfusion_EJ2_BlockEditor_BlockType_Paragraph). Paragraph blocks are the most common type, used for regular text content. They provide standard text formatting options and serve as the default block type. + +### BlockType + +```typescript +// Adding paragraph block +{ + blockType = 'Paragraph', + content = new List + { + new + { + contentType = 'Text', + content = 'This is a paragraph block example.' + } + } +} +``` The below sample demonstrates the configuration of paragraph block in the Block Editor. @@ -28,12 +45,22 @@ The below sample demonstrates the configuration of paragraph block in the Block {% endhighlight %} {% endtabs %} -![Paragraph Block](images/block-paragraph.png) +![Paragraph Block](./../../images/block-paragraph.png) ### Configure placeholder You can configure placeholder text for block using the `placeholder` in the `properties` property. This text appears when the block is empty. The default placeholder for the paragraph block is `Write something or ‘/’ for commands.`. +### BlockType & Properties + +```typescript +// Adding placeholder + { + blockType = 'Paragraph', + properties = new { placeholder = "Start typing ..." } +} +``` + The below sample demonstrates the configuration of placeholder in the Block Editor for the paragraph block. {% tabs %} @@ -45,17 +72,32 @@ The below sample demonstrates the configuration of placeholder in the Block Edit {% endhighlight %} {% endtabs %} -![Block placeholder](images/block-placeholder.png) +![Block placeholder](./../../images/block-placeholder.png) ## Configure heading block -You can render Heading blocks by setting the `blockType` property as `Heading`. Heading blocks are used to create document titles and section headers of varying importance. These blocks help structure your content hierarchically, making it easier to read and navigate. +You can render Heading blocks by setting the [blockType](https://help.syncfusion.com/cr/aspnetmvc-js2/Syncfusion.EJ2.BlockEditor.BlockType.html) property as [Heading](https://help.syncfusion.com/cr/aspnetmvc-js2/Syncfusion.EJ2.BlockEditor.BlockType.html#Syncfusion_EJ2_BlockEditor_BlockType_Heading). Heading blocks are used to create document titles and section headers of varying importance. These blocks help structure your content hierarchically, making it easier to read and navigate. ### Configure levels You can configure the heading blocks using the property `level` in the `properties` property. The heading level representing a title `level: 1`, heading `level: 2`, subheading `level: 3` and a subsection by `level: 4`. +### BlockType & Properties + +```typescript +// Adding heading block +{ + blockType = "Heading", + content = new List + { + new { contentType = "Text", content = "Heading" } + }, + // levels range from 1 to 4 + properties = new { level = 4 } +} +``` + The below sample demonstrates the configuration of heading block in the Block Editor. {% tabs %} @@ -67,15 +109,25 @@ The below sample demonstrates the configuration of heading block in the Block Ed {% endhighlight %} {% endtabs %} -![Heading Block](images/block-heading.png) +![Heading Block](./../../images/block-heading.png) ### Configure placeholder You can configure placeholder text for block using the `placeholder` in the `properties` property. This text appears when the block is empty. The default placeholder for heading block is `Heading{level}`. +### BlockType & Properties + +```typescript +// Adding placeholder + { + blockType = 'Paragraph', + properties = new {level = 4 , placeholder = "Heading block" } +} +``` + ## Configure collapsible blocks -You can render Collapsible blocks by setting the `blockType` property as `CollapsibleParagraph` or `CollapsibleHeading`. Collapsible blocks allow users to expand or collapse sections, providing a way to hide or show content as needed. +You can render Collapsible blocks by setting the [blockType](https://help.syncfusion.com/cr/aspnetmvc-js2/Syncfusion.EJ2.BlockEditor.BlockType.html) property as [CollapsibleParagraph](https://help.syncfusion.com/cr/aspnetmvc-js2/Syncfusion.EJ2.BlockEditor.BlockType.html#Syncfusion_EJ2_BlockEditor_BlockType_CollapsibleParagraph) or [CollapsibleHeading](https://help.syncfusion.com/cr/aspnetmvc-js2/Syncfusion.EJ2.BlockEditor.BlockType.html#Syncfusion_EJ2_BlockEditor_BlockType_CollapsibleHeading). Collapsible blocks allow users to expand or collapse sections, providing a way to hide or show content as needed. ### Configure levels @@ -97,7 +149,38 @@ This structure is essential for maintaining nested relationships within the edit You can control whether a block is expanded or collapsed using the `isExpanded` in the `properties` property. By default, this property is set to `false`, meaning the block will be collapsed initially. This setting is only applicable to Collapsible blocks. -The below sample demonstrates the configuration of collapsibleHeading and collapsibleParagraph blocks in the Block Editor. +### BlockType & Properties + +```typescript + // Configuring CollapsibleHeading block + new BlockModel + { + blockType = "CollapsibleHeading", + properties = new + { + level=1, + isExpanded = true, + children = new List(){ + // your actions + } + } + }, + // Configuring CollapsibleParagraph block + new BlockModel + { + blockType = "CollapsibleParagraph", + properties = new + { + isExpanded = false, + children = new List() + { + // your actions + } + } + } +``` + +The below sample demonstrates the configuration of [CollapsibleParagraph](https://help.syncfusion.com/cr/aspnetmvc-js2/Syncfusion.EJ2.BlockEditor.BlockType.html#Syncfusion_EJ2_BlockEditor_BlockType_CollapsibleParagraph) and [CollapsibleHeading](https://help.syncfusion.com/cr/aspnetmvc-js2/Syncfusion.EJ2.BlockEditor.BlockType.html#Syncfusion_EJ2_BlockEditor_BlockType_CollapsibleHeading) blocks in the Block Editor. {% tabs %} {% highlight razor tabtitle="CSHTML" %} @@ -108,15 +191,48 @@ The below sample demonstrates the configuration of collapsibleHeading and collap {% endhighlight %} {% endtabs %} -![Toggle Block](images/block-toggle.png) +![Toggle Block](./../../images/block-toggle.png) ### Configure placeholder You can configure placeholder text for block using the `placeholder` in the `properties` property. This text appears when the block is empty. The default placeholder for collapsible heading and collapsible paragraph is `Collapsible Heading{level}` and `Collapsible Paragraph` respectively. +```typescript + // Configuring CollapsibleHeading block + new BlockModel + { + blockType = "CollapsibleHeading", + properties = new + { + level=1, + isExpanded = true, + placeholder = "collapsible heading" + } + }, + // Configuring CollapsibleParagraph block + new BlockModel + { + blockType = "CollapsibleParagraph", + properties = new + { + isExpanded = false, + placeholder = "collapsible paragraph" + } + } +``` + ## Configure divider block -Divider blocks insert horizontal lines that separate different sections of content. You can render Divider blocks by setting the `blockType` property as `Divider`. +Divider blocks insert horizontal lines that separate different sections of content. You can render Divider blocks by setting the [blockType](https://help.syncfusion.com/cr/aspnetmvc-js2/Syncfusion.EJ2.BlockEditor.BlockType.html) property as [Divider](https://help.syncfusion.com/cr/aspnetmvc-js2/Syncfusion.EJ2.BlockEditor.BlockType.html#Syncfusion_EJ2_BlockEditor_BlockType_Divider). + +### BlockType + +```typescript +// Adding divider block +{ + blockType = "Divider" +}, +``` The below sample demonstrates the configuration of divider block in the Block Editor. @@ -129,11 +245,24 @@ The below sample demonstrates the configuration of divider block in the Block Ed {% endhighlight %} {% endtabs %} -![Divider Block](images/block-divider.png) +![Divider Block](./../../images/block-divider.png) ## Configure quote block -You can render Quote blocks by setting the `blockType` property as `Quote`. Quote blocks are specially styled for quotations or excerpts. +You can render Quote blocks by setting the [blockType](https://help.syncfusion.com/cr/aspnetmvc-js2/Syncfusion.EJ2.BlockEditor.BlockType.html) property as [Quote](https://help.syncfusion.com/cr/aspnetmvc-js2/Syncfusion.EJ2.BlockEditor.BlockType.html#Syncfusion_EJ2_BlockEditor_BlockType_Quote). Quote blocks are specially styled for quotations or excerpts. + +### BlockType & Properties + +```typescript +// Adding divider block +{ + blockType = "Quote", + content = new List + { + new { contentType = "Text", content = "“Quotes are perfect for highlighting key messages or testimonials.”" } + } +} +``` The below sample demonstrates the configuration of quote block in the Block Editor. @@ -146,15 +275,48 @@ The below sample demonstrates the configuration of quote block in the Block Edit {% endhighlight %} {% endtabs %} -![Quote Block](images/block-quote.png) +![Quote Block](./../../images/block-quote.png) ### Configure placeholder You can configure placeholder text for block using the `placeholder` in the `properties` property. This text appears when the block is empty. The default placeholder for quote block is `Write a quote`. +```typescript +// Adding placeholder value to blocktype +{ + blockType = 'Quote', + properties = new { placeholder = "Quote" } +} +``` + ## Configure callout block -You can render Callout blocks by setting the `blockType` property as `Callout`. They're useful for notes, warnings, or tips that require special attention. +You can render Callout blocks by setting the [blockType](https://help.syncfusion.com/cr/aspnetmvc-js2/Syncfusion.EJ2.BlockEditor.BlockType.html) property as [Callout](https://help.syncfusion.com/cr/aspnetmvc-js2/Syncfusion.EJ2.BlockEditor.BlockType.html#Syncfusion_EJ2_BlockEditor_BlockType_Callout). They're useful for notes, warnings, or tips that require special attention. + +### BlockType & Properties + +```typescript +// Adding callout block + { + blockType = "Callout", + properties = new { + children = new List() + { + new BlockModel() + { + blockType = "Paragraph", + content = new List(){ + new{ + contentType = "Text", + content = "Important information: This is a callout block used to highlight important content" + } + } + } + } + } + } + +``` The below sample demonstrates the configuration of callout block in the Block Editor. @@ -167,7 +329,7 @@ The below sample demonstrates the configuration of callout block in the Block Ed {% endhighlight %} {% endtabs %} -![Callout Block](images/block-callout.png) +![Callout Block](./../../images/block-callout.png) ### Configure children @@ -192,4 +354,4 @@ The below sample demonstrates the configuration of children in the Block Editor {% endhighlight %} {% endtabs %} -![Block children](images/block-children.png) \ No newline at end of file +![Block children](./../../images/block-children.png) \ No newline at end of file diff --git a/ej2-asp-core-mvc/blockeditor/EJ2_ASP.MVC/drag-drop.md b/ej2-asp-core-mvc/blockeditor/EJ2_ASP.MVC/drag-drop.md index 047915ecf3..c84ed2e7c7 100644 --- a/ej2-asp-core-mvc/blockeditor/EJ2_ASP.MVC/drag-drop.md +++ b/ej2-asp-core-mvc/blockeditor/EJ2_ASP.MVC/drag-drop.md @@ -37,4 +37,4 @@ During the drag operation, the editor provides visual cues to indicate where the {% endhighlight %} {% endtabs %} -![Drag and Drop](images/drag-drop.png) +![Drag and Drop](./../images/drag-drop.png) diff --git a/ej2-asp-core-mvc/blockeditor/EJ2_ASP.MVC/editor-menus.md b/ej2-asp-core-mvc/blockeditor/EJ2_ASP.MVC/editor-menus.md index 3f1d516f53..768c01533b 100644 --- a/ej2-asp-core-mvc/blockeditor/EJ2_ASP.MVC/editor-menus.md +++ b/ej2-asp-core-mvc/blockeditor/EJ2_ASP.MVC/editor-menus.md @@ -57,7 +57,7 @@ Below example demonstrates the customization of the Slash Command menu. {% endhighlight %} {% endtabs %} -![Slash Command](images/editor-slashcommand.png) +![Slash Command](./../images/editor-slashcommand.png) ## Context menu @@ -97,7 +97,7 @@ Below example demonstrates the customization of the Context menu. {% endhighlight %} {% endtabs %} -![Context Menu](images/editor-contextmenu.png) +![Context Menu](./../images/editor-contextmenu.png) ## Block action menu @@ -141,7 +141,7 @@ Below example demonstrates the customization of the Block action menu. {% endhighlight %} {% endtabs %} -![Block Action](images/editor-blockaction.png) +![Block Action](./../images/editor-blockaction.png) ## Inline Toolbar diff --git a/ej2-asp-core-mvc/blockeditor/EJ2_ASP.MVC/getting-started.md b/ej2-asp-core-mvc/blockeditor/EJ2_ASP.MVC/getting-started.md index eb534d12f6..d1d3351097 100644 --- a/ej2-asp-core-mvc/blockeditor/EJ2_ASP.MVC/getting-started.md +++ b/ej2-asp-core-mvc/blockeditor/EJ2_ASP.MVC/getting-started.md @@ -98,4 +98,4 @@ Now, add the Syncfusion® ASP.NET MVC BlockE Press Ctrl+F5 (Windows) or +F5 (macOS) to run the app. Then, the Syncfusion® ASP.NET MVC BlockEditor control will be rendered in the default web browser. -![ASP.NET MVC BlockEditor Control](images/block-editor-control.png) \ No newline at end of file +![ASP.NET MVC BlockEditor Control](./../images/block-editor-control.png) \ No newline at end of file diff --git a/ej2-asp-core-mvc/blockeditor/EJ2_ASP.MVC/globalization.md b/ej2-asp-core-mvc/blockeditor/EJ2_ASP.MVC/globalization.md index a992666be9..b33628f3a5 100644 --- a/ej2-asp-core-mvc/blockeditor/EJ2_ASP.MVC/globalization.md +++ b/ej2-asp-core-mvc/blockeditor/EJ2_ASP.MVC/globalization.md @@ -57,7 +57,7 @@ The below example shows adding the German culture locale(`de-DE`) {% endhighlight %} {% endtabs %} -![Locale](images/locale.png) +![Locale](./../images/locale.png) ## RTL @@ -72,4 +72,4 @@ RTL provides an option to switch the text direction and layout of the Block Edit {% endhighlight %} {% endtabs %} -![RTL](images/rtl.png) +![RTL](./../images/rtl.png) diff --git a/ej2-asp-core-mvc/blockeditor/EJ2_ASP.MVC/methods.md b/ej2-asp-core-mvc/blockeditor/EJ2_ASP.MVC/methods.md index a4e6eb38ea..6fec110de6 100644 --- a/ej2-asp-core-mvc/blockeditor/EJ2_ASP.MVC/methods.md +++ b/ej2-asp-core-mvc/blockeditor/EJ2_ASP.MVC/methods.md @@ -93,7 +93,7 @@ Below example demonstrates the usage of the above methods. {% endhighlight %} {% endtabs %} -![Block Method](images/method-block.png) +![Block Method](./../images/method-block.png) ## Selection and Cursor Methods @@ -171,7 +171,7 @@ Below example demonstrates the usage of the above methods. {% endhighlight %} {% endtabs %} -![Selection Method](images/method-selection.png) +![Selection Method](./../images/method-selection.png) ## Focus Management Methods @@ -242,7 +242,7 @@ Below example demonstrates the usage of the above methods. {% endhighlight %} {% endtabs %} -![Formatting Method](images/method-formatting.png) +![Formatting Method](./../images/method-formatting.png) ## Data Export Methods @@ -314,4 +314,4 @@ Below example demonstrates the usage of the above methods. {% endhighlight %} {% endtabs %} -![Data Method](images/method-data.png) +![Data Method](./../images/method-data.png) diff --git a/ej2-asp-core-mvc/blockeditor/EJ2_ASP.MVC/paste-cleanup.md b/ej2-asp-core-mvc/blockeditor/EJ2_ASP.MVC/paste-cleanup.md index 129f223a88..cea64df59f 100644 --- a/ej2-asp-core-mvc/blockeditor/EJ2_ASP.MVC/paste-cleanup.md +++ b/ej2-asp-core-mvc/blockeditor/EJ2_ASP.MVC/paste-cleanup.md @@ -12,11 +12,11 @@ documentation: ug The Block Editor control provides robust paste clean-up functionalities to ensure that pasted content integrates seamlessly and maintains consistency with the editor's styling and structure. This helps in removing unwanted formatting, scripts, or elements often copied from external sources like web pages or word processors. -You can configure the paste settings using the `PasteCleanupSettings` property in the Block Editor control. This property allows you to define various options to control how content is pasted into the editor. +You can configure the paste settings using the [PasteCleanupSettings](https://help.syncfusion.com/cr/aspnetmvc-js2/Syncfusion.EJ2.BlockEditor.PasteCleanupSettings.html) property in the Block Editor control. This property allows you to define various options to control how content is pasted into the editor. ## Configuring allowed styles -The `AllowedStyles` property in the `PasteCleanupSettings` model allows you to define which CSS styles are permitted when content is pasted into the editor. Any style not included in this list will be stripped from the pasted content. This ensures that only desired visual attributes are preserved, maintaining a clean and consistent look. +The [AllowedStyles](https://help.syncfusion.com/cr/aspnetmvc-js2/Syncfusion.EJ2.BlockEditor.PasteCleanupSettings.htmlAllowedStyles) property in the [`PasteCleanupSettings`](https://help.syncfusion.com/cr/aspnetmvc-js2/Syncfusion.EJ2.BlockEditor.PasteCleanupSettings.html) model allows you to define which CSS styles are permitted when content is pasted into the editor. Any style not included in this list will be stripped from the pasted content. This ensures that only desired visual attributes are preserved, maintaining a clean and consistent look. By default, following styles are allowed: @@ -35,7 +35,7 @@ In the below example, only `font-weight` and `font-style` styles will be retaine ## Setting denied tags -The `DeniedTags` property in `PasteCleanupSettings` enables you to specify HTML tags that should be completely removed from the pasted content. This is particularly useful for stripping out potentially problematic or irrelevant tags, such as `script` tags, `iframe`s, or any other elements you don't want to allow in the editor. By default, the `DeniedTags` property is an empty array, meaning no tags are removed by default. +The [DeniedTags](https://help.syncfusion.com/cr/aspnetmvc-js2/Syncfusion.EJ2.BlockEditor.PasteCleanupSettings.htmlDeniedTags) property in [`PasteCleanupSettings`](https://help.syncfusion.com/cr/aspnetmvc-js2/Syncfusion.EJ2.BlockEditor.PasteCleanupSettings.html) enables you to specify HTML tags that should be completely removed from the pasted content. This is particularly useful for stripping out potentially problematic or irrelevant tags, such as `script` tags, `iframe`s, or any other elements you don't want to allow in the editor. By default, the [DeniedTags](https://help.syncfusion.com/cr/aspnetmvc-js2/Syncfusion.EJ2.BlockEditor.PasteCleanupSettings.htmlDeniedTags) property is an empty array, meaning no tags are removed by default. In the below example, any ` -``` \ No newline at end of file +``` From d0436c388ec55458a239a48ca20a89b7a08befd8 Mon Sep 17 00:00:00 2001 From: KaviBharathi-SF5060 Date: Wed, 17 Dec 2025 16:46:47 +0530 Subject: [PATCH 08/10] 998697: updated the platform name separately --- .../block-editor/EJ2_ASP.MVC/appearance.md | 8 ++++---- .../built-in-blocks/built-in-blocks.md | 8 ++++---- .../EJ2_ASP.MVC/built-in-blocks/code-block.md | 8 ++++---- .../EJ2_ASP.MVC/built-in-blocks/embed.md | 8 ++++---- .../built-in-blocks/inline-content.md | 8 ++++---- .../EJ2_ASP.MVC/built-in-blocks/list-types.md | 8 ++++---- .../EJ2_ASP.MVC/built-in-blocks/table-block.md | 8 ++++---- .../EJ2_ASP.MVC/built-in-blocks/typography.md | 8 ++++---- .../block-editor/EJ2_ASP.MVC/drag-drop.md | 8 ++++---- .../block-editor/EJ2_ASP.MVC/editor-menus.md | 8 ++++---- .../editor-security/cross-site-script.md | 8 ++++---- .../editor-security/read-only-mode.md | 8 ++++---- .../block-editor/EJ2_ASP.MVC/events.md | 8 ++++---- .../EJ2_ASP.MVC/getting-started.md | 8 ++++---- .../block-editor/EJ2_ASP.MVC/globalization.md | 8 ++++---- .../EJ2_ASP.MVC/keyboard-shortcuts.md | 8 ++++---- .../block-editor/EJ2_ASP.MVC/methods.md | 8 ++++---- .../block-editor/EJ2_ASP.MVC/paste-cleanup.md | 18 +++++++++--------- .../block-editor/EJ2_ASP.MVC/undo-redo.md | 8 ++++---- .../block-editor/EJ2_ASP.NETCORE/appearance.md | 8 ++++---- .../built-in-blocks/built-in-blocks.md | 8 ++++---- .../built-in-blocks/code-block.md | 8 ++++---- .../EJ2_ASP.NETCORE/built-in-blocks/embed.md | 8 ++++---- .../built-in-blocks/inline-content.md | 8 ++++---- .../built-in-blocks/list-types.md | 8 ++++---- .../built-in-blocks/table-block.md | 8 ++++---- .../built-in-blocks/typography.md | 8 ++++---- .../block-editor/EJ2_ASP.NETCORE/drag-drop.md | 8 ++++---- .../EJ2_ASP.NETCORE/editor-menus.md | 8 ++++---- .../editor-security/cross-site-script.md | 8 ++++---- .../editor-security/read-only-mode.md | 8 ++++---- .../block-editor/EJ2_ASP.NETCORE/events.md | 8 ++++---- .../EJ2_ASP.NETCORE/getting-started.md | 6 +++--- .../EJ2_ASP.NETCORE/globalization.md | 8 ++++---- .../EJ2_ASP.NETCORE/keyboard-shortcuts.md | 8 ++++---- .../block-editor/EJ2_ASP.NETCORE/methods.md | 8 ++++---- .../EJ2_ASP.NETCORE/paste-cleanup.md | 8 ++++---- .../block-editor/EJ2_ASP.NETCORE/undo-redo.md | 8 ++++---- 38 files changed, 156 insertions(+), 156 deletions(-) diff --git a/ej2-asp-core-mvc/block-editor/EJ2_ASP.MVC/appearance.md b/ej2-asp-core-mvc/block-editor/EJ2_ASP.MVC/appearance.md index 43be044309..69a2f5fb95 100644 --- a/ej2-asp-core-mvc/block-editor/EJ2_ASP.MVC/appearance.md +++ b/ej2-asp-core-mvc/block-editor/EJ2_ASP.MVC/appearance.md @@ -1,14 +1,14 @@ --- layout: post -title: Appearance in ##Platform_Name## Block Editor Control | Syncfusion -description: Checkout and learn about appearance with Syncfusion Essential ##Platform_Name## BlockEditor control, its elements, and more details. +title: Appearance in ASP.NET MVC Block Editor Control | Syncfusion +description: Checkout and learn about appearance with Syncfusion Essential ASP.NET MVC BlockEditor control, its elements, and more details. platform: ej2-asp-core-mvc control: BlockEditor -publishingplatform: ##Platform_Name## +publishingplatform: ASP.NET MVC documentation: ug --- -# Appearance in ##Platform_Name## Block Editor control +# Appearance in ASP.NET MVC Block Editor control The Block Editor control provides various appearance customization options to match your application's design requirements. These properties allow you to control the visual styling, layout, and overall look and feel of the editor. diff --git a/ej2-asp-core-mvc/block-editor/EJ2_ASP.MVC/built-in-blocks/built-in-blocks.md b/ej2-asp-core-mvc/block-editor/EJ2_ASP.MVC/built-in-blocks/built-in-blocks.md index ab2418d67d..aef84c2f67 100644 --- a/ej2-asp-core-mvc/block-editor/EJ2_ASP.MVC/built-in-blocks/built-in-blocks.md +++ b/ej2-asp-core-mvc/block-editor/EJ2_ASP.MVC/built-in-blocks/built-in-blocks.md @@ -1,15 +1,15 @@ --- layout: post -title: Blocks in ##Platform_Name## Block Editor control | Syncfusion -description: Checkout and learn about Blocks with ##Platform_Name## Block Editor control of Syncfusion Essential JS 2 and more. +title: Blocks in ASP.NET MVC Block Editor control | Syncfusion +description: Checkout and learn about Blocks with ASP.NET MVC Block Editor control of Syncfusion Essential JS 2 and more. platform: ej2-asp-core-mvc control: BlockEditor -publishingplatform: ##Platform_Name## +publishingplatform: ASP.NET MVC documentation: ug domainurl: ##DomainURL## --- -# Blocks in ##Platform_Name## Block Editor control +# Blocks in ASP.NET MVC Block Editor control The Block Editor control enables you to create block-based content editing solution using various types of blocks. The [Blocks](https://help.syncfusion.com/cr/aspnetmvc-js2/Syncfusion.EJ2.BlockEditor.BlockEditor.html#Syncfusion_EJ2_BlockEditor_BlockEditor_Blocks) property allows you to define and manage the content structure of your editor. diff --git a/ej2-asp-core-mvc/block-editor/EJ2_ASP.MVC/built-in-blocks/code-block.md b/ej2-asp-core-mvc/block-editor/EJ2_ASP.MVC/built-in-blocks/code-block.md index 38a7426fd6..9794c3228c 100644 --- a/ej2-asp-core-mvc/block-editor/EJ2_ASP.MVC/built-in-blocks/code-block.md +++ b/ej2-asp-core-mvc/block-editor/EJ2_ASP.MVC/built-in-blocks/code-block.md @@ -1,15 +1,15 @@ --- layout: post -title: Code Block in ##Platform_Name## Block Editor control | Syncfusion -description: Checkout and learn about Code Block with ##Platform_Name## Block Editor control of Syncfusion Essential JS 2 and more. +title: Code Block in ASP.NET MVC Block Editor control | Syncfusion +description: Checkout and learn about Code Block with ASP.NET MVC Block Editor control of Syncfusion Essential JS 2 and more. platform: ej2-asp-core-mvc control: BlockEditor -publishingplatform: ##Platform_Name## +publishingplatform: ASP.NET MVC documentation: ug domainurl: ##DomainURL## --- -# Code Blocks in ##Platform_Name## Block Editor control +# Code Blocks in ASP.NET MVC Block Editor control You can render Code blocks by setting the [blockType](https://help.syncfusion.com/cr/aspnetmvc-js2/Syncfusion.EJ2.BlockEditor.BlockType.html) property as [Code](https://help.syncfusion.com/cr/aspnetmvc-js2/Syncfusion.EJ2.BlockEditor.BlockType.html#Syncfusion_EJ2_BlockEditor_BlockType_Code). By setting the `properties` property, you can configure the default language. The default language is `plainText`. diff --git a/ej2-asp-core-mvc/block-editor/EJ2_ASP.MVC/built-in-blocks/embed.md b/ej2-asp-core-mvc/block-editor/EJ2_ASP.MVC/built-in-blocks/embed.md index 071c3c66e0..bebcde4576 100644 --- a/ej2-asp-core-mvc/block-editor/EJ2_ASP.MVC/built-in-blocks/embed.md +++ b/ej2-asp-core-mvc/block-editor/EJ2_ASP.MVC/built-in-blocks/embed.md @@ -1,15 +1,15 @@ --- layout: post -title: Embed Blocks in ##Platform_Name## Block Editor control | Syncfusion -description: Checkout and learn about Embed Blocks with ##Platform_Name## Block Editor control of Syncfusion Essential JS 2 and more. +title: Embed Blocks in ASP.NET MVC Block Editor control | Syncfusion +description: Checkout and learn about Embed Blocks with ASP.NET MVC Block Editor control of Syncfusion Essential JS 2 and more. platform: ej2-javascript control: BlockEditor -publishingplatform: ##Platform_Name## +publishingplatform: ASP.NET MVC documentation: ug domainurl: ##DomainURL## --- -# Embed Blocks in ##Platform_Name## Block Editor control +# Embed Blocks in ASP.NET MVC Block Editor control Block Editor supports addition of embeds to help you organize, showcase contents and format your content effectively. diff --git a/ej2-asp-core-mvc/block-editor/EJ2_ASP.MVC/built-in-blocks/inline-content.md b/ej2-asp-core-mvc/block-editor/EJ2_ASP.MVC/built-in-blocks/inline-content.md index 9d31ecbc08..4c1d2a12c9 100644 --- a/ej2-asp-core-mvc/block-editor/EJ2_ASP.MVC/built-in-blocks/inline-content.md +++ b/ej2-asp-core-mvc/block-editor/EJ2_ASP.MVC/built-in-blocks/inline-content.md @@ -1,15 +1,15 @@ --- layout: post -title: Inline Content in ##Platform_Name## Block Editor control | Syncfusion -description: Checkout and learn about Inline Content with ##Platform_Name## Block Editor control of Syncfusion Essential JS 2 and more. +title: Inline Content in ASP.NET MVC Block Editor control | Syncfusion +description: Checkout and learn about Inline Content with ASP.NET MVC Block Editor control of Syncfusion Essential JS 2 and more. platform: ej2-asp-core-mvc control: BlockEditor -publishingplatform: ##Platform_Name## +publishingplatform: ASP.NET MVC documentation: ug domainurl: ##DomainURL## --- -# Inline Content in ##Platform_Name## Block Editor control +# Inline Content in ASP.NET MVC Block Editor control Content in the Block Editor is managed through the `content` property of blocks. diff --git a/ej2-asp-core-mvc/block-editor/EJ2_ASP.MVC/built-in-blocks/list-types.md b/ej2-asp-core-mvc/block-editor/EJ2_ASP.MVC/built-in-blocks/list-types.md index a5a1889cce..0f5f42f63b 100644 --- a/ej2-asp-core-mvc/block-editor/EJ2_ASP.MVC/built-in-blocks/list-types.md +++ b/ej2-asp-core-mvc/block-editor/EJ2_ASP.MVC/built-in-blocks/list-types.md @@ -1,15 +1,15 @@ --- layout: post -title: Lists in ##Platform_Name## Block Editor control | Syncfusion -description: Checkout and learn about List Blocks with ##Platform_Name## Block Editor control of Syncfusion Essential JS 2 and more. +title: Lists in ASP.NET MVC Block Editor control | Syncfusion +description: Checkout and learn about List Blocks with ASP.NET MVC Block Editor control of Syncfusion Essential JS 2 and more. platform: ej2-asp-core-mvc control: BlockEditor -publishingplatform: ##Platform_Name## +publishingplatform: ASP.NET MVC documentation: ug domainurl: ##DomainURL## --- -# Lists in ##Platform_Name## Block Editor control +# Lists in ASP.NET MVC Block Editor control List blocks in the BlockEditor component are used to organize content into structured lists. You can render List blocks by setting the [blockType](https://help.syncfusion.com/cr/aspnetmvc-js2/Syncfusion.EJ2.BlockEditor.BlockType.html) property as [BulletList](https://help.syncfusion.com/cr/aspnetmvc-js2/Syncfusion.EJ2.BlockEditor.BlockType.html#Syncfusion_EJ2_BlockEditor_BlockType_BulletList), [NumberedList](https://help.syncfusion.com/cr/aspnetmvc-js2/Syncfusion.EJ2.BlockEditor.BlockType.html#Syncfusion_EJ2_BlockEditor_BlockType_NumberedList), or [Checklist](https://help.syncfusion.com/cr/aspnetmvc-js2/Syncfusion.EJ2.BlockEditor.BlockType.html#Syncfusion_EJ2_BlockEditor_BlockType_Checklist). Bullet lists and numbered lists are ideal for unordered and ordered items, respectively, while checklist blocks enable interactive to-do lists with checkable items. diff --git a/ej2-asp-core-mvc/block-editor/EJ2_ASP.MVC/built-in-blocks/table-block.md b/ej2-asp-core-mvc/block-editor/EJ2_ASP.MVC/built-in-blocks/table-block.md index e9e6a30216..582a18d646 100644 --- a/ej2-asp-core-mvc/block-editor/EJ2_ASP.MVC/built-in-blocks/table-block.md +++ b/ej2-asp-core-mvc/block-editor/EJ2_ASP.MVC/built-in-blocks/table-block.md @@ -1,15 +1,15 @@ --- layout: post -title: Table Block in ##Platform_Name## Block Editor control | Syncfusion -description: Checkout and learn about Table Blocks with ##Platform_Name## Block Editor control of Syncfusion Essential JS 2 and more. +title: Table Block in ASP.NET MVC Block Editor control | Syncfusion +description: Checkout and learn about Table Blocks with ASP.NET MVC Block Editor control of Syncfusion Essential JS 2 and more. platform: ej2-asp-core-mvc control: BlockEditor -publishingplatform: ##Platform_Name## +publishingplatform: ASP.NET MVC documentation: ug domainurl: ##DomainURL## --- -# Table Blocks in ##Platform_Name## Block Editor control +# Table Blocks in ASP.NET MVC Block Editor control The Block Editor control allows you to render structured data in rows and columns by setting the block's [blockType](https://help.syncfusion.com/cr/aspnetmvc-js2/Syncfusion.EJ2.BlockEditor.BlockType.html) property to [Table](https://help.syncfusion.com/cr/aspnetmvc-js2/Syncfusion.EJ2.BlockEditor.BlockType.html#Syncfusion_EJ2_BlockEditor_BlockType_Table). You can customize the table layout, header, row numbers, and define columns and rows using the `properties` property. diff --git a/ej2-asp-core-mvc/block-editor/EJ2_ASP.MVC/built-in-blocks/typography.md b/ej2-asp-core-mvc/block-editor/EJ2_ASP.MVC/built-in-blocks/typography.md index 33bfe6ed86..b9a6391090 100644 --- a/ej2-asp-core-mvc/block-editor/EJ2_ASP.MVC/built-in-blocks/typography.md +++ b/ej2-asp-core-mvc/block-editor/EJ2_ASP.MVC/built-in-blocks/typography.md @@ -1,15 +1,15 @@ --- layout: post -title: Typography Blocks in ##Platform_Name## Block Editor control | Syncfusion -description: Checkout and learn about Typography Blocks with ##Platform_Name## Block Editor control of Syncfusion Essential JS 2 and more. +title: Typography Blocks in ASP.NET MVC Block Editor control | Syncfusion +description: Checkout and learn about Typography Blocks with ASP.NET MVC Block Editor control of Syncfusion Essential JS 2 and more. platform: ej2-asp-core-mvc control: BlockEditor -publishingplatform: ##Platform_Name## +publishingplatform: ASP.NET MVC documentation: ug domainurl: ##DomainURL## --- -# Typography Blocks in ##Platform_Name## Block Editor control +# Typography Blocks in ASP.NET MVC Block Editor control Typography blocks are essential for organizing and presenting text-based content in your documents. The BlockEditor component supports various structural blocks—such as Paragraph, Heading, Collapsible Block, Divider, Quote, and Callout to help you format and structure content effectively. diff --git a/ej2-asp-core-mvc/block-editor/EJ2_ASP.MVC/drag-drop.md b/ej2-asp-core-mvc/block-editor/EJ2_ASP.MVC/drag-drop.md index 6e8cf6d562..b25966195c 100644 --- a/ej2-asp-core-mvc/block-editor/EJ2_ASP.MVC/drag-drop.md +++ b/ej2-asp-core-mvc/block-editor/EJ2_ASP.MVC/drag-drop.md @@ -1,14 +1,14 @@ --- layout: post -title: Drag and drop in ##Platform_Name## Block Editor Control | Syncfusion -description: Checkout and learn about Drag and drop with Syncfusion Essential ##Platform_Name## BlockEditor control, its elements, and more details. +title: Drag and drop in ASP.NET MVC Block Editor Control | Syncfusion +description: Checkout and learn about Drag and drop with Syncfusion Essential ASP.NET MVC BlockEditor control, its elements, and more details. platform: ej2-asp-core-mvc control: BlockEditor -publishingplatform: ##Platform_Name## +publishingplatform: ASP.NET MVC documentation: ug --- -# Drag and drop in ##Platform_Name## Block Editor control +# Drag and drop in ASP.NET MVC Block Editor control The drag and drop feature in Block Editor allows users to easily rearrange blocks within the editor by dragging them to different positions. diff --git a/ej2-asp-core-mvc/block-editor/EJ2_ASP.MVC/editor-menus.md b/ej2-asp-core-mvc/block-editor/EJ2_ASP.MVC/editor-menus.md index 0c6a2e9086..a34707e93b 100644 --- a/ej2-asp-core-mvc/block-editor/EJ2_ASP.MVC/editor-menus.md +++ b/ej2-asp-core-mvc/block-editor/EJ2_ASP.MVC/editor-menus.md @@ -1,14 +1,14 @@ --- layout: post -title: Editor Menus in ##Platform_Name## Block Editor Control | Syncfusion -description: Checkout and learn about Editor Menus with Syncfusion Essential ##Platform_Name## BlockEditor control, its elements, and more details. +title: Editor Menus in ASP.NET MVC Block Editor Control | Syncfusion +description: Checkout and learn about Editor Menus with Syncfusion Essential ASP.NET MVC BlockEditor control, its elements, and more details. platform: ej2-asp-core-mvc control: BlockEditor -publishingplatform: ##Platform_Name## +publishingplatform: ASP.NET MVC documentation: ug --- -# Editor Menus in ##Platform_Name## Block Editor control +# Editor Menus in ASP.NET MVC Block Editor control The Block Editor control provides several interactive menus to enhance content creation and editing. These menus offer quick access to various commands and formatting options. diff --git a/ej2-asp-core-mvc/block-editor/EJ2_ASP.MVC/editor-security/cross-site-script.md b/ej2-asp-core-mvc/block-editor/EJ2_ASP.MVC/editor-security/cross-site-script.md index 1bb7856e02..0d15295d84 100644 --- a/ej2-asp-core-mvc/block-editor/EJ2_ASP.MVC/editor-security/cross-site-script.md +++ b/ej2-asp-core-mvc/block-editor/EJ2_ASP.MVC/editor-security/cross-site-script.md @@ -1,14 +1,14 @@ --- layout: post -title: Cross-Site scripting in ##Platform_Name## Block Editor | Syncfusion -description: Checkout and learn about Cross-Site scripting with Syncfusion Essential ##Platform_Name## BlockEditor control, its elements, and more details. +title: Cross-Site scripting in ASP.NET MVC Block Editor | Syncfusion +description: Checkout and learn about Cross-Site scripting with Syncfusion Essential ASP.NET MVC BlockEditor control, its elements, and more details. platform: ej2-asp-core-mvc control: BlockEditor -publishingplatform: ##Platform_Name## +publishingplatform: ASP.NET MVC documentation: ug --- -# Prevent XSS in ##Platform_Name## Block Editor Control +# Prevent XSS in ASP.NET MVC Block Editor Control The Block Editor control allows users to edit the content with security by preventing cross-site scripting (XSS). By default, it provides built-in support to remove elements from editor content that cause XSS attacks. The editor removes the elements based on the attributes if it is possible to execute a script. diff --git a/ej2-asp-core-mvc/block-editor/EJ2_ASP.MVC/editor-security/read-only-mode.md b/ej2-asp-core-mvc/block-editor/EJ2_ASP.MVC/editor-security/read-only-mode.md index 94d968ead6..e01d0321d5 100644 --- a/ej2-asp-core-mvc/block-editor/EJ2_ASP.MVC/editor-security/read-only-mode.md +++ b/ej2-asp-core-mvc/block-editor/EJ2_ASP.MVC/editor-security/read-only-mode.md @@ -1,14 +1,14 @@ --- layout: post -title: Controlled Access in ##Platform_Name## Block Editor Control | Syncfusion -description: Checkout and learn about Controlling Editor Access with Syncfusion Essential ##Platform_Name## BlockEditor control, its elements, and more details. +title: Controlled Access in ASP.NET MVC Block Editor Control | Syncfusion +description: Checkout and learn about Controlling Editor Access with Syncfusion Essential ASP.NET MVC BlockEditor control, its elements, and more details. platform: ej2-asp-core-mvc control: BlockEditor -publishingplatform: ##Platform_Name## +publishingplatform: ASP.NET MVC documentation: ug --- -# Controlling Editor Access in ##Platform_Name## Block Editor control +# Controlling Editor Access in ASP.NET MVC Block Editor control The Block Editor control provides read-only modes to control user interaction with the editor. This allows users to view formatted content without editing. This features are useful for displaying content without modifications or temporarily restricting input. diff --git a/ej2-asp-core-mvc/block-editor/EJ2_ASP.MVC/events.md b/ej2-asp-core-mvc/block-editor/EJ2_ASP.MVC/events.md index d8205bc966..562b8f1576 100644 --- a/ej2-asp-core-mvc/block-editor/EJ2_ASP.MVC/events.md +++ b/ej2-asp-core-mvc/block-editor/EJ2_ASP.MVC/events.md @@ -1,14 +1,14 @@ --- layout: post -title: Events in ##Platform_Name## Block Editor Control | Syncfusion -description: Checkout and learn about Events with Syncfusion Essential ##Platform_Name## BlockEditor control, its elements, and more details. +title: Events in ASP.NET MVC Block Editor Control | Syncfusion +description: Checkout and learn about Events with Syncfusion Essential ASP.NET MVC BlockEditor control, its elements, and more details. platform: ej2-asp-core-mvc control: BlockEditor -publishingplatform: ##Platform_Name## +publishingplatform: ASP.NET MVC documentation: ug --- -# Events in ##Platform_Name## Block Editor control +# Events in ASP.NET MVC Block Editor control The Block Editor control provides a comprehensive set of events that allow you to monitor and respond to various user interactions and editor state changes. These events enable you to implement custom behaviors, validation, logging, and integration with other systems. diff --git a/ej2-asp-core-mvc/block-editor/EJ2_ASP.MVC/getting-started.md b/ej2-asp-core-mvc/block-editor/EJ2_ASP.MVC/getting-started.md index 1c420ddaff..7474d2ca10 100644 --- a/ej2-asp-core-mvc/block-editor/EJ2_ASP.MVC/getting-started.md +++ b/ej2-asp-core-mvc/block-editor/EJ2_ASP.MVC/getting-started.md @@ -1,10 +1,10 @@ --- layout: post -title: Getting Started with ##Platform_Name## BlockEditor Control | Syncfusion -description: Checkout and learn about getting started with Syncfusion Essential ##Platform_Name## BlockEditor control, its elements, and more. +title: Getting Started with ASP.NET MVC BlockEditor Control | Syncfusion +description: Checkout and learn about getting started with Syncfusion Essential ASP.NET MVC BlockEditor control, its elements, and more. platform: ej2-asp-core-mvc control: BlockEditor -publishingplatform: ##Platform_Name## +publishingplatform: ASP.NET MVC documentation: ug --- @@ -21,7 +21,7 @@ This section briefly explains about how to include `ASP.NET MVC BlockEditor` con * [Create a Project using Microsoft Templates](https://learn.microsoft.com/en-us/aspnet/mvc/overview/getting-started/introduction/getting-started#create-your-first-app) -* [Create a Project using Syncfusion® ASP.NET MVC Extension](https://ej2.syncfusion.com/aspnetmvc/documentation/getting-started/project-template) +* [Create a Project using Syncfusion® ASP.NET MVC Extension](https://ej2.syncfusion.com/aspnetmvc/documentation/visual-studio-integration/create-project) ## Install ASP.NET MVC package in the application diff --git a/ej2-asp-core-mvc/block-editor/EJ2_ASP.MVC/globalization.md b/ej2-asp-core-mvc/block-editor/EJ2_ASP.MVC/globalization.md index 3a1a9900af..905e355d0a 100644 --- a/ej2-asp-core-mvc/block-editor/EJ2_ASP.MVC/globalization.md +++ b/ej2-asp-core-mvc/block-editor/EJ2_ASP.MVC/globalization.md @@ -1,14 +1,14 @@ --- layout: post -title: Globalization in ##Platform_Name## Block Editor Control | Syncfusion -description: Checkout and learn about Globalization with Syncfusion Essential ##Platform_Name## BlockEditor control, its elements, and more details. +title: Globalization in ASP.NET MVC Block Editor Control | Syncfusion +description: Checkout and learn about Globalization with Syncfusion Essential ASP.NET MVC BlockEditor control, its elements, and more details. platform: ej2-asp-core-mvc control: BlockEditor -publishingplatform: ##Platform_Name## +publishingplatform: ASP.NET MVC documentation: ug --- -# Globalization in ##Platform_Name## Block Editor control +# Globalization in ASP.NET MVC Block Editor control ## Localization diff --git a/ej2-asp-core-mvc/block-editor/EJ2_ASP.MVC/keyboard-shortcuts.md b/ej2-asp-core-mvc/block-editor/EJ2_ASP.MVC/keyboard-shortcuts.md index fac47e4596..b25d868fa1 100644 --- a/ej2-asp-core-mvc/block-editor/EJ2_ASP.MVC/keyboard-shortcuts.md +++ b/ej2-asp-core-mvc/block-editor/EJ2_ASP.MVC/keyboard-shortcuts.md @@ -1,14 +1,14 @@ --- layout: post -title: Keyboard Shortcuts in ##Platform_Name## Block Editor | Syncfusion -description: Checkout and learn about Keyboard Shortcuts with Syncfusion Essential ##Platform_Name## BlockEditor control, its elements, and more details. +title: Keyboard Shortcuts in ASP.NET MVC Block Editor | Syncfusion +description: Checkout and learn about Keyboard Shortcuts with Syncfusion Essential ASP.NET MVC BlockEditor control, its elements, and more details. platform: ej2-asp-core-mvc control: BlockEditor -publishingplatform: ##Platform_Name## +publishingplatform: ASP.NET MVC documentation: ug --- -# Keyboard Shortcuts in ##Platform_Name## Block Editor control +# Keyboard Shortcuts in ASP.NET MVC Block Editor control The Block Editor control provides comprehensive keyboard shortcuts to enhance productivity and streamline content creation. These shortcuts are organized into different categories based on their functionality, allowing users to quickly access various features without relying on mouse interactions. diff --git a/ej2-asp-core-mvc/block-editor/EJ2_ASP.MVC/methods.md b/ej2-asp-core-mvc/block-editor/EJ2_ASP.MVC/methods.md index 21310b839a..d14a139c5c 100644 --- a/ej2-asp-core-mvc/block-editor/EJ2_ASP.MVC/methods.md +++ b/ej2-asp-core-mvc/block-editor/EJ2_ASP.MVC/methods.md @@ -1,14 +1,14 @@ --- layout: post -title: Methods in ##Platform_Name## Block Editor | Syncfusion -description: Checkout and learn about Methods with Syncfusion Essential ##Platform_Name## BlockEditor control, its elements, and more details. +title: Methods in ASP.NET MVC Block Editor | Syncfusion +description: Checkout and learn about Methods with Syncfusion Essential ASP.NET MVC BlockEditor control, its elements, and more details. platform: ej2-asp-core-mvc control: BlockEditor -publishingplatform: ##Platform_Name## +publishingplatform: ASP.NET MVC documentation: ug --- -# Methods in ##Platform_Name## Block Editor control +# Methods in ASP.NET MVC Block Editor control The Block Editor control provides a comprehensive set of public methods that allow you to programmatically interact with and manipulate the editor content. These methods enable you to add, remove, update, and manage blocks, as well as control selection, formatting, and other editor operations. diff --git a/ej2-asp-core-mvc/block-editor/EJ2_ASP.MVC/paste-cleanup.md b/ej2-asp-core-mvc/block-editor/EJ2_ASP.MVC/paste-cleanup.md index a866b9320a..41ed7d068b 100644 --- a/ej2-asp-core-mvc/block-editor/EJ2_ASP.MVC/paste-cleanup.md +++ b/ej2-asp-core-mvc/block-editor/EJ2_ASP.MVC/paste-cleanup.md @@ -1,14 +1,14 @@ --- layout: post -title: Undo redo in ##Platform_Name## Block Editor | Syncfusion -description: Checkout and learn about undo redo with Syncfusion Essential ##Platform_Name## BlockEditor control, its elements, and more details. +title: Undo redo in ASP.NET MVC Block Editor | Syncfusion +description: Checkout and learn about undo redo with Syncfusion Essential ASP.NET MVC BlockEditor control, its elements, and more details. platform: ej2-asp-core-mvc control: BlockEditor -publishingplatform: ##Platform_Name## +publishingplatform: ASP.NET MVC documentation: ug --- -# Paste Clean-up in ##Platform_Name## Block Editor control +# Paste Clean-up in ASP.NET MVC Block Editor control The Block Editor control provides robust paste clean-up functionalities to ensure that pasted content integrates seamlessly and maintains consistency with the editor's styling and structure. This helps in removing unwanted formatting, scripts, or elements often copied from external sources like web pages or word processors. @@ -16,7 +16,7 @@ You can configure the paste settings using the [PasteCleanupSettings](https://he ## Configuring allowed styles -The [AllowedStyles](https://help.syncfusion.com/cr/aspnetmvc-js2/Syncfusion.EJ2.BlockEditor.PasteCleanupSettings.html#Syncfusion_EJ2_BlockEditor_PasteCleanupSettings_AllowedStyles) property in the [`PasteCleanupSettings`](https://help.syncfusion.com/cr/aspnetmvc-js2/Syncfusion.EJ2.BlockEditor.PasteCleanupSettings.html) model allows you to define which CSS styles are permitted when content is pasted into the editor. Any style not included in this list will be stripped from the pasted content. This ensures that only desired visual attributes are preserved, maintaining a clean and consistent look. +The [AllowedStyles](https://help.syncfusion.com/cr/aspnetmvc-js2/Syncfusion.EJ2.BlockEditor.PasteCleanupSettings.htmlAllowedStyles) property in the [`PasteCleanupSettings`](https://help.syncfusion.com/cr/aspnetmvc-js2/Syncfusion.EJ2.BlockEditor.PasteCleanupSettings.html) model allows you to define which CSS styles are permitted when content is pasted into the editor. Any style not included in this list will be stripped from the pasted content. This ensures that only desired visual attributes are preserved, maintaining a clean and consistent look. By default, following styles are allowed: @@ -35,7 +35,7 @@ In the below example, only `font-weight` and `font-style` styles will be retaine ## Setting denied tags -The [DeniedTags](https://help.syncfusion.com/cr/aspnetmvc-js2/Syncfusion.EJ2.BlockEditor.PasteCleanupSettings.html#Syncfusion_EJ2_BlockEditor_PasteCleanupSettings_DeniedTags) property in [`PasteCleanupSettings`](https://help.syncfusion.com/cr/aspnetmvc-js2/Syncfusion.EJ2.BlockEditor.PasteCleanupSettings.html) enables you to specify HTML tags that should be completely removed from the pasted content. This is particularly useful for stripping out potentially problematic or irrelevant tags, such as `script` tags, `iframe`s, or any other elements you don't want to allow in the editor. By default, the [DeniedTags](https://help.syncfusion.com/cr/aspnetmvc-js2/Syncfusion.EJ2.BlockEditor.PasteCleanupSettings.html#Syncfusion_EJ2_BlockEditor_PasteCleanupSettings_DeniedTags) property is an empty array, meaning no tags are removed by default. +The [DeniedTags](https://help.syncfusion.com/cr/aspnetmvc-js2/Syncfusion.EJ2.BlockEditor.PasteCleanupSettings.htmlDeniedTags) property in [`PasteCleanupSettings`](https://help.syncfusion.com/cr/aspnetmvc-js2/Syncfusion.EJ2.BlockEditor.PasteCleanupSettings.html) enables you to specify HTML tags that should be completely removed from the pasted content. This is particularly useful for stripping out potentially problematic or irrelevant tags, such as `script` tags, `iframe`s, or any other elements you don't want to allow in the editor. By default, the [DeniedTags](https://help.syncfusion.com/cr/aspnetmvc-js2/Syncfusion.EJ2.BlockEditor.PasteCleanupSettings.htmlDeniedTags) property is an empty array, meaning no tags are removed by default. In the below example, any ` -``` +``` \ No newline at end of file diff --git a/ej2-asp-core-mvc/block-editor/EJ2_ASP.MVC/undo-redo.md b/ej2-asp-core-mvc/block-editor/EJ2_ASP.MVC/undo-redo.md index f083dcb8fe..caebd3f135 100644 --- a/ej2-asp-core-mvc/block-editor/EJ2_ASP.MVC/undo-redo.md +++ b/ej2-asp-core-mvc/block-editor/EJ2_ASP.MVC/undo-redo.md @@ -1,14 +1,14 @@ --- layout: post -title: Undo redo in ##Platform_Name## Block Editor | Syncfusion -description: Checkout and learn about undo redo with Syncfusion Essential ##Platform_Name## BlockEditor control, its elements, and more details. +title: Undo redo in ASP.NET MVC Block Editor | Syncfusion +description: Checkout and learn about undo redo with Syncfusion Essential ASP.NET MVC BlockEditor control, its elements, and more details. platform: ej2-asp-core-mvc control: BlockEditor -publishingplatform: ##Platform_Name## +publishingplatform: ASP.NET MVC documentation: ug --- -# Undo redo in ##Platform_Name## Block Editor control +# Undo redo in ASP.NET MVC Block Editor control The undo/redo feature in Block Editor enables users to revert or reapply changes made to the content, offering a safety net for edits and enhancing the overall editing experience. diff --git a/ej2-asp-core-mvc/block-editor/EJ2_ASP.NETCORE/appearance.md b/ej2-asp-core-mvc/block-editor/EJ2_ASP.NETCORE/appearance.md index a3de1576bf..aaf3bbc0ae 100644 --- a/ej2-asp-core-mvc/block-editor/EJ2_ASP.NETCORE/appearance.md +++ b/ej2-asp-core-mvc/block-editor/EJ2_ASP.NETCORE/appearance.md @@ -1,14 +1,14 @@ --- layout: post -title: Appearance in ##Platform_Name## Block Editor Control | Syncfusion -description: Checkout and learn about appearance with Syncfusion Essential ##Platform_Name## BlockEditor control, its elements, and more details. +title: Appearance in ASP.NET Core Block Editor Control | Syncfusion +description: Checkout and learn about appearance with Syncfusion Essential ASP.NET Core BlockEditor control, its elements, and more details. platform: ej2-asp-core-mvc control: BlockEditor -publishingplatform: ##Platform_Name## +publishingplatform: ASP.NET Core documentation: ug --- -# Appearance in ##Platform_Name## Block Editor control +# Appearance in ASP.NET Core Block Editor control The Block Editor control provides various appearance customization options to match your application's design requirements. These properties allow you to control the visual styling, layout, and overall look and feel of the editor. diff --git a/ej2-asp-core-mvc/block-editor/EJ2_ASP.NETCORE/built-in-blocks/built-in-blocks.md b/ej2-asp-core-mvc/block-editor/EJ2_ASP.NETCORE/built-in-blocks/built-in-blocks.md index 49b541d2b8..3276dc06d7 100644 --- a/ej2-asp-core-mvc/block-editor/EJ2_ASP.NETCORE/built-in-blocks/built-in-blocks.md +++ b/ej2-asp-core-mvc/block-editor/EJ2_ASP.NETCORE/built-in-blocks/built-in-blocks.md @@ -1,15 +1,15 @@ --- layout: post -title: Blocks in ##Platform_Name## Block Editor control | Syncfusion -description: Checkout and learn about Blocks with ##Platform_Name## Block Editor control of Syncfusion Essential JS 2 and more. +title: Blocks in ASP.NET Core Block Editor control | Syncfusion +description: Checkout and learn about Blocks with ASP.NET Core Block Editor control of Syncfusion Essential JS 2 and more. platform: ej2-asp-core-mvc control: BlockEditor -publishingplatform: ##Platform_Name## +publishingplatform: ASP.NET Core documentation: ug domainurl: ##DomainURL## --- -# Blocks in ##Platform_Name## Block Editor control +# Blocks in ASP.NET Core Block Editor control The Block Editor control enables you to create block-based content editing solution using various types of blocks. The [blocks](https://help.syncfusion.com/cr/aspnetcore-js2/Syncfusion.EJ2.BlockEditor.BlockEditor.html#Syncfusion_EJ2_BlockEditor_BlockEditor_Blocks) tag helper allows you to define and manage the content structure of your editor. diff --git a/ej2-asp-core-mvc/block-editor/EJ2_ASP.NETCORE/built-in-blocks/code-block.md b/ej2-asp-core-mvc/block-editor/EJ2_ASP.NETCORE/built-in-blocks/code-block.md index 27bf1aa219..a83b3afe6a 100644 --- a/ej2-asp-core-mvc/block-editor/EJ2_ASP.NETCORE/built-in-blocks/code-block.md +++ b/ej2-asp-core-mvc/block-editor/EJ2_ASP.NETCORE/built-in-blocks/code-block.md @@ -1,15 +1,15 @@ --- layout: post -title: Code Block in ##Platform_Name## Block Editor control | Syncfusion -description: Checkout and learn about Code Block with ##Platform_Name## Block Editor control of Syncfusion Essential JS 2 and more. +title: Code Block in ASP.NET Core Block Editor control | Syncfusion +description: Checkout and learn about Code Block with ASP.NET Core Block Editor control of Syncfusion Essential JS 2 and more. platform: ej2-asp-core-mvc control: BlockEditor -publishingplatform: ##Platform_Name## +publishingplatform: ASP.NET Core documentation: ug domainurl: ##DomainURL## --- -# Code Blocks in ##Platform_Name## Block Editor control +# Code Blocks in ASP.NET Core Block Editor control You can render Code blocks by setting the [blockType](https://help.syncfusion.com/cr/aspnetcore-js2/Syncfusion.EJ2.BlockEditor.BlockType.html) property as [Code](https://help.syncfusion.com/cr/aspnetcore-js2/Syncfusion.EJ2.BlockEditor.BlockType.html#Syncfusion_EJ2_BlockEditor_BlockType_Code). By setting the `properties` property, you can configure the default language. The default language is `plainText`. diff --git a/ej2-asp-core-mvc/block-editor/EJ2_ASP.NETCORE/built-in-blocks/embed.md b/ej2-asp-core-mvc/block-editor/EJ2_ASP.NETCORE/built-in-blocks/embed.md index d0212d5d2b..1f1427b246 100644 --- a/ej2-asp-core-mvc/block-editor/EJ2_ASP.NETCORE/built-in-blocks/embed.md +++ b/ej2-asp-core-mvc/block-editor/EJ2_ASP.NETCORE/built-in-blocks/embed.md @@ -1,15 +1,15 @@ --- layout: post -title: Embed Blocks in ##Platform_Name## Block Editor control | Syncfusion -description: Checkout and learn about Embed Blocks with ##Platform_Name## Block Editor control of Syncfusion Essential JS 2 and more. +title: Embed Blocks in ASP.NET Core Block Editor control | Syncfusion +description: Checkout and learn about Embed Blocks with ASP.NET Core Block Editor control of Syncfusion Essential JS 2 and more. platform: ej2-asp-core-mvc control: BlockEditor -publishingplatform: ##Platform_Name## +publishingplatform: ASP.NET Core documentation: ug domainurl: ##DomainURL## --- -# Embed Blocks in ##Platform_Name## Block Editor control +# Embed Blocks in ASP.NET Core Block Editor control Block Editor supports addition of embeds to help you organize, showcase contents and format your content effectively. diff --git a/ej2-asp-core-mvc/block-editor/EJ2_ASP.NETCORE/built-in-blocks/inline-content.md b/ej2-asp-core-mvc/block-editor/EJ2_ASP.NETCORE/built-in-blocks/inline-content.md index 0282e1431b..c2f57a2dcd 100644 --- a/ej2-asp-core-mvc/block-editor/EJ2_ASP.NETCORE/built-in-blocks/inline-content.md +++ b/ej2-asp-core-mvc/block-editor/EJ2_ASP.NETCORE/built-in-blocks/inline-content.md @@ -1,15 +1,15 @@ --- layout: post -title: Inline Content in ##Platform_Name## Block Editor control | Syncfusion -description: Checkout and learn about Inline Content with ##Platform_Name## Block Editor control of Syncfusion Essential JS 2 and more. +title: Inline Content in ASP.NET Core Block Editor control | Syncfusion +description: Checkout and learn about Inline Content with ASP.NET Core Block Editor control of Syncfusion Essential JS 2 and more. platform: ej2-asp-core-mvc control: BlockEditor -publishingplatform: ##Platform_Name## +publishingplatform: ASP.NET Core documentation: ug domainurl: ##DomainURL## --- -# Inline Content in ##Platform_Name## Block Editor control +# Inline Content in ASP.NET Core Block Editor control Content in the Block Editor is managed through the `content` property of blocks. diff --git a/ej2-asp-core-mvc/block-editor/EJ2_ASP.NETCORE/built-in-blocks/list-types.md b/ej2-asp-core-mvc/block-editor/EJ2_ASP.NETCORE/built-in-blocks/list-types.md index 563af9a8ce..f03c256960 100644 --- a/ej2-asp-core-mvc/block-editor/EJ2_ASP.NETCORE/built-in-blocks/list-types.md +++ b/ej2-asp-core-mvc/block-editor/EJ2_ASP.NETCORE/built-in-blocks/list-types.md @@ -1,15 +1,15 @@ --- layout: post -title: Lists in ##Platform_Name## Block Editor control | Syncfusion -description: Checkout and learn about List Blocks with ##Platform_Name## Block Editor control of Syncfusion Essential JS 2 and more. +title: Lists in ASP.NET Core Block Editor control | Syncfusion +description: Checkout and learn about List Blocks with ASP.NET Core Block Editor control of Syncfusion Essential JS 2 and more. platform: ej2-asp-core-mvc control: BlockEditor -publishingplatform: ##Platform_Name## +publishingplatform: ASP.NET Core documentation: ug domainurl: ##DomainURL## --- -# Lists in ##Platform_Name## Block Editor control +# Lists in ASP.NET Core Block Editor control List blocks in the Block Editor component are used to organize content into structured lists. You can render List blocks by setting the [blockType](https://help.syncfusion.com/cr/aspnetcore-js2/Syncfusion.EJ2.BlockEditor.BlockType.html) property as [BulletList](https://help.syncfusion.com/cr/aspnetcore-js2/Syncfusion.EJ2.BlockEditor.BlockType.html#Syncfusion_EJ2_BlockEditor_BlockType_BulletList), [NumberedList](https://help.syncfusion.com/cr/aspnetcore-js2/Syncfusion.EJ2.BlockEditor.BlockType.html#Syncfusion_EJ2_BlockEditor_BlockType_NumberedList),, or [Checklist](https://help.syncfusion.com/cr/aspnetcore-js2/Syncfusion.EJ2.BlockEditor.BlockType.html#Syncfusion_EJ2_BlockEditor_BlockType_Checklist). Bullet lists and numbered lists are ideal for unordered and ordered items, respectively, while checklist blocks enable interactive to-do lists with checkable items. diff --git a/ej2-asp-core-mvc/block-editor/EJ2_ASP.NETCORE/built-in-blocks/table-block.md b/ej2-asp-core-mvc/block-editor/EJ2_ASP.NETCORE/built-in-blocks/table-block.md index 6965ac7cba..3b32f9f441 100644 --- a/ej2-asp-core-mvc/block-editor/EJ2_ASP.NETCORE/built-in-blocks/table-block.md +++ b/ej2-asp-core-mvc/block-editor/EJ2_ASP.NETCORE/built-in-blocks/table-block.md @@ -1,15 +1,15 @@ --- layout: post -title: Table Block in ##Platform_Name## Block Editor control | Syncfusion -description: Checkout and learn about Table Blocks with ##Platform_Name## Block Editor control of Syncfusion Essential JS 2 and more. +title: Table Block in ASP.NET Core Block Editor control | Syncfusion +description: Checkout and learn about Table Blocks with ASP.NET Core Block Editor control of Syncfusion Essential JS 2 and more. platform: ej2-asp-core-mvc control: BlockEditor -publishingplatform: ##Platform_Name## +publishingplatform: ASP.NET Core documentation: ug domainurl: ##DomainURL## --- -# Table Blocks in ##Platform_Name## Block Editor control +# Table Blocks in ASP.NET Core Block Editor control The Block Editor control allows you to render structured data in rows and columns by setting the block's [blockType](https://help.syncfusion.com/cr/aspnetcore-js2/Syncfusion.EJ2.BlockEditor.BlockType.html) property to [Table](https://help.syncfusion.com/cr/aspnetcore-js2/Syncfusion.EJ2.BlockEditor.BlockType.html#Syncfusion_EJ2_BlockEditor_BlockType_Table). You can customize the table layout, header, row numbers, and define columns and rows using the `properties` property. diff --git a/ej2-asp-core-mvc/block-editor/EJ2_ASP.NETCORE/built-in-blocks/typography.md b/ej2-asp-core-mvc/block-editor/EJ2_ASP.NETCORE/built-in-blocks/typography.md index 5225230835..0095d21227 100644 --- a/ej2-asp-core-mvc/block-editor/EJ2_ASP.NETCORE/built-in-blocks/typography.md +++ b/ej2-asp-core-mvc/block-editor/EJ2_ASP.NETCORE/built-in-blocks/typography.md @@ -1,15 +1,15 @@ --- layout: post -title: Typography Blocks in ##Platform_Name## Block Editor control | Syncfusion -description: Checkout and learn about Typography Blocks with ##Platform_Name## Block Editor control of Syncfusion Essential JS 2 and more. +title: Typography Blocks in ASP.NET Core Block Editor control | Syncfusion +description: Checkout and learn about Typography Blocks with ASP.NET Core Block Editor control of Syncfusion Essential JS 2 and more. platform: ej2-asp-core-mvc control: BlockEditor -publishingplatform: ##Platform_Name## +publishingplatform: ASP.NET Core documentation: ug domainurl: ##DomainURL## --- -# Typography Blocks in ##Platform_Name## Block Editor control +# Typography Blocks in ASP.NET Core Block Editor control Typography blocks are essential for organizing and presenting text-based content in your documents. The Block Editor component supports various structural blocks—such as Paragraph, Heading, Collapsible Block, Divider, Quote, and Callout to help you format and structure content effectively. diff --git a/ej2-asp-core-mvc/block-editor/EJ2_ASP.NETCORE/drag-drop.md b/ej2-asp-core-mvc/block-editor/EJ2_ASP.NETCORE/drag-drop.md index 0160fa1435..8c7b831b3a 100644 --- a/ej2-asp-core-mvc/block-editor/EJ2_ASP.NETCORE/drag-drop.md +++ b/ej2-asp-core-mvc/block-editor/EJ2_ASP.NETCORE/drag-drop.md @@ -1,14 +1,14 @@ --- layout: post -title: Drag and drop in ##Platform_Name## Block Editor Control | Syncfusion -description: Checkout and learn about Drag and drop with Syncfusion Essential ##Platform_Name## BlockEditor control, its elements, and more details. +title: Drag and drop in ASP.NET Core Block Editor Control | Syncfusion +description: Checkout and learn about Drag and drop with Syncfusion Essential ASP.NET Core BlockEditor control, its elements, and more details. platform: ej2-asp-core-mvc control: BlockEditor -publishingplatform: ##Platform_Name## +publishingplatform: ASP.NET Core documentation: ug --- -# Drag and drop in ##Platform_Name## Block Editor control +# Drag and drop in ASP.NET Core Block Editor control The drag and drop feature in Block Editor allows users to easily rearrange blocks within the editor by dragging them to different positions. diff --git a/ej2-asp-core-mvc/block-editor/EJ2_ASP.NETCORE/editor-menus.md b/ej2-asp-core-mvc/block-editor/EJ2_ASP.NETCORE/editor-menus.md index cdb7bc562a..0046a78933 100644 --- a/ej2-asp-core-mvc/block-editor/EJ2_ASP.NETCORE/editor-menus.md +++ b/ej2-asp-core-mvc/block-editor/EJ2_ASP.NETCORE/editor-menus.md @@ -1,14 +1,14 @@ --- layout: post -title: Editor Menus in ##Platform_Name## Block Editor Control | Syncfusion -description: Checkout and learn about Editor Menus with Syncfusion Essential ##Platform_Name## BlockEditor control, its elements, and more details. +title: Editor Menus in ASP.NET Core Block Editor Control | Syncfusion +description: Checkout and learn about Editor Menus with Syncfusion Essential ASP.NET Core BlockEditor control, its elements, and more details. platform: ej2-asp-core-mvc control: BlockEditor -publishingplatform: ##Platform_Name## +publishingplatform: ASP.NET Core documentation: ug --- -# Editor Menus in ##Platform_Name## Block Editor control +# Editor Menus in ASP.NET Core Block Editor control The Block Editor control provides several interactive menus to enhance content creation and editing. These menus offer quick access to various commands and formatting options. diff --git a/ej2-asp-core-mvc/block-editor/EJ2_ASP.NETCORE/editor-security/cross-site-script.md b/ej2-asp-core-mvc/block-editor/EJ2_ASP.NETCORE/editor-security/cross-site-script.md index 04e23ea6fd..f03fcf4dc9 100644 --- a/ej2-asp-core-mvc/block-editor/EJ2_ASP.NETCORE/editor-security/cross-site-script.md +++ b/ej2-asp-core-mvc/block-editor/EJ2_ASP.NETCORE/editor-security/cross-site-script.md @@ -1,14 +1,14 @@ --- layout: post -title: Cross-Site scripting in ##Platform_Name## Block Editor | Syncfusion -description: Checkout and learn about Cross-Site scripting with Syncfusion Essential ##Platform_Name## BlockEditor control, its elements, and more details. +title: Cross-Site scripting in ASP.NET Core Block Editor | Syncfusion +description: Checkout and learn about Cross-Site scripting with Syncfusion Essential ASP.NET Core BlockEditor control, its elements, and more details. platform: ej2-asp-core-mvc control: BlockEditor -publishingplatform: ##Platform_Name## +publishingplatform: ASP.NET Core documentation: ug --- -# Prevent XSS in ##Platform_Name## Block Editor Control +# Prevent XSS in ASP.NET Core Block Editor Control The Block Editor control allows users to edit the content with security by preventing cross-site scripting (XSS). By default, it provides built-in support to remove elements from editor content that cause XSS attacks. The editor removes the elements based on the attributes if it is possible to execute a script. diff --git a/ej2-asp-core-mvc/block-editor/EJ2_ASP.NETCORE/editor-security/read-only-mode.md b/ej2-asp-core-mvc/block-editor/EJ2_ASP.NETCORE/editor-security/read-only-mode.md index beddc8576f..f5c1b3c176 100644 --- a/ej2-asp-core-mvc/block-editor/EJ2_ASP.NETCORE/editor-security/read-only-mode.md +++ b/ej2-asp-core-mvc/block-editor/EJ2_ASP.NETCORE/editor-security/read-only-mode.md @@ -1,14 +1,14 @@ --- layout: post -title: Controlled Access in ##Platform_Name## Block Editor Control | Syncfusion -description: Checkout and learn about Controlling Editor Access with Syncfusion Essential ##Platform_Name## BlockEditor control, its elements, and more details. +title: Controlled Access in ASP.NET Core Block Editor Control | Syncfusion +description: Checkout and learn about Controlling Editor Access with Syncfusion Essential ASP.NET Core BlockEditor control, its elements, and more details. platform: ej2-asp-core-mvc control: BlockEditor -publishingplatform: ##Platform_Name## +publishingplatform: ASP.NET Core documentation: ug --- -# Controlling Editor Access in ##Platform_Name## Block Editor control +# Controlling Editor Access in ASP.NET Core Block Editor control The Block Editor control provides read-only modes to control user interaction with the editor. This allows users to view formatted content without editing. This features are useful for displaying content without modifications or temporarily restricting input. diff --git a/ej2-asp-core-mvc/block-editor/EJ2_ASP.NETCORE/events.md b/ej2-asp-core-mvc/block-editor/EJ2_ASP.NETCORE/events.md index 2338eec373..ddad8b551e 100644 --- a/ej2-asp-core-mvc/block-editor/EJ2_ASP.NETCORE/events.md +++ b/ej2-asp-core-mvc/block-editor/EJ2_ASP.NETCORE/events.md @@ -1,14 +1,14 @@ --- layout: post -title: Events in ##Platform_Name## Block Editor Control | Syncfusion -description: Checkout and learn about Events with Syncfusion Essential ##Platform_Name## BlockEditor control, its elements, and more details. +title: Events in ASP.NET Core Block Editor Control | Syncfusion +description: Checkout and learn about Events with Syncfusion Essential ASP.NET Core BlockEditor control, its elements, and more details. platform: ej2-asp-core-mvc control: BlockEditor -publishingplatform: ##Platform_Name## +publishingplatform: ASP.NET Core documentation: ug --- -# Events in ##Platform_Name## Block Editor control +# Events in ASP.NET Core Block Editor control The Block Editor control provides a comprehensive set of events that allow you to monitor and respond to various user interactions and editor state changes. These events enable you to implement custom behaviors, validation, logging, and integration with other systems. diff --git a/ej2-asp-core-mvc/block-editor/EJ2_ASP.NETCORE/getting-started.md b/ej2-asp-core-mvc/block-editor/EJ2_ASP.NETCORE/getting-started.md index 1ab079dd21..9b0b83116a 100644 --- a/ej2-asp-core-mvc/block-editor/EJ2_ASP.NETCORE/getting-started.md +++ b/ej2-asp-core-mvc/block-editor/EJ2_ASP.NETCORE/getting-started.md @@ -1,10 +1,10 @@ --- layout: post -title: Getting Started with ##Platform_Name## BlockEditor Control | Syncfusion -description: Checkout and learn about getting started with Syncfusion Essential ##Platform_Name## BlockEditor control, its elements, and more details. +title: Getting Started with ASP.NET Core BlockEditor Control | Syncfusion +description: Checkout and learn about getting started with Syncfusion Essential ASP.NET Core BlockEditor control, its elements, and more details. platform: ej2-asp-core-mvc control: BlockEditor -publishingplatform: ##Platform_Name## +publishingplatform: ASP.NET Core documentation: ug --- diff --git a/ej2-asp-core-mvc/block-editor/EJ2_ASP.NETCORE/globalization.md b/ej2-asp-core-mvc/block-editor/EJ2_ASP.NETCORE/globalization.md index 0d8e420463..2a8aeedd50 100644 --- a/ej2-asp-core-mvc/block-editor/EJ2_ASP.NETCORE/globalization.md +++ b/ej2-asp-core-mvc/block-editor/EJ2_ASP.NETCORE/globalization.md @@ -1,14 +1,14 @@ --- layout: post -title: Globalization in ##Platform_Name## Block Editor Control | Syncfusion -description: Checkout and learn about Globalization with Syncfusion Essential ##Platform_Name## BlockEditor control, its elements, and more details. +title: Globalization in ASP.NET Core Block Editor Control | Syncfusion +description: Checkout and learn about Globalization with Syncfusion Essential ASP.NET Core BlockEditor control, its elements, and more details. platform: ej2-asp-core-mvc control: BlockEditor -publishingplatform: ##Platform_Name## +publishingplatform: ASP.NET Core documentation: ug --- -# Globalization in ##Platform_Name## Block Editor control +# Globalization in ASP.NET Core Block Editor control ## Localization diff --git a/ej2-asp-core-mvc/block-editor/EJ2_ASP.NETCORE/keyboard-shortcuts.md b/ej2-asp-core-mvc/block-editor/EJ2_ASP.NETCORE/keyboard-shortcuts.md index 0dba961df7..c8823dfef6 100644 --- a/ej2-asp-core-mvc/block-editor/EJ2_ASP.NETCORE/keyboard-shortcuts.md +++ b/ej2-asp-core-mvc/block-editor/EJ2_ASP.NETCORE/keyboard-shortcuts.md @@ -1,14 +1,14 @@ --- layout: post -title: Keyboard Shortcuts in ##Platform_Name## Block Editor Control | Syncfusion -description: Checkout and learn about Keyboard Shortcuts with Syncfusion Essential ##Platform_Name## BlockEditor control, its elements, and more details. +title: Keyboard Shortcuts in ASP.NET Core Block Editor Control | Syncfusion +description: Checkout and learn about Keyboard Shortcuts with Syncfusion Essential ASP.NET Core BlockEditor control, its elements, and more details. platform: ej2-asp-core-mvc control: BlockEditor -publishingplatform: ##Platform_Name## +publishingplatform: ASP.NET Core documentation: ug --- -# Keyboard Shortcuts in ##Platform_Name## Block Editor control +# Keyboard Shortcuts in ASP.NET Core Block Editor control The Block Editor control provides comprehensive keyboard shortcuts to enhance productivity and streamline content creation. These shortcuts are organized into different categories based on their functionality, allowing users to quickly access various features without relying on mouse interactions. diff --git a/ej2-asp-core-mvc/block-editor/EJ2_ASP.NETCORE/methods.md b/ej2-asp-core-mvc/block-editor/EJ2_ASP.NETCORE/methods.md index 09dcadb905..92c6855f34 100644 --- a/ej2-asp-core-mvc/block-editor/EJ2_ASP.NETCORE/methods.md +++ b/ej2-asp-core-mvc/block-editor/EJ2_ASP.NETCORE/methods.md @@ -1,14 +1,14 @@ --- layout: post -title: Methods in ##Platform_Name## Block Editor Control | Syncfusion -description: Checkout and learn about Methods with Syncfusion Essential ##Platform_Name## BlockEditor control, its elements, and more details. +title: Methods in ASP.NET Core Block Editor Control | Syncfusion +description: Checkout and learn about Methods with Syncfusion Essential ASP.NET Core BlockEditor control, its elements, and more details. platform: ej2-asp-core-mvc control: BlockEditor -publishingplatform: ##Platform_Name## +publishingplatform: ASP.NET Core documentation: ug --- -# Methods in ##Platform_Name## Block Editor control +# Methods in ASP.NET Core Block Editor control The Block Editor control provides a comprehensive set of public methods that allow you to programmatically interact with and manipulate the editor content. These methods enable you to add, remove, update, and manage blocks, as well as control selection, formatting, and other editor operations. diff --git a/ej2-asp-core-mvc/block-editor/EJ2_ASP.NETCORE/paste-cleanup.md b/ej2-asp-core-mvc/block-editor/EJ2_ASP.NETCORE/paste-cleanup.md index 42e73157ed..e03aebb7f8 100644 --- a/ej2-asp-core-mvc/block-editor/EJ2_ASP.NETCORE/paste-cleanup.md +++ b/ej2-asp-core-mvc/block-editor/EJ2_ASP.NETCORE/paste-cleanup.md @@ -1,15 +1,15 @@ --- layout: post -title: Paste Clean-up in ##Platform_Name## Block Editor control | Syncfusion -description: Checkout and learn about paste clean-up with Syncfusion Essential ##Platform_Name## BlockEditor control, its elements, and more details. +title: Paste Clean-up in ASP.NET Core Block Editor control | Syncfusion +description: Checkout and learn about paste clean-up with Syncfusion Essential ASP.NET Core BlockEditor control, its elements, and more details. platform: ej2-javascript control: BlockEditor -publishingplatform: ##Platform_Name## +publishingplatform: ASP.NET Core documentation: ug domainurl: ##DomainURL## --- -# Paste Clean-up in ##Platform_Name## Block Editor control +# Paste Clean-up in ASP.NET Core Block Editor control The Block Editor control provides robust paste clean-up functionalities to ensure that pasted content integrates seamlessly and maintains consistency with the editor's styling and structure. This helps in removing unwanted formatting, scripts, or elements often copied from external sources like web pages or word processors. diff --git a/ej2-asp-core-mvc/block-editor/EJ2_ASP.NETCORE/undo-redo.md b/ej2-asp-core-mvc/block-editor/EJ2_ASP.NETCORE/undo-redo.md index df35d3e558..1e2d617132 100644 --- a/ej2-asp-core-mvc/block-editor/EJ2_ASP.NETCORE/undo-redo.md +++ b/ej2-asp-core-mvc/block-editor/EJ2_ASP.NETCORE/undo-redo.md @@ -1,14 +1,14 @@ --- layout: post -title: Undo redo in ##Platform_Name## Block Editor Control | Syncfusion -description: Checkout and learn about undo redo with Syncfusion Essential ##Platform_Name## BlockEditor control, its elements, and more details. +title: Undo redo in ASP.NET Core Block Editor Control | Syncfusion +description: Checkout and learn about undo redo with Syncfusion Essential ASP.NET Core BlockEditor control, its elements, and more details. platform: ej2-asp-core-mvc control: BlockEditor -publishingplatform: ##Platform_Name## +publishingplatform: ASP.NET Core documentation: ug --- -# Undo redo in ##Platform_Name## Block Editor control +# Undo redo in ASP.NET Core Block Editor control The undo/redo feature in Block Editor enables users to revert or reapply changes made to the content, offering a safety net for edits and enhancing the overall editing experience. From 5858deda84203770e5b5c6df6be6eee68c855ca8 Mon Sep 17 00:00:00 2001 From: KaviBharathi-SF5060 Date: Wed, 17 Dec 2025 17:21:40 +0530 Subject: [PATCH 09/10] 998697: updated the publishingplatformname and reverted changes --- .../block-editor/EJ2_ASP.MVC/appearance.md | 2 +- .../EJ2_ASP.MVC/built-in-blocks/built-in-blocks.md | 2 +- .../EJ2_ASP.MVC/built-in-blocks/code-block.md | 2 +- .../block-editor/EJ2_ASP.MVC/built-in-blocks/embed.md | 2 +- .../EJ2_ASP.MVC/built-in-blocks/inline-content.md | 2 +- .../EJ2_ASP.MVC/built-in-blocks/list-types.md | 2 +- .../EJ2_ASP.MVC/built-in-blocks/table-block.md | 2 +- .../EJ2_ASP.MVC/built-in-blocks/typography.md | 2 +- ej2-asp-core-mvc/block-editor/EJ2_ASP.MVC/drag-drop.md | 2 +- .../block-editor/EJ2_ASP.MVC/editor-menus.md | 2 +- .../EJ2_ASP.MVC/editor-security/cross-site-script.md | 2 +- .../EJ2_ASP.MVC/editor-security/read-only-mode.md | 2 +- ej2-asp-core-mvc/block-editor/EJ2_ASP.MVC/events.md | 2 +- .../block-editor/EJ2_ASP.MVC/getting-started.md | 2 +- .../block-editor/EJ2_ASP.MVC/globalization.md | 2 +- .../block-editor/EJ2_ASP.MVC/keyboard-shortcuts.md | 2 +- ej2-asp-core-mvc/block-editor/EJ2_ASP.MVC/methods.md | 2 +- .../block-editor/EJ2_ASP.MVC/paste-cleanup.md | 10 +++++----- ej2-asp-core-mvc/block-editor/EJ2_ASP.MVC/undo-redo.md | 2 +- .../block-editor/EJ2_ASP.NETCORE/appearance.md | 2 +- .../EJ2_ASP.NETCORE/built-in-blocks/built-in-blocks.md | 2 +- .../EJ2_ASP.NETCORE/built-in-blocks/code-block.md | 2 +- .../EJ2_ASP.NETCORE/built-in-blocks/embed.md | 2 +- .../EJ2_ASP.NETCORE/built-in-blocks/inline-content.md | 2 +- .../EJ2_ASP.NETCORE/built-in-blocks/list-types.md | 2 +- .../EJ2_ASP.NETCORE/built-in-blocks/table-block.md | 2 +- .../EJ2_ASP.NETCORE/built-in-blocks/typography.md | 2 +- .../block-editor/EJ2_ASP.NETCORE/drag-drop.md | 2 +- .../block-editor/EJ2_ASP.NETCORE/editor-menus.md | 2 +- .../editor-security/cross-site-script.md | 2 +- .../EJ2_ASP.NETCORE/editor-security/read-only-mode.md | 2 +- .../block-editor/EJ2_ASP.NETCORE/events.md | 2 +- .../block-editor/EJ2_ASP.NETCORE/getting-started.md | 2 +- .../block-editor/EJ2_ASP.NETCORE/globalization.md | 2 +- .../block-editor/EJ2_ASP.NETCORE/keyboard-shortcuts.md | 2 +- .../block-editor/EJ2_ASP.NETCORE/methods.md | 2 +- .../block-editor/EJ2_ASP.NETCORE/paste-cleanup.md | 10 +++++----- .../block-editor/EJ2_ASP.NETCORE/undo-redo.md | 2 +- 38 files changed, 46 insertions(+), 46 deletions(-) diff --git a/ej2-asp-core-mvc/block-editor/EJ2_ASP.MVC/appearance.md b/ej2-asp-core-mvc/block-editor/EJ2_ASP.MVC/appearance.md index 69a2f5fb95..a7fa0fe9a9 100644 --- a/ej2-asp-core-mvc/block-editor/EJ2_ASP.MVC/appearance.md +++ b/ej2-asp-core-mvc/block-editor/EJ2_ASP.MVC/appearance.md @@ -4,7 +4,7 @@ title: Appearance in ASP.NET MVC Block Editor Control | Syncfusion description: Checkout and learn about appearance with Syncfusion Essential ASP.NET MVC BlockEditor control, its elements, and more details. platform: ej2-asp-core-mvc control: BlockEditor -publishingplatform: ASP.NET MVC +publishingplatform: ##Platform_Name## documentation: ug --- diff --git a/ej2-asp-core-mvc/block-editor/EJ2_ASP.MVC/built-in-blocks/built-in-blocks.md b/ej2-asp-core-mvc/block-editor/EJ2_ASP.MVC/built-in-blocks/built-in-blocks.md index aef84c2f67..6fc95a1e9e 100644 --- a/ej2-asp-core-mvc/block-editor/EJ2_ASP.MVC/built-in-blocks/built-in-blocks.md +++ b/ej2-asp-core-mvc/block-editor/EJ2_ASP.MVC/built-in-blocks/built-in-blocks.md @@ -4,7 +4,7 @@ title: Blocks in ASP.NET MVC Block Editor control | Syncfusion description: Checkout and learn about Blocks with ASP.NET MVC Block Editor control of Syncfusion Essential JS 2 and more. platform: ej2-asp-core-mvc control: BlockEditor -publishingplatform: ASP.NET MVC +publishingplatform: ##Platform_Name## documentation: ug domainurl: ##DomainURL## --- diff --git a/ej2-asp-core-mvc/block-editor/EJ2_ASP.MVC/built-in-blocks/code-block.md b/ej2-asp-core-mvc/block-editor/EJ2_ASP.MVC/built-in-blocks/code-block.md index 9794c3228c..f000c3124e 100644 --- a/ej2-asp-core-mvc/block-editor/EJ2_ASP.MVC/built-in-blocks/code-block.md +++ b/ej2-asp-core-mvc/block-editor/EJ2_ASP.MVC/built-in-blocks/code-block.md @@ -4,7 +4,7 @@ title: Code Block in ASP.NET MVC Block Editor control | Syncfusion description: Checkout and learn about Code Block with ASP.NET MVC Block Editor control of Syncfusion Essential JS 2 and more. platform: ej2-asp-core-mvc control: BlockEditor -publishingplatform: ASP.NET MVC +publishingplatform: ##Platform_Name## documentation: ug domainurl: ##DomainURL## --- diff --git a/ej2-asp-core-mvc/block-editor/EJ2_ASP.MVC/built-in-blocks/embed.md b/ej2-asp-core-mvc/block-editor/EJ2_ASP.MVC/built-in-blocks/embed.md index bebcde4576..5b14447161 100644 --- a/ej2-asp-core-mvc/block-editor/EJ2_ASP.MVC/built-in-blocks/embed.md +++ b/ej2-asp-core-mvc/block-editor/EJ2_ASP.MVC/built-in-blocks/embed.md @@ -4,7 +4,7 @@ title: Embed Blocks in ASP.NET MVC Block Editor control | Syncfusion description: Checkout and learn about Embed Blocks with ASP.NET MVC Block Editor control of Syncfusion Essential JS 2 and more. platform: ej2-javascript control: BlockEditor -publishingplatform: ASP.NET MVC +publishingplatform: ##Platform_Name## documentation: ug domainurl: ##DomainURL## --- diff --git a/ej2-asp-core-mvc/block-editor/EJ2_ASP.MVC/built-in-blocks/inline-content.md b/ej2-asp-core-mvc/block-editor/EJ2_ASP.MVC/built-in-blocks/inline-content.md index 4c1d2a12c9..ce36d88ed0 100644 --- a/ej2-asp-core-mvc/block-editor/EJ2_ASP.MVC/built-in-blocks/inline-content.md +++ b/ej2-asp-core-mvc/block-editor/EJ2_ASP.MVC/built-in-blocks/inline-content.md @@ -4,7 +4,7 @@ title: Inline Content in ASP.NET MVC Block Editor control | Syncfusion description: Checkout and learn about Inline Content with ASP.NET MVC Block Editor control of Syncfusion Essential JS 2 and more. platform: ej2-asp-core-mvc control: BlockEditor -publishingplatform: ASP.NET MVC +publishingplatform: ##Platform_Name## documentation: ug domainurl: ##DomainURL## --- diff --git a/ej2-asp-core-mvc/block-editor/EJ2_ASP.MVC/built-in-blocks/list-types.md b/ej2-asp-core-mvc/block-editor/EJ2_ASP.MVC/built-in-blocks/list-types.md index 0f5f42f63b..0739fff258 100644 --- a/ej2-asp-core-mvc/block-editor/EJ2_ASP.MVC/built-in-blocks/list-types.md +++ b/ej2-asp-core-mvc/block-editor/EJ2_ASP.MVC/built-in-blocks/list-types.md @@ -4,7 +4,7 @@ title: Lists in ASP.NET MVC Block Editor control | Syncfusion description: Checkout and learn about List Blocks with ASP.NET MVC Block Editor control of Syncfusion Essential JS 2 and more. platform: ej2-asp-core-mvc control: BlockEditor -publishingplatform: ASP.NET MVC +publishingplatform: ##Platform_Name## documentation: ug domainurl: ##DomainURL## --- diff --git a/ej2-asp-core-mvc/block-editor/EJ2_ASP.MVC/built-in-blocks/table-block.md b/ej2-asp-core-mvc/block-editor/EJ2_ASP.MVC/built-in-blocks/table-block.md index 582a18d646..0c17c5c64f 100644 --- a/ej2-asp-core-mvc/block-editor/EJ2_ASP.MVC/built-in-blocks/table-block.md +++ b/ej2-asp-core-mvc/block-editor/EJ2_ASP.MVC/built-in-blocks/table-block.md @@ -4,7 +4,7 @@ title: Table Block in ASP.NET MVC Block Editor control | Syncfusion description: Checkout and learn about Table Blocks with ASP.NET MVC Block Editor control of Syncfusion Essential JS 2 and more. platform: ej2-asp-core-mvc control: BlockEditor -publishingplatform: ASP.NET MVC +publishingplatform: ##Platform_Name## documentation: ug domainurl: ##DomainURL## --- diff --git a/ej2-asp-core-mvc/block-editor/EJ2_ASP.MVC/built-in-blocks/typography.md b/ej2-asp-core-mvc/block-editor/EJ2_ASP.MVC/built-in-blocks/typography.md index b9a6391090..ce7a2e50bd 100644 --- a/ej2-asp-core-mvc/block-editor/EJ2_ASP.MVC/built-in-blocks/typography.md +++ b/ej2-asp-core-mvc/block-editor/EJ2_ASP.MVC/built-in-blocks/typography.md @@ -4,7 +4,7 @@ title: Typography Blocks in ASP.NET MVC Block Editor control | Syncfusion description: Checkout and learn about Typography Blocks with ASP.NET MVC Block Editor control of Syncfusion Essential JS 2 and more. platform: ej2-asp-core-mvc control: BlockEditor -publishingplatform: ASP.NET MVC +publishingplatform: ##Platform_Name## documentation: ug domainurl: ##DomainURL## --- diff --git a/ej2-asp-core-mvc/block-editor/EJ2_ASP.MVC/drag-drop.md b/ej2-asp-core-mvc/block-editor/EJ2_ASP.MVC/drag-drop.md index b25966195c..fab8588572 100644 --- a/ej2-asp-core-mvc/block-editor/EJ2_ASP.MVC/drag-drop.md +++ b/ej2-asp-core-mvc/block-editor/EJ2_ASP.MVC/drag-drop.md @@ -4,7 +4,7 @@ title: Drag and drop in ASP.NET MVC Block Editor Control | Syncfusion description: Checkout and learn about Drag and drop with Syncfusion Essential ASP.NET MVC BlockEditor control, its elements, and more details. platform: ej2-asp-core-mvc control: BlockEditor -publishingplatform: ASP.NET MVC +publishingplatform: ##Platform_Name## documentation: ug --- diff --git a/ej2-asp-core-mvc/block-editor/EJ2_ASP.MVC/editor-menus.md b/ej2-asp-core-mvc/block-editor/EJ2_ASP.MVC/editor-menus.md index a34707e93b..122d4335c5 100644 --- a/ej2-asp-core-mvc/block-editor/EJ2_ASP.MVC/editor-menus.md +++ b/ej2-asp-core-mvc/block-editor/EJ2_ASP.MVC/editor-menus.md @@ -4,7 +4,7 @@ title: Editor Menus in ASP.NET MVC Block Editor Control | Syncfusion description: Checkout and learn about Editor Menus with Syncfusion Essential ASP.NET MVC BlockEditor control, its elements, and more details. platform: ej2-asp-core-mvc control: BlockEditor -publishingplatform: ASP.NET MVC +publishingplatform: ##Platform_Name## documentation: ug --- diff --git a/ej2-asp-core-mvc/block-editor/EJ2_ASP.MVC/editor-security/cross-site-script.md b/ej2-asp-core-mvc/block-editor/EJ2_ASP.MVC/editor-security/cross-site-script.md index 0d15295d84..bb660cb922 100644 --- a/ej2-asp-core-mvc/block-editor/EJ2_ASP.MVC/editor-security/cross-site-script.md +++ b/ej2-asp-core-mvc/block-editor/EJ2_ASP.MVC/editor-security/cross-site-script.md @@ -4,7 +4,7 @@ title: Cross-Site scripting in ASP.NET MVC Block Editor | Syncfusion description: Checkout and learn about Cross-Site scripting with Syncfusion Essential ASP.NET MVC BlockEditor control, its elements, and more details. platform: ej2-asp-core-mvc control: BlockEditor -publishingplatform: ASP.NET MVC +publishingplatform: ##Platform_Name## documentation: ug --- diff --git a/ej2-asp-core-mvc/block-editor/EJ2_ASP.MVC/editor-security/read-only-mode.md b/ej2-asp-core-mvc/block-editor/EJ2_ASP.MVC/editor-security/read-only-mode.md index e01d0321d5..c23d1961d8 100644 --- a/ej2-asp-core-mvc/block-editor/EJ2_ASP.MVC/editor-security/read-only-mode.md +++ b/ej2-asp-core-mvc/block-editor/EJ2_ASP.MVC/editor-security/read-only-mode.md @@ -4,7 +4,7 @@ title: Controlled Access in ASP.NET MVC Block Editor Control | Syncfusion description: Checkout and learn about Controlling Editor Access with Syncfusion Essential ASP.NET MVC BlockEditor control, its elements, and more details. platform: ej2-asp-core-mvc control: BlockEditor -publishingplatform: ASP.NET MVC +publishingplatform: ##Platform_Name## documentation: ug --- diff --git a/ej2-asp-core-mvc/block-editor/EJ2_ASP.MVC/events.md b/ej2-asp-core-mvc/block-editor/EJ2_ASP.MVC/events.md index 562b8f1576..32b71e65cd 100644 --- a/ej2-asp-core-mvc/block-editor/EJ2_ASP.MVC/events.md +++ b/ej2-asp-core-mvc/block-editor/EJ2_ASP.MVC/events.md @@ -4,7 +4,7 @@ title: Events in ASP.NET MVC Block Editor Control | Syncfusion description: Checkout and learn about Events with Syncfusion Essential ASP.NET MVC BlockEditor control, its elements, and more details. platform: ej2-asp-core-mvc control: BlockEditor -publishingplatform: ASP.NET MVC +publishingplatform: ##Platform_Name## documentation: ug --- diff --git a/ej2-asp-core-mvc/block-editor/EJ2_ASP.MVC/getting-started.md b/ej2-asp-core-mvc/block-editor/EJ2_ASP.MVC/getting-started.md index 7474d2ca10..1319b040e2 100644 --- a/ej2-asp-core-mvc/block-editor/EJ2_ASP.MVC/getting-started.md +++ b/ej2-asp-core-mvc/block-editor/EJ2_ASP.MVC/getting-started.md @@ -4,7 +4,7 @@ title: Getting Started with ASP.NET MVC BlockEditor Control | Syncfusion description: Checkout and learn about getting started with Syncfusion Essential ASP.NET MVC BlockEditor control, its elements, and more. platform: ej2-asp-core-mvc control: BlockEditor -publishingplatform: ASP.NET MVC +publishingplatform: ##Platform_Name## documentation: ug --- diff --git a/ej2-asp-core-mvc/block-editor/EJ2_ASP.MVC/globalization.md b/ej2-asp-core-mvc/block-editor/EJ2_ASP.MVC/globalization.md index 905e355d0a..e1faa406d4 100644 --- a/ej2-asp-core-mvc/block-editor/EJ2_ASP.MVC/globalization.md +++ b/ej2-asp-core-mvc/block-editor/EJ2_ASP.MVC/globalization.md @@ -4,7 +4,7 @@ title: Globalization in ASP.NET MVC Block Editor Control | Syncfusion description: Checkout and learn about Globalization with Syncfusion Essential ASP.NET MVC BlockEditor control, its elements, and more details. platform: ej2-asp-core-mvc control: BlockEditor -publishingplatform: ASP.NET MVC +publishingplatform: ##Platform_Name## documentation: ug --- diff --git a/ej2-asp-core-mvc/block-editor/EJ2_ASP.MVC/keyboard-shortcuts.md b/ej2-asp-core-mvc/block-editor/EJ2_ASP.MVC/keyboard-shortcuts.md index b25d868fa1..03f4ba5df5 100644 --- a/ej2-asp-core-mvc/block-editor/EJ2_ASP.MVC/keyboard-shortcuts.md +++ b/ej2-asp-core-mvc/block-editor/EJ2_ASP.MVC/keyboard-shortcuts.md @@ -4,7 +4,7 @@ title: Keyboard Shortcuts in ASP.NET MVC Block Editor | Syncfusion description: Checkout and learn about Keyboard Shortcuts with Syncfusion Essential ASP.NET MVC BlockEditor control, its elements, and more details. platform: ej2-asp-core-mvc control: BlockEditor -publishingplatform: ASP.NET MVC +publishingplatform: ##Platform_Name## documentation: ug --- diff --git a/ej2-asp-core-mvc/block-editor/EJ2_ASP.MVC/methods.md b/ej2-asp-core-mvc/block-editor/EJ2_ASP.MVC/methods.md index d14a139c5c..28ee46ad5b 100644 --- a/ej2-asp-core-mvc/block-editor/EJ2_ASP.MVC/methods.md +++ b/ej2-asp-core-mvc/block-editor/EJ2_ASP.MVC/methods.md @@ -4,7 +4,7 @@ title: Methods in ASP.NET MVC Block Editor | Syncfusion description: Checkout and learn about Methods with Syncfusion Essential ASP.NET MVC BlockEditor control, its elements, and more details. platform: ej2-asp-core-mvc control: BlockEditor -publishingplatform: ASP.NET MVC +publishingplatform: ##Platform_Name## documentation: ug --- diff --git a/ej2-asp-core-mvc/block-editor/EJ2_ASP.MVC/paste-cleanup.md b/ej2-asp-core-mvc/block-editor/EJ2_ASP.MVC/paste-cleanup.md index 41ed7d068b..f3484738ca 100644 --- a/ej2-asp-core-mvc/block-editor/EJ2_ASP.MVC/paste-cleanup.md +++ b/ej2-asp-core-mvc/block-editor/EJ2_ASP.MVC/paste-cleanup.md @@ -4,7 +4,7 @@ title: Undo redo in ASP.NET MVC Block Editor | Syncfusion description: Checkout and learn about undo redo with Syncfusion Essential ASP.NET MVC BlockEditor control, its elements, and more details. platform: ej2-asp-core-mvc control: BlockEditor -publishingplatform: ASP.NET MVC +publishingplatform: ##Platform_Name## documentation: ug --- @@ -16,7 +16,7 @@ You can configure the paste settings using the [PasteCleanupSettings](https://he ## Configuring allowed styles -The [AllowedStyles](https://help.syncfusion.com/cr/aspnetmvc-js2/Syncfusion.EJ2.BlockEditor.PasteCleanupSettings.htmlAllowedStyles) property in the [`PasteCleanupSettings`](https://help.syncfusion.com/cr/aspnetmvc-js2/Syncfusion.EJ2.BlockEditor.PasteCleanupSettings.html) model allows you to define which CSS styles are permitted when content is pasted into the editor. Any style not included in this list will be stripped from the pasted content. This ensures that only desired visual attributes are preserved, maintaining a clean and consistent look. +The [AllowedStyles](https://help.syncfusion.com/cr/aspnetmvc-js2/Syncfusion.EJ2.BlockEditor.PasteCleanupSettings.html#Syncfusion_EJ2_BlockEditor_PasteCleanupSettings_AllowedStyles) property in the [`PasteCleanupSettings`](https://help.syncfusion.com/cr/aspnetmvc-js2/Syncfusion.EJ2.BlockEditor.PasteCleanupSettings.html) model allows you to define which CSS styles are permitted when content is pasted into the editor. Any style not included in this list will be stripped from the pasted content. This ensures that only desired visual attributes are preserved, maintaining a clean and consistent look. By default, following styles are allowed: @@ -35,7 +35,7 @@ In the below example, only `font-weight` and `font-style` styles will be retaine ## Setting denied tags -The [DeniedTags](https://help.syncfusion.com/cr/aspnetmvc-js2/Syncfusion.EJ2.BlockEditor.PasteCleanupSettings.htmlDeniedTags) property in [`PasteCleanupSettings`](https://help.syncfusion.com/cr/aspnetmvc-js2/Syncfusion.EJ2.BlockEditor.PasteCleanupSettings.html) enables you to specify HTML tags that should be completely removed from the pasted content. This is particularly useful for stripping out potentially problematic or irrelevant tags, such as `script` tags, `iframe`s, or any other elements you don't want to allow in the editor. By default, the [DeniedTags](https://help.syncfusion.com/cr/aspnetmvc-js2/Syncfusion.EJ2.BlockEditor.PasteCleanupSettings.htmlDeniedTags) property is an empty array, meaning no tags are removed by default. +The [DeniedTags](https://help.syncfusion.com/cr/aspnetmvc-js2/Syncfusion.EJ2.BlockEditor.PasteCleanupSettings.html#Syncfusion_EJ2_BlockEditor_PasteCleanupSettings_DeniedTags) property in [`PasteCleanupSettings`](https://help.syncfusion.com/cr/aspnetmvc-js2/Syncfusion.EJ2.BlockEditor.PasteCleanupSettings.html) enables you to specify HTML tags that should be completely removed from the pasted content. This is particularly useful for stripping out potentially problematic or irrelevant tags, such as `script` tags, `iframe`s, or any other elements you don't want to allow in the editor. By default, the [DeniedTags](https://help.syncfusion.com/cr/aspnetmvc-js2/Syncfusion.EJ2.BlockEditor.PasteCleanupSettings.html#Syncfusion_EJ2_BlockEditor_PasteCleanupSettings_DeniedTags) property is an empty array, meaning no tags are removed by default. In the below example, any ` + + + + \ No newline at end of file diff --git a/ej2-asp-core-mvc/code-snippet/file-manager/large-icon-view-template/tagHelper b/ej2-asp-core-mvc/code-snippet/file-manager/large-icon-view-template/tagHelper new file mode 100644 index 0000000000..882b904e55 --- /dev/null +++ b/ej2-asp-core-mvc/code-snippet/file-manager/large-icon-view-template/tagHelper @@ -0,0 +1,42 @@ +
      +
      + + + + +
      +
      + + + + + + \ No newline at end of file diff --git a/ej2-asp-core-mvc/code-snippet/file-manager/navigation-pane-template/HomeController_core.cs b/ej2-asp-core-mvc/code-snippet/file-manager/navigation-pane-template/HomeController_core.cs new file mode 100644 index 0000000000..c6e1574103 --- /dev/null +++ b/ej2-asp-core-mvc/code-snippet/file-manager/navigation-pane-template/HomeController_core.cs @@ -0,0 +1,123 @@ +using System; +using System.Collections.Generic; +using System.Linq; +//File Manager's base functions are available in the below package +using Syncfusion.EJ2.FileManager.Base; +//File Manager's operations are available in the below package +using Syncfusion.EJ2.FileManager.PhysicalFileProvider; +using Newtonsoft.Json; +// use the package for hosting +using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Hosting; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Http.Features; + +namespace WebApplication.Controllers +{ + public class HomeController : Controller + { + public PhysicalFileProvider operation; + public string basePath; + // Root Path in which files and folders are available. + string root = "wwwroot\\Files"; + public HomeController(IHostingEnvironment hostingEnvironment) + { + // Map the path of the files to be accessed with the host + this.basePath = hostingEnvironment.ContentRootPath; + this.operation = new PhysicalFileProvider(); + // Assign the mapped path as root folder + this.operation.RootFolder(this.basePath + "\\" + this.root); + } + + public object FileOperations([FromBody] FileManagerDirectoryContent args) + { + // Restricting modification of the root folder + if (args.Action == "delete" || args.Action == "rename") + { + if ((args.TargetPath == null) && (args.Path == "")) + { + FileManagerResponse response = new FileManagerResponse(); + ErrorDetails er = new ErrorDetails + { + Code = "401", + Message = "Restricted to modify the root folder." + }; + response.Error = er; + return this.operation.ToCamelCase(response); + } + } + // Processing the File Manager operations + switch (args.Action) + { + case "read": + // Path - Current path; ShowHiddenItems - Boolean value to show/hide hidden items + return this.operation.ToCamelCase(this.operation.GetFiles(args.Path, args.ShowHiddenItems)); + case "delete": + // Path - Current path where of the folder to be deleted; Names - Name of the files to be deleted + return this.operation.ToCamelCase(this.operation.Delete(args.Path, args.Names)); + case "copy": + // Path - Path from where the file was copied; TargetPath - Path where the file/folder is to be copied; RenameFiles - Files with same name in the copied location that is confirmed for renaming; TargetData - Data of the copied file + return this.operation.ToCamelCase(this.operation.Copy(args.Path, args.TargetPath, args.Names, args.RenameFiles, args.TargetData)); + case "move": + // Path - Path from where the file was cut; TargetPath - Path where the file/folder is to be moved; RenameFiles - Files with same name in the moved location that is confirmed for renaming; TargetData - Data of the moved file + return this.operation.ToCamelCase(this.operation.Move(args.Path, args.TargetPath, args.Names, args.RenameFiles, args.TargetData)); + case "details": + // Path - Current path where details of file/folder is requested; Name - Names of the requested folders + return this.operation.ToCamelCase(this.operation.Details(args.Path, args.Names)); + case "create": + // Path - Current path where the folder is to be created; Name - Name of the new folder + return this.operation.ToCamelCase(this.operation.Create(args.Path, args.Name)); + case "search": + // Path - Current path where the search is performed; SearchString - String typed in the searchbox; CaseSensitive - Boolean value which specifies whether the search must be casesensitive + return this.operation.ToCamelCase(this.operation.Search(args.Path, args.SearchString, args.ShowHiddenItems, args.CaseSensitive)); + case "rename": + // Path - Current path of the renamed file; Name - Old file name; NewName - New file name + return this.operation.ToCamelCase(this.operation.Rename(args.Path, args.Name, args.NewName)); + } + return null; + } + + + + // Processing the Upload operation + public IActionResult Upload(string path, IList uploadFiles, string action) + { + // Here we have restricted the upload operation for our online samples + if (Response.HttpContext.Request.Host.Value == "ej2.syncfusion.com") + { + Response.Clear(); + Response.ContentType = "application/json; charset=utf-8"; + Response.StatusCode = 403; + Response.HttpContext.Features.Get().ReasonPhrase = "File Manager's upload functionality is restricted in the online demo. If you need to test upload functionality, please install Syncfusion Essential Studio on your machine and run the demo"; + } + // Use below code for performing upload operation + else + { + FileManagerResponse uploadResponse; + //Invoking upload operation with the required paramaters + // path - Current path where the file is to uploaded; uploadFiles - Files to be uploaded; action - name of the operation(upload) + uploadResponse = operation.Upload(path, uploadFiles, action, null); + } + return Content(""); + } + // Processing the Download operation + public IActionResult Download(string downloadInput) + { + FileManagerDirectoryContent args = JsonConvert.DeserializeObject(downloadInput); + //Invoking download operation with the required paramaters + // path - Current path where the file is downloaded; Names - Files to be downloaded; + return operation.Download(args.Path, args.Names); + } + // Processing the GetImage operation + public IActionResult GetImage(FileManagerDirectoryContent args) + { + //Invoking GetImage operation with the required paramaters + // path - Current path of the image file; Id - Image file id; + return this.operation.GetImage(args.Path, args.Id, false, null, null); + } + public IActionResult Index() + { + return View(); + } + } +} \ No newline at end of file diff --git a/ej2-asp-core-mvc/code-snippet/file-manager/navigation-pane-template/HomeController_mvc.cs b/ej2-asp-core-mvc/code-snippet/file-manager/navigation-pane-template/HomeController_mvc.cs new file mode 100644 index 0000000000..47fdf31a18 --- /dev/null +++ b/ej2-asp-core-mvc/code-snippet/file-manager/navigation-pane-template/HomeController_mvc.cs @@ -0,0 +1,94 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Web.Mvc; +//File Manager's base functions are available in the below package +using Syncfusion.EJ2.FileManager.Base; +//File Manager's operations are available in the below package +using Syncfusion.EJ2.FileManager.PhysicalFileProvider; +using Newtonsoft.Json; +// Use the package for hosting +using System.Web.Hosting; + + +namespace WebApplication.Controllers +{ + public class HomeController : Controller + { + // Accessing the File Operations from File Manager package + PhysicalFileProvider operation = new PhysicalFileProvider(); + public HomeController() + { + // Map the path of the files to be accessed with the host + var path = HostingEnvironment.MapPath("~/Content/Files"); + // Assign the mapped path as root folder + operation.RootFolder(path); + } + public ActionResult FileOperations(FileManagerDirectoryContent args) + { + // Processing the File Manager operations + switch (args.Action) + { + case "read": + // Path - Current path; ShowHiddenItems - Boolean value to show/hide hidden items + return Json(operation.ToCamelCase(operation.GetFiles(args.Path, args.ShowHiddenItems))); + case "delete": + // Path - Current path where of the folder to be deleted; Names - Name of the files to be deleted + return Json(operation.ToCamelCase(operation.Delete(args.Path, args.Names))); + case "copy": + // Path - Path from where the file was copied; TargetPath - Path where the file/folder is to be copied; RenameFiles - Files with same name in the copied location that is confirmed for renaming; TargetData - Data of the copied file + return Json(operation.ToCamelCase(operation.Copy(args.Path, args.TargetPath, args.Names, args.RenameFiles, args.TargetData))); + case "move": + // Path - Path from where the file was cut; TargetPath - Path where the file/folder is to be moved; RenameFiles - Files with same name in the moved location that is confirmed for renaming; TargetData - Data of the moved file + return Json(operation.ToCamelCase(operation.Move(args.Path, args.TargetPath, args.Names, args.RenameFiles, args.TargetData))); + case "details": + if (args.Names == null) + { + args.Names = new string[] { }; + } + // Path - Current path where details of file/folder is requested; Name - Names of the requested folders + return Json(operation.ToCamelCase(operation.Details(args.Path, args.Names))); + case "create": + // Path - Current path where the folder is to be created; Name - Name of the new folder + return Json(operation.ToCamelCase(operation.Create(args.Path, args.Name))); + case "search": + // Path - Current path where the search is performed; SearchString - String typed in the searchbox; CaseSensitive - Boolean value which specifies whether the search must be casesensitive + return Json(operation.ToCamelCase(operation.Search(args.Path, args.SearchString, args.ShowHiddenItems, args.CaseSensitive))); + case "rename": + // Path - Current path of the renamed file; Name - Old file name; NewName - New file name + return Json(operation.ToCamelCase(operation.Rename(args.Path, args.Name, args.NewName))); + } + return null; + } + + // Processing the Upload operation + public ActionResult Upload(string path, IList uploadFiles, string action) + { + FileManagerResponse uploadResponse; + //Invoking upload operation with the required paramaters + // path - Current path where the file is to uploaded; uploadFiles - Files to be uploaded; action - name of the operation(upload) + uploadResponse = operation.Upload(path, uploadFiles, action, null); + + return Content(""); + } + // Processing the Download operation + public ActionResult Download(string downloadInput) + { + FileManagerDirectoryContent args = JsonConvert.DeserializeObject(downloadInput); + //Invoking download operation with the required paramaters + // path - Current path where the file is downloaded; Names - Files to be downloaded; + return operation.Download(args.Path, args.Names); + } + // Processing the GetImage operation + public ActionResult GetImage(FileManagerDirectoryContent args) + { + //Invoking GetImage operation with the required paramaters + // path - Current path of the image file; Id - Image file id; + return operation.GetImage(args.Path, args.Id, false, null, null); + } + public ActionResult Index() + { + return View(); + } + } +} \ No newline at end of file diff --git a/ej2-asp-core-mvc/code-snippet/file-manager/navigation-pane-template/razor b/ej2-asp-core-mvc/code-snippet/file-manager/navigation-pane-template/razor new file mode 100644 index 0000000000..a6dbaeafb8 --- /dev/null +++ b/ej2-asp-core-mvc/code-snippet/file-manager/navigation-pane-template/razor @@ -0,0 +1,19 @@ +
      +
      + @Html.EJS().FileManager("filemanager").AjaxSettings( + new Syncfusion.EJ2.FileManager.FileManagerAjaxSettings + { + Url = "/Home/FileOperations", + GetImageUrl = "/Home/GetImage", + UploadUrl = "/Home/Upload", + DownloadUrl = "/Home/Download" + } + ).NavigationPaneTemplate("#navigationPaneTemplate").Render() +
      +
      + + diff --git a/ej2-asp-core-mvc/code-snippet/file-manager/navigation-pane-template/tagHelper b/ej2-asp-core-mvc/code-snippet/file-manager/navigation-pane-template/tagHelper new file mode 100644 index 0000000000..a16c74f78a --- /dev/null +++ b/ej2-asp-core-mvc/code-snippet/file-manager/navigation-pane-template/tagHelper @@ -0,0 +1,19 @@ +
      +
      + + + + +
      +
      + + \ No newline at end of file diff --git a/ej2-asp-core-mvc/file-manager/how-to/customize-navigation-items.md b/ej2-asp-core-mvc/file-manager/how-to/customize-navigation-items.md new file mode 100644 index 0000000000..d3a58b94a0 --- /dev/null +++ b/ej2-asp-core-mvc/file-manager/how-to/customize-navigation-items.md @@ -0,0 +1,38 @@ +--- +layout: post +title: Customize Navigation Pane in ##Platform_Name## Syncfusion File Manager +description: Learn here all about Customize the Navigation Pane in Syncfusion ##Platform_Name## File Manager control of Syncfusion Essential JS 2 and more. +platform: ej2-asp-core-mvc +control: Customize the Navigation Pane +publishingplatform: ##Platform_Name## +documentation: ug +--- + +# Customize Navigation Pane in File Manager Control + +The navigation pane in the File Manager Control displays the folder hierarchy in a tree-like structure. You can customize the layout of each folder node in the navigation pane using the `navigationPaneTemplate` property. This allows you to modify the appearance of folders based on your application's requirements. + +You may use this template to show additional metadata, custom icons, or other UI elements alongside the folder name. + +{% if page.publishingplatform == "aspnet-core" %} + +{% tabs %} +{% highlight cshtml tabtitle="CSHTML" %} +{% include code-snippet/file-manager/navigation-pane-template/tagHelper %} +{% endhighlight %} +{% highlight c# tabtitle="HomeController_core.cs" %} +{% include code-snippet/file-manager/navigation-pane-template/HomeController_core.cs %} +{% endhighlight %} +{% endtabs %} + +{% elsif page.publishingplatform == "aspnet-mvc" %} + +{% tabs %} +{% highlight razor tabtitle="CSHTML" %} +{% include code-snippet/file-manager/navigation-pane-template/razor %} +{% endhighlight %} +{% highlight c# tabtitle="HomeController_mvc.cs" %} +{% include code-snippet/file-manager/navigation-pane-template/HomeController_mvc.cs %} +{% endhighlight %} +{% endtabs %} +{% endif %} \ No newline at end of file diff --git a/ej2-asp-core-mvc/file-manager/images/large-icons-view-template.png b/ej2-asp-core-mvc/file-manager/images/large-icons-view-template.png new file mode 100644 index 0000000000000000000000000000000000000000..784bf8bed4f95840504d096c1414de061422ca78 GIT binary patch literal 63605 zcmce;byQSs^fo+-fP#n$h_nSrOLvQOGed)jGy~E|4F({sLrHfG-Ce>XNOw0#4c#!q z4Br_apWpi4wchW)_j}J;z{ELs?R#JQ+WX#{U=1~S5+Z6M5C}w~sPIw?1j0`Pfv%%& z5&)mH-anWC{#l9vG$_tS0yZ*Evgt4f1FWs$^}X86GSTkjO~T|l7wuDG9T^Og*r zAkaCH;!9~APm}FAm{H6L=IUVmUcez?LU2Wf^|dOEnlDOa6t8!_uw|Xx;*ixvV7@wk zsQ+5URZ2Ci#7@H*r>9-XSd~3Gs?EAa&PE~_15qLtRin&4I)5sC;BzJ9pG2(jkIN!$ z|B7FOam_NuFEzCNpx$IXY5jfbnML``j{7xWSh#EPjd2*szb`?c+K*jAc&No6pG3Tl z^K9+xXaw>8el^H0DJglfF(gZA?D|c+K^x?|zxadczi&a-B<3C4l{Y$vGUaKmZvK5n zs(^~uG8dF!A^2bWP>bI0bvGaXecQ@$Gwr`&I7oy38^t@~>(+no@Hf0G^@vrgy`wH}brs)?`JMP{X(wLYSqFc9|=&vmn+A5_^JmvDs zd)g5(Ui7G;J9-*B|OFGau$ef9;dj9DyZgT!JwCCHhF+2QfCtHZGTY=9DOVTe| z9eitx%Det)O^K7U{l(w$!z9D9r5nON(&iy(eKwDmk0`P`JJMa~X>;wNBeglsQy|$F zobAVZ$ZNTGC+)0oXqIBwIC3F}EzB3#ttWTvHTqx5{8{1M3af*sUi(#Z9hQVGFU0v^ z&AV5Aa|2f<8S?b{d2=V%ilis;N^G%0TuOKBNb~G%BAg$@ZTesGFHS$M--$IO*GkP~ z$QunLu{&PMMT0Y&LuljD!^*xPx1`Bv!l^1e2nS&UL(q7w@r2uRZ?^Ho{z++38zBqL z4ziRi`3JRpGgT9de%Uw3&H)o^o5c5wP7tTjIqu+TGOaiCzEgFGrZtPS?YewM@}e5I z3#1ZvhTy@Z$ek?{t#1cSuF$%*`K!;}yPn{Z@qljc2a6$~n*5?zY8VNhqq@ zHz=2I)-H%LmC&am;_x>*xdim=kyrEUPp38e zicl*{FB*AWi?%=0I(MCuwJJQOsc>(2~D(t41|tV#8b8Q?Y3)=ZI8Dh)UCU)AG}=W?~67GR2didqo{UV=r z@Tv+-L9yL&1ls2y>)N&3VsqgDlas*0Q?91o_dnK4bVp6vPZF>oBM!Q&bg1N0@luF! zc;OlKbb5bQhXWBZ8a*|@#XT|gw6YuJb4tqb#T9H2;6_)tDGRtX{1#Pw`$3HR`YpqA7Zw$RXTD4POn3Rt*O^0T?Rbh{>QLL9 z?gn;>sy@4lGN9QeBm}GV_WQ+liSoy+a!E^DMH=3XMVdaINWLC19(@GwQPpK8Sg8rZ z3UfD^i7i{KyNg4$38A!%kE zgzkmA`-|%v6$hc3sKRIX;C}6H;?)k50dvu3iDe`^IY0O7=pXY@ih>E;mp6;a9yPx>tuE|_7aTmz zpdL34hdt7b4fM}cl3Qt`pcj?z&}(?>Rom9yS@7#!sh(CM!=6UXgZ-yJ;aSV_$njzO zMuB%#;Mk;tkQN(_#EGd&D2tAPR`g1S+R`WTvsT&|T6^Ko!bj$dgYU|6Iw-?LMiM&c zZ3h~xZl!Kf$!x?xlej%4)Jz}sUR+} zCW96~;N2%(r;u0gii$~cxfE<>AZgJvbSop{0>zT6-Azrq3!XY33~Kz_^ds8U*PnBW z8ELjaIcE!FEtG28GRwi!zx8Z6U>6J*Qu#%}$BfS7Y_>e{h~yz64?hu9if`Db)P_sknc++XrT z?=T|qSx+bQm2R?6Br&feGAPgmdSCO*SnyFIZ^{qX*4QKk_2YEOpEJ5QhMX#EeSIVU zO37PU2g%n^pt3cgq=itDuurOuK^)_;2$_9;LS2<2ph332#s7!=%qaiOajGi=EY1x?@n(x%X?> za%B-BP7tnN^#U4ePs%wFVcbx;Rj0QCiqv&kEN$ydVe~21rIcB?!nBLLi=AFlTP5zW zS-x-c@>R;=`Wg!cf;b){XUvJ?yJZw+Z^uh6_(Tq$0uvLxBs71R685bcn3I4ez8b^0 z9(ey~sC(Y$!z)#{u)an%1q)^E=e-qH>k!Nc@2x2fSr$~)1>hq0?=I<nj8NO*=s7H2Yr4qDb8_nA)h;vlTjd0sZenzj+J39?5J0je6yKI$TUVN+7$ zm8qzp(``ib$6}3h{bCYuwQc%?V%x*w$*F*)`X>tcvm@6k=m!3o{}pHIH+9~5=d{Ro z%DjE2Jt+0+^xaTRM{-S@?kWB)v(wVg_@^aEgF8iPRi+FNEE%dwn}0gg!0K8hSlN3e zkTI6i*iy7>;+#Vbg8@{%Nut*e<0#=oEx0>ino57<6pKOGbxd{6(O8luR`0r^C6Bht z%qC_kBqZiW3;7YJrKK;tkqI5)ojY4O#*U;7meIb_ax3l)a}JVkO$9lo=^w-0%QL%hp zv?5U?1Cv3dunz2pvN^`_DedscCe67PxfSyaEO!gGYwT1uymNZzG2!&A?x+Ozs?%eJQgYj~w~e4I&%@B@HbgQGmR}!~q;T2p34PEu7R7gnjN_c+> zYGEWR7Q;J0PqTJOi}M6qYrvddtr9*m=@@&*Y=by1ooQm`+clD<8}{BVT!7p7gEtM$ zYIEvLK|xW~m`&nT_~DJc$8_vgc4}4Q$L_kDd{#E&$sbr@0&@6PdQs(Ot)@pp#i#RfJ+wT?+#hCPO^{W=a zZc~3|b+@)#Q)+Yj7<2hm|3l#TmxCw@jzpyzK7jA2olIvuh$O`CVBJZ-X`}oNvR&kO z8!{Yqi^!RpCT}DC9-Q?UJoiJRtXyF=Wb`+pED%kRwvoylN)bLFEtLmfcN~s5JK}#_ zZV-E^7!pbis4R6K)X@%FD*_qfL}Q2JBidPG?A>XDuB|;|JfEt3V_}o22`M^viRW|9 zfE&5OXnE6H#*U(RE6axj`9*qq*S*BOQ%=08p`+T+DYvPQ2Un%&X%eco0zZGKHk zhNkM^x9uM^i!<7syTr=6%BVdJ8{fPgVV>#Vr(Mg6Ur(%edF;9UGMkmLa~sj@i>_`w+1>Q4umeQv)xGfWYn6Ul@031Ifl;0M1Z=JbQF3O;s2_cr zSzpCW17+D$K)L3+E5o1gy?I+&X=yw+oxN&cY#;MJOaGqi8wz_i%`SJve63BCvyG?9 zO!FI)ld3{^;Jjy3S?A+tI_dCkHrlg%;c;;acpwtRK<)kPf*->wyT$Oy>mCuYldb=Z zob78DJMkO%h}5i*kdiQQlKfLcLkaq4_@)%B2qU#19k-Zn-3QOlHu=I^o~k+3ykyzc zUzZDR&d>YG89IK_7ZB`s%@)4rSx4#u_%AidX6RL=a;;wkj4F>yh$?)9$1wgs&kHreit{D-5Ka|(|BaF%}No8 z#=JYxiFfz2+_q_$TeZ*{lp?Wjw`#t1rZ&!j1Z+P6>&xB=;yKO%_$ z+oypU84R+gd14%5d%1@KO^4^NC&Vwg5fu5{M%L|qx^6mb*o4QJEGElcG&!{_x6^<8 zosi&EK%i=l5}%rmUnO{CeKYD4<@0l9GQOwgvCbWQWag*)YiSo>x*tfEFd7<0gh$#N zXROD?B3=!D4O(Yg*QM&VHuJ_()+GCiA3%s|Sry;!t+72WRSMv$zPx5o;0i^hk6c*q zI6d@rEdOX13V!R9<+}1WT*izS{b0ApK)Iiu z-B|4Ajt6O;)$!c`Ds;cx*-gfQ0bS<>Rtl9aNc>U)vGmieaTZ4h7lZYSUIUS}Ck(EI z9CNd=5{(YyuCFVH7v}O+LwWgG&)Fz)m~Hh&t=sF*?r>n}aVlq3ZrXDcYkfu$oG|{o z=}6odclIcx;N(KDdgAJqjop<7<)!S77bt``#9wqJ+_t(5M*`5YUw1vWO!&&VD>YCd0#H~Pc<rCdS+N7XF7H+EF>i@8x?ajEduqGlwb4bS(TW& z;EcxkAg*E5W1~vCm*2XJxHBlXHZYV=J{WBu(EWsj{W? zD_?8&*lnadKzv_0$VIa(XluK$!H8% z4fo3hQ&7MOKC@IFyveItH8{vQI=J`VC2VxoN!w0)sOPBh(d;I|aCqHrT2;Ps_O6U* z+xn`A^9WyGs>Dmqh}dMkg>LXtu4)89SG7rjfKvUTvwX6XG}JoZh{BY5rvJB5MEj#~ zg)h+%&WVs1Io3)!+qR}%jNVzuc@SUuNWj1y-LSs#%n3#Gsel&?q(Qz17N7M`RvoJJ zV3Aj-R6<^zeLl0)sYMGO+Pq3}H>#M*5^)(&S#QVrvfIZh?XCV`ZyEBsbQ#aWBmFqe zudD2-u3%kJhN5ea6_pyn!zNo7z7;sF_K!psWZeoz)|scT6+4Q=7n%J2PP-ar^L}{X z+lfonJ9%|RH3cmi$SYU2>l@Y7U$c^OpS<VECE>a?4zHKHi4{8c{u zq-R)I$@`JolwERAXN1bvYRbIVE}vh`&OW!NqGqlbFR+dW-{T%y=QbCTT8l4vp6*!Z z3=>gVaUr5RTi>~!J;$vQH6MF_4TJ5aJRnkpAiqDFnpf2H(ZVd~5=t(B|t`ho>RjC=}CgNDegvhuv%Ga@ph_zzAj0dTPweo zSG&8wi;gf;s!+H$!ZY9_<|=46-gpBaIso?B_FUz3yF@?WQqaCERb+*HH0dh2O8ybj z%&&*?iO|v_rfu2U5l$c%)wGCv7`yl|CFl5u*2T8xPr)z_jp;lg3U~E)OZDvzzXhe9 zR;ULJa>XgL!Y*9Tlf<>~ke1uKCYN8}yQ;Qhu?M@tK6kuIb*3^2SZx3C%w8qW^R!4` z6HCrGH)COypiVz#-kMNx2et{jYub}%6iwd?mSY}JG-`~7kdpN82;Hu?1GegezApW} z;ZRc4vlg~!J~UW0v=}XvmtpMgif3j5#^7l7Q~i~o-S4X?_CEUc zjAH;u@;;m9uw@MKQ)cA$Lu54S*7zhKx&}JuG6@|EDRakl=SeqMF5+F~XgMI=rJmUw z&x>bZWkk+e(L%e&+iSzQnLwatbG>Srl8MDGn_Nslk)wtD25u+u*6u!5rQw8nax3>- zLAPBus03chwi)Q<9WC_4oGcUAob!phCYM#L+>=TTS|mJ*nSZN~r%0q@zst(eqo%QM z70{gm&xmGWNjL}^L#-jZl$w9M@Uc$ng}d%N54ZODk+CaFAv(&G$RU&IH+<-Pv*`ZA zf<|ybG%u50!$LQtJDNN@Ye4(GM!EC6adzWUcy5jWvs4-H7B;85zGZV$CdM=|d$lfe zv`6UDhykxM*))%d++nzU`-a@4K*4iKLzWR2aP5IzK={DWp@*raRur+BqE?=kscG?O z>wSytoaYuw)sUn{6S6}=n~Q%c zbee!c^qKN>ON-(;yCU8b#|aKiS-#(eGaU7d87HZx1d%-xZ0d|QuP2hr8xw$Lr&vpM z@~({I4IuSKWW~08=Z$uFo0`c-4 zm2a-BV^I6=XYP?alrX>}_08kAo8W6{s?!)4@YHy^*JvudM>o_;Xfj-|SyOA@bV%@+ zjL%N1v{G1Be{Yhu6WP!c9e=klS$QjBY?LbDY+f+LlU<*~NU7qaI3dlV;D~>Tzy@<< z6M<15&@$8ae%+XiX8_`#$*15P(COUu)pG2akB^Wz4$7C?`?7=YhjTsBa@(-FE+B^;%b-^UBx6@ z^AHVEU;5CAaFfnhP9Yg%YdB2kHwoGr-JR&}l|L@0hu)XS+)?7qlDO&0yo?JH;IZwO&kSGLkWj&P+6AWpt8|iQD$@ zpJADG+&c@rs&);(|1XC@`}Ad(XNq2LW{kbueqfweJp|^~6zU#eo%3V2cM-q1wfUg4 z9Mpru)G7SvDzk&51oW%;i2pehf=kf+uLo&sbcFYO$gc4%igdCo)k(;$MsiNnGsin2 zmE^H0nP}b#h4zYLTNDRUxt0_dYTBo5{mU=(K1Bg6Jbq?gc?Un2ubN&)ij`|Lgiqw< zlbyB}B{JF`gg~!J-2d-zw^r!ub3`l#-UE`@rh}ega(3yW_+Vv{jA`XFNH9t zES33Fain+>xB2NVh&r)7>59kLij09hrb%0q(x5tBKSjXNTTYRH-4tFYz%bO}Gr|7BNpCg%WI`g+h;<-!0 zPMX+NYGx0d$Ya?Hbk?u~oOM!Wvs6ThS>{Mw<7-q7CUU-006U{dIB^dC zm|~Q@8YxgA!DqDmYaw-l3`U|^O*qC53G3h(+OjsXev+S&@ zlk@p~dq5`903KjaA1N69_vX+Sc>i}+;ZTqq)%VJehs{G zye}oVdjsU!h$1CK4E*_~bp$v*k6rxp8u<19b-Mk7dJwd@r1$Sq8B{wiNYIISYA~y( z@VQ^J&MY==KxTw;4l~9Xz1bFFGw+y1f>0Ynnfb-V;|T5CFk_Ja(O|YRCH{>YdGe9; z9h|}cp0XQM0u5pIU{~7K)_Ip0O!ypVIxi>Z6%eFBj^qvq2MuO)dMJwj{b)V`T9t;Kx2n<95sRbRyF5~&2`uh6m$s3?| z+_oIJ8K21_psd5+V5iBmE?{|34E1HbnS? z&Nh#R@5dBE>!FB3?mL8kh5!sQpv$3VW($^ASg50*@a5>H;)2gnco~8WF|-czGKw;p zFXsK(i%mD@N0X{=1e$cvgWe_kVNg_wI{Nx7ihbi&xQ6yEt}fRlPudxFwH&rK@|4}J7-UQ45xrDOFr6fyf-0{wI9N&sAZ+~Mp#>fNvTcU5?YqFLm?)-EP z5pr>moM7zbHT2b2*{^tGLj~$geG9a+b$+mdI!e7N6rA^z1-4!EGcXvu2?PkVfz#jd zVq?3;TeyL@w%gCugEu!fQOluRVaA+p8-tJg68M$5nvUTS43eCRBA)wc<>lqa{i1sh zgW8q3@w~bQ+|KqS1qB3qB#-GW)>XmwF!RWYg!WXsO)kIUi*fH``5qk-fjibi5*&1} z8k1=Ydyf~Ay7}7-%IFaK@g^>;d}azdH0KpsnFQ7ulVF@sWY$4*eV;l-1g}0nU+HY# zyX16x%6uFCY|i&=&g*o_s>*%GK>YC6)5D{qk;{uC3No@4*O`l>b-VNZrH;gZlMpH` z+%3J!W_C~$E!b?J4RuHXm{~39>od2_VY!2Y15}r~-7q@#D(i`4|N_vI1v;`u=P1-d0B34Ati&f3N6IQ8XfKF@HdT_Tu! zzne zX^V@m$Hr0pavd3&nQnVcXClz2ufjBH9OhgPep0eMeJZOicJLWDu@%)J#k*3ZI2*QkR#b6E8m*Za^uiTHNhyTh@7xSJSt<=bKAAAx0)|<%TenW%gx+lsaYIHQ zSgHd0b~Tivns}VafKg~cjg`0pkhM8(=s1QsTPPVF)%n@kN#i(d10a;`udk2QW?Dbs zt*(2-p1d2f`7Z&fbsf6UY^)4hcf^UesH!8B>)bX7qa%{~kLeJL1QkE5kEHX@d5+QYNcr|&#mZh>0V zXJ~ z1k}|oR!K>z(huX6>z8TL!X@10>;P3 zC&BRZ^Ox(fcXxMd85krC4-X&DEMTj<Bh<}p19m)}87W93GojO%)5+kg zdUdPGfRaXZsJuNf`u#$C0_I!vK5?hWu==dK9^-&`A^Na7mHsSps@`$f9=a2iX44X% ztv{eLCO+YlInbPE(%MX~xcES$podDh^*3CDc;hzv~hAT zUq0vN)^uz-i5>ZeDzl)tUg_Swd(*W}nGe|Y(moNAQU~$nnR21R1?LCPn$N@;85uWo zB{7IQv_fg`kJdH|N}6pSqETBV1%-tw07_@>Hl3M}Q1QHMaNijQbSr12Gg5S?2C(iu zaa9Qx6M+0_kpKoaye-U?_7b`MpG5`+z>fmsAbaZqUAk@kw-|xuX3FKJ8$yv*l zF`(~*;%BqC9kJPTHb1h~mq>$QIcYonc*|=Q%a-ggVzc9==pip^ z`9#ouCC)b0X_jitdL)Tm-?lg51jTUj&s>CC)?Pfe9(%kohN|9(WGzlyY_wTTL_sW7 zdwgHwz=h5)GR5@^p}nRqDzE3TxjZq@e! zr$OsG`%CSp^OeYxkyNbCT!V+8yWl-a%G~xK(t?bPw#l(Hpv(HbW;Cv0%$DiZFz}F|mk<7yyq=m`94|ILy^=ej=5yen@lwenxJJmr`(W zFg4HHFF355a~)Bgu5nB~-JRR2TmYI@!y~*i8tHfZG+u=X!THM09EQ;>95)%{0BqSg! zp>y?PLfc^m=!X~_p3XOUQ_#^BeS0d8!%QU=6&*lHz0P(4UurtI^Tr^&rT7v^7E8H0 zQuHdy=n(e7Uc~Hp+-r>xz}Y4tOLjr~NK(<7sfC4@JkM1#W9KtW$j<7ln}vN+@#q8S z#pr=cOLLsUbiNx+l2s}i-HUf8t!Zbz$&dkdStcVR!{@#|8OT56b%M}H^fTj@LylGvjixZ8IM`t9%L@*gM`ThHEwr$7dD2=m# zvnhc_NgG@`Pe&M4CP2oXKY1cEQw<#{)UT*CYbVIH5SF<3P3E>Wt|~a^sx7O*t|%=n zUB6x4bG&ectub>y+NoJ6mheUKg>lEL5Rs68RaI4^EQA2oOhHYJ9ChDcl=j75tk>_> zZ@I373yPfZTTPalsipg1d_|m=Ulwq7JXahV8mb4lL~=D?gV7ykR-@CMdERHc$nl~? zR#w&|%RG;r>60+tnI#kY(_eyj(qS2?=Wl>eL{srlUppOdEKPM{{{i>;DGf$`xLFc2 z`<}_owK8KbxrB?+SAX-nw(p5A6*Y~QUM!X6&u8N4aq}3Xh3Z{dc94WM_VNOk12H1t zbN+6nlotg61&*A7ArNGzB(`kC9=U+o^?+wx0q%gv`@<|I)r2f82EElzDyd^+lmwsx zAo=dYKRg0(`Mx~`CiS`OqA($`Z#D^_znken^uyZf;@JRj=)iytpWH0x1$00s?EJE> zu1>Au^T_aUrOUe7l)V5z!+@RuUjUhUb(tH>uAhPH8+B3wE6P@m6F@<80Y^nBU@YG| z)eXRQUqD|xh@2Bw_V!9bx!hCkY_6~80*WF$ms@d*gkN$(nWynQ3W{ z=DfCwaGC-zO&tx5w3232K6vY0yRR6#|M=!zR2c&@DDvX<`SzPndwuRHigVW9%bjj= zSra5)8T;Z*M`#4K)22z2@X>nx5i_ZsO}3LGXc1u8K4rVj=v}7Nzy$!|>QBZESAl{2 z_(W)Tf*kWgB63GdOeLW+)v5r>=t3Z|J)Ay&D2#`(>yR9d95iE5cILVjwzjse=lf>H zPCqF+ig}R>EiE{1W9&X^hK8~&v#vTa3U(3(WAFddXD3A+%u(?&z zG9IIAf=I<4=hm;r8YcOvH*o?6L};tVu*RVyhe?HLL|+zpI-1b=>n+db>5St<2@GRL zLL;DZg*|KGx9X?mFlqdL7D<9acUglc<>rXd-{Undr}!Y^5bQ?QqlP zas#!soaY^VunZ7T&A>N!)mz!7say3Upg|D~>O>nbU%>7^0Wc6p$DmQr<$r=nll6)YMdfUs`M*S{M0-Aps#Ndo1|YU>B~?Flqt& z@72(m96(&cJ7fT3z_U)O2@PUd0~D);T{HM-xL@@lW%wDX+TfRT`03t=pqe;nks5%4 zGl~Zfa(vOJn?ET{T@4a(RK#niYT_8+Jo)wY28jYtTfM#Bw>*Cs;YeR6;wRDs65$p=WyCSZBRGich@kWCSY-kH$YKB{SlQT= zVW^SR;~#_!8-PnNf%9i}W@^;S%F0M6&uE0+rTLw=GuY16yLkaFN|n>fE8LFpy26~r z#KleAePQZ*GA82u`^y6kgRF2GLEDv%aDY>e0L2X?Eln224enz=l%oho?r^52>TTD3 z-19g>wgzN@;Xdm~^!z+7@e0R{Q{JypahNtYF70_8^$D&5NcH8*%@v0swVP=e+AD+; zkh##04JSDxrYg|IiYc3yL@8Z;MNqXQq*F}|Z1vG$sk!|=BPDauey)WmU;V-<+&93_ z`hs|2Emg^udZY<-@-e8kALolnUR?~-?^MtHUSDS}7|VBTzIX-j!||g5$r79sb?w?U zY7y5w)bVEKA0r8j7)L+FFZbJl^}>$+{`e55h3|@iJ&_HpBobf+5LegA6z^SO)f6%P zpFe*Z)Ho#1!>)YAk9v8jCH)$&_5Pk=trW-kl4z>?xs_b-u74!{>jGXv@M|ixJ=!nFTS3(A#G@Ox0Pfv$uB|6kA zN?vrS>wv-804dRC(=8qaZkk-C9^|-1L^S-nD~jUYy>vjXTLUm`MJ$(TF@P=Bt^U_K zmgv)~B8PCs9WXyOfb>XUx_k3YF>v^D87z_O#T1QimbSh=;_KJD>-XHWFGY*!xHkJ0 zmE8^oOtl<_&x|Y9j)P%aePPVU(-Y<=ogOK#A8`9awkAqa%M@c`BG^6(=%)Sw@Hh+* z`4}aIoy(fL6eNqdDdF5_(<_v&g_V^Zuox&{YR7RcmvS@$_Jb3qFn~&X@!#kMNQqU_ z#cfvssBmW(74NmmEUv4|Qa|jnyKu>8pOnjzQ9PHcEP21*a0MFw$bTb}{^NGaLXeWW zeJcNoe}gxmdbPeKUzBsF6>7kvBgJJM*2Pav>lN(vO&m{1{@)UrK`-d7&X?!6D-8_$ zxy?INfGQjM&woRFB^*oN=Nu-6vy}mZ<#vr59HLA%oimK#5ZHp6{MF;PpLN z;vKy6U$M?2uL@I?Lkq^;*rksji1Rr}{U0dZ`QL}uZh;mF0DBT;%a$!mDo}}|-Eh|* z_>_D=;0d^d03G!@-L|nOSbS0>(dk90;I|N$(DnUR+O^hC$6FKX`4>_sfsRRB2^Qd4 z#iNS9T@O_5d)v$Y11CM)^)3_$ECNQ-_919dOvCQa$5K`!`IS!}J!<`b1t>uq_CQSX z3|9bU;`zAZ2-Hea@4A^m%+;tN?sfd)Z#k7`6~y@SUC>}e?cXA&eI_8<{clg8!TJAI z5Cr<)mpe%%VgOtO1E(kegoPXbPmz;;=glk@!I9(-Fk zU|>Lq+@CP7s0iT4;kdZhA3_Nfnl+y_?b+b;Hl6Nc!gWsuBoRpW@HpZ6A|DXv-Djk` zD+L2+VSZs@G{Dh0>we!i_FM|+cnoT61u!HRFt`Z7hk5+?F`YZ7wzhx&r~2!yF=E*{ zAnWerYkZWCZ-5v)08-@(g!hnu1{c>OSxs(SH`#6@<{Aa-8fW7uD!`#emfC~DWoIK2 zuDf!MQhH=mAG&b{1L|CRd$D$y)_AbV0RR-s9vTx*$M^KBIuEVETs| zSb~y!fe3#Fj>mOa#%1P!n*XfAbU_YiLkQSMi=S|DA$oDIclQ`t35|gDLk?vI0iRiK zJ5$*bEgI&rfs7F1wnY9Ba)35VYyeS!!t9&pUjerU_Znz49cVNNx3sgy+8|eUoM@y0 z1`3X(7Z2+Li6DT+H*kUf|IM9|xT+wdKZ$f@efAzRW~XA#URf%U21G% zod1!~WFNjQQ2LF)I~UWDt$Abo3nwhmZHqx(~O2d9;8uI&(Q z#mk$2%NARS?@D>!y{hnQXP1gwh%Z_F{NH&+Bj{QsCDD`5f6EjX@o%OzMcc_*|0yXG zn=K^?(VC@Oi788aIc~cG{R1oKGL(B61`6@M2P0q?;^F6~) zgEB;(WMpGAfYr|ZXN0Z3?wai-ohG#oWg2O{O=bDS#7_O!-fUbrkCp-Rskpg^5yP_dwCbE4OT3L!EFvY~jZmaLvb)4P>48xDIQv0;#XH^)3bh_Ze z2E6mEkm))7^7*9f#=48{MrMUopa{a+hzrPxsyqj(Bc3x_jLzl$TO)w2QJokso{!HR z@|d`i==5V_p9)EJKo~lhr!n>S>0FGxR;RZ~EIFvD%~x$>F5UA(3do{cY~zPJ$LDgl!3Gli zGT_j)yk9T4>)u!dyrLMplBj@NacZaN4|mHH<-xNa$%XOt_?VYwNs)v(h4C)X=7SU& z9VzpbZgnTb<$wMbflk6si*V3;&`16y0E-`PrVV)!<|mEAIAIkU|E6dY*^hE6*4uv6 zB6~JN^V3b)Qm^WbBEnTR=YfiANZG)`m?AZQ?a;s+P=KNX?@bV@KG-ADa#hKDTQInb zlKlN$PR?l;hLJMc=N6iE}m!SF=B$ZT!X`~OL*raZrS z^BwBmUnTRpF=$f|9WCcn2N#%p*DIo5Olqd9RU`Rb}rZSF<_Htk{ULOH*Q3Kb2E{GLgqNMSl!GP`}3 z`$gNPl_C)lk{Kb>(871hM{%GL!DIy0c2bHan3FK6bBrkn8T(tdJ$UP$RAx+m)%=@p z*UkAWZLrg}*TltK5*&YjdLQAIkT^9Q)F8w|8U{f%7*^Rh<-Ed&Ww#x_Bmr{SKXQfP z{axt2SD(*P6kMyPu^VLsjLgZ&;x1Azw=SLo#p>~S?HUnvLSfRxxXl(?n1?W$<*e&E zKc?Wn?&Lt>6?w647J;wSIU!?IIkIrvG;s3@)E z$7Fm@J~W1h-Nc4C!~)S`D$Jrp>p@=umnCGC(HaV^V>PkS{6Q>NuEgpqqU1#SJHHfL z=4S>khba9pk3zP20jVSTv2GP|*)c{BTV3?QFIbJ1mV#OH_)hC|yIec@S%=4|z5RKG z^orpptL0nvoI1o5Bn0&)L05JT5vz*hqow9Z<=&Od-fAx8fK%k)$5pl&oU$;eI$j zBT%9z%tlar%LG}Pe{Hv*D3$scAdnz%6#&=tT> zUeC=;`72~!S(Gsu?c|V#G^$mx0v4lDk|O`g+%RSe1*1MMh3B^OZ<2IgF>_32C%LfW zS-BLiW9o#~eSxxwgHxjzHmMJB_$(T59gZ1neqelpwE1Bb>r7#5b)$eY4Zv-FvYd^4 zafi);O@qkR_O$5v@r%l8q=L)pSmUyOY#N-!-GZj-4SjTxI2-s;x7)B(74qyNKITfX zxp$7_)3cbCySe{d)=yqcyA~NPb$9;EZ$mG~G>OZ^?{R87i;e?i(DTTS0%WCY2&B4e z=aA8iuD(vvzM4ux9;Iw!BWCpe_&QXB^pDO1t??0h7bTE~4gJN{GWcAS%F;viDU?E> zS@z{J3j^Kq{xaW6Sy2HFEiaX?I>tG(Xvt5+_%c&I;X- zvcrGHD*RM_)BNd{{}I1FI~P_9oRZ*Ug35&U#Uo743~sGOUOZ z9=GlX*!p3hHujq9-4+d1&q;R0@@CzPz>AP7FstulxdTCxe8VWGuNk`vnm=N5MzRXn zIJ$iwnP`4eE8(KMlF`p3_M_rz9P15e9naw}L|gw`65Qf3xWmFaX&Loady{yDLibEG zW4Axn0=D9-R1FPKQVtnTd$7B=8R`!%cw-Z?oQXW;e@6U3-vk6MYMc)k<`p>njLDItNJ zjjI|W0mAVKGS&bP)PBv75lp0R_eY*~Y=MPwe9_PeIwVB5n}#CaiTWvG99LSM+ZjNr zr86wn=}hd;g*Gc^ntg;T8GFe2z~B&)ZXcpEd`05AD-<_DVy-|YI;5AZ-6pJq9V zs&t-6MXk0z>3r;L#w=IC$9SU$^)IS*Na=Esw9HCS0`Md)B_eTh4G+bJo# zy2>V`<*97Ij6D%;!lKZCPIh@VOGtzGgcFt|JW3xf!8z8CV%&}>n#kvmxZ;>AuPD}J zH8p*bnDsr8#y6<9TE@mhtQd}c`u|Y(o>5IOU%zNT5kAi#WqKJY)DWP`=kU&5>gsuY8kuJRmNa!dvlsnPqdGC48S^ss;{czV^H(zv-$&@{N z_U!r_{x(KzfOTS<5mR9c1LcqmuD}D`mdLA`Xu~Qn!`!mRqGx!sy(BYv+rihZbS9ey zyPQVj;}R5Uzf!n48Llzd{Q72OR&mk`WY=9S-G(iNYf)KQB8A#hIn`TbzwYfm9L0ne2KhxXAg^tX6RfA|N zBr>%Na%sWUGLt`BpgNgx^4(n;t6#n)lynX+c^_0i*q@G*=DSUor|?)Iu3mo0sNE$= zoCOEpe=1Kr%fEz#VybmF%;n3L%Ifl0%M-O*;SBjx7v*h++P@i~lSlI-Q*}3_7!Ffv zwSvv#`wBOQtlVlf;+kvg5c4eHsLmy!Z%mrXY zoP>U?2E4a~b*o%WB&+qNkYkDc3Wr%)V$J!D+&g$QuQ0p4sx*TsYN8<|BPLQg)z+mW ziF>rt2>(Dgen&>GT=lm+diHZ+Z)c=^n6}dFueD-RW&YF&|DGP5mI@K-?|N~IZq!>U zjiKkt+KO*zU+2uErDH%p=4=XY+#)*cig4I$_Q?1zNSh<+{q|)!Vok=rDLekx^0iT&>Y1>{&P3{Hfb~-cq!e()*s_Rz9#!ou}4{O1BfZk^9}3 zV%z?pfJcH18FXua+2dg6^%;QDGU@6K9kfa%8&96B5$^04effqXhST5n6?vWl;zLUA zGx1RPbCtKYTZ$A7InpYI+1e=y`M)XJqrH-ghFbb#tjFnvBuC$*^(|PsEbIuJU~#;!?TpGV;(T~puLxAO<~!pi4cJjA>)NcJ`XR#Iug>wml6&po!Jk*Q zwHijwF2ezx+q>oK%&+s!0}XY^n7-U=u`iN*@~fyzd~auC??O{s^0mUp;-MOCy`fiw zoOiR**gB7F!f)sNu-tQzw-Cw}P8~j0)Jn63`s6*?FIA(^&uXZa;lywJIu;Tcaw*g+ zmvZiZ^Gj#@#5zrl7FmxL@E!*IGAX&Uc401(9JTI`tRJ*Sm9_5p!ZeMzn<%P;~g(|(3+DkxJ zP(6EEYx#?&@|!d6og4E_P^0+F89n)-+b}D~%k;=rehtn^mloxM^-3yms0b5JF!zQ9jIy^$YWG*bI#l{ zd4J(rLe`Iq@=Y*)izX^v+Wa5h=UDcW5PXG#Bd)6g+N=e^l@mpw27S}I+8{DtMk2s#lIUm2F*8O7)ylKIWNPQaq z<*Vl5(U7@3e9xkq;q?hI99{v<^G<7K*}0WRa*;<#?c=$!j13_@05TEF)UK11(#e>9 ziS;ErZfNuS5@MAuGfqxERI|fT-X<)%qDT_&9xd}KX#z1?T0VgQX#|WbwO#|=MdcXN zx%oc94_Q6r8;n`|@2-M3qd^7bl%2cC?F3TW5>Q&?_ z@`H7lz#1ZN_5{ubX+kL5-fFH&@kZKw5k(|%W}bqiT_O3@OZE0xWMJG6RGf;O=&#Zi zJZ9z9tTCp-^QpGGm@w4gnKvA>BPr!ZQu1~aFQYbHU-vS<>H8=fikPFz%8JK?{&va# z7PqaLMXrgSiN5o%n!GJhlfkRVCV$^tR?f!Pvvh`8PD4f^V}=(-qv;VL9(!5=KCf{p z603Re^Khb*V{^Yl9F(-HbGo%ErHM}-f$j5t+u?%1iL6|$u{39B?_qRHv+ zax|hJj^C2!Z7FqKytPZCA5WF4qA?N#Z|UV1Ys|p739xfNPUd{Dgt|72zUvze`vgtl*b2Pi{9;?p!f)I8H*q=?ZMWMK;GEB*pD)!pvoM*& z*k08YiwQExV4B|cv^K0gJGkXmf@2c6DP=V~gDU#=vE+j(I{ZweW`U4668>D_H81=! zt$=l~X1#qan^nc;+8gU!#C6Q9z$%(bzA=<(CbXU^SsKNzZH1|V+8+eIzHp|Fuhr?> zv>xZ?gt~?3g8q)z>{xg0n-E?UzeMl0Q0V*6-k&rrHUZx%-U(7uh^DI6X^~A)kz~MN z38EE01YI)9v-N8Xku-k4&ae3Vwom-yLZ3cE4}589FSl(e&BFIm9u0TJhuH0UiTHDgBHq6Jm$hjk(N>uk|dtx5K2@w-xab95gu0+xI zb`*g83pBKYR?t{&tv*%eHpuVCUnpbzMB}0T3R@v!jri7<+&gvB>?)VG^(?#M)adqA z%jXJ#p_80yBcZK0F)zZ~18HTRf2A#Q@dX+sBR$7{;8u4hb zYWo$Yjp#TB6it3BY>>08sW7wx zDbnrjvC1I9z*KT)Zl6ZinjP6O6kdfa?3 z%@X5KNH@gi0_dxhmW1ONAbVPEU9BWT>djk7uMrgMpP}z$9t#A>g`#(X@bQK6~1zi3vHH>niHnWy{eRNi_Q( zC%|BMIDPiFzO#ry%ck(+Nf}O2QR$`@`pM#>pg{GuiJ38@4QHRs4L2K2Rh|gy7|ad! zx>b+!a7}oD0=4jDIr{*xg2gTt=046DsthLqxE(e}M1po8-gG`p_>sG7wlt!wIS^E0 zM4t*4S=AUj;iBpMvH77=r0MAVfzJ6qfvqcxq%3eyHt2FIKqgPR<%=8?VU=n25NZSp z{C3RRoo#b(F9;95?>eZzryEuxAS|ZL?sn7lhpG&x+Ev`B&we=^r7#o=bPrSCDh(nB z1B}h3remBzfW;uaRGo7K7#F%Oo2b~!xBxqfglK+Qq{BGlKR$uS(*7WlgmXDGeOHQ> z;4FFz?)(i9r}Puk`<}?tlZ$cl?=yT1)lbOy(s5a!jydx`;e$o?r9$QZ2c#+v<2@HX z6r(yixw`Tb>!0;OggMA9FTj0!vI*wq!zthHC)&Q&ZL)VUi<4wHHqcEgP2#1P*b046 zo0xOPLul~5N|#QSvcIDCm%!)B$%ce$-X`y!A7pJYw5v?kVV^W5veG=_R~y_y7Y|mj z0E4g-{u?Jn>*!Tl>Q@q7t57H!Kc$ni->O|Y_3bI9SWWu%^?sFb)EyhI2<)xiGOTF? zh%ptqBoqVI?R zU;BF+Oh(zw-*nOmuHMlZ&I<1ytvaQ(acXk?haeO*g00@NDUp3NA@cS2wgHxy+~37I zXt8UozIY?_mdIp{%2nw$#w)H~{*kV3#qif6$Ju}Mi)<;%q=aP6LN0g_ms)FmQkt5$ zl*QBhUgppb9Mk ze2cSz)9fEnA$)=4jLQ4%d8T*&9MVSl^r3XbZFY;?Cuh9oVvCxMDsm@|%WSCz=iI8+ zhlsddvu}960H-XeVS!8V6&1uXDhtvS*V#L986X$K%kILss8p_{e@%Dd&C_IO5st~Y zL$WH}Up+?>k#8JR0=eWLH&VrD7UeuUa=n5e;{Jj4VGJsyLTMI+jw9*w@-*v;C8|_& ztPYr*LaW&ooVta1em@)6__pbHc!1;zeQ`(jN zaCFK|t&8FkCPOdcopx)Wszu7#EY(tFgZg*jPxD{PTqEjnJeAAOKoo2x=4Fk*ar#$s zhvQCTh-yvLsJlyw?1)^~66MDG-v}RrIqUB9{LFo(kR+y>%2*@OC?217{d!3>U$*=K z7iZcQU)+gI)X}OI2#{jb8;vpd9;tuMkYN~1{UF`fXH(VW{mZQ|D*11r`9u`E|5t>rM9`+7-9Rz$ zoQTGgQUVGD*=ERUy%eE+UGoJ2FP1;{HBqUaRqN?7ovSHV(Vy&&5K2?3QoWjFbo@_^ z?$0NHh#&61;uc@DEIi6*{j>m_qUM&rOMEnZ~GOMp&KL!h35v&*F zgm19PzpYRhv9WV*{3pXLjqgUlwi;6EXEa?KJIbbuMlhtiJQ=EM6=8;!ZaV9XiV!y1 zP=5(hPUOntlyF|-jzzV=Gd6`eji`Mj|9MqTqj5BR^y>V(p^vHaSkYUCVSFkr-H|j0 zQR<<&T=2$QiO-*BsCvA50^2U8qU9RBd;Yx@jb62cM~Qi-qFT?kK~qb(_G<5b{e9() z&$lr;XS~?O<-^gqm$be%AAj#LqO-2%zCcUIR4iD+m!F^vpX&s%vgu+>f=s2XrLS9V^R{98l|d2t$WmKKX7na4j$#q3`WAuGjbWJi+;1 z7v|VjWy@35-M_^yUn@_ex#OHA&&7wL8hI1!pq%p0XUZ^+Y~?0&q6^U&b31m^1}z~i z9$f$c=2jpzmx1bA8TeO?4p?wrs9NjtJ+ZEov?I~-{8Z_MkBI2p-)m^QF@;iMfYbZG z{Xu$);>gZJQeI#0;WiWBFH-R>(cJ#bV0vty<4UM>deg#d_yULjtr&yxs8M=UAn1N# z;Y;#Dt;o*G+gw<{OObA0kJZsWH4O-*vG5w1>X&l>?YnE>tuOXaRGq_PEK7rE{NeDY zR-u;^hy3=M7-B`czPFW09ee0pJT&f~)|XC7@Uy0ZG{};wABCBSMgD{@;{LfBl-k#- zYX&jLM~^uwF2o!TKQN&SaF;M7n^Neffduf}1ctpUH%C2U#ll05qyGN(i$}zbap9^* z@SN?r>(!9TD{d44Fm(+GL=41*Aw8IWzrD(30WA}k9C)<_RwbrIj-&2@JDKANQW{-G zHU#2x9w?+~eIJJoWOM2cONy#Aidl{%IF7F0Bpz##dc62=k9BWIJz5Q4*c)a@ikc++ zuwX?H=VlFlQ#xMxuih^G?M?f5boj>=l|w;ej*4ToZIe-?A*AbyTQHuy^0Gj10y*Sw zXP*7c_se(B5jPBls}4hi%N)v!&Nl3&6@b(8p02zdtnodGP0FKbBiO7Jr1xC662j6`h5Qy!xlt zo+{FWrp~G$^2&KpVMh>0rhnEhkwePs`}stv`P8*xI~&*M#2d-NyI?^QCAlyQDMPX@ z3V}IWFtMJ!xMlb1+M|%RHih6ec+ z1(l&9JL3_#oC~i>BH7R7p7EUvK|E2zcOq(h(upB&fDnEE3dp0(xfx*3 zH_<*0VFj~Yz8-AWRA4a_65h@hkQFJG zn;<1N$y{77d*o4{+jITgF$t}{&c<-#5s_tWyr zC^zl_{$Cd(d0tdr=}J2Wu8HxLH{_^mPmzP~)3O^VNL`#G*=rK4+fkGBiIAxpQqtsQ z0g8YM(n>n_YQFJa86yGw2L@A*%GCiSpXOr1|~vc z=RXr^AP%dx`W>(ov+TZ9Ib67uJR*+Rc1S@T{ya4+HpoR zxwmGv+tk~$#s0*MW!WM5GRk+g0p7cYcQxLRn&MxCnr;eidr|z6@gCJ_1!=5m+Ff6h ziS8oSRKnx}6b+sr+1YN_|36E5fLQV|^+T<7_HxK^8-s9Z;fRA-1?^(LU==x7+?fNQ%WHXy9!hWGK9?E{`uvQ0>_bwEroE`TZO@$-|qdiFX#!O9+}wJjs zMWC6?tXbIJr|OyWn70wS$qz9$i8STCt{)g~Qs~4OyKeNq{(^@Fq~A6S4J*TAQ<}BX zKF8rtUQ3*^%Z07q>!;97SxsIS-7zQorAO8Lh zN;|P|Ew!@2df7FekQwq$8RCO7vw`39V)@_;T?>i-CDf4#sAK;DFcg;pN3YFX5P3K8L*xb&? zC>bJg5=1_?sMFVlDG6Zb+|VxI1Zt2dcn!F8E{Q%+ydv2qun_*3>VijySi$6F<8p;E zEnkFL&43X7#r!F~u&Xt`*-VJ`;#@Vvkjx$M>;`1@IRUlY2P?76*Gr9%LDT>!(K01QV77|sGP+-<+W&^G{0t^=UOPc+NY%a*IB$sm=r z(r{|QG4nhJ+WR3w(6dTfo83Y04B;Tf>hot*`QY$PT{LN%O?lIX`zq!=Umo#L`ywje}dF=!djxCs+wK~iEsc`j^ z*t!>Bt8)Z}90}#XmNdXEcSS`$$v5S|`)KI_C-lDmFBF{p)|bEJFNGklxQ z%Eva8DlY@IZvZl8=Q({}1i1Shl{saVj8M_Cfvk{h>GJd_l;DulXsftrR%po>O+f5Y zuRd?G!v>i_!w-%qV-^!w%_TRAlpuVskebF6CyB`C$Vw@(BRXkgAl=6)n=3~GO+;3> z20sNbyD{Z7xsKH?@7=8G?()J`(tjBre#aN9q07<}4&d35vI%C)@xTwkHI!|f>S^`9 zILWDPoH^^&UScVs>WqS=>uATdSxZQAXsarrw|$tZR74{-B|MDSKm@nR&0JXWNdXFG zP*@hynFPcwOZmwij;0{#X>a2pMQ^&)$2EFu9J*%I{AqH>A?#U=6 zL!SE&$XB`@0*WY%!oXpCY`Dml%efA!0U*pk0qvw>PP|oO98Yy*z>P8ZWv-tEw#^6U zWXiA?47EDCy`qy`*eZqI>Q;pxY<-R{8Z>A8{v_b|y1D#`pJVt_8*Y-WcQv#zqh^sx z&CD-g1S(;Aa30gM(=vgIOG=#PFRa#WH6b@MG{}nFl7{A=({xsd)Z<&gXY^Xz_O5of zA(bPu0`fW(I*ki(=yv{T0+d#{3oegy(o9|rByd?BhL`~mA+bhq_UD`Ug>_=_f^I(< z|0nW!lE{Y&Z4QQs*6eX@3}jCiR6h}q!OH2U^P1;>;9}F2mqN0hBVn?__hNX3I!(%H z^KvVlUS<)RVd9GTJ8*gN^C;_j^#QVlf>V!KqfKLM6^k|3gNv>N@Z8(;pBz3}TEY#4 z+t~1F9vQ>OEtv(bxBF>aMS)D~mV&G}1@X@e72ff;_v0IdwGr!|&YmB$kchk;9*xD? zhNeX4pEjvi2O<0BlkzeAP2#+=O)#$FyPX3+cSRS=)pF7Yn=)zLJV5qq`Cp_;Tl7Jl zBrk{6ld!)06R3MjwCumRv{zL_tbA0`XUkz{1vuE%!4nO$WUj)7^$WXtH+$5T4B6|~ zuIo<&&iVOokD2uRX_BlUokc^S-o6Wl|#L*hwG74ps$VU>@_uS4$ zE{1v_JB=Fu+K1rUb-hPW_%&ALP?3?H_7X5^DFQ@p!iwWnY}I04I;k95xL~`zi-{uk zCS`ibyyn2o_f(^`ZzJKi42rxkRI3Boh;Mk9B_xa6|M3!z7!HcQ=a1Tao$9oD4+8R@ zeNVY3j}Toj`^L@GX}-J0ncR(GNZh}}`~4lh1Ps6P@9+^KCoJn2eq17_6>&)(>`cy2 z4>ZOsuc4uKom$&}{1HdQrPHZoyVT-!@HgQmgtmmx`lXLfSgt}5$wd6tlE*Z{VBtP&!!cL?{ERcc)UCiFXb70K&{LK_ZkOK zDXB<`6sZpG1+7MfBHR7E(<|Mkgxh-|z&ZlDQja>2wO0fvn1G4dpg}SbYQl_--@4I$ zBU>ii(ipm7!Y2$YU*Xek=qM6(NVhsPg_aC5fmXcGGITc3-5gHW+W&d@9cgmZK<~@~ zdgl!w%~JkM&I~VS=yjceZ0Fa~=Xd2QVgJ1ib7BfuBS>}yXO*E z5gk}jAXt&qpB1SNDYExbG;1~Z;$348UT6$qK(h(Zj6r~61xeDY{xl26j3Od2c}3S9 zGr8dsaYdJsPrFg9yvO&(gDpKGZ7C@f)j)Jz;fOyV(K`;`+K(#K@UZTuEfoakM@IRv zH)->p0t*RTFK9v4XOY=b0O>?qDgy3w(59Ny#z2%6Z18(bqDityTCHnU!$vc8 zG94HXiSMlf<4uspyG9yM#BI^WmTau~$56}gtFAZrAonMR8)W@7rK}_cPKHDPg=~9+ zIfj*78-J6t!Z!(2BeZVlzRc`2Lz2)3aWzPQ2f^!Y5rrd5xZq?%J>STc7X5{m`upHt z2FQg!U8orHL@3eG>yr)f8Q$5uAJ)kMn8PR+Ru`BMv`tc^r%6`6QEUGSmHcfJzA3Nl z0$z$&^!ne<09xAT!o)y3cTjHlx7`Hk26_wg{d}mDZC~tBI|lfJG;>MAjZ0wWS4cA_ zS+VOXhWm2a_F!w~ma_{CbSJdIs4AehAkZ6W)J4*$6PWg3-i>VPl?KzzSf!(8b5|Ka z%`1e^_i5Q_$t0E(Cap1+w{-#?TXe}$$Q$V1w_Wu>qYH%4LeR+fzZwnky48LeK3SP! z{Go^<`5GX25PpU)m(!AtbOVQz4pc23JnjbJwji`Q&1>YsEGheGS%7F1A*o`nf3|jD z%R7>@VVJ7&>U5w(dO_MFHEkcDK(3Hj?(-jBioq^|IGezP`3O{FNc@a`E~ld)pb-zLjCtM2kFLExxUlS# zuTnPTd-Y~^R}L_8fY4@b!4vCq-i^Xu#&F|)KTV~6EHL9B%(W?ydvK&N zj|t3&%#C6d@TxMP$XOtWVu45gju!10T~4&L2<^Rldf&wDYYe$paB5E08SvBTWK;Ya z+VM)`?{E!!e0z$w?ybv%^`3QW5(MT7H)*|~HZRJS2R^+m!QNq*Gq)$y7XST)w_HTz z4{i3dH~AqCi-=qIACN5+o^3(#05=8~I0In`;KJWLF==ulgfHzCHKbT>F{sGmKi|4HCy zoun?(7t-@sY5bI2HpGOl$36Qjx?qy8{8I>^uX8_bs*G}AJBbZ1k^c|{s2Feu`#;x>1H;9+?l$3oPuSO)z z6@&B{064A#4}=n=ey$d^jeS%UF;dm~I6ZH%WfcLBY|i`GI}Fm9TWB0{O1BFj)O3Vi zWvVy#{=@j*W5c}}Z#ZH>mSvj4FH-pq+P+=w8(pL(dwZ!6^!~(8gOk*n%W|NUuv5X0 zS9Z_;I~JiTEjQ|dvT$mwS@1;{+nSsbfC#QH!K!!lUQ2{y~W zX%mNRKsIXQ3FIRcTbn)_5ARSa=st||b5XdfpG+k8umhs(l=aM*&z$PJXqx<2#zR}; zw0SpX!}U6`!B!=v-i}o!GP^EC@bSYps%?Yj?3})&_qwue`tOGoM}eZAx!<^UKZe3@ z_22U+j$`L4dA_&Ozi`Zfh9@(hXlQq3dTL8H($T+?ROlK2E;e$yi~?|qNa2C?+hWWT zirVkI<$tv(NLy)?IeI8dd3UY`dp+O0Y_;rD%fCvMGrIfAIuSa!VEy}xAhAetq-?k63puE>%h}aHTQ2#GI}xRrJ)vg z*L~0v7hm8Pb>0?d)8*}V`QV@m+M6T>j6zjCuYwoi;L~B!&PtBl>fa)vR;DpVp1jk) zeGO}MT17)n7`4+lmKB|`6gkd&$F=?#2rL>Ppn<@GlLXe6g%g&o#?LN1l>EsamD=-Z zT%c?E*NJD&cO|D!h;DVimfNc-EMkia{0LjXHg+Eh3!S2&7TY& z2}L>g-DrCBAunSEfpwo?f;hN5W}|x^s2GPgxMS#8TXemSw8QBI65zUVBV9M=$y{IJ zFM5qhoM&8k31&e7j{R5s+=rAYsh5)`Yzv#!O9 z(hAx?EJ?doa?1=cE!nQSDqDt49vlVc&!e}Y5vJoFDV)Lq;ckzkmFTDi%E@u&gd>yq zT?H6@X2FywkX^45f_{+{3sBu9qNnyTh~eninW7!KB(`wV!UDkJRJppvaSOVag*0OH z)-_*YCsMMWd1PUx?7~2r2Gr<7`UYpPb({vHu-c`_P@@jShC&#X(H-aCZh|l?r4Od^ z8V9T{nl+?1C;nEWo^{(tSn%J_ElCOeu#!xZLwx30Em6h!mVWYHb(JPx#tgq$PS3ac zVjY*;78spIg*sU8M-7Nkjz=-c5Ti;m93tc0y6#|00n|g_nM?p?n?6Z+a{|*;4M)(E ze;E}mI-LE95>!1|zvfM`ACGy!ZDe(ob0$SyIHYnA4Q%y3eAN}#+CiJH-+$^*2UFei zCUHY~_TSAo|K~DL!XT1b&34;)?mZHeCwVF)MrM=-8(V#;nM=6jX}_c=F!nxb38n8L z-s?=YCBLKYWozo&&yrmk@p$A=tDF={XBSYErj)s}Fg~ZiWDB5~3Qh1&KPc6%&2dsM zH1{L2CwAnIrkk084F|$ZX%s+52T&scbbS9kkWIFOh4$_~yDpqkE8pIHO1_+z_Q*Yk zN=z&keItm5sF~6$d#ZvM3?Zw0{2yZ@tD4J`qOj@}o=EzX`GBjg5tyA?Uc-Z|qD&2^ z1y2x(_P$J@(tD40t^*diDtNPe2@tl@*v`)G^Ks&Ta0rMwuUJ0Lj24AMiJeb6i8Xpu z?=&}E+Di*e$AxU$qvdzcK~$6uQzALnEkp;V@A}N1XEJz+4;lnZ1qa%a30ygAE$1v% zpTZFC0I z>fqle6%k(LxDM>>;d22`D1a+ZdW%_Og{#FV(K(kn@;gr>37fU?V!vKf7f2gE20>9v zVDcq^Fip=}5)8fQdA_vq%kGYbOnGv%b5f^D6C8Z`}{wHiv%)1)-mhsJ)sW`wA_eLI_`^y?W)zRZyrA{Q^k zxoEs$v&QqBSq`_eF^fTudAHs~EM~}>5mGa`V>?h7?V#@3^p}ai`Z-53A(Tlb1b}$~ zp!ic(ab)9lD!v>82Z~r+WbO7xQ-J=;Qxi?{_bL+hAH|dV-H5MLDjf5fsCJn&dW-Mf zQ`1iPoAR(N+#lT)lF)m%%R9}a%HJNQSO;wF~u7aOIM6WD7>M0t# zF7b=$&%;w7zWD!x9NWX=QQ~oBZnwzfv440b+>OurK~&t8O*8Spw`USo$>rb2^^sd$ zc&^bfzx*`uCBNbC(buhuXX0!>D2F9w%c;Mujr)>!x&IucW%toMFZPTIR@6f7l##S5-2H6;!itS$Y;Wr9GS zoILaA>2*Lni6Z`w2 z`$IXf2t2Qm)4VW5du@gXEp8sCDC_ZS2|gw@-+PHk*j3KT%4+^OME!2$tXQP)i8%Z% zp>5Xhf&rMfP8XC4>gwtOkM+3^75KVLg9pH~bwNX>9n_*NOIxq!;^N7eZ1(X3yG?hi z%9$c24LooMvi-YdcWL=u6aPR#0t$V(XD-o_;7jYAzoOQvI*Ra0t=b%MtBpe+;5bLT zvb5s0T(|=AK7sU>OBY+6SX%4Ilnf&ni4n^T4gFs#DR0y9rQLs4(-JPHpx$=!Ho#I4 zVwWZ?X;lmv{LQh2+|Y{nZ(HzGhZ!Zr*yiw5;UDY^N1U95$z{)hxP=d&?;m6?pLg*F z^CErv&YZDSsuOWWR8<*mWw(r&x=8)~g7nQ#9k+>0Y)D^e|MZ916n-ubtyW)nWFev; zB=5(@j^J<1mJN5=evt9@-au8R5=E*~)aU7*Ue$b!KJS;~Mps5Jn-z3ul`lrrd>#7- zJ*>f1l3ZA85AU{X`MSKK-f^ri3h1Sn|&mAR5 zQOiaoge-02gw2E)p~Lre7LV6+GgXPFI7sYt~$@rG6~tAJCMGx?o9LTiB&Juc|e}3^w^okLzV_1_vrF|h}A2x3j~&7VaJM*H8=$HE9Y5m!^=6#vS-aSLi8rD?b8eUkFgaB=-X(2 zXO}+`Y>S@F?h-=F5lRclW5_u7_>0wTuuInKGR=kw56cn>67FBU`^A`K1p~&lzC#_x)zanSJpAx{+P8; zeZJIvC&dW2x2T0GXw%xp!tLy!+QoRy1#8Wj`DCmgzy5ca3u6C054PvFTMgliYMNqi z9#VL7z zzN6Gw*q$m*@A$cF+6r$D)s?JpL%Zq1^g=1F>Vsk&x90X(gWecJsy$+DflyXaWe`m2 zyjTszRgLf}R8{sDkJH(%GssR5j6&@Hs>K>6<}IVXxA{8fZQFODRwR(+C!+=?9w`%k zDr&ZhYn~#uBR0-fmmM!HrWcal$^xG^4=?xJ=hEl#8W~u%8k%5#oh1E`u3Jpv1+3dPn5i+WbQVF-V=ZLrOjtj!Tez0!85;nu`me)DXWY8jVgWI0m zPwVfZ8xS|hkP+-OHhtJDgopG8BdeNoe6`p;c<`94@8+J*X7YJuCnHvpTsqfroB4%k z+#MG@zo&dL=F9Cw<;czlY&S){v)PVylLb&Pv$q|!a*^YHVOjP}{zC?QKl|kiU1jm` z&zHAeMqcGm^p)*DG@4r4?G{31s0h@Lq@G$sd28pnI;1D38KaFGAc@dnimuFCnI|_|$uRH>L4E zH?8A|h=6d!#-g*I5bWc;%N=j*rdX=*J>tW?)>8w1LaLa?pf6?B14qawp4g$>hAJ7i z38ewClvvd(Gh%Pg@|`rwN$Q`&UTdKrYIr4bW%##? z=W%m95OLm>lG;UU3qL$Fm8e6c%pBrix9;xxQnDzbVsz8MQfjWO#~VKxpE4O7oz)un ztcaSt=v?3aVOH>f#EA7r#_!$o(v%huAa9)bx^zb@teJ))Q>zN7LF(D#MdbfR_&-? zI>>~{1j5iM!QHs6y@Br^Rod4$&rW>Ho_;@xXsX)ya8op zVWB8qkB@H;8=oVNpB9ch@-D*_7*u7m-^?zps17-7ni%-bY4tYpN{7HpdqWzY+M)E% z>HZgAJv?%cHC03qm=4(+J5PJ-^>4@g7%ekg{m@Ct&bgYs7wHqKc&`(}@*)f7RKV6b zLEx=J6{U8td@b!?tzL&j{?a9Q|TO zh|a*Hc%7qgu*>tq{8m)^JmU!CL!Iaoou3%XjIA4?;Y6~!LygTwXKJ6DT1T8=sR zW@{#{SCHI2r{K$EJx=$KP-m#$zZ|CBdW=PEwAs>%Y3D_r#LQMJ2UZ(KvuU^ct@x3y zI~Rn(P}-(9`(!~(BhubC=LgD^_+tJZ%fshvhCDb#lUQnGJzgV(dPVEdWgxH;Uat{? zz2zx5$mv!oGAC}qooc=xE9zaUIp8+h?`K)4uoi_+G0wzJ$ut+W=X|E@g3h(tVGok3 zxGT@;%@lvUa1O4-`S z#_?ApSr}E>V!Y{|v0L!g;>18My>?xw5p$9as_sa7Zlqds=ldKKYft}BMVSYM`N@Yk zQ4#7@L3d{*;zOOgX6sh6J?AKfHnZ;W(-~LadaYHlL@Jvll*kOrVxvA$p(6J?3XQ&5 zA+>+uLEBb5I&k!`*ZGqJgXp4qr-{(b3MPF2?x+NA!78LU<${4;g%>1a)F` ze{G)9UgM}kA2UY1CH_O(rQh3?h`D8Bs;8LVBr|IOk{`!N(S{0@Zd3ep` zHR{7Fy#@Mf=k|D?Jpc58_~BmUuhoW-rX6kUGvBrkwJiG-F*mbQoa;vku%_+pFa(SP!s6`5k z(N^NB=Zli2i0*gnq{p9rdR}V6t0Zc$e?2x~GU9+TNSr4`%F2e&FQoM5cX0WA9`*ay zcbCP@1+1~uHRT`mr`hEtWSen0n}aFt>*-blsw;yF2@4VN!n6qr3=W zNiwzrITXQ!2plrTKh`%A!To4Ci=wwRKhC4o>lNAEZ!;pO&5YQM)C+lh5g!hGJJ%N> zWz-szQ)4!de^xVcr#q*7si(*U>nleX*G^C38O-(8MZ0@%TQ4Pu3|#jbeL5uOxvXNh zzu;bWTnfLwFplLc(2z|n&B`@GrJjA4*kG4#Q})DUXVD`TGqtGY#sk%yoAUM?f4)7QrWN5YiL)kE0pvR+C|g{fASh2I|x@Ix4vZ#L6G9 z+EkVaK4R5}hmZ@sHS&bIXs)l=qqSGGh~4Gb^)8hGpJ(e=J62x{Kyz(T9!^uf1KK}0 zyI6KJUGhzC$qVb{Y>C+E5e?8uXZ+l14YHCt1gs5o7+>%_DAY?GdHAE2arkHCsCxED zCkm>x-g@X0_~4|)<`zpudE(i!EsK>A!!pSuZG*N8wJRF%C9U_o3>Ox`<4cB}V}r8} z9`e=$_@}q-w+uYA<+btgn)5{K8a2V@X5Hm$H&aorvOdF%I}rL!{B8`J8)iecx7nDnuPEkuQ+r-Bk9q6X z2o8GCQfqx|h1S{yhiDx$i|kYIJrEhG_Ae~I+LUJ#qFA8q6ZuGEE-~zchag4l$24J?~$y~nata46S)tVmydWW$3(FuLcZQnj`&qDPAhy6L90;945 zr6xClR)h{+Qmdf*-DtMjfn4(?nKBlk>~Wj_i@o=bigH={Mlpa91B!}>0Rbgv5sh?0X2IV({Zn30?rGLj{ZWF$&fa-Q2Wc;0i~bKmpNUF&}9yWhIA z)?T>hnWwwDtGc?X`d8H$+E2ZGc~%geZWB_9z?7$d4{Whqu?V|xT(~Y*(RAO=cx0tQ z5;-AaB)IZ&3Q6ZOaI`(?PbZE<+#$m;!BN0usJ$1{SbWj@Jcn2nxS;Km9__`X@9`#d z^ig+L=7N^CT(dt!Mw;-*52^lq+w(rbh)#(2$C|svnl)b{1md^hpVh%z`^$BQsu{bq zc>h7Q)ha^m+|~O$w-r84zHYbVP>e;@7g1+G=A5!ZR`g`JkTqY%?%d;S3El5zpn|*; z6mKJ=!LJ5=*}V~950P4^eME)oo?KEGd$o*x@vZhbJi>JG$>_0l`dtV_(eU8l(K{@P zmn#Ap(qaAJg8LDXI3uG$QtbWL9@)*!6PJZq<$v)vcust)_+cRDT%AwL*s8ISrs`*F zmX*)I*eb(h%Gu?&{qoMV2t%-3NQr&j;-uRp55>vvPpGJ0)V(?08NnZuH*jrEyK(!a$?%k1)6-WB!AbLoH zh}RoQyHV)^>xMgq@V9paK>t6#ze;DwxJxZ4);26FecwN3Ff7fv)?S~#cdS?RV(q1-N@v18sVo4`cct>Z%RK3+MO;W>)t<8irI0UHU0ddJuV|xDU)%& zDgW8GyQuDIf%WKgr3_}F88*MjbMkVFZ-3{Y`q;-R#o|7du8hZ|-h_-t{Gd+FaCf)a z!tPd5(C;}q!OuNO>~_{tsah?PTNKDugd|0^`>wSloL33iP<#v7oeM+yXw5t zpwUA2b5)Ig2eV~T*vi0oeBAFt#T)2+ZX73_sp-VX_y|SQrJ%kzhEz;MV(?{q32Ha1 zJSKkFeBCnBzoq{Zj%}<&uiOqgsyTMNcnPY7g^l2v<*a$L_sl%kw)SQ{pULsFJGItS z=(?e}d`p`ras*pkDlOJ}q$u5cGt|9;+O(bgF!U8qUG#;T>YpqXmu74HUR3D|$Gjvn z54m75$`ftG3b}XKc5u+J-j2!S^_@>_7`XfF%8@lM3SA__AEzmMAP3WL4OI>q$l6J= zf&{j~Z>?8OM57T6qZfD|KF{Rl5{p?XAZ>|&Wr;l*^9xfjM@ElY-mRRTi`Wr@IFBb_BljB_pKtHWlN2b#rPv#=$lQJ7|Ws$IbL0 zYC7dx_q{YnV_;+_M?idi&Fntc(hUYU>hdH(#(+m8K>-558!16h&lH$;qN!Fg5Qf0l z?pz9c6B|r>j4@o8*?QslEyvF;mCj%1d_^6CVT)&g9e1m^8Ud`DsA6z=nb+=g%0)`{ zlz1F4#7l+Z@q6SsR->pSJ@QtbP~%2nU*oPT*4B#N@&ecw7)P1Go9~W0BahxJ2(3(D zR>J)b|Kh24&Fp<1*2-bA;eQ_aaRpz8me3XbfEZj>R!GvBVLsIj*P?{ZcNTPFGSFAA5lD&n7yBSIl zmBgufbg&=QrHGYM%k|xinaH{=|CW0xgJsIk+U_pJUd|G^?m_7n*lpNcAJ~ikt3FV5 zdcw#uGWMEtpL^@!kG8$51I&z`J$ZF+dZv19EM)bbb)36>zOGo-$R^K@wM_lgwM!u8 zdDlEO2w$$VrKj_3k$nYK@G4IBS*iK_u&u5}6Umy=Vt-i{1nRQXpANUwdJrf_slOGg3foE>lEsdo!w(I0^1^#e z@bVuf?w!}pDw@U}hzW8A!ln!$*2S$iD*UDrk`^OxdP#fr>Zfkz9LzpZD^!y8%w+lX zQg4caUQXbf%Zo#yp_PJ8n%s%f7H;`^t6W1nkE$o)o(xX}XZVLj+*n?ZhB^I|Nm)1; zwoIcdM(ecHc!(P}hBfcB-Ows+&zdoDGM|r_>s+0RI?jHrTAwOs=~mTyw4n72rlOaX zbJ4ut(H>oLoa+=BnkRPedzJ?hdArc#d%!aDOh5t8Jl zHKSS(gw@R%4KZrkNuuG-f3BY5qnW28V8cO2vK{{J!)Ex92hF2*o{mmVkikid`ap-~ zw4AKFv&DkY{a1(jaB5rk?G_-$Td{)F2eI&&ohkuNI^lCITN?Q`sY#n>o4vk=d{+*k zym9}lS_$uAL)5s3+ibK#+*LBJ*T81~u{+~Z9b9>%rMCDYj_FL9Iu$jjh>N}fR?|&T zTokC4zCQGJ;AW?HO)XqnPGbg9n@h&L zs~cbYCVTf`^?0+(bbqCvsk}RDWrMQM6^>#td1JBDj3MDe@U_hU5Yre|eK zoO0UA6+w=K-C9mx1;*k7E*aH^y%4u;A6kXAZLe<0%Zy=~aec19KR^?tT@4+<-s@nX zo5{9`o0-U0Ncv0$kf{H7jdXd2pHZLjOJ9S7IoVj%#y3iz-|=nz_Lwybrv)< zgP&>mM~nwFJF#v=wwisu{l`<4jW6XS7%km}_mQcaf)%slH+HGYcFJZwxqrQ#VUK(| zwm1;|gt@;6P;Sy*l+nUA4@>eH@xW(jDhM+ki)1cNVZ@WMS>j`L+CQq{vmtvMrgsnG)vH%Oo`S8x*<$yR*$jkUW*eIRo1se3}UKE=$d;CQFv9G4W3)HZ$JjtR%$ za*Te+am#7IROeH`R4Y=p)>n9F)(BH9de$IfKg+~mYo3>w)TPpJO*K5s#VEP2gxC&p;u$FZD9{r2cK_19seFpdVUKH?dZhZ#WCUD0H>6b$>Fb8 z8>f3nydfMbe2?xqZ1atT_F@%5>=qemM3<3C&0M2qeNWgVq^7kuT#kJHjNIvN%|x?w z{FYRjP?=BHP?&<0t{L(}WKrW+mLbz34_r}p+w6367qX*vM}F+p*^-UB)k@RrnrTPc zE>eqAqB`Sz!y!j?3Oasc`cHmZ%sZuRZe*YFK<}#L^&DrtCu^|m<%Vm1)<3E>w9WZ& zjLVSnop1csnJz3~wd~$zn$AY`qNdBb=&IGA{a$3xb{?;k@fXk5Gm3_3Sy(6F+jq># zH&~={&s1-E9ZerKXHME`u6y@=pSduh^)okXP$Poog%w0Dq`y1*4mtKxji7x>8r6Ed zB9&!#?)k%ez}`;pr)-Y5E~d)rNH`x_)}vIJ{|R3{C;ipMwWP4_>7K){vWz(@>JhS1 zX@TEIwJzM7oUg-@_xH#QB^M{Vott8wQCWVXmXMU8Yw@5vxU$i6A#Fw5oGe_gm*O#R zgK1<5S!ph{ZA6As+P0kUd^7T#`W^ZS5sEviFF7A~fA7z?m$A4QDroL`=Y^ZpQXfZ1 z`1rW6O)|@#LtxK0s%7WK4eMP_?fvQLM}}Up`TQ1OraZpxmCg7Nh+g3dd)tiqsN6FD z#n!r#^Gg)&Rf|zFSV!_b9Y2g+(64ly!eB`;A?|7wuEU8om~3}o*F}ZZC_7nhdg1U;an8=#Id>5 znnoV~`o)n@p-?3gb|kY+6J#Fs$~Nu;g_s`-~ts1dNEV?xnjZyxBke=$#LI4ql}hwjN3D79n0I^ z!ij8{R|L+Kg&R%Ostq3G$jQlN4C7TXqf1E{!sL>6%fPSDU!2l<2hRVKYijBolUZUs zGpI}o>K9w=5OwBU#^;i!w_F?SPOjhrw`>LoOcXM5Ki)q6c;*_FPSUw_M4XQ!^wgxQ zZQkjJvc%*0{JPct5<`DA7i{@y60|}a4mkSTlNC86Hr0d;KSKs&(wux~-<;(kX?%zp zxLZ-uY|-rvRHr#L>)(x{Tivr&8_x#kP*GtRP~?}`gPC6NvOnvPew%uQVomp^526`;Q* zf*j;eag+lpL@&pKi_3*~C(qb(dOzI)*AEgdSN#t^)he_3)RiQdb?G)+EQ&-T4*dN& zT5eDHy4;LNh8TeiD~W$J9zwX-Z}a$IEdkIGN4TK4bj&FMkbE7G{1@@JYT&mn1VTcz zie7zS)2;g4m!*^dS`P$&m%tziUxU^OZ-^4#F#5+Em*r$+-s6@Kp^^_Tdi<(8x9(ak zDtCnuk{EnX)#}M1G%D$mrxq|~A zmaR$1h^^Y}iBfX^gX3T4IurPmF5P1JR^_t62=!w4nCS)8vKz)wcnL*D6ow=DCREJM%N2CCW+9m^)Te&Go`DM>AFd- zIF#!A8T^jg+}ACsoM$C8z4?YMn+IWeOjQk|{3qigdGGB<$Ef%lbt!7hUM!1lVHJ+3 z(#c@8j*m~W7>tIg6uq?ngq$a9&&_=H!64pc#Rk|!t*4__e)iWIt^5txj|z_52+XM4 zmW$f9`CvABq*~rU!~{_#USHM7$!%Gj;kWM@{d27r0fs=Hje+T~DZ;4qmS*=;~nOm|hNf z36rJ!0FPlA23Cz!xj&Je)F}u}pw0^83->QA*8+zq%+FCSlOJ%OkBdrnX1NCL6*2BS z*fC$b)YJy z8mPwxMGs&yVM0D{HmrEp*4s-e;7!hP+9Q#B68Xr1>^Y&j&24Pa=K*Wg9}~Bjdx{ce z0McyM@Aek)#~=Oc<|T&ijMUO2VM#aG_7$MNF_|AQ#N| zoH5gm$bEUWhs7SUPsSsr)|AK@(iL(cT6U%B=+)W~(+NfwdRDiG1EX9IA1MbSD=N+u zmQ>>hSxw_qM69fywhD~E|3E?}nZRuP8ze*|c3Hu*;ICr6E>*KH4{cYhioG5yCol3c z*`Sq^_*9F-P5ibw$eS3gPBYm3u`#YsM541U6E#i zi!ajQSX`m@(CUPp4~;)~H{XoOr9@3-_-Yp|kYmeL#@KP$#og$tC`O+*66U zyd?e{7jDHslvGz~L0xK=m+ViXL(xvk{?435)#d;_S8V@-bh) z*`hx)W_0mIAM+4J)UjUM<`j2f@j|kr8U3kHYDi&i>L~r z0r>hW*mN#%7X!n=j~8H0fdTnBD@(f2qo! zr-vd8E?yJLl!b%E_<^$ZERVTpOYG|w3P{qTdmr51qe4KC-aM5;I;r`xKGXiMhO1lP zrue03ZL1y~=dq>-(X~9!z)kUE;Hq`PCG(qvhYeRnc=!UJgLZW?fzb-UvDDlj4HfXN zZ930}ZV%lwL1S-uc)BR<`=gsKPY#dPQhmG42LCoyrIi(S{f0a*)-_6h|lLVJ8<0Lg2c8_0A#?=;}$IP}w;O)pfkU9F&8M-U=>rcV*L zGE>vjkejEJU)8-K1@}tBz&GVg1_6ws4hbP;KmlZm7>k~%RkQas7EJ+{#?N=B;J|ng z=+oCE$6e-WI+FzXrl2SzYK{JaePP?36$UQp$i!e6`u<6aJQAWU74FVWelsSzd^!{AqlVyys?7r0dIDFm}$0W{}E3=kgV;X+^ z?dgkylQw2@>#Q#?A+gs)txH%)Wd*<^htG(ss&#~!?jUPG$9OIaM1+Z}p{tcgstes@fp(3MT>4%#a zT{_55g)CQTqc`32v=cBzDtr&FoB^>Nf(OCj`K)qkEdX{%aSOudsG{B5x?IWvGVJq67Z?uQum4H7dy|uJtI(s7>AA;c*_E ztV))a(;j^j$_5%_q@-q$cryl>O9vdD$Ab1^f zu5}0_j$c!s9j33=Ow)44q(4Wfui)~%#xQLm&o@-12M2QFVFLXggYZ+0(H+<^aNm?5 z6ke=4OEowAl#5S%ZwNU9ZC`5W@Dcu=dJCH_xL!0R47u=bc<;b)|48IE)A;DE+OMlm z)x|vm6H#(%*o@fUfC>h3Ap5n&`G_`XAYF4nmrI-#Fx^2a@U(|~XP2(@-2uf)f z)MC150LrGZ*QbOZE#(-`$NOUFlK@OngXK;yy1PHd5MYnArQq$vbw`*j$LF@R@2|)z z-Zw?4W5FiLxMUu>_&$(B zUb`s&b+CY#UHb{XTxF@1zOIJbXw4Qi7tEg{@H88v3cY&!vl%RFO2uv#zM{5z^vuyw z`uFLo*b3L`b)Nog+Z4WizDtG1Ozbe9w;LGo-e&8P>{%hm1s5$_YZ(avMyManRHH$a>dfgdG_s3be%@3W4$&yzox9Jevy;5=!aJGiK6 zjCCxDb$$_^!M+GBt&}27foIJ{_!uV*_|ynYt3*`}GtSSeAl#P90`A1-9D<|5)eK|D zI1wALddqwWQ6ID}MsG~S*7WEK)<^;NqwTtS^b3uwAON{w)rqqF2R1OTAs&s*;gaJ?Hj=pNcg5I75L!mE7Hp`AQf;IZm$P4PHgNn==YUzIv--?++@68Ypb%D)*Zh*& zjyBK}t%vOI3LuN4(^RqLqq9~YU@GgkrGn4s46k<@@6iFE4DM6PAhG#ztoFOox9+Fu zvv)#6wXoo9XUnZv-A||*S)sOr&r^n_L>_jG>w6UsZwDU@SG2Kh zxvFi9U4iJ*9EU2Yq{`wM@2D=8WFNt(B^zraXUqrpyJ4^7Jl?IRTnV89+eWJ>K@C{} z00;SayzXjrw^@vRyYtMwmzJ$vLagf$SxtQE#WgOR;ujaiDB(ET1m4{(>rt~UIaib- z|IS(KZ0F}Q8hvzFx}@jyDMyM;+VnJIw79;|^{N}O&Su(o#+ZMdR;@oX)K*Bq$%QNV z41IH}LL#GfQlxkPmP3v&z0Zolk*sHQV_xtYXYTvG6K zpxGKkPs58EM>be|^$X+1Z!vn=b?l;g)^f!LJ6*Q6_OW){-5p01II|Jcj>HTRA}a6) zzz*{MT{uMPC0(UbkYrbpQ(S3?&3SN_f6H$0fy{a%`$Y(aWLs8m)Od<}bb3wrY5cfe z?tbT%IKjse=F?8_R6{SH&31!@4(4g(WTe<;FTCn!_x5Idia1iV^vIN$B?sqRFrWj0 ztZmO*AO-sO{ghl$3amoNRc9vly3yy2vy)ioM)QuZ6!+Q~&HV#U0dVi}dymcIRoN>Y zjoT>$noW!cD~X^L|cC^ zG;)-3S}t<$$fuG@EVwIP?#-$^)!j4d#>_|P_m7W~oqtl0t~roCyHhpYRXe;{a+4BQ zy0n8g!IVJxqh1d&J0pCaRsD7Gu4=@JZk8-&Y6rwmMCk~-tc3i&_z*HZ3_C%$qe1;} zYs;^LHUyVcC-_59u#!yn$eQQ#UbPRqw6k7CFa5&gElbzOFBoSha4b7+NY{!1n!`+6 z=M2=Za@VMF`ql}W!TX|bS=ukLH2kpo)~x4BpYe3<6K8Mt??BliSyv2%eD#}-w2;{@ zWS8Ns+^SLxouj8o#EVZaKX$WsGh4aPGd|LZyMR1Y82)}uVEbs@y%aKrTu$jyE2vsr z#R?i&rS?9^Q$O;Oi<|-XPl~JH2sY3gg1Vt)V5^j$-Dx3&XnOl1H#Fjyl37)I8ccIs zAAf&p3z@vNljf*Zm?@7iU!3_6`GH18*9{B%nA_5(_M;7^jwoGre(UM4{2jQv44O!# zJUz|(Kc|N-mfwe{4i7UVm9b=3>hhavGBM@--Bd`)q+KZGxF#d}m1l=cA{ncy&>fwf z`^oTY$N0~v)GFvRh|Z#`YA;uoddQc|LlX1MHUP|>fuWe6m&gT27FUUl1=r)kO7M;u zZEF!T<^vV8M}}h=hf3+DV^@{VYSW`;mfjU;XQ1cpBew&XuVo1r!k3)((j^t4_??@O z7AW3kSd=CEDQj=M*U#vim=65&w)lZsy7h8%HFd4DLFW!abd2u`*rh~gG;Tmgi}VCj zTGdnYU}IP-=mxVDO%DbA_&2#R7ZF$2_O{&rxS!TyaP>2M%Qm zwJOsip-}|Xraerw(dF30Cr8&5y0jsgGh~7e)n%+hJf~xHa~v;=o(RCNZ~K%@9XX=3 zJdZwbnLDGl3o}VxDyaPyDMcOk+#H&&T6|rs*(oCYa6+d%=g?2}$aK0aM7Fqe0JU2u zk=>p*2h$p`Wzb#FL&FZ(bD~Tm(&-R+vg&IIJ{rAM^8pTeXr=^b)Mm{u>r3(%)_BeG zP|A6jXF1E+&9xz3K;uI6IWIT-#HRw^>;gE4+JE!;+fvj))5U=bCHam_{{PCebQ;V( zOS|~*PVT>?Sw?(b%3ztrxdDqWJwqpBCte$#A`^BXvrRsEH_5p@Y7tqf)Z6BIxKgu|<^&;v)dlV_AHJ0Xe7;cHYos;{Fz~H7M>UXdvNHF8F zE#27<|NPrrlj*!RAIPeMht53N$?Z5oA3}h!RiY$T%E1iDY$n zH^2RTUyznjlJQ0?(8e>7H?uL?V=Qccu9tWi0KAry&qG?m(mVMO&v*X$^*=H*e|%dv z5nAMh?JSw9)iiuMB)b*+r~Gl|4T^91i&fwRHp?^{glvUOwN^o(FP%;g1-}YwonEv4 zsk(%Nn{AO|mp4%M(s37si3WW}ibhuE4q0WjdJT+8&Hfu);IDDB=yuKY%zwswWoS>) zpxnm<+YA(LqWdI1x$R#0xXeIv ziMW8%a;)b>KJ=Y)tRPm_Ig5F0RaMm`sbaq)>c-^Jm2xjPrx~ije;G4f6Qif&rvf*{ zpOJK9NvM!gRMD)0YGFj@@Vac!GYdAg^-=w}f&Muy4Q{oXRz|n(TjjcoT)01Ruh>i( zQSrqkD6W0WZlY2Gf;7^h#qn_s9Ev0iVAuWVvj4}xD%#7^SX-(*2R1Z&G)`ve(gGKJ z!<}U2S|QrrcX~-iFq!~eXPu~JF$-_IcZI*EmnmD0H|0V}yLlwc*IX{9`uZS>u65)+ zyMLN|aviePbwJ5&hLA>@qRHgHP<}iCGDE50gN^xWrd?dTM^5^zH~w&Tju5o8%Ioe> z8O*X*b9$(=g-2=pu8S`_kSnfJ&j`i%Wqi!|AJZ1&zenzEg|-ztX0NugF5b6iyn?xl zRr{E8=7H+?zUzQB8aB&RDd1cdsW*gm|4NZJ2FL6dGa{#=4z@%q_f5DEe9nBj<7?(e z8=iTV$JJppf| z(UayS%r1zMf(HRHMt#T-(aPm>Hyk@L`;*dbpP8X;_3sN#tk&uj6mERZjuIpfZ?}m- zOP19as)c!vs!bXG#PhE`2I&p?mTevl_KWJIX2U!YS@1Pn^s} zw6~=!_Y)O#x-0v?8=}c6+2W+U=0iwuZhuT029 zX1Ru5Of*-U?^Iivj{778f09sudd8%!ljGtP64y{I?6_j8)>(*Pa(ynRnIf+`xN&{F z@z*LHeSFZLoIx3z(1rKXUBP3>iUA=rE}9c@3Q+v7G_*73!dGJxQm5FnF0(0vEx<}L zUuEvfvwRVa+{FjW&`My*3`8;SpzA6wylfxHv^J4D$5eD2bzSA#8c)tc%kuS<@ze$r z;mln;JeQm@L9Kc?@qV&Cw@HHB8;}lo8*b?OH4PqztNQszcX4=tcx|N7!Kf6JJwkwq zFJ~*HTpidOQc1SuITKzoM0?KYQvuAF*-=Ky!(vQG9JloRczf4GrDcpq52<8(p^i7x z|3z=q9c1kv&1gUh^3Ii=`1L-kSBwttDoHz-Yb3$O#*nw@895z#W@`X;rc5yXp;}DE z1TW=~HMA-n?VGgjAAO)bFnU*uL%>a{L}dorw=?$R=#Pfs3_Ht{i3S_LNCXQWmAC#D z+Q@vQ`n$JBpj?)EprVC!2Q84-4o7v3_-np-Y#WHA=f!)3YVDK_?5Y%2A$j<;y9S(E zbutq%{iORt%4u&BwHEpsHo1|K?}j(!3l1?AMTbAQcvtNJ3<|U*HBhz=-CY0n4-F^E z0^*pAtjFzJOdvADM2{~`%JJfntihS7ZS%&o)%0c0%x~v#8R~B>{&k@#$AeA#w=^{r zJSw?&pkWibM2KFfAEhxa9&JU7icE-nqSSUW7jNS@3Zb=KQ7pD*Q(v6*$Z;8_$Kl{i zD68Hd(S`#h*DzOGaaQ;;g%=@{tM7@ih?Zxm+%d2Y~X`oqND>N_H+E?jX zYlOvtwXv|Ip2jWBON^Ah;r79(rs$1Fc%DShb(?xAN&KWw-xWP8LBwp6sNObw0AhdF zLEKi(rtzOR$IJ`bcMN*CqAaX%ib%r7O!$ZqDwky51%b~1?-N5of6-w149PViLTvNo z6YKOJx7Yu$>;C^=gPEhPH@M^1gO?;?XejEnNl2`6gRzmvu`k(Z#yT-_wpZiiq#b^K zdz6up5f_|>v|Z(^uygefx#~qfU4MO{O?r+&H5$=X9d9f5iDkpyC@#hfO@@{wT1m-4 z0nDPJxu6grNvfuv-b5{)^*?}UItad1mfRX@?NtpM{`f|P-8wzh{1pWh-3L0V+v6$| zf!My;iLC6kF{J6vzRzcXbO5xY?-Gpme$FnuVvOgGtqy;m0Xn_}efXoY;&9G`s|!B} zC!HjF2!hNcBsf1{h&`-;AE)h)dumj;55u`vs2+z8Ap0qRAR!@{93}vIB*>?yuuE+Zyo}hwWSjl5{TUPV z?YsJz@{6@+|1{=LXw2-6i6M)r-ClUb;kN8n^}$){z*E#zW3&|8@>A?(?cwuXQxBFv(EeQlu+Cu(L~aW(}e9keZNFs>h3Xj^;r>O&VUbn+Z zNpNooX93=*zfQXrY&zyJWr;%F+$*^0br$doO!wtn9Vgw`W@FrD_;xOlcn1;)KlTVh zC%U)(^WEPC|Aw^)`EO-X>@1E`a#gkV7^B>rP`hFJKOm)xHTD|YST^M!dPDNvu^LGO z?a(ieb)!T^vgsgdR~!g5H<9|}Hr_?5$Hw_^ErZV)J&mV$b`^c|gVh!0;Djq1I3 z1yS9PKws#qY@zpWc!W#Vg;WcSm|LA9QT1tpliX;)SFlx=tHHXKxnQU6+_FWm5Tz~z z+@lmR8_LCBLu)CdjxvwGaVQmcPj5lpMcdcv$lpDxdNJbYldPqlqXxg;lKLJy$o_+i zv?)R}C_kIN40OV$s@}^v-|B_G_M^Ju0S&q z%v*fU^4LISMD@5SB+KqbyD);j!_As4*-V@7**o^1AoU_b%if@fBH9N9pd(Hm)<*(c z!(7mzUUXhK15+2AU$Hf%Q?;tfY;W&ZyUngv0sv*ZFk|TVE|b*u8znBOO<;xcA&Q?^6{jIzO*4F;)qXBDd*ES8rIaLd?~Kj!nX)Ge{NV#%J$grF zRX~2~BJHfZf$7IQ5EsACrV=`0V#S!`fSSv{m%-|Ib~qChfEoGK>PSN3u;8Jy+V=i; zT{nnI*jN(DJ0l~iWd1t{I|g@RMM8J^7?D^>)^iHbCnNoKe}hv6gST6s&h1S+RqZ0w zYf1Uk3vwQ@E)f@3EM2F5gbL_efoRMly>^{Yfhc(Da3@IMXY5ZJ3$;Vs%I4>}u(I=c ziksjzqqSjCC{O$9#ec<=_*yDGLp|-wV9;~@#oPa1Wm&{YNc<|?Es8_N@hRnZNYGS- z(`fIrJa3k-&N51R78g0ajdIhoRL=tR?ty^TywLEj1Im3T%G_BlF9?QUc0-_p^uD92 zmFP^rzL*6yRD>on2(jW)^q(>-YT91vm{Av+oS|Wn+m*0n;PDi)YtD*HU@R%$wdn$| z3A8EaXvou22LZ!vQ1{=I*Kph6$xdTerpN!CT_1IXd0D#cl{5<|H7v7Jgt;D9mfs{n z)0_~xxj7fL<6%F=v#T&d#l~EI!^;lN*RNg8k z;I!H`1ov-EGdMD8n+H=gFk1|@?M2SuJ72ocFH~uF605qve(U^DpikgRd8%F@Fi_RP z3@Km_is{dL=3MG3uGQS6GtWg&k{RgZ;pk&-H`{?ynK(CR(8x1&5e?v%ph}bg#kanA zJp}{+c=PZKxaKXlX(zGnY0n%heEFI8tawvq0j2)c%FJ@^sMHG59=UI8A4<1mVIQcN zv?*(cT4wiM;_-h0$H=-a1%$~V*CMNs(L(RdR%!p>Ny6ojQw8m6NAGn&i29YOR!!U8 z7mLEyo)q3c5uCS4V6ESx3Ndk)uJ;8nm+2A|&b1MO=sg>nRUT;2)GB@K-n>>E;PzB+ zNF5vRN%39l%hEjSx>g}HR#1JvTrUxAmYOf54eCIgF&DV%k~=_QfAISYL)%{X!PY^E zYZObwwuf7iok|R93gA8Hy+1d~OUip+vQCh@26~JoA@Jt@Hbj^I_}iARGp0ZLvCiCG$h^osN@LWuCfV90W9 ze3$tBRv%5=wl*dELap_c1lRM63+komn+NrM1GdfxRFP-t6~|?@-($kOF&2>~`lcXK zBxMZjgYxqv=u1R?Z~=ZK4WO6jx6Qn&RZG0GRl0Cm^yXEo_tw%85gmAyr`mcbtsL$C zsnYCUJrO=R#e}I^ z46jZ(RUO}`xvV3*{D+OgK$Qv8z2lp@e=vCu3&5P*T56$lT&%V3q@11>*?2iA!hHt+ zy%1H5Q^g<$nsN?%7!cuxgX>@Je^pObFgtn~aai&KA);@^@#d{q6uP7xpCiZLb(ePq zWN>6bc+CrD1d>wa?GF$cuC`G9yt!HP{gKMqapkOnmIAdcDX)g-2$51~IiGX(Twyy@ zZS3Z&Qj{{{Dm$)1M`bm7?Q8kdZ^M<FCTEpgcZ;;9bqFEnoNw% z`-J}N`PYy^s~f0|sQ24Qi(rakBSbz^iVYLzW+*tL{-1y@JNgad0Dy!pQ1%bs2j`wv zFH^bh=k+(^quDBX(?#@|DtF};!l~wZd&UkcZtlDGt-{W( zu>4LL6Zb74Msu+w@NF;=R8H8c0s%6aghW+GZ(?$|`2UW@{q0))lHZu(TSV(bcBZwJ z%CxonTs-IZC>4zyay^FZixTt{-*6!k*BMR+rlM}Q);yuMCB5N8gn(4YFnrW}W5_k6 zqPAO4I10zC=c^W*0|d#*XLBO9sou-&qm4A%Z zrzIGJqL&{712Wb#gqcftUxe#;Q%7fS2lKP7b&E?;gnfDx)4}S4GET&2g!FaGd1}_Bm(L-~?rjLmA_9m`1Qp%GNz$&p~-`|2laS$%H)?Y$TrW^1I$n$*a6Auu( z368Uy!ALUpj%%bqSrF|ZLJ;T-NhbNUuM`!2=QgsAwLSK--=>##dLiBdUCSc{ubUy5 z;od)i<4M9H1mF9+c_=A2Ca@K;xzKhF+-&J?gsyXtfY+%JIi(E32PFEgyT8Eg%*UAW zn`OWEkLjjI&F56)r2&DILzlzaEm}W_*!`18{pbt{8pd^bnjt@264(?s#+**#~nm#2_+xmaaf<*^_57PhDgHiwktm zPw3vXp0+b&{;Gp~0acyE_0%(fxKqTZe8i^>TnBj0+o$-xU)D4pGi7Te%GqNg_y4qC z#cG4%;?QK_reCrIvu^@s{~2-i?1;115<+^oSU*$H@!ojcg00B`$f*(W{iiJh&q(z5 zzqp5V)^lXDL_crkYJrCkh6f>{$9jkYy8lJvbZPsUh{o7DmL}i{*U=GQenk}WYK=W{ znur#$R4(8=as(2YLiAPTAK%h6K0c?(a=2el7q|7GgFY6Vmc<$orDC?M7qE?;8}Dlr zXUaxO+s&m~FmAvm$pZwtfZ#rgUM66_^KDpe1Ac+1eKNjwlIRl9^VD>K%6~}3G z5fHBS5EmcqXdmj1R4OC_z{YyK!T5ufO-BSQJjpqiOxNQX(KudoW$4mFB-RUMbO_(y=zO#2mS*lA0b=9d%>jH-SgcK zvIIs=Yp&b0@z-EB4Mde}G08+t!f~WwOgh+g)+&mf2$if|+?uf%Qj zEQaK|VLltj?MHX7!)(qF-_0e?b~H=jt+-(CuW>G@^0UfdB~l0dlk`oV4JZ2x*Z32y z^LVt>80?L;BgqLrL$~HbNLZBtKgoS(UJqvedQ*C3M?G0{9!^^g$*QE&? zJ|`j4q`x2U5krS6zZv^HI<7ZY5KNCT*dR}seuv2P_Wk*Sj!AVFiLfS$Cx#4xsj*`4 zzuunkj@U&F%Z3q$>hVKTkfwbTI9n6Y z(X>R6r~x@l7|2yT-exZp!14N^713Jem#+$ zA+!XE*=DibX)_=w3iMcrrV6~E{3hqyvNsn_goe2F?-!1tRbUoZ-ch|Rt;0+j13 z;=t300~cv$IT<+UBmdYs7pSV#e|8XX`W6-UaR>Z7T(JF~{RM+7z+5~LhMR!pq7JbH z{Rii6&wXuw-2m*kH;6!9VoH#x+Ly*LOSaSKvE@pj9sdH_@hMTxlnGO#Tt^YZLQuJv z;nh^nG^cI>z3&T1J6Y=u1kzF)T2#J|Ubs=uWf-=ZuV&9l?BHaP5;km6hc6w`2&)QU za=6+bKZZ!31@os&oIgLp{7I0vE2KmjcktdmGtFn1?9gWd7R<{=N;n^p3|j&jJ=2D! z1s$3|+?zYOc0^k1E!WQj)5(!&;%N|eziT>kw`GZ@(RX7uB;v0RBpjmaT^ytxYxqJ9IW}tVZzcTp+l#Fe!dobl({uBPp{blt>rNOYQTJ+ zF39^jSpSX$f=P~uO(AEaP2RN9dJeqg;Wh$IY91d#>`6J!+LBHaZMpMJ1Kc3;t7*j; zgQ$x^-X`txNA zrx1JJRW#=iUkiSr3P!c^s7kG)XEWiZ&8IhRc%!7@fkXq++x+FffIu$%Uc{>tB%otbs1=tbuv z5KQ+c#8}bqL5TG^X|*x|)DE&3DX-r;tnm%ckZouAThmv1T-Sb@agOXk;rM+}aaK3y zkZesK6gZ!M4~j%TVwJl6!lW;nEV*)%TQWy*@~X9cZ(fdc?`aSAP9*A+sxPbS?3ij= zDrMdNpYpVzWXiA49fx;m_RN+qSo;1T4PR?8)f)C%?u|xGy6MdMslJDWy1-n76$2)B z$b}|)qnYRP@A6_10;O4r)b1Vohl>^(S+hHlt=xY<@AzGr^PDd^b`oadE2mjk7O^c8 zHTpz6r{#J~75SdHZrb!hoik7e9B~9aL|gCmQI>y!G-r4qqwIhHeg?4Vl4$t$Vxx=w zQsDH+?Ok!K!Dy>bHY39Fq_lRsi6UpjDR8W+AjkxxGH?hv6){p;I0ao#( z!1z&0j>G4YB25z!T@Z9GX3{f-;m}-p*{k;s8RkXQFzLJ9&?_~~owIHC)`CNz9%E*@ z2^qN<-kfQpDlT=wGqwoLs)`8_gq4s_MgKC>-@~`9|EAzk`ICSOi~72kO}BO5LQPUP zex16alhyEVjKETGtZd9>jl70HlcN#-b4e7Yh6T--J#U*r0QjUxoEIE0G$BmV1HPrj`B>G&NtK1=8 zxB($y*Rj#|&sXlhc*Pd4VWJ&^Y=TIsxCZvD*OYS=C|Y!KBaz6EUX&o6c(two=Mg;b zdd=EUiOORkLJ74|)5MFIcmb)`D>qiRLZ#+FaR))Kn%1v!vRvyW$#*_qJUrY8A+!F@ z-Mpf`V(`~Jzx#rNEx-&3GfrtLFt7@?%vlaOg^FP>fZ z>60pR8CE=3c5YXXTzfq>@xXnIPmFjFyXrhM5+|jig8Za3DA7|vg8AN7tx``*5%jc; zA-u-jWwOWllgF#^mm$&n?!e0~XqkiW)s;=M;r^#anGUMxd4#-0!19aJ-JD z)?GWfLcBf!c6GN3`r?Uupl`(effvy??3fGWLb2riuE|bMm-cG&cJuUXzy71xr{fxv zs;5o%`yy$xep`lgyR+3oR#5(fn9~|LJSK7R;wCfO?2z9Pio9eKX^&a;c<1P8n(Lx< zP>WC`fO+nU_i%)eL5 zd`x7V##~Ll#yq09LFU$cr>hc*9bg{Q%l6x1EQnk3J>7n724yU*Fj=*tSMllps_eX@ zn#%S)u2%;JL=Y9FXBdh@l_DTTa4bNmQbLg48A30i6NaG)8qm+GDfbF$CQ$#0+E_xm|RK+xRW_jLhQlBdJF zNmxpS9N3QW(R9DcV#B>eG%B^A7L_vV%_6lYi^Ag$_z0mAj=W8Mg)+#GOo)Ydm{K74qV?qFHx^!U29Py-9YPse&_{h$b2wJ`FR}#Pw z$(8G1lRO^NxYGpSVBdpP40RaH+Rlu-bWh`&Q*(BN6XoqDMvzWEw z4YJwd2u|2wG_rNzy8s7Drm}I@{*f3x51SCfp&q_*;bA8 z(L`C`9XGN2!vI{0tL+S=w=SuAdMI8-Es;k^ji{IdVqFTX;Z97!U>U!Y0za_Jle$<+ zxTtHjjY1@pmGqOR(rH(U#HrMEpT+{~J+gL#pqe|JjkdCe>+Mn>C07^2 z&k}V)q^(W`E(gL4hg#!=<{Y_VDU`fZ;YRxej%hRfLLIC+PJur4G?8>s+}c_mBcoG3 z4es96Jmpk$$nZQnB=XIhDMeAvSJVdhx83ogw}4 zjmHDLW#nd04^fG}v{Ns&11SW0jD61$CSx%%)5h(uiKiG0{-R}Wp>N@UVT-;}(OTXP zH-gk(L?Tm4e9=u!Uzy7ebH%7J28;Y`TBda9B`Eolc!q?kF z-*0-?lJK%M5dxiB`>(ejJBcLnY~lHW7viVKt=P?c1$M>V=g;#xY$*k)Y|S^mye-G*j$XB{5-u-nh?DzfA||KqO`PJ$EtrFzgk@oM0HIc zK%3>@l*Q8-$CGa-a-bK}{I}bz7kXIHT3tP4KIi&BDiYxzsL!=?c@A27M6wEYX~vAs ze~OIp1=+wdoQDewqL+K+74JU})KT`)Zl+Jqc^Mgg+YX0>FC~%pf6wzfJipqIz?C4d zyaOo%YATVJ2-O&34H26@hBDg7noG-{-*|uMp5|-4j0;D<+%|P$@WQqr0u%jQlg9F~ zV!H)8W%P@wwaX?xx3p%T%}ls;n@%QgjeIsK4MIO(=opfYl5an)kin}{nI^=FnLRwT z+nYu9XTI|5okX4GiKEwMB9P_)+$>ReSSbEtru~=p#eSN8ZNVKUsWTZAl+I9PWT8bY zJ8wT1*MdMy%|y`pqRD*0=MNRGdVRP?J%_;2u=VCE3%wRjFu$-6^sXXi!LxY%tK5#< zw#1tza`wfXdsF4VQHtiFR|c#)JkD1O%Dv4PME=y84A<*b^FPiFrAc(4UgUi z_2`*|csI?Jmkrk75#q)e68%j$q9e56sjbbmUNc2|OI*QqVKvT2;Ux)(m*GT$oX}DE zoIv1TP}Ir*-GpPhL>ypr?+cYgg}%2`)E9RnMI6z;b*OWQS*yttd-@u@La!Zd@R(5R zkSZLZk8Z48 zmio1v8~=mD8B;_R(VmEkwta@OJXlZp@@^}^MzlO<%cEcItIE9{`MpROiZAAOha|Am(GH;H}c!oe2`nqlIl!aF-HQY}Dh5{*xNu_SHr|vBt$sJdPi&@ImRp)lA+hc^( zdfJsm+7=A%*u>aPZ9E0&#?6Sw-cu>N1sEf>ToJY)8?i zQ(GA1%an#g(<>3nF2XGU$(D>zJa9G=)M4(%(6;ROT85<>Z_HFk>#qk7gxoaptS11a z`#v=wdFCUqnbeDv0R*y7Z&yW=U0* zP9?)?*i$VRRYC~C(7MsMFsYrboy6YZ5;5v#XpvN3Rgu(*4knjexIN|PZJESz=E?}% z!1f@H`cf{T!v6KCjINs4h`PQ;FXCvW=*FwoV(fnbHFW^S*vInf`4cA~MFcoEW8sCU zAd&kaeh-<|o)m>4W5jYHznPPmxnV)O9q#hUwJsWQ0oMXwS|nKX5cDBta;}~M$C>!>l!v|jE&dLj!m2P>u~tq$S%rWWPMvU zMp&_7b-r+Z-K0);ebuZuyGtaP)&E@;B*FmJx`NZi+Q64GPSW2i#G2Z9t`d1fzEd4R8pV~n=0%z;qs ze0k;Dm><6zZalZ7?;o;v1*=2@`+*NX+&5insE>T{`SP%>r4Pq1Wql5q*MB~e7pvCE zITEy4vPK~~B3bJLp^YKv4i9DNZo!_ofNx}lC5TG) zt#6_M`~TT`5z2{y#_tx!FlC*NYBrOW?p^XRCeEuYEpC;;?SOTkVC=x9qpiHTG@1u8l-x z9p9&LAROO0V3WK+FV%)Jm{g}N4`&qCE* z%m=j1;%tpY+^gxO0}a}QhGV(`m&drdgCoOIy6VI=g^+zWO%;(gcXNgA*ofO>I!8n5 zV_xpe{OQ7M*RguJ-#pHdLr_@x;aAgX)o-*8-Qz!gYn*75+fm9CAT9v-V|PL;Sq9t= z(YCTH-80Sd>1xUwd68AY6>C?`!?TZf!$fBnyQuIy!Wl3oS)g(&Dm=V5sxFMPWh>r> zMSYonj`xx_EnuaGA;VmgKVE9caEd;56s$_aa->I^NzUJPg(YQ-%r(!*l9$Vq$=9 zEZ67T3I{yv*845xiX#}4^Vg*w8e=(xKVzr!PWlX({r1(*|F*R;^3XP0*WA8g39s zMms1hykjY(C{PWlr?2FPhJ>U%KG&ebdSW8>KTDQ4ANX1k-ghH)zIu{~E%f_~{d(Ws zj761WNGo%5a6bYcGHbmmvE};UZ_fvh@{??XGMmmL@<{+O=2d>;cemvA zt=q~qH|iKvL9`MJ=~cd$V_?fq4EM_hUu@-^xKsN#=VdJ#02nK-^g#(m-Q0-7p$PfQ zR+mAHb1urcC$sS3<*S(x%n~diQqtdqN`r!FNUOpRKK>^Lh@=R(N`U|QzzE_i0kR>W z-oygxO|Di4NdHL(f35$*@AvUoKQ9AuF83#**t*}Ics9TY3;T0#<4e}VD=acUJh<^B z@mS&llJ38AR(nt0%25f_2lyXpWxM*wQMNDUl!8vOa(U46V-8Gv3Q z@l)2OJJ9=^u2yy4zXBic+}w$x z2jKidt5D<6yPNZd(8fEXe&mAQdqRLWIb?zb-EF)7FMmK=i1q)5%yf3?&HgxC<%0e? zssx}x@zLzkcL5=&CsST$W3H$FU~hv2os?wJNC2FI^$SBnop_EAtmnTcmo{?Q?U;Te z4wc+}c*%9HJL43{y(oSn3H@0XA<%OW(Ovj`s5&si+28l=co~hW0JJ8P-p!UHIt`$j zV1J#_xrtZu(@4K+Gx$2@4E)xqR>%4@pay_Ss}R_dc1VBG_}A<6ADBh*$T=zbm=ck}(lE~C#CyJzhg{^dtD`fvL|yxH&NKiZTf z=KgV_b*5o`Rr>|!{uRIPPR!O6N6NU_r3F5}3ZcWJld2!l`n<2@HKC^9clGa--?IJV EpUiJdFaQ7m literal 0 HcmV?d00001 diff --git a/ej2-asp-core-mvc/file-manager/images/navigationpane-template.png b/ej2-asp-core-mvc/file-manager/images/navigationpane-template.png new file mode 100644 index 0000000000000000000000000000000000000000..e3bc25e8bc38c52ee0d8246f9e0c7665eb3fa8f9 GIT binary patch literal 64050 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

      5%wXXP8LhF=Qqb8d?%7RQpgD4!>-b->Yo0eOU3 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 NTX%1k-mv=pKLF6{erf;! literal 0 HcmV?d00001 diff --git a/ej2-asp-core-mvc/file-manager/user-interface.md b/ej2-asp-core-mvc/file-manager/user-interface.md index 4932580680..795c048554 100644 --- a/ej2-asp-core-mvc/file-manager/user-interface.md +++ b/ej2-asp-core-mvc/file-manager/user-interface.md @@ -35,7 +35,7 @@ The `Toolbar` provides easy access to the file operations using different button If the toolbar items exceed the size of the toolbar, the excess items will be moved to a toolbar popup with a dropdown button at the end of the toolbar. -*Refer [Toolbar](./file-operations/#toolbar) section in file operations to know more about the buttons present in toolbar*. +*Refer [Toolbar](./file-operations#toolbar) section in file operations to know more about the buttons present in toolbar*. ![Toolbar](./images/toolbar.png) @@ -50,6 +50,10 @@ The File Manager provides navigation between files and folders using the followi The File Manager provides a navigation pane that displays the folder hierarchy of the file system and enables easy navigation to the desired folder. Using [`navigationPaneSettings`](https://help.syncfusion.com/cr/aspnetcore-js2/Syncfusion.EJ2.FileManager.FileManagerNavigationPaneSettings.html) minimum and maximum width of the navigation pane can be changed. The navigation pane can be shown or hidden using the `visible` option in the `navigationPaneSettings`. +You can customize the appearance of the navigation pane by using the `navigationPaneTemplate` property. This enables you to modify icons, display text, and include additional elements to suit your application's requirements. + +![Navigation Pane Template Output](./images/navigationpane-template.png) + ### BreadCrumb The File Manager provides breadcrumb for navigating to the parent folders. The breadcrumb in the File Manager is responsible for resizing. Whenever the path length exceeds the breadcrumb length, a dropdown button will be added at the starting of the breadcrumb to hold the parent folders adjacent to root. @@ -71,6 +75,10 @@ In the large icons view, the thumbnail icons will be shown in a larger size, whi ![LargeIconView](./images/largeiconsview.png) +The `largeIconsTemplate` property enables complete customization of how folders and files are rendered in the `Large Icons View`. It allows you to enhance the layout by adding background images, custom file-type icons, and actions such as dropdown menus. + +![Large Icon View Template Output](./images/large-icons-view-template.png) + ### Details view The File Manager view can be changed from large icon to details view by using the [`View`](https://help.syncfusion.com/cr/aspnetcore-js2/Syncfusion.EJ2.FileManager.FileManager.html#Syncfusion_EJ2_FileManager_FileManager_View) property. In the details view, the files are displayed in a sorted list order. This file list comprises of several columns of information about the files such as **Name**, **Date Modified**, **Type**, and **Size**. Each file has its own small icon representing the file type. Additional columns can be added using [`detailsViewSettings`](https://help.syncfusion.com/cr/aspnetcore-js2/Syncfusion.EJ2.FileManager.FileManagerDetailsViewSettings.html) API. The details view allows you to perform sorting using column header. @@ -83,6 +91,6 @@ The context menu appears on user interaction such as right-click. The File Manag Context menu can be customized using the [`contextMenuSettings`](https://help.syncfusion.com/cr/aspnetcore-js2/Syncfusion.EJ2.FileManager.FileManagerContextMenuSettings.html), [`menuOpen`](https://help.syncfusion.com/cr/aspnetcore-js2/Syncfusion.EJ2.FileManager.FileManager.html#Syncfusion_EJ2_FileManager_FileManager_MenuOpen), and [`menuClick`](https://help.syncfusion.com/cr/aspnetcore-js2/Syncfusion.EJ2.FileManager.FileManager.html#Syncfusion_EJ2_FileManager_FileManager_MenuClose) events. -*Refer [Context Menu](./file-operations/#context-menu) section in file operations to know more about the menu items present in context menu*. +*Refer [Context Menu](./file-operations#context-menu) section in file operations to know more about the menu items present in context menu*. ![Context Menu](./images/contextmenu.png) \ No newline at end of file diff --git a/ej2-asp-core-mvc/file-manager/views.md b/ej2-asp-core-mvc/file-manager/views.md index 459ef148cd..afa2e4fc9d 100644 --- a/ej2-asp-core-mvc/file-manager/views.md +++ b/ej2-asp-core-mvc/file-manager/views.md @@ -9,7 +9,7 @@ documentation: ug --- -# Views +# Views in File Manager Control The view section displays files and folders for user browsing. The `view` API can also be used to change the initial view of the File Manager. @@ -51,6 +51,33 @@ The output will look like the image below. ![File Manager largeicons view](./images/large_icons.PNG) +### Customize existing Large Icons View + +The large icons view layout can be customized using the `largeIconsTemplate` property, which allows you to display file or folder information, apply custom formatting, and use conditional rendering based on item type. You can customize it further based on your application requirements. + +{% if page.publishingplatform == "aspnet-core" %} + +{% tabs %} +{% highlight cshtml tabtitle="CSHTML" %} +{% include code-snippet/file-manager/large-icon-view-template/tagHelper %} +{% endhighlight %} +{% highlight c# tabtitle="HomeController_core.cs" %} +{% include code-snippet/file-manager/large-icon-view-template/HomeController_core.cs %} +{% endhighlight %} +{% endtabs %} + +{% elsif page.publishingplatform == "aspnet-mvc" %} + +{% tabs %} +{% highlight razor tabtitle="CSHTML" %} +{% include code-snippet/file-manager/large-icon-view-template/razor %} +{% endhighlight %} +{% highlight c# tabtitle="HomeController_mvc.cs" %} +{% include code-snippet/file-manager/large-icon-view-template/HomeController_mvc.cs %} +{% endhighlight %} +{% endtabs %} +{% endif %} + ## Details View The default appearance of the File Manager can be changed from largeicons to details view by using the `view` property. In the Details view, the files are displayed in a sorted list order. This file list comprises of several columns of information about the files such as **Name**, **Date Modified**, **Type**, and **Size**. The following example demonstrates the File Manager with details view. diff --git a/ej2-asp-core-toc.html b/ej2-asp-core-toc.html index 5fee1aa7e4..c989799220 100644 --- a/ej2-asp-core-toc.html +++ b/ej2-asp-core-toc.html @@ -1133,6 +1133,7 @@

    • Render FileManager in Internet Explorer
    • Implement own service provider
    • Pass custom value from client to server
    • +
    • Customize Navigation Items
    • diff --git a/ej2-asp-mvc-toc.html b/ej2-asp-mvc-toc.html index 12013ee9aa..98a43d3ca5 100644 --- a/ej2-asp-mvc-toc.html +++ b/ej2-asp-mvc-toc.html @@ -1078,6 +1078,7 @@
    • Render FileManager in Internet Explorer
    • Implement own service provider
    • Pass custom value from client to server
    • +
    • Customize Navigation Items