Initial version
This commit is contained in:
commit
ad9e158294
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
Binary file not shown.
|
@ -0,0 +1,111 @@
|
|||
{
|
||||
"Version": 1,
|
||||
"WorkspaceRootPath": "C:\\Users\\joshdeck.KEYMTV\\Documents\\Misc\\SummerBestWebForm\\",
|
||||
"Documents": [
|
||||
{
|
||||
"AbsoluteMoniker": "D:0:0:{0AB3B0A3-A5E6-4BAB-8001-B9C78D2168AD}|SummerBestWebForm.Client\\SummerBestWebForm.Client.csproj|c:\\users\\joshdeck.keymtv\\documents\\misc\\summerbestwebform\\summerbestwebform.client\\pages\\home.razor||{40D31677-CBC0-4297-A9EF-89D907823A98}",
|
||||
"RelativeMoniker": "D:0:0:{0AB3B0A3-A5E6-4BAB-8001-B9C78D2168AD}|SummerBestWebForm.Client\\SummerBestWebForm.Client.csproj|solutionrelative:summerbestwebform.client\\pages\\home.razor||{40D31677-CBC0-4297-A9EF-89D907823A98}"
|
||||
},
|
||||
{
|
||||
"AbsoluteMoniker": "D:0:0:{B777B9E1-10D7-4857-94E7-AEB9A04A3709}|SummerBestWebForm\\SummerBestWebForm.csproj|c:\\users\\joshdeck.keymtv\\documents\\misc\\summerbestwebform\\summerbestwebform\\wwwroot\\app.css||{A5401142-F49D-43DB-90B1-F57BA349E55C}",
|
||||
"RelativeMoniker": "D:0:0:{B777B9E1-10D7-4857-94E7-AEB9A04A3709}|SummerBestWebForm\\SummerBestWebForm.csproj|solutionrelative:summerbestwebform\\wwwroot\\app.css||{A5401142-F49D-43DB-90B1-F57BA349E55C}"
|
||||
},
|
||||
{
|
||||
"AbsoluteMoniker": "D:0:0:{0AB3B0A3-A5E6-4BAB-8001-B9C78D2168AD}|SummerBestWebForm.Client\\SummerBestWebForm.Client.csproj|c:\\users\\joshdeck.keymtv\\documents\\misc\\summerbestwebform\\summerbestwebform.client\\layout\\mainlayout.razor||{40D31677-CBC0-4297-A9EF-89D907823A98}",
|
||||
"RelativeMoniker": "D:0:0:{0AB3B0A3-A5E6-4BAB-8001-B9C78D2168AD}|SummerBestWebForm.Client\\SummerBestWebForm.Client.csproj|solutionrelative:summerbestwebform.client\\layout\\mainlayout.razor||{40D31677-CBC0-4297-A9EF-89D907823A98}"
|
||||
}
|
||||
],
|
||||
"DocumentGroupContainers": [
|
||||
{
|
||||
"Orientation": 0,
|
||||
"VerticalTabListWidth": 256,
|
||||
"DocumentGroups": [
|
||||
{
|
||||
"DockedWidth": 200,
|
||||
"SelectedChildIndex": 10,
|
||||
"Children": [
|
||||
{
|
||||
"$type": "Bookmark",
|
||||
"Name": "ST:128:0:{116d2292-e37d-41cd-a077-ebacac4c8cc4}"
|
||||
},
|
||||
{
|
||||
"$type": "Bookmark",
|
||||
"Name": "ST:0:0:{aa2115a1-9712-457b-9047-dbb71ca2cdd2}"
|
||||
},
|
||||
{
|
||||
"$type": "Bookmark",
|
||||
"Name": "ST:129:0:{116d2292-e37d-41cd-a077-ebacac4c8cc4}"
|
||||
},
|
||||
{
|
||||
"$type": "Bookmark",
|
||||
"Name": "ST:130:0:{116d2292-e37d-41cd-a077-ebacac4c8cc4}"
|
||||
},
|
||||
{
|
||||
"$type": "Bookmark",
|
||||
"Name": "ST:131:0:{116d2292-e37d-41cd-a077-ebacac4c8cc4}"
|
||||
},
|
||||
{
|
||||
"$type": "Bookmark",
|
||||
"Name": "ST:132:0:{116d2292-e37d-41cd-a077-ebacac4c8cc4}"
|
||||
},
|
||||
{
|
||||
"$type": "Bookmark",
|
||||
"Name": "ST:133:0:{116d2292-e37d-41cd-a077-ebacac4c8cc4}"
|
||||
},
|
||||
{
|
||||
"$type": "Bookmark",
|
||||
"Name": "ST:134:0:{1fc202d4-d401-403c-9834-5b218574bb67}"
|
||||
},
|
||||
{
|
||||
"$type": "Bookmark",
|
||||
"Name": "ST:135:0:{116d2292-e37d-41cd-a077-ebacac4c8cc4}"
|
||||
},
|
||||
{
|
||||
"$type": "Bookmark",
|
||||
"Name": "ST:136:0:{1fc202d4-d401-403c-9834-5b218574bb67}"
|
||||
},
|
||||
{
|
||||
"$type": "Document",
|
||||
"DocumentIndex": 0,
|
||||
"Title": "Home.razor",
|
||||
"DocumentMoniker": "C:\\Users\\joshdeck.KEYMTV\\Documents\\Misc\\SummerBestWebForm\\SummerBestWebForm.Client\\Pages\\Home.razor",
|
||||
"RelativeDocumentMoniker": "SummerBestWebForm.Client\\Pages\\Home.razor",
|
||||
"ToolTip": "C:\\Users\\joshdeck.KEYMTV\\Documents\\Misc\\SummerBestWebForm\\SummerBestWebForm.Client\\Pages\\Home.razor",
|
||||
"RelativeToolTip": "SummerBestWebForm.Client\\Pages\\Home.razor",
|
||||
"ViewState": "AgIAAAMCAAAAAAAAAAAAABsCAAAAAAAAAAAAAA==",
|
||||
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000759|",
|
||||
"WhenOpened": "2025-05-05T16:00:26.455Z",
|
||||
"EditorCaption": ""
|
||||
},
|
||||
{
|
||||
"$type": "Document",
|
||||
"DocumentIndex": 1,
|
||||
"Title": "app.css",
|
||||
"DocumentMoniker": "C:\\Users\\joshdeck.KEYMTV\\Documents\\Misc\\SummerBestWebForm\\SummerBestWebForm\\wwwroot\\app.css",
|
||||
"RelativeDocumentMoniker": "SummerBestWebForm\\wwwroot\\app.css",
|
||||
"ToolTip": "C:\\Users\\joshdeck.KEYMTV\\Documents\\Misc\\SummerBestWebForm\\SummerBestWebForm\\wwwroot\\app.css",
|
||||
"RelativeToolTip": "SummerBestWebForm\\wwwroot\\app.css",
|
||||
"ViewState": "AgIAAB4AAAAAAAAAAAAIwDEAAAAXAAAAAAAAAA==",
|
||||
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.003000|",
|
||||
"WhenOpened": "2025-05-06T13:07:01.591Z",
|
||||
"EditorCaption": ""
|
||||
},
|
||||
{
|
||||
"$type": "Document",
|
||||
"DocumentIndex": 2,
|
||||
"Title": "MainLayout.razor",
|
||||
"DocumentMoniker": "C:\\Users\\joshdeck.KEYMTV\\Documents\\Misc\\SummerBestWebForm\\SummerBestWebForm.Client\\Layout\\MainLayout.razor",
|
||||
"RelativeDocumentMoniker": "SummerBestWebForm.Client\\Layout\\MainLayout.razor",
|
||||
"ToolTip": "C:\\Users\\joshdeck.KEYMTV\\Documents\\Misc\\SummerBestWebForm\\SummerBestWebForm.Client\\Layout\\MainLayout.razor",
|
||||
"RelativeToolTip": "SummerBestWebForm.Client\\Layout\\MainLayout.razor",
|
||||
"ViewState": "AgIAAAAAAAAAAAAAAAAAAAQAAAAXAAAAAAAAAA==",
|
||||
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000759|",
|
||||
"WhenOpened": "2025-05-05T15:59:59.662Z",
|
||||
"EditorCaption": ""
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
|
@ -0,0 +1,111 @@
|
|||
{
|
||||
"Version": 1,
|
||||
"WorkspaceRootPath": "C:\\Users\\joshdeck.KEYMTV\\Documents\\Misc\\SummerBestWebForm\\",
|
||||
"Documents": [
|
||||
{
|
||||
"AbsoluteMoniker": "D:0:0:{0AB3B0A3-A5E6-4BAB-8001-B9C78D2168AD}|SummerBestWebForm.Client\\SummerBestWebForm.Client.csproj|c:\\users\\joshdeck.keymtv\\documents\\misc\\summerbestwebform\\summerbestwebform.client\\pages\\home.razor||{40D31677-CBC0-4297-A9EF-89D907823A98}",
|
||||
"RelativeMoniker": "D:0:0:{0AB3B0A3-A5E6-4BAB-8001-B9C78D2168AD}|SummerBestWebForm.Client\\SummerBestWebForm.Client.csproj|solutionrelative:summerbestwebform.client\\pages\\home.razor||{40D31677-CBC0-4297-A9EF-89D907823A98}"
|
||||
},
|
||||
{
|
||||
"AbsoluteMoniker": "D:0:0:{B777B9E1-10D7-4857-94E7-AEB9A04A3709}|SummerBestWebForm\\SummerBestWebForm.csproj|c:\\users\\joshdeck.keymtv\\documents\\misc\\summerbestwebform\\summerbestwebform\\wwwroot\\app.css||{A5401142-F49D-43DB-90B1-F57BA349E55C}",
|
||||
"RelativeMoniker": "D:0:0:{B777B9E1-10D7-4857-94E7-AEB9A04A3709}|SummerBestWebForm\\SummerBestWebForm.csproj|solutionrelative:summerbestwebform\\wwwroot\\app.css||{A5401142-F49D-43DB-90B1-F57BA349E55C}"
|
||||
},
|
||||
{
|
||||
"AbsoluteMoniker": "D:0:0:{0AB3B0A3-A5E6-4BAB-8001-B9C78D2168AD}|SummerBestWebForm.Client\\SummerBestWebForm.Client.csproj|c:\\users\\joshdeck.keymtv\\documents\\misc\\summerbestwebform\\summerbestwebform.client\\layout\\mainlayout.razor||{40D31677-CBC0-4297-A9EF-89D907823A98}",
|
||||
"RelativeMoniker": "D:0:0:{0AB3B0A3-A5E6-4BAB-8001-B9C78D2168AD}|SummerBestWebForm.Client\\SummerBestWebForm.Client.csproj|solutionrelative:summerbestwebform.client\\layout\\mainlayout.razor||{40D31677-CBC0-4297-A9EF-89D907823A98}"
|
||||
}
|
||||
],
|
||||
"DocumentGroupContainers": [
|
||||
{
|
||||
"Orientation": 0,
|
||||
"VerticalTabListWidth": 256,
|
||||
"DocumentGroups": [
|
||||
{
|
||||
"DockedWidth": 200,
|
||||
"SelectedChildIndex": 10,
|
||||
"Children": [
|
||||
{
|
||||
"$type": "Bookmark",
|
||||
"Name": "ST:128:0:{116d2292-e37d-41cd-a077-ebacac4c8cc4}"
|
||||
},
|
||||
{
|
||||
"$type": "Bookmark",
|
||||
"Name": "ST:0:0:{aa2115a1-9712-457b-9047-dbb71ca2cdd2}"
|
||||
},
|
||||
{
|
||||
"$type": "Bookmark",
|
||||
"Name": "ST:129:0:{116d2292-e37d-41cd-a077-ebacac4c8cc4}"
|
||||
},
|
||||
{
|
||||
"$type": "Bookmark",
|
||||
"Name": "ST:130:0:{116d2292-e37d-41cd-a077-ebacac4c8cc4}"
|
||||
},
|
||||
{
|
||||
"$type": "Bookmark",
|
||||
"Name": "ST:131:0:{116d2292-e37d-41cd-a077-ebacac4c8cc4}"
|
||||
},
|
||||
{
|
||||
"$type": "Bookmark",
|
||||
"Name": "ST:132:0:{116d2292-e37d-41cd-a077-ebacac4c8cc4}"
|
||||
},
|
||||
{
|
||||
"$type": "Bookmark",
|
||||
"Name": "ST:133:0:{116d2292-e37d-41cd-a077-ebacac4c8cc4}"
|
||||
},
|
||||
{
|
||||
"$type": "Bookmark",
|
||||
"Name": "ST:134:0:{1fc202d4-d401-403c-9834-5b218574bb67}"
|
||||
},
|
||||
{
|
||||
"$type": "Bookmark",
|
||||
"Name": "ST:135:0:{116d2292-e37d-41cd-a077-ebacac4c8cc4}"
|
||||
},
|
||||
{
|
||||
"$type": "Bookmark",
|
||||
"Name": "ST:136:0:{1fc202d4-d401-403c-9834-5b218574bb67}"
|
||||
},
|
||||
{
|
||||
"$type": "Document",
|
||||
"DocumentIndex": 0,
|
||||
"Title": "Home.razor",
|
||||
"DocumentMoniker": "C:\\Users\\joshdeck.KEYMTV\\Documents\\Misc\\SummerBestWebForm\\SummerBestWebForm.Client\\Pages\\Home.razor",
|
||||
"RelativeDocumentMoniker": "SummerBestWebForm.Client\\Pages\\Home.razor",
|
||||
"ToolTip": "C:\\Users\\joshdeck.KEYMTV\\Documents\\Misc\\SummerBestWebForm\\SummerBestWebForm.Client\\Pages\\Home.razor",
|
||||
"RelativeToolTip": "SummerBestWebForm.Client\\Pages\\Home.razor",
|
||||
"ViewState": "AgIAAAMCAAAAAAAAAAAAABsCAAAAAAAAAAAAAA==",
|
||||
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000759|",
|
||||
"WhenOpened": "2025-05-05T16:00:26.455Z",
|
||||
"EditorCaption": ""
|
||||
},
|
||||
{
|
||||
"$type": "Document",
|
||||
"DocumentIndex": 1,
|
||||
"Title": "app.css",
|
||||
"DocumentMoniker": "C:\\Users\\joshdeck.KEYMTV\\Documents\\Misc\\SummerBestWebForm\\SummerBestWebForm\\wwwroot\\app.css",
|
||||
"RelativeDocumentMoniker": "SummerBestWebForm\\wwwroot\\app.css",
|
||||
"ToolTip": "C:\\Users\\joshdeck.KEYMTV\\Documents\\Misc\\SummerBestWebForm\\SummerBestWebForm\\wwwroot\\app.css",
|
||||
"RelativeToolTip": "SummerBestWebForm\\wwwroot\\app.css",
|
||||
"ViewState": "AgIAAB4AAAAAAAAAAAAIwDEAAAAXAAAAAAAAAA==",
|
||||
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.003000|",
|
||||
"WhenOpened": "2025-05-06T13:07:01.591Z",
|
||||
"EditorCaption": ""
|
||||
},
|
||||
{
|
||||
"$type": "Document",
|
||||
"DocumentIndex": 2,
|
||||
"Title": "MainLayout.razor",
|
||||
"DocumentMoniker": "C:\\Users\\joshdeck.KEYMTV\\Documents\\Misc\\SummerBestWebForm\\SummerBestWebForm.Client\\Layout\\MainLayout.razor",
|
||||
"RelativeDocumentMoniker": "SummerBestWebForm.Client\\Layout\\MainLayout.razor",
|
||||
"ToolTip": "C:\\Users\\joshdeck.KEYMTV\\Documents\\Misc\\SummerBestWebForm\\SummerBestWebForm.Client\\Layout\\MainLayout.razor",
|
||||
"RelativeToolTip": "SummerBestWebForm.Client\\Layout\\MainLayout.razor",
|
||||
"ViewState": "AgIAAAAAAAAAAAAAAAAAAAQAAAAXAAAAAAAAAA==",
|
||||
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000759|",
|
||||
"WhenOpened": "2025-05-05T15:59:59.662Z",
|
||||
"EditorCaption": ""
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
|
@ -0,0 +1,5 @@
|
|||
@inherits LayoutComponentBase
|
||||
|
||||
<TelerikRootComponent>
|
||||
@Body
|
||||
</TelerikRootComponent>
|
|
@ -0,0 +1,96 @@
|
|||
.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 {
|
||||
background: lightyellow;
|
||||
bottom: 0;
|
||||
box-shadow: 0 -1px 2px rgba(0, 0, 0, 0.2);
|
||||
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;
|
||||
}
|
|
@ -0,0 +1,29 @@
|
|||
<div class="top-row ps-3 navbar navbar-dark">
|
||||
<div class="container-fluid">
|
||||
<a class="navbar-brand" href="">SummerBestWebForm</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<input type="checkbox" title="Navigation menu" class="navbar-toggler" />
|
||||
|
||||
<div class="nav-scrollable" onclick="document.querySelector('.navbar-toggler').click()">
|
||||
<nav class="flex-column">
|
||||
<div class="nav-item px-3">
|
||||
<NavLink class="nav-link" href="" Match="NavLinkMatch.All">
|
||||
<span class="bi bi-house-door-fill" 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" 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" aria-hidden="true"></span> Weather
|
||||
</NavLink>
|
||||
</div>
|
||||
</nav>
|
||||
</div>
|
|
@ -0,0 +1,102 @@
|
|||
.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 {
|
||||
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 {
|
||||
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 {
|
||||
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 {
|
||||
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 a {
|
||||
color: #d7d7d7;
|
||||
border-radius: 4px;
|
||||
height: 3rem;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
line-height: 3rem;
|
||||
}
|
||||
|
||||
.nav-item ::deep a.active {
|
||||
background-color: rgba(255,255,255,0.37);
|
||||
color: white;
|
||||
}
|
||||
|
||||
.nav-item ::deep a: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;
|
||||
}
|
||||
}
|
|
@ -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++;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,767 @@
|
|||
@page "/"
|
||||
@using System.ComponentModel.DataAnnotations
|
||||
@using kmCommonLibsCore;
|
||||
|
||||
@if (ShowWizard)
|
||||
{
|
||||
<TelerikWizard @bind-Value="@Value" OnFinish="@OnFinishHandler" Width="1440px" Height="900px" Class="sbWizard">
|
||||
<WizardSteps>
|
||||
@* *@
|
||||
@* Step 1 - plastic card vs postcard *@
|
||||
@* *@
|
||||
<WizardStep Label="Card Type" Icon="@SvgIcon.EnvelopeBox" OnChange="@OnCardChoiceStepChange" Valid="@IsCardChoiceValid">
|
||||
<Content>
|
||||
<TelerikForm Model="@cardType" @ref="@cardTypeForm">
|
||||
<FormItems>
|
||||
<h1 style="text-align:center">Choose a Card Type</h1>
|
||||
@* Logic behind the buttons *@
|
||||
<div style="text-align:center">
|
||||
<TelerikButtonGroup SelectionMode="@ButtonGroupSelectionMode.Single">
|
||||
<ButtonGroupToggleButton @bind-Selected="@isPlasticCard">Plastic Card</ButtonGroupToggleButton>
|
||||
<ButtonGroupToggleButton @bind-Selected="@isPostcard">Postcard</ButtonGroupToggleButton>
|
||||
</TelerikButtonGroup>
|
||||
</div>
|
||||
<br />
|
||||
|
||||
@* Preview information about the selected card type*@
|
||||
|
||||
@if (isPlasticCard)
|
||||
{
|
||||
<h3>Focused on Expanding Your Customer Base ($1.02/card)</h3>
|
||||
}
|
||||
else
|
||||
{
|
||||
<h3>Focused on Thanking and Rewarding Your Best Customers ($0.79/card)</h3>
|
||||
}
|
||||
|
||||
@if(isPlasticCard) {
|
||||
<img src="img/Plastic1_Back.png" />
|
||||
} else {
|
||||
<img src="img/Postcard1_Front.png" />
|
||||
}
|
||||
</FormItems>
|
||||
<FormButtons>
|
||||
@* Need this here to avoid addition of random submit button *@
|
||||
</FormButtons>
|
||||
</TelerikForm>
|
||||
</Content>
|
||||
</WizardStep>
|
||||
|
||||
|
||||
|
||||
@* *@
|
||||
@* Step 2 - selecting card design *@
|
||||
@* *@
|
||||
<WizardStep Label="Card Design" Icon="@SvgIcon.MapMarkerTarget" OnChange="@OnDesignStepChange" Valid="@IsDesignChoiceValid">
|
||||
<Content>
|
||||
<TelerikForm Model="@custOptions"
|
||||
@ref="@customizationForm">
|
||||
<FormValidation>
|
||||
<DataAnnotationsValidator></DataAnnotationsValidator>
|
||||
</FormValidation>
|
||||
<FormItems>
|
||||
<h1 style="text-align:center">Choose a Design</h1>
|
||||
|
||||
@* Button logic *@
|
||||
<div style="text-align:center">
|
||||
<TelerikButtonGroup SelectionMode="@ButtonGroupSelectionMode.Single">
|
||||
@if (isPlasticCard)
|
||||
{
|
||||
<ButtonGroupToggleButton @bind-Selected="@designOne">Plastic Card 1</ButtonGroupToggleButton>
|
||||
<ButtonGroupToggleButton @bind-Selected="@designTwo">Plastic Card 2</ButtonGroupToggleButton>
|
||||
<ButtonGroupToggleButton @bind-Selected="@designThree">Plastic Card 3</ButtonGroupToggleButton>
|
||||
}
|
||||
else
|
||||
{
|
||||
<ButtonGroupToggleButton @bind-Selected="@designOne">Postcard 1</ButtonGroupToggleButton>
|
||||
<ButtonGroupToggleButton @bind-Selected="@designTwo">Postcard 2</ButtonGroupToggleButton>
|
||||
<ButtonGroupToggleButton @bind-Selected="@designThree">Postcard 3</ButtonGroupToggleButton>
|
||||
}
|
||||
</TelerikButtonGroup>
|
||||
<br /><br />
|
||||
@* Card preview logic *@
|
||||
@if (designOne)
|
||||
{
|
||||
@if(isPostcard)
|
||||
{
|
||||
<img src="img/Postcard1_Front.png" />
|
||||
<img src="img/Postcard1_Back.png" />
|
||||
}
|
||||
else
|
||||
{
|
||||
<img src="img/Plastic1_Front.png" />
|
||||
<img src="img/Plastic1_Back.png" />
|
||||
|
||||
}
|
||||
}
|
||||
else if(designTwo)
|
||||
{
|
||||
@if(isPostcard)
|
||||
{
|
||||
<img src="img/Postcard2_Front.png" />
|
||||
<img src="img/Postcard2_Back.png" />
|
||||
}
|
||||
else
|
||||
{
|
||||
<img src="img/Plastic2_Front.png" />
|
||||
<img src="img/Plastic2_Back.png" />
|
||||
}
|
||||
}
|
||||
else if (designThree)
|
||||
{
|
||||
@if(isPostcard)
|
||||
{
|
||||
<img src="img/Postcard3_Front.png" />
|
||||
<img src="img/Postcard3_Back.png" />
|
||||
}
|
||||
else
|
||||
{
|
||||
<img src="img/Plastic3_Front.png" />
|
||||
<img src="img/Plastic3_Back.png" />
|
||||
}
|
||||
}
|
||||
</div>
|
||||
</FormItems>
|
||||
<FormButtons>
|
||||
|
||||
</FormButtons>
|
||||
</TelerikForm>
|
||||
</Content>
|
||||
</WizardStep>
|
||||
|
||||
|
||||
|
||||
@* *@
|
||||
@* Step 3 - For postcards, choose a verse and a signature *@
|
||||
@* *@
|
||||
<WizardStep Label="Customization" OnChange="@OnMessagingStepChange" Valid="@isMessagingValid">
|
||||
<Content>
|
||||
<TelerikForm Model="@messagingOptions"
|
||||
@ref="@messagingForm">
|
||||
<FormItems>
|
||||
@if (isPlasticCard)
|
||||
{
|
||||
<h1>No customization needed. Please proceed to logo selection.</h1>
|
||||
}
|
||||
else
|
||||
{
|
||||
<h1>Select a Verse</h1>
|
||||
@if (!isPlasticCard)
|
||||
{
|
||||
<TelerikButtonGroup SelectionMode="@ButtonGroupSelectionMode.Single" Class="vertical-buttons block-buttons">
|
||||
<ButtonGroupToggleButton @bind-Selected="@verseOne">Option 1</ButtonGroupToggleButton>
|
||||
<ButtonGroupToggleButton @bind-Selected="@verseTwo">Option 2</ButtonGroupToggleButton>
|
||||
<ButtonGroupToggleButton @bind-Selected="@verseThree">Option 3</ButtonGroupToggleButton>
|
||||
</TelerikButtonGroup>
|
||||
<br />
|
||||
<br />
|
||||
|
||||
@if (verseOne)
|
||||
{
|
||||
<a>Thank you for making our success possible. We appreciate loyal customers like you and look forward to continuing to be your complete auto repair, service and tire center</a>
|
||||
}
|
||||
else if(verseTwo)
|
||||
{
|
||||
<a>We appreciate the trust you have shown in us and look forward to working with you in the future.</a>
|
||||
}
|
||||
else if(verseThree)
|
||||
{
|
||||
<a>We want you to know that we truly appreciate your business and will make every effort possible to continue to provide you with excellent car care.</a>
|
||||
}
|
||||
<br />
|
||||
<br />
|
||||
<hr />
|
||||
|
||||
|
||||
|
||||
<h1>Select a Signature</h1>
|
||||
<TelerikButtonGroup SelectionMode="@ButtonGroupSelectionMode.Single">
|
||||
<ButtonGroupToggleButton @bind-Selected="@sigOne">From Your Friends</ButtonGroupToggleButton>
|
||||
<ButtonGroupToggleButton @bind-Selected="@sigTwo">Name, Title, Phone Number</ButtonGroupToggleButton>
|
||||
<ButtonGroupToggleButton @bind-Selected="@sigThree">Custom</ButtonGroupToggleButton>
|
||||
</TelerikButtonGroup>
|
||||
<br />
|
||||
<br />
|
||||
@if (sigOne)
|
||||
{
|
||||
<a>From your friends at <strong>{Location Name} {Location Phone Number}</strong></a>
|
||||
}
|
||||
else if (sigTwo)
|
||||
{
|
||||
<FormItem LabelText="Custom Signature">
|
||||
<Template>
|
||||
<label style="text-align:center; display:block" for="CustomName" class="k-label k-form-label">Name: <TelerikTextBox Id="CustomName" @bind-Value="@customName" MaxLength="30" Width="250px"></TelerikTextBox></label>
|
||||
<label style="text-align:center; display:block" for="CustomTitle" class="k-label k-form-label">Title: <TelerikTextBox Id="CustomTitle" @bind-Value="@customTitle" MaxLength="30" Width="250px"></TelerikTextBox></label>
|
||||
<label style="text-align:center; display:block" for="CustomPhone" class="k-label k-form-label">Phone: <TelerikTextBox Id="CustomPhone" @bind-Value="@customPhone" MaxLength="12" Width="200px"></TelerikTextBox></label>
|
||||
</Template>
|
||||
</FormItem>
|
||||
}
|
||||
else if (sigThree)
|
||||
{
|
||||
<FormItem LabelText="Custom Signature">
|
||||
<Template>
|
||||
<label for="CustomSignature" class="k-label k-form-label" style="text-align: center">Custom Message (max 30 character/line up to 4 lines):</label>
|
||||
<TelerikTextBox Id="CustomSignature" @bind-Value="@customSignature" MaxLength="120" Width="700px"></TelerikTextBox>
|
||||
</Template>
|
||||
</FormItem>
|
||||
}
|
||||
}
|
||||
}
|
||||
</FormItems>
|
||||
<FormButtons>
|
||||
|
||||
</FormButtons>
|
||||
</TelerikForm>
|
||||
</Content>
|
||||
</WizardStep>
|
||||
|
||||
|
||||
|
||||
@* *@
|
||||
@* Step 4 - Logo Selection *@
|
||||
@* *@
|
||||
<WizardStep Label="Logos" OnChange="@OnLogoStepChange" Valid="@isLogoValid">
|
||||
<Content>
|
||||
<TelerikForm Model="@logoOptions"
|
||||
@ref="@logoForm">
|
||||
<FormItems>
|
||||
<TelerikCheckBox Id="goodyearBox" @bind-Value="@goodyear" />
|
||||
<label for="goodyearBox">Goodyear Logo</label>
|
||||
<TelerikCheckBox Id="michelinBox" @bind-Value="@michelin" />
|
||||
<label for="michelinBox">Michelin Logo</label>
|
||||
<TelerikCheckBox Id="customBox" @bind-Value="@custom" />
|
||||
<label for="customBox">Custom Logo</label>
|
||||
<br /><br /><br />
|
||||
@if(goodyear) {
|
||||
<img src="img/goodyear.png" />
|
||||
}
|
||||
@if(michelin) {
|
||||
<img src="img/michelin.png" />
|
||||
}
|
||||
</FormItems>
|
||||
<FormButtons>
|
||||
</FormButtons>
|
||||
</TelerikForm>
|
||||
</Content>
|
||||
</WizardStep>
|
||||
|
||||
|
||||
|
||||
@* *@
|
||||
@* Step 5 - Offer selection for Plastic cards *@
|
||||
@* *@
|
||||
<WizardStep Label="Offers" OnChange="@OnOfferStepChange" Valid="@isOfferSelectionValid">
|
||||
<Content>
|
||||
<TelerikForm Model="@offerOptions"
|
||||
@ref="@offerForm">
|
||||
<FormItems>
|
||||
@if (isPlasticCard)
|
||||
{
|
||||
<h1>Please select two (2) full size offers:</h1>
|
||||
<TelerikButtonGroup SelectionMode="@ButtonGroupSelectionMode.Multiple">
|
||||
<ButtonGroupToggleButton @bind-Selected="@bigOffers[0]"><img src="img/A1.png" /></ButtonGroupToggleButton>
|
||||
<ButtonGroupToggleButton @bind-Selected="@bigOffers[1]"><img src="img/A2.png" /></ButtonGroupToggleButton>
|
||||
<ButtonGroupToggleButton @bind-Selected="@bigOffers[2]"><img src="img/A3.png" /></ButtonGroupToggleButton>
|
||||
<ButtonGroupToggleButton @bind-Selected="@bigOffers[3]"><img src="img/A4.png" /></ButtonGroupToggleButton>
|
||||
<ButtonGroupToggleButton @bind-Selected="@bigOffers[4]"><img src="img/A5.png" /></ButtonGroupToggleButton>
|
||||
<ButtonGroupToggleButton @bind-Selected="@bigOffers[5]"><img src="img/A6.png" /></ButtonGroupToggleButton>
|
||||
</TelerikButtonGroup>
|
||||
|
||||
<br />
|
||||
<br />
|
||||
<hr />
|
||||
<h1>And four (4) half-sized offers:</h1>
|
||||
<TelerikButtonGroup SelectionMode="@ButtonGroupSelectionMode.Multiple">
|
||||
<ButtonGroupToggleButton @bind-Selected="@smallOffers[0]"><img src="img/B1.png" /></ButtonGroupToggleButton>
|
||||
<ButtonGroupToggleButton @bind-Selected="@smallOffers[1]"><img src="img/B2.png" /></ButtonGroupToggleButton>
|
||||
<ButtonGroupToggleButton @bind-Selected="@smallOffers[2]"><img src="img/B3.png" /></ButtonGroupToggleButton>
|
||||
<ButtonGroupToggleButton @bind-Selected="@smallOffers[3]"><img src="img/B4.png" /></ButtonGroupToggleButton>
|
||||
<ButtonGroupToggleButton @bind-Selected="@smallOffers[4]"><img src="img/B5.png" /></ButtonGroupToggleButton>
|
||||
<ButtonGroupToggleButton @bind-Selected="@smallOffers[5]"><img src="img/B6.png" /></ButtonGroupToggleButton>
|
||||
</TelerikButtonGroup>
|
||||
<br />
|
||||
<TelerikButtonGroup SelectionMode="@ButtonGroupSelectionMode.Multiple">
|
||||
<ButtonGroupToggleButton @bind-Selected="@smallOffers[6]"><img src="img/B7.png" /></ButtonGroupToggleButton>
|
||||
<ButtonGroupToggleButton @bind-Selected="@smallOffers[7]"><img src="img/B8.png" /></ButtonGroupToggleButton>
|
||||
<ButtonGroupToggleButton @bind-Selected="@smallOffers[8]"><img src="img/B9.png" /></ButtonGroupToggleButton>
|
||||
<ButtonGroupToggleButton @bind-Selected="@smallOffers[9]"><img src="img/B10.png" /></ButtonGroupToggleButton>
|
||||
<ButtonGroupToggleButton @bind-Selected="@smallOffers[10]"><img src="img/B11.png" /></ButtonGroupToggleButton>
|
||||
<ButtonGroupToggleButton @bind-Selected="@smallOffers[11]"><img src="img/B12.png" /></ButtonGroupToggleButton>
|
||||
</TelerikButtonGroup>
|
||||
}
|
||||
else
|
||||
{
|
||||
<h1>No offers needed. Please proceed to location information.</h1>
|
||||
}
|
||||
</FormItems>
|
||||
|
||||
<FormButtons>
|
||||
|
||||
</FormButtons>
|
||||
</TelerikForm>
|
||||
</Content>
|
||||
</WizardStep>
|
||||
|
||||
|
||||
|
||||
@* *@
|
||||
@* Step 6 - Location information *@
|
||||
@* *@
|
||||
<WizardStep Label="Location Info" OnChange="@OnLocationStepChange" Valid="@isLocationInfoValid">
|
||||
<Content>
|
||||
<TelerikForm Model="@locationInfo"
|
||||
@ref="@locationForm" Columns="2" ColumnSpacing="25px">
|
||||
<FormButtons></FormButtons>
|
||||
</TelerikForm>
|
||||
</Content>
|
||||
</WizardStep>
|
||||
|
||||
|
||||
|
||||
@* *@
|
||||
@* Step 7 - Payment *@
|
||||
@* *@
|
||||
<WizardStep Label="Payment Info">
|
||||
<Content>
|
||||
<TelerikForm Model="@paymentInfo"
|
||||
@ref="@paymentForm">
|
||||
<FormItems>
|
||||
<TelerikButtonGroup SelectionMode="@ButtonGroupSelectionMode.Single" Class="vertical-buttons block-buttons">
|
||||
<ButtonGroupToggleButton @bind-Selected="@ccOnFile">Credit Card On File</ButtonGroupToggleButton>
|
||||
<ButtonGroupToggleButton @bind-Selected="@callWithInfo">Call With Payment Info</ButtonGroupToggleButton>
|
||||
<ButtonGroupToggleButton @bind-Selected="@check">Check (due by 5/31/25)</ButtonGroupToggleButton>
|
||||
</TelerikButtonGroup>
|
||||
<br /><br />
|
||||
<FormItem LabelText="Additional Info">
|
||||
<Template>
|
||||
<label for="RequestedQuantity" style="text-align: center">Requested Quantity</label>
|
||||
<TelerikTextBox Id="RequestedQuantity" @bind-Value="@requestedQuantity" MaxLength="6" Width="150px"></TelerikTextBox>
|
||||
<label for="AdditionalComments" style="text-align: center">Additional Comments</label>
|
||||
<TelerikTextBox Id="AdditionalComments" @bind-Value="@additionalComments" MaxLength="120" Width="450px"></TelerikTextBox>
|
||||
</Template>
|
||||
</FormItem>
|
||||
</FormItems>
|
||||
<FormButtons></FormButtons>
|
||||
</TelerikForm>
|
||||
</Content>
|
||||
</WizardStep>
|
||||
</WizardSteps>
|
||||
</TelerikWizard>
|
||||
}
|
||||
|
||||
|
||||
@code {
|
||||
async Task OnFinishHandler()
|
||||
{
|
||||
|
||||
|
||||
using (var em = new kmCommonLibsCore.Emails())
|
||||
{
|
||||
// Parsing the submitted form to pull the relevant information
|
||||
string cardType = isPostcard ? "Postcard" : "Plastic Card";
|
||||
string cardDesign = "";
|
||||
if (designOne)
|
||||
cardDesign = "A";
|
||||
else if (designTwo)
|
||||
cardDesign = "B";
|
||||
else if (designThree)
|
||||
cardDesign = "C";
|
||||
|
||||
|
||||
|
||||
// Postcard or Plastic specific options
|
||||
string customizationInfo = "";
|
||||
if (isPostcard)
|
||||
{
|
||||
string verseChoice = "";
|
||||
string sigChoice = "";
|
||||
|
||||
if (verseOne)
|
||||
verseChoice = "1";
|
||||
else if (verseTwo)
|
||||
verseChoice = "2";
|
||||
else if (verseThree)
|
||||
verseChoice = "3";
|
||||
|
||||
if (sigOne)
|
||||
sigChoice = string.Format("Option D - From Your Friends At:<br />{0}<br />{1}", locationInfo.LocationName, locationInfo.PhoneNumber);
|
||||
else if (sigTwo)
|
||||
sigChoice = string.Format("Option E - Name: {0}<br />Title: {1}<br />Phone: {2}", customName, customTitle, customPhone);
|
||||
else if (sigThree)
|
||||
sigChoice = string.Format("Option F - {0}", customSignature);
|
||||
|
||||
// combine these into customizationInfo
|
||||
customizationInfo = string.Format("Verse: {0}<br />Signature: {1}", verseChoice, sigChoice);
|
||||
}
|
||||
else // isPlasticCard
|
||||
{
|
||||
string smallOfferString = "";
|
||||
string bigOfferString = "";
|
||||
|
||||
int[] smallIndexes = new int[4];
|
||||
int[] bigIndexes = new int[2];
|
||||
|
||||
int smallCount = 0;
|
||||
for (int index = 0; index < smallOffers.Length; index++) {
|
||||
if (smallOffers[index]) {
|
||||
smallIndexes[smallCount] = index;
|
||||
smallCount++;
|
||||
}
|
||||
}
|
||||
|
||||
int bigCount = 0;
|
||||
for (int index = 0; index < bigOffers.Length; index++) {
|
||||
if (bigOffers[index]) {
|
||||
bigIndexes[bigCount] = index;
|
||||
bigCount++;
|
||||
}
|
||||
}
|
||||
|
||||
foreach (int index in smallIndexes) {
|
||||
switch (index)
|
||||
{
|
||||
case 0:
|
||||
smallOfferString = smallOfferString + "B1 ";
|
||||
break;
|
||||
case 1:
|
||||
smallOfferString = smallOfferString + "B2 ";
|
||||
break;
|
||||
case 2:
|
||||
smallOfferString = smallOfferString + "B3 ";
|
||||
break;
|
||||
case 3:
|
||||
smallOfferString = smallOfferString + "B4 ";
|
||||
break;
|
||||
case 4:
|
||||
smallOfferString = smallOfferString + "B5 ";
|
||||
break;
|
||||
case 5:
|
||||
smallOfferString = smallOfferString + "B6 ";
|
||||
break;
|
||||
case 6:
|
||||
smallOfferString = smallOfferString + "B7 ";
|
||||
break;
|
||||
case 7:
|
||||
smallOfferString = smallOfferString + "B8 ";
|
||||
break;
|
||||
case 8:
|
||||
smallOfferString = smallOfferString + "B9 ";
|
||||
break;
|
||||
case 9:
|
||||
smallOfferString = smallOfferString + "B10 ";
|
||||
break;
|
||||
case 10:
|
||||
smallOfferString = smallOfferString + "B11 ";
|
||||
break;
|
||||
case 11:
|
||||
smallOfferString = smallOfferString + "B12 ";
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
foreach (int index in bigIndexes)
|
||||
{
|
||||
switch (index)
|
||||
{
|
||||
case 0:
|
||||
bigOfferString = bigOfferString + "A1 ";
|
||||
break;
|
||||
case 1:
|
||||
bigOfferString = bigOfferString + "A2 ";
|
||||
break;
|
||||
case 2:
|
||||
bigOfferString = bigOfferString + "A3 ";
|
||||
break;
|
||||
case 3:
|
||||
bigOfferString = bigOfferString + "A4 ";
|
||||
break;
|
||||
case 4:
|
||||
bigOfferString = bigOfferString + "A5 ";
|
||||
break;
|
||||
case 5:
|
||||
bigOfferString = bigOfferString + "A6 ";
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
customizationInfo = string.Format("Offers: {0} - {1}", bigOfferString, smallOfferString);
|
||||
}
|
||||
|
||||
|
||||
|
||||
// Logo info
|
||||
string logos = "";
|
||||
if (!goodyear && !michelin && !custom)
|
||||
logos = "NA";
|
||||
else
|
||||
{
|
||||
if (goodyear)
|
||||
{
|
||||
logos += "Goodyear";
|
||||
if (michelin)
|
||||
logos += ", Michelin";
|
||||
if (custom)
|
||||
logos += ", Custom";
|
||||
}
|
||||
else if (michelin)
|
||||
{
|
||||
logos += "Michelin";
|
||||
if (custom)
|
||||
logos += ", Custom";
|
||||
}
|
||||
else if (custom)
|
||||
logos += "Custom";
|
||||
}
|
||||
|
||||
// Payment info
|
||||
string paymentMethod = "";
|
||||
if (ccOnFile)
|
||||
paymentMethod = "Credit Card on File";
|
||||
else if (callWithInfo)
|
||||
paymentMethod = "Call With Payment Info";
|
||||
else if (check)
|
||||
paymentMethod = "Check";
|
||||
|
||||
// Formulating the email to send
|
||||
em.Subject = "SBC Order Form Submission";
|
||||
em.AddAddress(enuAddressType.From, "support@keymotive.us", "Summer Growth Enrollment");
|
||||
em.AddAddress(enuAddressType.To, "support@keymotive.us", "KeyMotive Support");
|
||||
|
||||
string locInfoString = string.Format("<pre>Location Name: {0}<br />Manager: {1}<br />Address: {2}<br />City: {3}<br />State: {4}<br />Zip: {5}<br /><br />Phone Number: {6}<br />Contact Name: {7}<br />Contact Phone: {8}<br />Contact Email: {9}<br />",
|
||||
locationInfo.LocationName, locationInfo.Manager, locationInfo.Address, locationInfo.City, locationInfo.State,
|
||||
locationInfo.Zip, locationInfo.PhoneNumber, locationInfo.ContactName,
|
||||
locationInfo.ContactPhone, locationInfo.ContactEmail);
|
||||
|
||||
string cardInfoString = string.Format("Card type: {0}, Design {1}<br /><br />Customization Options:<br />{2}<br />Logos: {3}<br />",
|
||||
cardType, cardDesign, customizationInfo, logos);
|
||||
|
||||
string paymentString = string.Format("Payment Method: {0}<br /><br />Requested Quantity: {1}<br />Additional Comments: {2}", paymentMethod, requestedQuantity, additionalComments);
|
||||
em.HtmlBody = "<b>You have a new enrollment:</b><br />" +locInfoString + cardInfoString + paymentString + "</pre>";
|
||||
|
||||
try
|
||||
{
|
||||
em.Send();
|
||||
await Console.Out.WriteLineAsync("Done sending");
|
||||
}
|
||||
catch(Exception e)
|
||||
{
|
||||
await Console.Out.WriteLineAsync("ERROR: " + e.Message);
|
||||
}
|
||||
ShowWizard = false;
|
||||
await Dialog.AlertAsync("The Registration was submitted successfully", "Done");
|
||||
}
|
||||
}
|
||||
|
||||
public bool? IsCardChoiceValid { get; set; }
|
||||
|
||||
public bool? IsDesignChoiceValid { get; set; }
|
||||
|
||||
[CascadingParameter]
|
||||
public DialogFactory Dialog { get; set; }
|
||||
|
||||
public bool ShowWizard { get; set; } = true;
|
||||
|
||||
public int Value { get; set; }
|
||||
|
||||
public TelerikForm RegisterForm { get; set; }
|
||||
public User UserModel { get; set; } = new User();
|
||||
|
||||
|
||||
// Variables for selecting between plastic and post
|
||||
public TelerikForm cardTypeForm { get; set; }
|
||||
public CardType cardType { get; set; } = new CardType();
|
||||
public bool isPlasticCard = true;
|
||||
public bool isPostcard = false;
|
||||
|
||||
// Variables for selecting specific design
|
||||
public TelerikForm customizationForm { get; set; }
|
||||
public CustomizationOptions custOptions { get; set; } = new CustomizationOptions();
|
||||
public bool designOne = true;
|
||||
public bool designTwo = false;
|
||||
public bool designThree = false;
|
||||
|
||||
// Variables for selecting messaging (postcards only)
|
||||
public TelerikForm messagingForm { get; set; }
|
||||
public MessagingOptions messagingOptions { get; set; } = new MessagingOptions();
|
||||
public bool verseOne = true;
|
||||
public bool verseTwo = false;
|
||||
public bool verseThree = false;
|
||||
public bool sigOne = true;
|
||||
public bool sigTwo = false;
|
||||
public bool sigThree = false;
|
||||
public string customName = ""; // For sig two
|
||||
public string customTitle = "";
|
||||
public string customPhone = "";
|
||||
public string customSignature = ""; // For sig three
|
||||
public bool isMessagingValid = false;
|
||||
|
||||
// Variables for logo selection
|
||||
public TelerikForm logoForm { get; set; }
|
||||
public LogoOptions logoOptions { get; set; } = new LogoOptions();
|
||||
public bool goodyear = false;
|
||||
public bool michelin = false;
|
||||
public bool custom = false;
|
||||
public bool isLogoValid = false;
|
||||
|
||||
// Variables for offer selection (plastic cards only)
|
||||
public TelerikForm offerForm { get; set; }
|
||||
public OfferOptions offerOptions { get; set; } = new OfferOptions();
|
||||
public bool[] bigOffers = new bool[6];
|
||||
public bool[] smallOffers = new bool[12];
|
||||
public bool isOfferSelectionValid = false;
|
||||
|
||||
// Location information
|
||||
public TelerikForm locationForm { get; set; }
|
||||
public LocationInfo locationInfo { get; set; } = new LocationInfo();
|
||||
public string locationName { get; set; }
|
||||
public string manager { get; set; }
|
||||
public string address { get; set; }
|
||||
public string city { get; set; }
|
||||
public string state { get; set; }
|
||||
public string zip { get; set; }
|
||||
public string phoneNumber { get; set; }
|
||||
public string contactName { get; set; }
|
||||
public string contactPhone { get; set; }
|
||||
public string contactEmail { get; set; }
|
||||
public bool isLocationInfoValid = false;
|
||||
|
||||
// Payment information
|
||||
public TelerikForm paymentForm { get; set; }
|
||||
public PaymentInfo paymentInfo { get; set; } = new PaymentInfo();
|
||||
public string requestedQuantity = "";
|
||||
public string additionalComments = "";
|
||||
public bool ccOnFile = true;
|
||||
public bool callWithInfo = false;
|
||||
public bool check = false;
|
||||
|
||||
|
||||
public void ToggleCardType()
|
||||
{
|
||||
isPlasticCard = !isPlasticCard;
|
||||
isPostcard = !isPostcard;
|
||||
}
|
||||
public void OnCardChoiceStepChange(WizardStepChangeEventArgs args)
|
||||
{
|
||||
IsCardChoiceValid = true; // This is forced to be true but required nonetheless
|
||||
}
|
||||
|
||||
public void OnDesignStepChange(WizardStepChangeEventArgs args)
|
||||
{
|
||||
IsDesignChoiceValid = true; // Same as card choice
|
||||
}
|
||||
|
||||
public void OnMessagingStepChange(WizardStepChangeEventArgs args)
|
||||
{
|
||||
isMessagingValid = true;
|
||||
}
|
||||
|
||||
public void OnLogoStepChange(WizardStepChangeEventArgs arg)
|
||||
{
|
||||
isLogoValid = true;
|
||||
}
|
||||
|
||||
public async void OnOfferStepChange(WizardStepChangeEventArgs args)
|
||||
{
|
||||
if (isPostcard)
|
||||
{
|
||||
isOfferSelectionValid = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
int bigOfferCount = 0;
|
||||
foreach (bool selection in bigOffers)
|
||||
{
|
||||
if (selection)
|
||||
bigOfferCount++;
|
||||
}
|
||||
|
||||
int smallOfferCount = 0;
|
||||
foreach (bool selection in smallOffers)
|
||||
{
|
||||
if (selection)
|
||||
smallOfferCount++;
|
||||
}
|
||||
|
||||
if (smallOfferCount == 4 && bigOfferCount == 2)
|
||||
isOfferSelectionValid = true;
|
||||
else
|
||||
isOfferSelectionValid = false;
|
||||
|
||||
if (!isOfferSelectionValid)
|
||||
{
|
||||
args.IsCancelled = true;
|
||||
await Dialog.AlertAsync("Please select the proper amount of offers.", "You cannot proceed");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public async void OnLocationStepChange(WizardStepChangeEventArgs args)
|
||||
{
|
||||
isLocationInfoValid = locationInfo.ContactEmail != "" && locationInfo.ContactPhone != "" && locationInfo.ContactName != "" && locationInfo.City != "" &&
|
||||
locationInfo.State != "" && locationInfo.Zip != "" && locationInfo.PhoneNumber != "" && locationInfo.LocationName != "" &&
|
||||
locationInfo.Address != "" && locationInfo.Manager != "";
|
||||
|
||||
if(!isLocationInfoValid)
|
||||
{
|
||||
args.IsCancelled = true;
|
||||
await Dialog.AlertAsync("Please fill out all required fields.", "You cannot proceed");
|
||||
}
|
||||
}
|
||||
|
||||
public class CardType
|
||||
{
|
||||
[Required]
|
||||
public string cardChoice { get; set; }
|
||||
}
|
||||
|
||||
public class CustomizationOptions
|
||||
{
|
||||
[Required]
|
||||
public string custOption { get; set; }
|
||||
}
|
||||
|
||||
public class MessagingOptions
|
||||
{
|
||||
public string verse { get; set; }
|
||||
public string signature { get; set; }
|
||||
}
|
||||
|
||||
public class LogoOptions
|
||||
{
|
||||
public string option;
|
||||
}
|
||||
|
||||
public class OfferOptions
|
||||
{
|
||||
public string option;
|
||||
}
|
||||
|
||||
public class LocationInfo
|
||||
{
|
||||
[Required]
|
||||
public string LocationName { get; set; } = "";
|
||||
[Required]
|
||||
public string Manager { get; set; } = "";
|
||||
[Required]
|
||||
public string Address { get; set; } = "";
|
||||
[Required]
|
||||
public string City { get; set; } = "";
|
||||
[Required]
|
||||
public string State { get; set; } = "";
|
||||
[Required]
|
||||
public string Zip { get; set; } = "";
|
||||
[Required]
|
||||
public string PhoneNumber { get; set; } = "";
|
||||
[Required]
|
||||
public string ContactName { get; set; } = "";
|
||||
[Required]
|
||||
public string ContactPhone { get; set; } = "";
|
||||
[Required]
|
||||
public string ContactEmail { get; set; } = "";
|
||||
}
|
||||
|
||||
public class PaymentInfo
|
||||
{
|
||||
public string info;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,63 @@
|
|||
@page "/weather"
|
||||
|
||||
<PageTitle>Weather</PageTitle>
|
||||
|
||||
<h1>Weather</h1>
|
||||
|
||||
<p>This component demonstrates showing data.</p>
|
||||
|
||||
@if (forecasts == null)
|
||||
{
|
||||
<p><em>Loading...</em></p>
|
||||
}
|
||||
else
|
||||
{
|
||||
<table class="table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Date</th>
|
||||
<th>Temp. (C)</th>
|
||||
<th>Temp. (F)</th>
|
||||
<th>Summary</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
@foreach (var forecast in forecasts)
|
||||
{
|
||||
<tr>
|
||||
<td>@forecast.Date.ToShortDateString()</td>
|
||||
<td>@forecast.TemperatureC</td>
|
||||
<td>@forecast.TemperatureF</td>
|
||||
<td>@forecast.Summary</td>
|
||||
</tr>
|
||||
}
|
||||
</tbody>
|
||||
</table>
|
||||
}
|
||||
|
||||
@code {
|
||||
private WeatherForecast[]? forecasts;
|
||||
|
||||
protected override async Task OnInitializedAsync()
|
||||
{
|
||||
// Simulate asynchronous loading to demonstrate a loading indicator
|
||||
await Task.Delay(500);
|
||||
|
||||
var startDate = DateOnly.FromDateTime(DateTime.Now);
|
||||
var summaries = new[] { "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching" };
|
||||
forecasts = Enumerable.Range(1, 5).Select(index => new WeatherForecast
|
||||
{
|
||||
Date = startDate.AddDays(index),
|
||||
TemperatureC = Random.Shared.Next(-20, 55),
|
||||
Summary = summaries[Random.Shared.Next(summaries.Length)]
|
||||
}).ToArray();
|
||||
}
|
||||
|
||||
private class WeatherForecast
|
||||
{
|
||||
public DateOnly Date { get; set; }
|
||||
public int TemperatureC { get; set; }
|
||||
public string? Summary { get; set; }
|
||||
public int TemperatureF => 32 + (int)(TemperatureC / 0.5556);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,7 @@
|
|||
using Microsoft.AspNetCore.Components.WebAssembly.Hosting;
|
||||
|
||||
var builder = WebAssemblyHostBuilder.CreateDefault(args);
|
||||
|
||||
builder.Services.AddTelerikBlazor();
|
||||
|
||||
await builder.Build().RunAsync();
|
|
@ -0,0 +1,6 @@
|
|||
<Router AppAssembly="@typeof(Program).Assembly">
|
||||
<Found Context="routeData">
|
||||
<RouteView RouteData="@routeData" DefaultLayout="@typeof(Layout.MainLayout)" />
|
||||
<FocusOnNavigate RouteData="@routeData" Selector="h1" />
|
||||
</Found>
|
||||
</Router>
|
|
@ -0,0 +1,22 @@
|
|||
<Project Sdk="Microsoft.NET.Sdk.BlazorWebAssembly">
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFramework>net9.0</TargetFramework>
|
||||
<Nullable>enable</Nullable>
|
||||
<ImplicitUsings>enable</ImplicitUsings>
|
||||
<NoDefaultLaunchSettingsFile>true</NoDefaultLaunchSettingsFile>
|
||||
<StaticWebAssetProjectMode>Default</StaticWebAssetProjectMode>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<None Include="wwwroot\img\postcard1.png" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="kmCommonLibsCore" Version="2.0.0.129" />
|
||||
<PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly" Version="8.0.0" />
|
||||
<PackageReference Include="Telerik.SvgIcons" Version="4.1.0" />
|
||||
<PackageReference Include="Telerik.UI.for.Blazor" Version="6.2.0" />
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
|
@ -0,0 +1,11 @@
|
|||
@using System.Net.Http
|
||||
@using System.Net.Http.Json
|
||||
@using Microsoft.AspNetCore.Components.Forms
|
||||
@using Microsoft.AspNetCore.Components.Routing
|
||||
@using Microsoft.AspNetCore.Components.Web
|
||||
@using Microsoft.AspNetCore.Components.Web.Virtualization
|
||||
@using Microsoft.JSInterop
|
||||
@using SummerBestWebForm.Client
|
||||
@using Telerik.Blazor
|
||||
@using Telerik.Blazor.Components
|
||||
@using Telerik.SvgIcons
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue