-
Notifications
You must be signed in to change notification settings - Fork 55
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #44 from SyncfusionExamples/ChatUI
ChatUI: Create the getting started with the Blazor ChatUI sample
- Loading branch information
Showing
24 changed files
with
713 additions
and
0 deletions.
There are no files selected for viewing
17 changes: 17 additions & 0 deletions
17
ChatUI/BlazorWebApp/BlazorWebApp.Client/BlazorWebApp.Client.csproj
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,17 @@ | ||
<Project Sdk="Microsoft.NET.Sdk.BlazorWebAssembly"> | ||
|
||
<PropertyGroup> | ||
<TargetFramework>net9.0</TargetFramework> | ||
<ImplicitUsings>enable</ImplicitUsings> | ||
<Nullable>enable</Nullable> | ||
<NoDefaultLaunchSettingsFile>true</NoDefaultLaunchSettingsFile> | ||
<StaticWebAssetProjectMode>Default</StaticWebAssetProjectMode> | ||
</PropertyGroup> | ||
|
||
<ItemGroup> | ||
<PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly" Version="9.0.0" /> | ||
<PackageReference Include="Syncfusion.Blazor.InteractiveChat" Version="28.1.35" /> | ||
<PackageReference Include="Syncfusion.Blazor.Themes" Version="28.1.35" /> | ||
</ItemGroup> | ||
|
||
</Project> |
23 changes: 23 additions & 0 deletions
23
ChatUI/BlazorWebApp/BlazorWebApp.Client/Layout/MainLayout.razor
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,23 @@ | ||
@inherits LayoutComponentBase | ||
|
||
<div class="page"> | ||
<div class="sidebar"> | ||
<NavMenu /> | ||
</div> | ||
|
||
<main> | ||
<div class="top-row px-4"> | ||
<a href="https://learn.microsoft.com/aspnet/core/" target="_blank">About</a> | ||
</div> | ||
|
||
<article class="content px-4"> | ||
@Body | ||
</article> | ||
</main> | ||
</div> | ||
|
||
<div id="blazor-error-ui" data-nosnippet> | ||
An unhandled error has occurred. | ||
<a href="." class="reload">Reload</a> | ||
<span class="dismiss">🗙</span> | ||
</div> |
98 changes: 98 additions & 0 deletions
98
ChatUI/BlazorWebApp/BlazorWebApp.Client/Layout/MainLayout.razor.css
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,98 @@ | ||
.page { | ||
position: relative; | ||
display: flex; | ||
flex-direction: column; | ||
} | ||
|
||
main { | ||
flex: 1; | ||
} | ||
|
||
.sidebar { | ||
background-image: linear-gradient(180deg, rgb(5, 39, 103) 0%, #3a0647 70%); | ||
} | ||
|
||
.top-row { | ||
background-color: #f7f7f7; | ||
border-bottom: 1px solid #d6d5d5; | ||
justify-content: flex-end; | ||
height: 3.5rem; | ||
display: flex; | ||
align-items: center; | ||
} | ||
|
||
.top-row ::deep a, .top-row ::deep .btn-link { | ||
white-space: nowrap; | ||
margin-left: 1.5rem; | ||
text-decoration: none; | ||
} | ||
|
||
.top-row ::deep a:hover, .top-row ::deep .btn-link:hover { | ||
text-decoration: underline; | ||
} | ||
|
||
.top-row ::deep a:first-child { | ||
overflow: hidden; | ||
text-overflow: ellipsis; | ||
} | ||
|
||
@media (max-width: 640.98px) { | ||
.top-row { | ||
justify-content: space-between; | ||
} | ||
|
||
.top-row ::deep a, .top-row ::deep .btn-link { | ||
margin-left: 0; | ||
} | ||
} | ||
|
||
@media (min-width: 641px) { | ||
.page { | ||
flex-direction: row; | ||
} | ||
|
||
.sidebar { | ||
width: 250px; | ||
height: 100vh; | ||
position: sticky; | ||
top: 0; | ||
} | ||
|
||
.top-row { | ||
position: sticky; | ||
top: 0; | ||
z-index: 1; | ||
} | ||
|
||
.top-row.auth ::deep a:first-child { | ||
flex: 1; | ||
text-align: right; | ||
width: 0; | ||
} | ||
|
||
.top-row, article { | ||
padding-left: 2rem !important; | ||
padding-right: 1.5rem !important; | ||
} | ||
} | ||
|
||
#blazor-error-ui { | ||
color-scheme: light only; | ||
background: lightyellow; | ||
bottom: 0; | ||
box-shadow: 0 -1px 2px rgba(0, 0, 0, 0.2); | ||
box-sizing: border-box; | ||
display: none; | ||
left: 0; | ||
padding: 0.6rem 1.25rem 0.7rem 1.25rem; | ||
position: fixed; | ||
width: 100%; | ||
z-index: 1000; | ||
} | ||
|
||
#blazor-error-ui .dismiss { | ||
cursor: pointer; | ||
position: absolute; | ||
right: 0.75rem; | ||
top: 0.5rem; | ||
} |
30 changes: 30 additions & 0 deletions
30
ChatUI/BlazorWebApp/BlazorWebApp.Client/Layout/NavMenu.razor
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,30 @@ | ||
<div class="top-row ps-3 navbar navbar-dark"> | ||
<div class="container-fluid"> | ||
<a class="navbar-brand" href="">BlazorWebApp</a> | ||
</div> | ||
</div> | ||
|
||
<input type="checkbox" title="Navigation menu" class="navbar-toggler" /> | ||
|
||
<div class="nav-scrollable" onclick="document.querySelector('.navbar-toggler').click()"> | ||
<nav class="nav flex-column"> | ||
<div class="nav-item px-3"> | ||
<NavLink class="nav-link" href="" Match="NavLinkMatch.All"> | ||
<span class="bi bi-house-door-fill-nav-menu" aria-hidden="true"></span> Home | ||
</NavLink> | ||
</div> | ||
|
||
<div class="nav-item px-3"> | ||
<NavLink class="nav-link" href="counter"> | ||
<span class="bi bi-plus-square-fill-nav-menu" aria-hidden="true"></span> Counter | ||
</NavLink> | ||
</div> | ||
|
||
<div class="nav-item px-3"> | ||
<NavLink class="nav-link" href="weather"> | ||
<span class="bi bi-list-nested-nav-menu" aria-hidden="true"></span> Weather | ||
</NavLink> | ||
</div> | ||
</nav> | ||
</div> | ||
|
105 changes: 105 additions & 0 deletions
105
ChatUI/BlazorWebApp/BlazorWebApp.Client/Layout/NavMenu.razor.css
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,105 @@ | ||
.navbar-toggler { | ||
appearance: none; | ||
cursor: pointer; | ||
width: 3.5rem; | ||
height: 2.5rem; | ||
color: white; | ||
position: absolute; | ||
top: 0.5rem; | ||
right: 1rem; | ||
border: 1px solid rgba(255, 255, 255, 0.1); | ||
background: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e") no-repeat center/1.75rem rgba(255, 255, 255, 0.1); | ||
} | ||
|
||
.navbar-toggler:checked { | ||
background-color: rgba(255, 255, 255, 0.5); | ||
} | ||
|
||
.top-row { | ||
min-height: 3.5rem; | ||
background-color: rgba(0,0,0,0.4); | ||
} | ||
|
||
.navbar-brand { | ||
font-size: 1.1rem; | ||
} | ||
|
||
.bi { | ||
display: inline-block; | ||
position: relative; | ||
width: 1.25rem; | ||
height: 1.25rem; | ||
margin-right: 0.75rem; | ||
top: -1px; | ||
background-size: cover; | ||
} | ||
|
||
.bi-house-door-fill-nav-menu { | ||
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='white' class='bi bi-house-door-fill' viewBox='0 0 16 16'%3E%3Cpath d='M6.5 14.5v-3.505c0-.245.25-.495.5-.495h2c.25 0 .5.25.5.5v3.5a.5.5 0 0 0 .5.5h4a.5.5 0 0 0 .5-.5v-7a.5.5 0 0 0-.146-.354L13 5.793V2.5a.5.5 0 0 0-.5-.5h-1a.5.5 0 0 0-.5.5v1.293L8.354 1.146a.5.5 0 0 0-.708 0l-6 6A.5.5 0 0 0 1.5 7.5v7a.5.5 0 0 0 .5.5h4a.5.5 0 0 0 .5-.5Z'/%3E%3C/svg%3E"); | ||
} | ||
|
||
.bi-plus-square-fill-nav-menu { | ||
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='white' class='bi bi-plus-square-fill' viewBox='0 0 16 16'%3E%3Cpath d='M2 0a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V2a2 2 0 0 0-2-2H2zm6.5 4.5v3h3a.5.5 0 0 1 0 1h-3v3a.5.5 0 0 1-1 0v-3h-3a.5.5 0 0 1 0-1h3v-3a.5.5 0 0 1 1 0z'/%3E%3C/svg%3E"); | ||
} | ||
|
||
.bi-list-nested-nav-menu { | ||
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='white' class='bi bi-list-nested' viewBox='0 0 16 16'%3E%3Cpath fill-rule='evenodd' d='M4.5 11.5A.5.5 0 0 1 5 11h10a.5.5 0 0 1 0 1H5a.5.5 0 0 1-.5-.5zm-2-4A.5.5 0 0 1 3 7h10a.5.5 0 0 1 0 1H3a.5.5 0 0 1-.5-.5zm-2-4A.5.5 0 0 1 1 3h10a.5.5 0 0 1 0 1H1a.5.5 0 0 1-.5-.5z'/%3E%3C/svg%3E"); | ||
} | ||
|
||
.nav-item { | ||
font-size: 0.9rem; | ||
padding-bottom: 0.5rem; | ||
} | ||
|
||
.nav-item:first-of-type { | ||
padding-top: 1rem; | ||
} | ||
|
||
.nav-item:last-of-type { | ||
padding-bottom: 1rem; | ||
} | ||
|
||
.nav-item ::deep .nav-link { | ||
color: #d7d7d7; | ||
background: none; | ||
border: none; | ||
border-radius: 4px; | ||
height: 3rem; | ||
display: flex; | ||
align-items: center; | ||
line-height: 3rem; | ||
width: 100%; | ||
} | ||
|
||
.nav-item ::deep a.active { | ||
background-color: rgba(255,255,255,0.37); | ||
color: white; | ||
} | ||
|
||
.nav-item ::deep .nav-link:hover { | ||
background-color: rgba(255,255,255,0.1); | ||
color: white; | ||
} | ||
|
||
.nav-scrollable { | ||
display: none; | ||
} | ||
|
||
.navbar-toggler:checked ~ .nav-scrollable { | ||
display: block; | ||
} | ||
|
||
@media (min-width: 641px) { | ||
.navbar-toggler { | ||
display: none; | ||
} | ||
|
||
.nav-scrollable { | ||
/* Never collapse the sidebar for wide screens */ | ||
display: block; | ||
|
||
/* Allow sidebar to scroll for tall menus */ | ||
height: calc(100vh - 3.5rem); | ||
overflow-y: auto; | ||
} | ||
} |
18 changes: 18 additions & 0 deletions
18
ChatUI/BlazorWebApp/BlazorWebApp.Client/Pages/Counter.razor
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,18 @@ | ||
@page "/counter" | ||
|
||
<PageTitle>Counter</PageTitle> | ||
|
||
<h1>Counter</h1> | ||
|
||
<p role="status">Current count: @currentCount</p> | ||
|
||
<button class="btn btn-primary" @onclick="IncrementCount">Click me</button> | ||
|
||
@code { | ||
private int currentCount = 0; | ||
|
||
private void IncrementCount() | ||
{ | ||
currentCount++; | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,68 @@ | ||
@page "/" | ||
|
||
<!-- SfChatUI component that sets up the Blazor chat interface with various configurations --> | ||
<SfChatUI HeaderText="Feature Testing Collaboration" | ||
ShowTimeBreak="true" TimestampFormat="MMMM hh:mm tt" User="ProductManager" | ||
Width="400px" Height="500px" Messages="ChatUserMessages"> | ||
<!-- Empty chat template to display when no messages are present --> | ||
<EmptyChatTemplate> | ||
<div class="empty-chat-text"> | ||
<h4><span class="e-icons e-comment-show"></span></h4> | ||
<h5>No Messages Yet</h5> | ||
<p>Start a conversation to see your messages here.</p> | ||
</div> | ||
</EmptyChatTemplate> | ||
</SfChatUI> | ||
|
||
<!-- Styling for the empty chat message --> | ||
<style> | ||
.empty-chat-text { | ||
font-size: 15px; | ||
display: flex; | ||
flex-direction: column; | ||
align-items: center; | ||
margin-top: 35%; | ||
justify-content: center; | ||
} | ||
</style> | ||
|
||
@code { | ||
|
||
// Defining static user models for the participants in the chat | ||
private static UserModel ProductManager = new UserModel() { ID = "User1", User = "Thomas Cooper" }; | ||
private static UserModel Tester = new UserModel() { ID = "User2", User = "James Carter" }; | ||
private static UserModel Developer = new UserModel() { ID = "User3", User = "David Morgan", AvatarUrl = "images/Developer.jpg" }; | ||
|
||
// List of messages to display in the chat | ||
private List<ChatMessage> ChatUserMessages = new List<ChatMessage>() | ||
{ | ||
new ChatMessage() { Text = "Did you complete the test cases for the new feature?", | ||
Author = ProductManager, Timestamp = new DateTime(2024,12,23,12,15,0) }, | ||
|
||
new ChatMessage() { Text = "Yes, they’re ready. I’ve shared the document with you.", | ||
Author = Tester, Timestamp = new DateTime(2024,12,23,1,15,0) }, | ||
|
||
// Time break message on December 24th | ||
new ChatMessage() { Text = "Great! I’ll review them and get back to you with any feedback.", | ||
Author = ProductManager, Timestamp = new DateTime(2024,12,24,9,00,0) }, | ||
|
||
new ChatMessage() { Text = "Just a heads up, I’m working on the fixes for the reported bugs.", | ||
Author = Developer, Timestamp = new DateTime(2024,12,24,9,05,0) }, | ||
|
||
new ChatMessage() { Text = "Thanks, David Morgan! I’ll check them and make sure the fixes align with the test cases.", | ||
Author = ProductManager, Timestamp = new DateTime(2024,12,24,10,45,0) }, | ||
|
||
new ChatMessage() { Text = "I’ll review the test cases and update any changes if needed.", | ||
Author = Tester, Timestamp = new DateTime(2024,12,24,11,55,0) }, | ||
|
||
new ChatMessage() { Text = "Once the test cases are updated, we should run a full regression test tomorrow.", | ||
Author = ProductManager, Timestamp = new DateTime(2024,12,24,12,05,0) }, | ||
|
||
new ChatMessage() { Text = "Absolutely! We’ll prioritize the critical features testing first.", | ||
Author = Tester, Timestamp = new DateTime(2024,12,24,12,10,0) }, | ||
|
||
new ChatMessage() { Text = "I’ll start working on those as soon as the bug fixes are done.", | ||
Author = Developer, Timestamp = new DateTime(2024,12,24,12,15,0) } | ||
}; | ||
} | ||
|
Oops, something went wrong.