Repository: moemura/AdminLTE.Core Branch: master Commit: 70c980db55d0 Files: 132 Total size: 357.6 KB Directory structure: gitextract_2k0n1zd6/ ├── .gitignore ├── AdminLTE.sln.DotSettings ├── AdminLTE.slnx ├── LICENSE ├── README.md └── src/ └── AdminLTE/ ├── AdminLTE.csproj ├── Common/ │ ├── Attributes/ │ │ └── HelpDefinitionAttribute.cs │ ├── CustomClaimTypes.cs │ ├── Extensions/ │ │ └── IdentityExtension.cs │ ├── GlobalHelper.cs │ └── ModuleHelper.cs ├── Controllers/ │ ├── AccountController.cs │ ├── BaseController.cs │ ├── HomeController.cs │ ├── ManageController.cs │ ├── RoleController.cs │ ├── SuperAdminController.cs │ └── UserLogsController.cs ├── Data/ │ ├── AppClaimsPrincipalFactory.cs │ ├── ApplicationDbContext.cs │ ├── AuditableSignInManager.cs │ ├── DataSeed.cs │ └── Migrations/ │ ├── 00000000000000_CreateIdentitySchema.Designer.cs │ ├── 00000000000000_CreateIdentitySchema.cs │ ├── 20160801092435_ExtendASPNetUser.Designer.cs │ ├── 20160801092435_ExtendASPNetUser.cs │ ├── 20160802025049_UserAuditTable.Designer.cs │ ├── 20160802025049_UserAuditTable.cs │ ├── 20160802083550_AddedAdditionalUserFields.Designer.cs │ ├── 20160802083550_AddedAdditionalUserFields.cs │ ├── 20251217031644_UpdateEF10.Designer.cs │ ├── 20251217031644_UpdateEF10.cs │ └── ApplicationDbContextModelSnapshot.cs ├── Models/ │ ├── AccountViewModels/ │ │ ├── ExternalLoginConfirmationViewModel.cs │ │ ├── ForgotPasswordViewModel.cs │ │ ├── LoginViewModel.cs │ │ ├── RegisterViewModel.cs │ │ ├── ResetPasswordViewModel.cs │ │ ├── SendCodeViewModel.cs │ │ └── VerifyCodeViewModel.cs │ ├── ApplicationUser.cs │ ├── ManageViewModels/ │ │ ├── AddPhoneNumberViewModel.cs │ │ ├── ChangePasswordViewModel.cs │ │ ├── ConfigureTwoFactorViewModel.cs │ │ ├── FactorViewModel.cs │ │ ├── IndexViewModel.cs │ │ ├── ManageLoginsViewModel.cs │ │ ├── RemoveLoginViewModel.cs │ │ ├── SetPasswordViewModel.cs │ │ └── VerifyPhoneNumberViewModel.cs │ ├── Message.cs │ ├── RoleViewModels/ │ │ ├── EditRoleVm.cs │ │ └── ModifyRoleVm.cs │ ├── SalesOrderDetail.cs │ ├── SidebarMenu.cs │ ├── SuperAdminViewModels/ │ │ └── CreateVm.cs │ └── UserAudit.cs ├── Program.cs ├── Project_Readme.html ├── Properties/ │ └── launchSettings.json ├── Services/ │ ├── IEmailSender.cs │ ├── ISmsSender.cs │ ├── MessageServices.cs │ └── RequestLoggingMiddleware.cs ├── ViewComponents/ │ ├── BreadcrumbViewComponent.cs │ ├── ControlSidebarViewComponent.cs │ ├── FooterViewComponent.cs │ ├── HeaderViewComponent.cs │ ├── MenuMessageViewComponent.cs │ ├── MenuNotificationViewComponent.cs │ ├── MenuTaskViewComponent.cs │ ├── MenuUserViewComponent.cs │ ├── PageAlertViewComponent.cs │ ├── PageHeaderViewComponent.cs │ └── SidebarViewComponent.cs ├── Views/ │ ├── Account/ │ │ ├── ConfirmEmail.cshtml │ │ ├── ExternalLoginConfirmation.cshtml │ │ ├── ExternalLoginFailure.cshtml │ │ ├── ForgotPassword.cshtml │ │ ├── ForgotPasswordConfirmation.cshtml │ │ ├── Lockout.cshtml │ │ ├── Login.cshtml │ │ ├── Register.cshtml │ │ ├── ResetPassword.cshtml │ │ ├── ResetPasswordConfirmation.cshtml │ │ ├── SendCode.cshtml │ │ └── VerifyCode.cshtml │ ├── Home/ │ │ ├── About.cshtml │ │ ├── Contact.cshtml │ │ ├── Error.cshtml │ │ └── Index.cshtml │ ├── Manage/ │ │ ├── AddPhoneNumber.cshtml │ │ ├── ChangePassword.cshtml │ │ ├── Index.cshtml │ │ ├── ManageLogins.cshtml │ │ ├── SetPassword.cshtml │ │ └── VerifyPhoneNumber.cshtml │ ├── Role/ │ │ ├── Create.cshtml │ │ ├── Edit.cshtml │ │ └── Index.cshtml │ ├── Shared/ │ │ ├── Components/ │ │ │ ├── Breadcrumb/ │ │ │ │ └── Default.cshtml │ │ │ ├── ControlSidebar/ │ │ │ │ └── Default.cshtml │ │ │ ├── Footer/ │ │ │ │ └── Default.cshtml │ │ │ ├── Header/ │ │ │ │ └── Default.cshtml │ │ │ ├── MenuMessage/ │ │ │ │ └── Default.cshtml │ │ │ ├── MenuNotification/ │ │ │ │ └── Default.cshtml │ │ │ ├── MenuTask/ │ │ │ │ └── Default.cshtml │ │ │ ├── MenuUser/ │ │ │ │ └── Default.cshtml │ │ │ ├── PageAlert/ │ │ │ │ └── Default.cshtml │ │ │ ├── PageHeader/ │ │ │ │ └── Default.cshtml │ │ │ └── Sidebar/ │ │ │ └── Default.cshtml │ │ ├── Error.cshtml │ │ ├── _Layout.cshtml │ │ ├── _LoginPartial.cshtml │ │ └── _ValidationScriptsPartial.cshtml │ ├── SuperAdmin/ │ │ ├── ChangePassword.cshtml │ │ ├── Create.cshtml │ │ ├── Edit.cshtml │ │ └── Index.cshtml │ ├── UserLogs/ │ │ └── Index.cshtml │ ├── _ViewImports.cshtml │ └── _ViewStart.cshtml ├── appsettings.json ├── bundleconfig.json ├── libman.json ├── web.config └── wwwroot/ ├── _references.js ├── css/ │ ├── animation.css │ ├── error.css │ └── site.css ├── files/ │ └── SalesOrderDetail.txt └── js/ └── site.js ================================================ FILE CONTENTS ================================================ ================================================ FILE: .gitignore ================================================ /src/AdminLTE/wwwroot/lib/ ## Ignore Visual Studio temporary files, build results, and ## files generated by popular Visual Studio add-ons. # User-specific files *.suo *.user *.userosscache *.sln.docstates # User-specific files (MonoDevelop/Xamarin Studio) *.userprefs # Build results [Dd]ebug/ [Dd]ebugPublic/ [Rr]elease/ [Rr]eleases/ x64/ x86/ bld/ [Bb]in/ [Oo]bj/ [Ll]og/ # Visual Studio 2015 cache/options directory .vs/ # Uncomment if you have tasks that create the project's static files in wwwroot #wwwroot/ # MSTest test Results [Tt]est[Rr]esult*/ [Bb]uild[Ll]og.* # NUNIT *.VisualState.xml TestResult.xml # Build Results of an ATL Project [Dd]ebugPS/ [Rr]eleasePS/ dlldata.c # DNX project.lock.json artifacts/ *_i.c *_p.c *_i.h *.ilk *.meta *.obj *.pch *.pdb *.pgc *.pgd *.rsp *.sbr *.tlb *.tli *.tlh *.tmp *.tmp_proj *.log *.vspscc *.vssscc .builds *.pidb *.svclog *.scc # Chutzpah Test files _Chutzpah* # Visual C++ cache files ipch/ *.aps *.ncb *.opendb *.opensdf *.sdf *.cachefile *.VC.db *.VC.VC.opendb # Visual Studio profiler *.psess *.vsp *.vspx *.sap # TFS 2012 Local Workspace $tf/ # Guidance Automation Toolkit *.gpState # ReSharper is a .NET coding add-in _ReSharper*/ *.[Rr]e[Ss]harper *.DotSettings.user # JustCode is a .NET coding add-in .JustCode # TeamCity is a build add-in _TeamCity* # DotCover is a Code Coverage Tool *.dotCover # NCrunch _NCrunch_* .*crunch*.local.xml nCrunchTemp_* # MightyMoose *.mm.* AutoTest.Net/ # Web workbench (sass) .sass-cache/ # Installshield output folder [Ee]xpress/ # DocProject is a documentation generator add-in DocProject/buildhelp/ DocProject/Help/*.HxT DocProject/Help/*.HxC DocProject/Help/*.hhc DocProject/Help/*.hhk DocProject/Help/*.hhp DocProject/Help/Html2 DocProject/Help/html # Click-Once directory publish/ # Publish Web Output *.[Pp]ublish.xml *.azurePubxml # TODO: Comment the next line if you want to checkin your web deploy settings # but database connection strings (with potential passwords) will be unencrypted *.pubxml *.publishproj # Microsoft Azure Web App publish settings. Comment the next line if you want to # checkin your Azure Web App publish settings, but sensitive information contained # in these scripts will be unencrypted PublishScripts/ # NuGet Packages *.nupkg # The packages folder can be ignored because of Package Restore **/packages/* # except build/, which is used as an MSBuild target. !**/packages/build/ # Uncomment if necessary however generally it will be regenerated when needed #!**/packages/repositories.config # NuGet v3's project.json files produces more ignoreable files *.nuget.props *.nuget.targets # Microsoft Azure Build Output csx/ *.build.csdef # Microsoft Azure Emulator ecf/ rcf/ # Windows Store app package directories and files AppPackages/ BundleArtifacts/ Package.StoreAssociation.xml _pkginfo.txt # Visual Studio cache files # files ending in .cache can be ignored *.[Cc]ache # but keep track of directories ending in .cache !*.[Cc]ache/ # Others ClientBin/ ~$* *~ *.dbmdl *.dbproj.schemaview *.pfx *.publishsettings node_modules/ orleans.codegen.cs # Since there are multiple workflows, uncomment next line to ignore bower_components # (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) #bower_components/ # RIA/Silverlight projects Generated_Code/ # Backup & report files from converting an old project file # to a newer Visual Studio version. Backup files are not needed, # because we have git ;-) _UpgradeReport_Files/ Backup*/ UpgradeLog*.XML UpgradeLog*.htm # SQL Server files *.mdf *.ldf # Business Intelligence projects *.rdl.data *.bim.layout *.bim_*.settings # Microsoft Fakes FakesAssemblies/ # GhostDoc plugin setting file *.GhostDoc.xml # Node.js Tools for Visual Studio .ntvs_analysis.dat # Visual Studio 6 build log *.plg # Visual Studio 6 workspace options file *.opt # Visual Studio LightSwitch build output **/*.HTMLClient/GeneratedArtifacts **/*.DesktopClient/GeneratedArtifacts **/*.DesktopClient/ModelManifest.xml **/*.Server/GeneratedArtifacts **/*.Server/ModelManifest.xml _Pvt_Extensions # Paket dependency manager .paket/paket.exe paket-files/ # FAKE - F# Make .fake/ # JetBrains Rider .idea/ *.sln.iml ================================================ FILE: AdminLTE.sln.DotSettings ================================================  URL ================================================ FILE: AdminLTE.slnx ================================================ ================================================ FILE: LICENSE ================================================ MIT License Copyright (c) 2016 Baltazar Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ================================================ FILE: README.md ================================================ # **Admin**LTE - MVC Core This template is based from AdminLTE of http://almsaeedstudio.com. Converted as a .Net project. ## Prerequisites as a minimum, you should have the following installed * Visual Studio 2022+ _built using .NET ## Installation Just clone or fork this. Whatever you want. [Restore client side libraries](https://github.com/moemura/AdminLTE.Core/issues/1). Run the solution. ## Features ### Controls are ViewComponent like a **UserControl** see below the body of **_Layouts.cshtml** ```html
@await Component.InvokeAsync("Header") @await Component.InvokeAsync("Sidebar")
@await Component.InvokeAsync("PageHeader")
@await Component.InvokeAsync("Breadcrumb")

@await Component.InvokeAsync("PageAlert")
@RenderBody()
@await Component.InvokeAsync("Footer") @await Component.InvokeAsync("ControlSidebar")
@RenderSection("scripts", required: false) ``` ### List of ViewComponents * Header * Notification * Messages * Task * User Profile * Footer * SideBar * ControlSideBar (converted to HelpBar) * PageHeader * Breadcrumb * Login & Logout * Error Page * Registration* ### ViewComponent Usage Typically, you should inherit your Controller from `BaseController.cs` to enable convenience helpers. **PageHeader Title & Description** ```cs declaration: AddPageHeader(string pageHeader = "", string pageDescription = "") usage: AddPageHeader("Dashboard", ""); ``` **Page Alerts** ```cs declaration: AddPageAlerts(PageAlertType pageAlertType, string description) usage: AddPageAlerts(PageAlertType.Info, "you may view the summary here"); ``` **Page Breadcrumb** ```cs declaration: AddBreadcrumb(string displayName, string urlPath) usage: AddBreadcrumb("Register", "/Account/Register"); AddBreadcrumb("Contact", "/Account/Contact"); ``` **Sidebar Menus** ```cs var sidebars = new List(); sidebars.Add(ModuleHelper.AddHeader("MAIN NAVIGATION")); sidebars.Add(ModuleHelper.AddModule(ModuleHelper.Module.Home)); sidebars.Add(ModuleHelper.AddModule(ModuleHelper.Module.Error, Tuple.Create(0, 0, 1))); sidebars.Add(ModuleHelper.AddModule(ModuleHelper.Module.About, Tuple.Create(0, 1, 0))); sidebars.Add(ModuleHelper.AddModule(ModuleHelper.Module.Contact, Tuple.Create(1, 0, 0))); sidebars.Add(ModuleHelper.AddTree("Account")); sidebars.Last().TreeChild = new List() { ModuleHelper.AddModule(ModuleHelper.Module.Login), ModuleHelper.AddModule(ModuleHelper.Module.Register, Tuple.Create(1, 1, 1)), }; ``` The above code will create a hierarchical sidebar like... ``` > > LABEL > LINK 1 > LINK 1 > LINK 1 > TREE > > LINK > > LINK 1|1|1 ``` ...where 1 is the notification color at the right side of the link via Tuple. Tuple 0 will not display the notification whereas the position of the items will display its corresponding color notification **Menu Notification** This implementation is almost the same with Menu Task and Menu Message. ```cs public class MenuNotificationViewComponent : ViewComponent { public MenuNotificationViewComponent() { } public IViewComponentResult Invoke(string filter) { var messages = GetData(); return View(messages); } private List GetData() { var messages = new List(); messages.Add(new Message { Id = 1, FontAwesomeIcon = "fa fa-users text-aqua", ShortDesc = "5 new members joined today", URLPath = "#", }); return messages; } } ``` **Help Pane** You can add page help or quick links/info by adding `[HelpDefinition]` attribute above the IActionResult method ```cs public class HomeController : BaseController { [HelpDefinition] public IActionResult Index() { return View(); } ``` You can still specify a filename as parameter in case you want to retrieve it on the wwwroot/files/Shared folder. ```cs [HelpDefinition("helpdefault")] public IActionResult Contact() { ``` > By default, no arguments will get the path via ControllerName\CallerMethod which have the equivalent path to wwwroot/files/{ControllerName}/{CallerMethod}.html ### List of Global Javascript Events * **Submit Button** - disabled when click once. Auto add progress spinner. No additional codes required for that implementation. > Usage: You just simply declare the submit button. The script name is `useSubmitClass` ```html
``` * Sidebar Collapse/ Expand * The sidebar will save the expand & collapse state thru cookie. Using `Mozilla cookie helper`. > The cookie name is `sidebarstate` ### List of Control Templates * DataTable * ...more to follow ### User Audit The project implements middleware that audits user login activity upon `login, logout & failed login` ### Extended User Properties The project gives some insight on how to implement extended user properties via Claims ### HTTP Logging The project provides middleware to log `per HTTP request`. ### Authentication This uses templated individual authentication and customized `ErrorPage` & `LoginPage`. It also uses dependency injection that requires controllers by default to be ``[Authorized]`` without typing them on each controller/method ## Copyrights See MIT License ================================================ FILE: src/AdminLTE/AdminLTE.csproj ================================================  net10.0 true AdminLTE AdminLTE enable aspnet-AdminLTE-c9131f1e-93fb-4772-8c8b-1d4c77bf4354 PreserveNewest All All ================================================ FILE: src/AdminLTE/Common/Attributes/HelpDefinitionAttribute.cs ================================================ using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.Filters; using System; using System.Collections.Generic; using System.Linq; using System.Runtime.CompilerServices; using System.Threading.Tasks; namespace AdminLTE.Common.Attributes { [AttributeUsage(AttributeTargets.Method)] public class HelpDefinitionAttribute : ActionFilterAttribute, IActionFilter { private string _fileName { get; set; } private string _memberName { get; set; } private string _pageHelpFileName { get; set; } public override void OnResultExecuting(ResultExecutingContext filterContext) { var controller = filterContext.Controller as Controller; controller.ViewBag.PageHelpFileName = _pageHelpFileName; } /// /// By declaring this on the IActionResult method, you are enabling /// /// specify specific filename located in wwwroot\files\Shared folder /// THIS MUST BE EMPTY /// THIS MUST BE EMPTY public HelpDefinitionAttribute(string fileName = "",[CallerFilePath] string filePath = "", [CallerMemberName] string memberName = "") { var controllerName = filePath.Split('\\').Last().Replace("Controller.cs", string.Empty); if (fileName == string.Empty) //if not specified, will check it on the common help location plus path from class+method.html { _pageHelpFileName = controllerName + @"\" + memberName; //ChildController + ActionMethod } else //if specified, will check it in the common help location { _pageHelpFileName = @"Shared\" + fileName; } } } } ================================================ FILE: src/AdminLTE/Common/CustomClaimTypes.cs ================================================ namespace AdminLTE.Common { public static class CustomClaimTypes { #region Default ClaimTypes (taken from ClaimTypes class) // // Summary: // http://schemas.xmlsoap.org/ws/2009/09/identity/claims/actor. public const string Actor = "http://schemas.xmlsoap.org/ws/2009/09/identity/claims/actor"; // // Summary: // The URI for a claim that specifies the anonymous user; http://schemas.xmlsoap.org/ws/2005/05/identity/claims/anonymous. public const string Anonymous = "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/anonymous"; // // Summary: // The URI for a claim that specifies details about whether an identity is authenticated, // http://schemas.xmlsoap.org/ws/2005/05/identity/claims/authenticated. public const string Authentication = "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/authentication"; // // Summary: // The URI for a claim that specifies the instant at which an entity was authenticated; // http://schemas.microsoft.com/ws/2008/06/identity/claims/authenticationinstant. public const string AuthenticationInstant = "http://schemas.microsoft.com/ws/2008/06/identity/claims/authenticationinstant"; // // Summary: // The URI for a claim that specifies the method with which an entity was authenticated; // http://schemas.microsoft.com/ws/2008/06/identity/claims/authenticationmethod. public const string AuthenticationMethod = "http://schemas.microsoft.com/ws/2008/06/identity/claims/authenticationmethod"; // // Summary: // The URI for a claim that specifies an authorization decision on an entity; http://schemas.xmlsoap.org/ws/2005/05/identity/claims/authorizationdecision. public const string AuthorizationDecision = "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/authorizationdecision"; // // Summary: // The URI for a claim that specifies the cookie path; http://schemas.microsoft.com/ws/2008/06/identity/claims/cookiepath. public const string CookiePath = "http://schemas.microsoft.com/ws/2008/06/identity/claims/cookiepath"; // // Summary: // The URI for a claim that specifies the country/region in which an entity resides, // http://schemas.xmlsoap.org/ws/2005/05/identity/claims/country. public const string Country = "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/country"; // // Summary: // The URI for a claim that specifies the date of birth of an entity, http://schemas.xmlsoap.org/ws/2005/05/identity/claims/dateofbirth. public const string DateOfBirth = "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/dateofbirth"; // // Summary: // The URI for a claim that specifies the deny-only primary group SID on an entity; // http://schemas.microsoft.com/ws/2008/06/identity/claims/denyonlyprimarygroupsid. // A deny-only SID denies the specified entity to a securable object. public const string DenyOnlyPrimaryGroupSid = "http://schemas.microsoft.com/ws/2008/06/identity/claims/denyonlyprimarygroupsid"; // // Summary: // The URI for a claim that specifies the deny-only primary SID on an entity; http://schemas.microsoft.com/ws/2008/06/identity/claims/denyonlyprimarysid. // A deny-only SID denies the specified entity to a securable object. public const string DenyOnlyPrimarySid = "http://schemas.microsoft.com/ws/2008/06/identity/claims/denyonlyprimarysid"; // // Summary: // The URI for a claim that specifies a deny-only security identifier (SID) for // an entity, http://schemas.xmlsoap.org/ws/2005/05/identity/claims/denyonlysid. // A deny-only SID denies the specified entity to a securable object. public const string DenyOnlySid = "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/denyonlysid"; // // Summary: // http://schemas.microsoft.com/ws/2008/06/identity/claims/denyonlywindowsdevicegroup. public const string DenyOnlyWindowsDeviceGroup = "http://schemas.microsoft.com/ws/2008/06/identity/claims/denyonlywindowsdevicegroup"; // // Summary: // The URI for a claim that specifies the DNS name associated with the computer // name or with the alternative name of either the subject or issuer of an X.509 // certificate, http://schemas.xmlsoap.org/ws/2005/05/identity/claims/dns. public const string Dns = "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/dns"; // // Summary: // http://schemas.microsoft.com/ws/2008/06/identity/claims/dsa. public const string Dsa = "http://schemas.microsoft.com/ws/2008/06/identity/claims/dsa"; // // Summary: // The URI for a claim that specifies the email address of an entity, http://schemas.xmlsoap.org/ws/2005/05/identity/claims/email. public const string Email = "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress"; // // Summary: // http://schemas.microsoft.com/ws/2008/06/identity/claims/expiration. public const string Expiration = "http://schemas.microsoft.com/ws/2008/06/identity/claims/expiration"; // // Summary: // http://schemas.microsoft.com/ws/2008/06/identity/claims/expired. public const string Expired = "http://schemas.microsoft.com/ws/2008/06/identity/claims/expired"; // // Summary: // The URI for a claim that specifies the gender of an entity, http://schemas.xmlsoap.org/ws/2005/05/identity/claims/gender. public const string Gender = "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/gender"; // // Summary: // The URI for a claim that specifies the given name of an entity, http://schemas.xmlsoap.org/ws/2005/05/identity/claims/givenname. public const string GivenName = "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/givenname"; // // Summary: // The URI for a claim that specifies the SID for the group of an entity, http://schemas.microsoft.com/ws/2008/06/identity/claims/groupsid. public const string GroupSid = "http://schemas.microsoft.com/ws/2008/06/identity/claims/groupsid"; // // Summary: // The URI for a claim that specifies a hash value, http://schemas.xmlsoap.org/ws/2005/05/identity/claims/hash. public const string Hash = "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/hash"; // // Summary: // The URI for a claim that specifies the home phone number of an entity, http://schemas.xmlsoap.org/ws/2005/05/identity/claims/homephone. public const string HomePhone = "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/homephone"; // // Summary: // http://schemas.microsoft.com/ws/2008/06/identity/claims/ispersistent. public const string IsPersistent = "http://schemas.microsoft.com/ws/2008/06/identity/claims/ispersistent"; // // Summary: // The URI for a claim that specifies the locale in which an entity resides, http://schemas.xmlsoap.org/ws/2005/05/identity/claims/locality. public const string Locality = "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/locality"; // // Summary: // The URI for a claim that specifies the mobile phone number of an entity, http://schemas.xmlsoap.org/ws/2005/05/identity/claims/mobilephone. public const string MobilePhone = "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/mobilephone"; // // Summary: // The URI for a claim that specifies the name of an entity, http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name. public const string Name = "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name"; // // Summary: // The URI for a claim that specifies the name of an entity, http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier. public const string NameIdentifier = "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier"; // // Summary: // The URI for a claim that specifies the alternative phone number of an entity, // http://schemas.xmlsoap.org/ws/2005/05/identity/claims/otherphone. public const string OtherPhone = "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/otherphone"; // // Summary: // The URI for a claim that specifies the postal code of an entity, http://schemas.xmlsoap.org/ws/2005/05/identity/claims/postalcode. public const string PostalCode = "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/postalcode"; // // Summary: // The URI for a claim that specifies the primary group SID of an entity, http://schemas.microsoft.com/ws/2008/06/identity/claims/primarygroupsid. public const string PrimaryGroupSid = "http://schemas.microsoft.com/ws/2008/06/identity/claims/primarygroupsid"; // // Summary: // The URI for a claim that specifies the primary SID of an entity, http://schemas.microsoft.com/ws/2008/06/identity/claims/primarysid. public const string PrimarySid = "http://schemas.microsoft.com/ws/2008/06/identity/claims/primarysid"; // // Summary: // The URI for a claim that specifies the role of an entity, http://schemas.microsoft.com/ws/2008/06/identity/claims/role. public const string Role = "http://schemas.microsoft.com/ws/2008/06/identity/claims/role"; // // Summary: // The URI for a claim that specifies an RSA key, http://schemas.xmlsoap.org/ws/2005/05/identity/claims/rsa. public const string Rsa = "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/rsa"; // // Summary: // The URI for a claim that specifies a serial number, http://schemas.microsoft.com/ws/2008/06/identity/claims/serialnumber. public const string SerialNumber = "http://schemas.microsoft.com/ws/2008/06/identity/claims/serialnumber"; // // Summary: // The URI for a claim that specifies a security identifier (SID), http://schemas.xmlsoap.org/ws/2005/05/identity/claims/sid. public const string Sid = "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/sid"; // // Summary: // The URI for a claim that specifies a service principal name (SPN) claim, http://schemas.xmlsoap.org/ws/2005/05/identity/claims/spn. public const string Spn = "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/spn"; // // Summary: // The URI for a claim that specifies the state or province in which an entity resides, // http://schemas.xmlsoap.org/ws/2005/05/identity/claims/stateorprovince. public const string StateOrProvince = "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/stateorprovince"; // // Summary: // The URI for a claim that specifies the street address of an entity, http://schemas.xmlsoap.org/ws/2005/05/identity/claims/streetaddress. public const string StreetAddress = "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/streetaddress"; // // Summary: // The URI for a claim that specifies the surname of an entity, http://schemas.xmlsoap.org/ws/2005/05/identity/claims/surname. public const string Surname = "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/surname"; // // Summary: // The URI for a claim that identifies the system entity, http://schemas.xmlsoap.org/ws/2005/05/identity/claims/system. public const string System = "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/system"; // // Summary: // The URI for a claim that specifies a thumbprint, http://schemas.xmlsoap.org/ws/2005/05/identity/claims/thumbprint. // A thumbprint is a globally unique SHA-1 hash of an X.509 certificate. public const string Thumbprint = "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/thumbprint"; // // Summary: // The URI for a claim that specifies a user principal name (UPN), http://schemas.xmlsoap.org/ws/2005/05/identity/claims/upn. public const string Upn = "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/upn"; // // Summary: // The URI for a claim that specifies a URI, http://schemas.xmlsoap.org/ws/2005/05/identity/claims/uri. public const string Uri = "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/uri"; // // Summary: // http://schemas.microsoft.com/ws/2008/06/identity/claims/userdata. public const string UserData = "http://schemas.microsoft.com/ws/2008/06/identity/claims/userdata"; // // Summary: // http://schemas.microsoft.com/ws/2008/06/identity/claims/version. public const string Version = "http://schemas.microsoft.com/ws/2008/06/identity/claims/version"; // // Summary: // The URI for a claim that specifies the webpage of an entity, http://schemas.xmlsoap.org/ws/2005/05/identity/claims/webpage. public const string Webpage = "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/webpage"; // // Summary: // The URI for a claim that specifies the Windows domain account name of an entity, // http://schemas.microsoft.com/ws/2008/06/identity/claims/windowsaccountname. public const string WindowsAccountName = "http://schemas.microsoft.com/ws/2008/06/identity/claims/windowsaccountname"; // // Summary: // http://schemas.microsoft.com/ws/2008/06/identity/claims/windowsdeviceclaim. public const string WindowsDeviceClaim = "http://schemas.microsoft.com/ws/2008/06/identity/claims/windowsdeviceclaim"; // // Summary: // http://schemas.microsoft.com/ws/2008/06/identity/claims/windowsdevicegroup. public const string WindowsDeviceGroup = "http://schemas.microsoft.com/ws/2008/06/identity/claims/windowsdevicegroup"; // // Summary: // http://schemas.microsoft.com/ws/2008/06/identity/claims/windowsfqbnversion. public const string WindowsFqbnVersion = "http://schemas.microsoft.com/ws/2008/06/identity/claims/windowsfqbnversion"; // // Summary: // http://schemas.microsoft.com/ws/2008/06/identity/claims/windowssubauthority. public const string WindowsSubAuthority = "http://schemas.microsoft.com/ws/2008/06/identity/claims/windowssubauthority"; // // Summary: // http://schemas.microsoft.com/ws/2008/06/identity/claims/windowsuserclaim. public const string WindowsUserClaim = "http://schemas.microsoft.com/ws/2008/06/identity/claims/windowsuserclaim"; // // Summary: // The URI for a distinguished name claim of an X.509 certificate, http://schemas.xmlsoap.org/ws/2005/05/identity/claims/x500distinguishedname. // The X.500 standard defines the methodology for defining distinguished names that // are used by X.509 certificates. public const string X500DistinguishedName = "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/x500distinguishedname"; #endregion public const string AvatarURL = "http://schemas.xmlsoap.org/ws/2009/09/identity/claims/avatarurl"; public const string Position = "http://schemas.xmlsoap.org/ws/2009/09/identity/claims/position"; public const string NickName = "http://schemas.xmlsoap.org/ws/2009/09/identity/claims/nickname"; public const string DateRegistered = "http://schemas.xmlsoap.org/ws/2009/09/identity/claims/dateregistered"; } } ================================================ FILE: src/AdminLTE/Common/Extensions/IdentityExtension.cs ================================================ using System.Linq; using System.Security.Claims; namespace AdminLTE.Common.Extensions { public static class IdentityExtension { /// /// //Use CustomClaimTypes when using this method /// /// /// Use [CustomClaimTypes] when using this method /// public static string GetUserProperty(this ClaimsPrincipal user, string claimType) { if (user.Identity.IsAuthenticated) { return user.Claims.FirstOrDefault(v => v.Type == claimType)?.Value ?? string.Empty; } return string.Empty; } } } ================================================ FILE: src/AdminLTE/Common/GlobalHelper.cs ================================================ using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Http.Features; using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; namespace AdminLTE.Common { public static class GlobalHelper { } } ================================================ FILE: src/AdminLTE/Common/ModuleHelper.cs ================================================ using AdminLTE.Models; using System; using System.Collections.Generic; namespace AdminLTE.Common { /// /// This is where you customize the navigation sidebar /// public static class ModuleHelper { public enum Module { Home, About, Contact, Error, Login, Register, SuperAdmin, Role, UserLogs } public static SidebarMenu AddHeader(string name) { return new SidebarMenu { Type = SidebarMenuType.Header, Name = name, }; } public static SidebarMenu AddTree(string name, string iconClassName = "bi bi-link") { return new SidebarMenu { Type = SidebarMenuType.Tree, IsActive = false, Name = name, IconClassName = iconClassName, URLPath = "#", }; } public static SidebarMenu AddModule(Module module, Tuple counter = null) { if (counter == null) counter = Tuple.Create(0, 0, 0); switch (module) { case Module.Home: return new SidebarMenu { Type = SidebarMenuType.Link, Name = "Home", IconClassName = "bi bi-house-door-fill", URLPath = "/", LinkCounter = counter, }; case Module.Login: return new SidebarMenu { Type = SidebarMenuType.Link, Name = "Login", IconClassName = "bi bi-door-open-fill", URLPath = "/Account/Login", LinkCounter = counter, }; case Module.Register: return new SidebarMenu { Type = SidebarMenuType.Link, Name = "Register", IconClassName = "bi bi-person-fill-add", URLPath = "/Account/Register", LinkCounter = counter, }; case Module.About: return new SidebarMenu { Type = SidebarMenuType.Link, Name = "About", IconClassName = "bi bi-people-fill", URLPath = "/Home/About", LinkCounter = counter, }; case Module.Contact: return new SidebarMenu { Type = SidebarMenuType.Link, Name = "Contact", IconClassName = "bi bi-telephone-fill", URLPath = "/Home/Contact", LinkCounter = counter, }; case Module.Error: return new SidebarMenu { Type = SidebarMenuType.Link, Name = "Error", IconClassName = "bi bi-exclamation-triangle-fill", URLPath = "/Home/Error", LinkCounter = counter, }; case Module.SuperAdmin: return new SidebarMenu { Type = SidebarMenuType.Link, Name = "User", IconClassName = "bi bi-people-fill", URLPath = "/SuperAdmin", LinkCounter = counter, }; case Module.Role: return new SidebarMenu { Type = SidebarMenuType.Link, Name = "Role", IconClassName = "bi bi-person-fill-gear", URLPath = "/Role", LinkCounter = counter, }; case Module.UserLogs: return new SidebarMenu { Type = SidebarMenuType.Link, Name = "UserLogs", IconClassName = "bi bi-clock-history", URLPath = "/UserLogs", LinkCounter = counter, }; default: break; } return null; } } } ================================================ FILE: src/AdminLTE/Controllers/AccountController.cs ================================================ using System.Linq; using System.Security.Claims; using System.Threading.Tasks; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Identity; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.Rendering; using Microsoft.Extensions.Logging; using AdminLTE.Models; using AdminLTE.Models.AccountViewModels; using AdminLTE.Services; using AdminLTE.Common; using System; namespace AdminLTE.Controllers { [Authorize] public class AccountController : Controller { private readonly UserManager _userManager; private readonly SignInManager _signInManager; private readonly IEmailSender _emailSender; private readonly ISmsSender _smsSender; private readonly ILogger _logger; public AccountController( UserManager userManager, SignInManager signInManager, IEmailSender emailSender, ISmsSender smsSender, ILoggerFactory loggerFactory) { _userManager = userManager; _signInManager = signInManager; _emailSender = emailSender; _smsSender = smsSender; _logger = loggerFactory.CreateLogger(); } // // GET: /Account/Login [HttpGet] [AllowAnonymous] public IActionResult Login(string returnUrl = null) { ViewData["ReturnUrl"] = returnUrl; return View(); } // // POST: /Account/Login [HttpPost] [AllowAnonymous] [ValidateAntiForgeryToken] public async Task Login(LoginViewModel model, string returnUrl = null) { ViewData["ReturnUrl"] = returnUrl; if (ModelState.IsValid) { // This doesn't count login failures towards account lockout // To enable password failures to trigger account lockout, set lockoutOnFailure: true var result = await _signInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, lockoutOnFailure: false); if (result.Succeeded) { _logger.LogInformation(1, "User logged in."); return RedirectToLocal(returnUrl); } if (result.RequiresTwoFactor) { return RedirectToAction(nameof(SendCode), new { ReturnUrl = returnUrl, RememberMe = model.RememberMe }); } if (result.IsLockedOut) { _logger.LogWarning(2, "User account locked out."); return View("Lockout"); } else { ModelState.AddModelError(string.Empty, "Invalid login attempt."); return View(model); } } // If we got this far, something failed, redisplay form return View(model); } // // GET: /Account/Register [HttpGet] [AllowAnonymous] public IActionResult Register(string returnUrl = null) { ViewData["ReturnUrl"] = returnUrl; return View(); } // // POST: /Account/Register [HttpPost] [AllowAnonymous] [ValidateAntiForgeryToken] public async Task Register(RegisterViewModel model, string returnUrl = null) { ViewData["ReturnUrl"] = returnUrl; if (ModelState.IsValid) { var user = new ApplicationUser { UserName = model.Email, Email = model.Email, //extended properties FirstName = model.FirstName, LastName = model.LastName, AvatarURL = "/images/user.png", DateRegistered = DateTime.UtcNow.ToString(), Position = "", NickName = "", }; var result = await _userManager.CreateAsync(user, model.Password); if (result.Succeeded) { // For more information on how to enable account confirmation and password reset please visit http://go.microsoft.com/fwlink/?LinkID=532713 // Send an email with this link //var code = await _userManager.GenerateEmailConfirmationTokenAsync(user); //var callbackUrl = Url.Action("ConfirmEmail", "Account", new { userId = user.Id, code = code }, protocol: HttpContext.Request.Scheme); //await _emailSender.SendEmailAsync(model.Email, "Confirm your account", // $"Please confirm your account by clicking this link: link"); await _signInManager.SignInAsync(user, isPersistent: false); _logger.LogInformation(3, "User created a new account with password."); await _userManager.AddClaimAsync(user, new Claim(CustomClaimTypes.GivenName, user.FirstName)); await _userManager.AddClaimAsync(user, new Claim(CustomClaimTypes.Surname, user.LastName)); await _userManager.AddClaimAsync(user, new Claim(CustomClaimTypes.AvatarURL, user.AvatarURL)); return RedirectToLocal(returnUrl); } AddErrors(result); } // If we got this far, something failed, redisplay form return View(model); } // // POST: /Account/LogOff [HttpPost] [ValidateAntiForgeryToken] public async Task LogOff() { await _signInManager.SignOutAsync(); _logger.LogInformation(4, "User logged out."); return RedirectToAction(nameof(HomeController.Index), "Home"); } // // POST: /Account/ExternalLogin [HttpPost] [AllowAnonymous] [ValidateAntiForgeryToken] public IActionResult ExternalLogin(string provider, string returnUrl = null) { // Request a redirect to the external login provider. var redirectUrl = Url.Action("ExternalLoginCallback", "Account", new { ReturnUrl = returnUrl }); var properties = _signInManager.ConfigureExternalAuthenticationProperties(provider, redirectUrl); return Challenge(properties, provider); } // // GET: /Account/ExternalLoginCallback [HttpGet] [AllowAnonymous] public async Task ExternalLoginCallback(string returnUrl = null, string remoteError = null) { if (remoteError != null) { ModelState.AddModelError(string.Empty, $"Error from external provider: {remoteError}"); return View(nameof(Login)); } var info = await _signInManager.GetExternalLoginInfoAsync(); if (info == null) { return RedirectToAction(nameof(Login)); } // Sign in the user with this external login provider if the user already has a login. var result = await _signInManager.ExternalLoginSignInAsync(info.LoginProvider, info.ProviderKey, isPersistent: false); if (result.Succeeded) { _logger.LogInformation(5, "User logged in with {Name} provider.", info.LoginProvider); return RedirectToLocal(returnUrl); } if (result.RequiresTwoFactor) { return RedirectToAction(nameof(SendCode), new { ReturnUrl = returnUrl }); } if (result.IsLockedOut) { return View("Lockout"); } else { // If the user does not have an account, then ask the user to create an account. ViewData["ReturnUrl"] = returnUrl; ViewData["LoginProvider"] = info.LoginProvider; var email = info.Principal.FindFirstValue(ClaimTypes.Email); return View("ExternalLoginConfirmation", new ExternalLoginConfirmationViewModel { Email = email }); } } // // POST: /Account/ExternalLoginConfirmation [HttpPost] [AllowAnonymous] [ValidateAntiForgeryToken] public async Task ExternalLoginConfirmation(ExternalLoginConfirmationViewModel model, string returnUrl = null) { if (ModelState.IsValid) { // Get the information about the user from the external login provider var info = await _signInManager.GetExternalLoginInfoAsync(); if (info == null) { return View("ExternalLoginFailure"); } var user = new ApplicationUser { UserName = model.Email, Email = model.Email }; var result = await _userManager.CreateAsync(user); if (result.Succeeded) { result = await _userManager.AddLoginAsync(user, info); if (result.Succeeded) { await _signInManager.SignInAsync(user, isPersistent: false); _logger.LogInformation(6, "User created an account using {Name} provider.", info.LoginProvider); return RedirectToLocal(returnUrl); } } AddErrors(result); } ViewData["ReturnUrl"] = returnUrl; return View(model); } // GET: /Account/ConfirmEmail [HttpGet] [AllowAnonymous] public async Task ConfirmEmail(string userId, string code) { if (userId == null || code == null) { return View("Error"); } var user = await _userManager.FindByIdAsync(userId); if (user == null) { return View("Error"); } var result = await _userManager.ConfirmEmailAsync(user, code); return View(result.Succeeded ? "ConfirmEmail" : "Error"); } // // GET: /Account/ForgotPassword [HttpGet] [AllowAnonymous] public IActionResult ForgotPassword() { return View(); } // // POST: /Account/ForgotPassword [HttpPost] [AllowAnonymous] [ValidateAntiForgeryToken] public async Task ForgotPassword(ForgotPasswordViewModel model) { if (ModelState.IsValid) { var user = await _userManager.FindByNameAsync(model.Email); if (user == null || !(await _userManager.IsEmailConfirmedAsync(user))) { // Don't reveal that the user does not exist or is not confirmed return View("ForgotPasswordConfirmation"); } // For more information on how to enable account confirmation and password reset please visit http://go.microsoft.com/fwlink/?LinkID=532713 // Send an email with this link //var code = await _userManager.GeneratePasswordResetTokenAsync(user); //var callbackUrl = Url.Action("ResetPassword", "Account", new { userId = user.Id, code = code }, protocol: HttpContext.Request.Scheme); //await _emailSender.SendEmailAsync(model.Email, "Reset Password", // $"Please reset your password by clicking here: link"); //return View("ForgotPasswordConfirmation"); } // If we got this far, something failed, redisplay form return View(model); } // // GET: /Account/ForgotPasswordConfirmation [HttpGet] [AllowAnonymous] public IActionResult ForgotPasswordConfirmation() { return View(); } // // GET: /Account/ResetPassword [HttpGet] [AllowAnonymous] public IActionResult ResetPassword(string code = null) { return code == null ? View("Error") : View(); } // // POST: /Account/ResetPassword [HttpPost] [AllowAnonymous] [ValidateAntiForgeryToken] public async Task ResetPassword(ResetPasswordViewModel model) { if (!ModelState.IsValid) { return View(model); } var user = await _userManager.FindByNameAsync(model.Email); if (user == null) { // Don't reveal that the user does not exist return RedirectToAction(nameof(AccountController.ResetPasswordConfirmation), "Account"); } var result = await _userManager.ResetPasswordAsync(user, model.Code, model.Password); if (result.Succeeded) { return RedirectToAction(nameof(AccountController.ResetPasswordConfirmation), "Account"); } AddErrors(result); return View(); } // // GET: /Account/ResetPasswordConfirmation [HttpGet] [AllowAnonymous] public IActionResult ResetPasswordConfirmation() { return View(); } // // GET: /Account/SendCode [HttpGet] [AllowAnonymous] public async Task SendCode(string returnUrl = null, bool rememberMe = false) { var user = await _signInManager.GetTwoFactorAuthenticationUserAsync(); if (user == null) { return View("Error"); } var userFactors = await _userManager.GetValidTwoFactorProvidersAsync(user); var factorOptions = userFactors.Select(purpose => new SelectListItem { Text = purpose, Value = purpose }).ToList(); return View(new SendCodeViewModel { Providers = factorOptions, ReturnUrl = returnUrl, RememberMe = rememberMe }); } // // POST: /Account/SendCode [HttpPost] [AllowAnonymous] [ValidateAntiForgeryToken] public async Task SendCode(SendCodeViewModel model) { if (!ModelState.IsValid) { return View(); } var user = await _signInManager.GetTwoFactorAuthenticationUserAsync(); if (user == null) { return View("Error"); } // Generate the token and send it var code = await _userManager.GenerateTwoFactorTokenAsync(user, model.SelectedProvider); if (string.IsNullOrWhiteSpace(code)) { return View("Error"); } var message = "Your security code is: " + code; if (model.SelectedProvider == "Email") { await _emailSender.SendEmailAsync(await _userManager.GetEmailAsync(user), "Security Code", message); } else if (model.SelectedProvider == "Phone") { await _smsSender.SendSmsAsync(await _userManager.GetPhoneNumberAsync(user), message); } return RedirectToAction(nameof(VerifyCode), new { Provider = model.SelectedProvider, ReturnUrl = model.ReturnUrl, RememberMe = model.RememberMe }); } // // GET: /Account/VerifyCode [HttpGet] [AllowAnonymous] public async Task VerifyCode(string provider, bool rememberMe, string returnUrl = null) { // Require that the user has already logged in via username/password or external login var user = await _signInManager.GetTwoFactorAuthenticationUserAsync(); if (user == null) { return View("Error"); } return View(new VerifyCodeViewModel { Provider = provider, ReturnUrl = returnUrl, RememberMe = rememberMe }); } // // POST: /Account/VerifyCode [HttpPost] [AllowAnonymous] [ValidateAntiForgeryToken] public async Task VerifyCode(VerifyCodeViewModel model) { if (!ModelState.IsValid) { return View(model); } // The following code protects for brute force attacks against the two factor codes. // If a user enters incorrect codes for a specified amount of time then the user account // will be locked out for a specified amount of time. var result = await _signInManager.TwoFactorSignInAsync(model.Provider, model.Code, model.RememberMe, model.RememberBrowser); if (result.Succeeded) { return RedirectToLocal(model.ReturnUrl); } if (result.IsLockedOut) { _logger.LogWarning(7, "User account locked out."); return View("Lockout"); } else { ModelState.AddModelError(string.Empty, "Invalid code."); return View(model); } } #region Helpers private void AddErrors(IdentityResult result) { foreach (var error in result.Errors) { ModelState.AddModelError(string.Empty, error.Description); } } private Task GetCurrentUserAsync() { return _userManager.GetUserAsync(HttpContext.User); } private IActionResult RedirectToLocal(string returnUrl) { if (Url.IsLocalUrl(returnUrl)) { return Redirect(returnUrl); } else { return RedirectToAction(nameof(HomeController.Index), "Home"); } } #endregion } } ================================================ FILE: src/AdminLTE/Controllers/BaseController.cs ================================================ using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Logging; using AdminLTE.Models; using System.Runtime.CompilerServices; namespace AdminLTE.Controllers { public class BaseController : Controller { internal void AddBreadcrumb(string displayName, string urlPath) { List messages; if (ViewBag.Breadcrumb == null) { messages = new List(); } else { messages = ViewBag.Breadcrumb as List; } messages.Add(new Message { DisplayName = displayName, URLPath = urlPath }); ViewBag.Breadcrumb = messages; } internal void AddPageHeader(string pageHeader = "", string pageDescription = "") { ViewBag.PageHeader = Tuple.Create(pageHeader, pageDescription); } internal enum PageAlertType { Error, Info, Warning, Success } internal void AddPageAlerts(PageAlertType pageAlertType, string description) { List messages; if (ViewBag.PageAlerts == null) { messages = new List(); } else { messages = ViewBag.PageAlerts as List; } messages.Add(new Message { Type = pageAlertType.ToString().ToLower(), ShortDesc = description }); ViewBag.PageAlerts = messages; } } } ================================================ FILE: src/AdminLTE/Controllers/HomeController.cs ================================================ using AdminLTE.Common.Attributes; using AdminLTE.Models; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Reflection; namespace AdminLTE.Controllers { public class HomeController : BaseController { [HelpDefinition] public IActionResult Index() { AddPageHeader("Dashboard", ""); return View(); } [HttpPost] public IActionResult Index(object model) { AddPageAlerts(PageAlertType.Info, "you may view the summary here"); return View("Index"); } [HelpDefinition] public IActionResult About() { ViewData["Message"] = "Your application description page."; AddBreadcrumb("About", "/Account/About"); return View(); } [HelpDefinition("helpdefault")] public IActionResult Contact() { AddBreadcrumb("Contact", "/Account/Contact"); ViewData["Message"] = "Your contact page."; return View(); } public IActionResult Error() { return View(); } #region Get data method. /// /// GET: /Home/GetData /// /// Return data public ActionResult GetData() { try { // Initialization. string search = Request.Form["search[value]"][0]; string draw = Request.Form["draw"][0]; string order = Request.Form["order[0][column]"][0]; string orderDir = Request.Form["order[0][dir]"][0]; int startRec = Convert.ToInt32(Request.Form["start"][0]); int pageSize = Convert.ToInt32(Request.Form["length"][0]); // Loading. List data = this.LoadData(); // Total record count. int totalRecords = data.Count; // Verification. if (!string.IsNullOrEmpty(search) && !string.IsNullOrWhiteSpace(search)) { // Apply search data = data.Where(p => p.sr.ToString().ToLower().Contains(search.ToLower()) || p.ordertracknumber.ToLower().Contains(search.ToLower()) || p.quantity.ToString().ToLower().Contains(search.ToLower()) || p.productname.ToLower().Contains(search.ToLower()) || p.specialoffer.ToLower().Contains(search.ToLower()) || p.unitprice.ToString().ToLower().Contains(search.ToLower()) || p.unitpricediscount.ToString().ToLower().Contains(search.ToLower())).ToList(); } // Sorting. data = this.SortByColumnWithOrder(order, orderDir, data); // Filter record count. int recFilter = data.Count; // Apply pagination. data = data.Skip(startRec).Take(pageSize).ToList(); // Loading drop down lists. var result = this.Json(new { draw = Convert.ToInt32(draw), recordsTotal = totalRecords, recordsFiltered = recFilter, data = data }); return result; } catch (Exception ex) { // Info Console.Write(ex); return null; } } #endregion #region Helpers #region Load Data /// /// Load data method. /// /// Returns - Data private List LoadData() { // Initialization. List lst = new List(); try { // Initialization. string line = string.Empty; //string srcFilePath = "content/files/SalesOrderDetail.txt"; //var rootPath = Path.GetDirectoryName(AppContext.BaseDirectory); //var fullPath = Path.Combine(rootPath, srcFilePath); //string filePath = new Uri(fullPath).LocalPath; StreamReader sr = new StreamReader(new FileStream(@"wwwroot\files\SalesOrderDetail.txt", FileMode.Open, FileAccess.Read)); // Read file. while ((line = sr.ReadLine()) != null) { // Initialization. SalesOrderDetail infoObj = new SalesOrderDetail(); string[] info = line.Split(','); // Setting. infoObj.sr = Convert.ToInt32(info[0].ToString()); infoObj.ordertracknumber = info[1].ToString(); infoObj.quantity = Convert.ToInt32(info[2].ToString()); infoObj.productname = info[3].ToString(); infoObj.specialoffer = info[4].ToString(); infoObj.unitprice = Convert.ToDouble(info[5].ToString()); infoObj.unitpricediscount = Convert.ToDouble(info[6].ToString()); // Adding. lst.Add(infoObj); } // Closing. sr.Dispose(); } catch (Exception ex) { // info. Console.Write(ex); } // info. return lst; } #endregion #region Sort by column with order method /// /// Sort by column with order method. /// /// Order parameter /// Order direction parameter /// Data parameter /// Returns - Data private List SortByColumnWithOrder(string order, string orderDir, List data) { // Initialization. List lst = new List(); try { // Sorting switch (order) { case "0": // Setting. lst = orderDir.Equals("DESC", StringComparison.CurrentCultureIgnoreCase) ? data.OrderByDescending(p => p.sr).ToList() : data.OrderBy(p => p.sr).ToList(); break; case "1": // Setting. lst = orderDir.Equals("DESC", StringComparison.CurrentCultureIgnoreCase) ? data.OrderByDescending(p => p.ordertracknumber).ToList() : data.OrderBy(p => p.ordertracknumber).ToList(); break; case "2": // Setting. lst = orderDir.Equals("DESC", StringComparison.CurrentCultureIgnoreCase) ? data.OrderByDescending(p => p.quantity).ToList() : data.OrderBy(p => p.quantity).ToList(); break; case "3": // Setting. lst = orderDir.Equals("DESC", StringComparison.CurrentCultureIgnoreCase) ? data.OrderByDescending(p => p.productname).ToList() : data.OrderBy(p => p.productname).ToList(); break; case "4": // Setting. lst = orderDir.Equals("DESC", StringComparison.CurrentCultureIgnoreCase) ? data.OrderByDescending(p => p.specialoffer).ToList() : data.OrderBy(p => p.specialoffer).ToList(); break; case "5": // Setting. lst = orderDir.Equals("DESC", StringComparison.CurrentCultureIgnoreCase) ? data.OrderByDescending(p => p.unitprice).ToList() : data.OrderBy(p => p.unitprice).ToList(); break; case "6": // Setting. lst = orderDir.Equals("DESC", StringComparison.CurrentCultureIgnoreCase) ? data.OrderByDescending(p => p.unitpricediscount).ToList() : data.OrderBy(p => p.unitpricediscount).ToList(); break; default: // Setting. lst = orderDir.Equals("DESC", StringComparison.CurrentCultureIgnoreCase) ? data.OrderByDescending(p => p.sr).ToList() : data.OrderBy(p => p.sr).ToList(); break; } } catch (Exception ex) { // info. Console.Write(ex); } // info. return lst; } #endregion #endregion } } ================================================ FILE: src/AdminLTE/Controllers/ManageController.cs ================================================ using System.Linq; using System.Threading.Tasks; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Identity; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Logging; using AdminLTE.Models; using AdminLTE.Models.ManageViewModels; using AdminLTE.Services; namespace AdminLTE.Controllers { [Authorize] public class ManageController : Controller { private readonly UserManager _userManager; private readonly SignInManager _signInManager; private readonly IEmailSender _emailSender; private readonly ISmsSender _smsSender; private readonly ILogger _logger; public ManageController( UserManager userManager, SignInManager signInManager, IEmailSender emailSender, ISmsSender smsSender, ILoggerFactory loggerFactory) { _userManager = userManager; _signInManager = signInManager; _emailSender = emailSender; _smsSender = smsSender; _logger = loggerFactory.CreateLogger(); } // // GET: /Manage/Index [HttpGet] public async Task Index(ManageMessageId? message = null) { ViewData["StatusMessage"] = message == ManageMessageId.ChangePasswordSuccess ? "Your password has been changed." : message == ManageMessageId.SetPasswordSuccess ? "Your password has been set." : message == ManageMessageId.SetTwoFactorSuccess ? "Your two-factor authentication provider has been set." : message == ManageMessageId.Error ? "An error has occurred." : message == ManageMessageId.AddPhoneSuccess ? "Your phone number was added." : message == ManageMessageId.RemovePhoneSuccess ? "Your phone number was removed." : ""; var user = await GetCurrentUserAsync(); if (user == null) { return View("Error"); } var model = new IndexViewModel { HasPassword = await _userManager.HasPasswordAsync(user), PhoneNumber = await _userManager.GetPhoneNumberAsync(user), TwoFactor = await _userManager.GetTwoFactorEnabledAsync(user), Logins = await _userManager.GetLoginsAsync(user), BrowserRemembered = await _signInManager.IsTwoFactorClientRememberedAsync(user) }; return View(model); } // // POST: /Manage/RemoveLogin [HttpPost] [ValidateAntiForgeryToken] public async Task RemoveLogin(RemoveLoginViewModel account) { ManageMessageId? message = ManageMessageId.Error; var user = await GetCurrentUserAsync(); if (user != null) { var result = await _userManager.RemoveLoginAsync(user, account.LoginProvider, account.ProviderKey); if (result.Succeeded) { await _signInManager.SignInAsync(user, isPersistent: false); message = ManageMessageId.RemoveLoginSuccess; } } return RedirectToAction(nameof(ManageLogins), new { Message = message }); } // // GET: /Manage/AddPhoneNumber public IActionResult AddPhoneNumber() { return View(); } // // POST: /Manage/AddPhoneNumber [HttpPost] [ValidateAntiForgeryToken] public async Task AddPhoneNumber(AddPhoneNumberViewModel model) { if (!ModelState.IsValid) { return View(model); } // Generate the token and send it var user = await GetCurrentUserAsync(); if (user == null) { return View("Error"); } var code = await _userManager.GenerateChangePhoneNumberTokenAsync(user, model.PhoneNumber); await _smsSender.SendSmsAsync(model.PhoneNumber, "Your security code is: " + code); return RedirectToAction(nameof(VerifyPhoneNumber), new { PhoneNumber = model.PhoneNumber }); } // // POST: /Manage/EnableTwoFactorAuthentication [HttpPost] [ValidateAntiForgeryToken] public async Task EnableTwoFactorAuthentication() { var user = await GetCurrentUserAsync(); if (user != null) { await _userManager.SetTwoFactorEnabledAsync(user, true); await _signInManager.SignInAsync(user, isPersistent: false); _logger.LogInformation(1, "User enabled two-factor authentication."); } return RedirectToAction(nameof(Index), "Manage"); } // // POST: /Manage/DisableTwoFactorAuthentication [HttpPost] [ValidateAntiForgeryToken] public async Task DisableTwoFactorAuthentication() { var user = await GetCurrentUserAsync(); if (user != null) { await _userManager.SetTwoFactorEnabledAsync(user, false); await _signInManager.SignInAsync(user, isPersistent: false); _logger.LogInformation(2, "User disabled two-factor authentication."); } return RedirectToAction(nameof(Index), "Manage"); } // // GET: /Manage/VerifyPhoneNumber [HttpGet] public async Task VerifyPhoneNumber(string phoneNumber) { var user = await GetCurrentUserAsync(); if (user == null) { return View("Error"); } var code = await _userManager.GenerateChangePhoneNumberTokenAsync(user, phoneNumber); // Send an SMS to verify the phone number return phoneNumber == null ? View("Error") : View(new VerifyPhoneNumberViewModel { PhoneNumber = phoneNumber }); } // // POST: /Manage/VerifyPhoneNumber [HttpPost] [ValidateAntiForgeryToken] public async Task VerifyPhoneNumber(VerifyPhoneNumberViewModel model) { if (!ModelState.IsValid) { return View(model); } var user = await GetCurrentUserAsync(); if (user != null) { var result = await _userManager.ChangePhoneNumberAsync(user, model.PhoneNumber, model.Code); if (result.Succeeded) { await _signInManager.SignInAsync(user, isPersistent: false); return RedirectToAction(nameof(Index), new { Message = ManageMessageId.AddPhoneSuccess }); } } // If we got this far, something failed, redisplay the form ModelState.AddModelError(string.Empty, "Failed to verify phone number"); return View(model); } // // POST: /Manage/RemovePhoneNumber [HttpPost] [ValidateAntiForgeryToken] public async Task RemovePhoneNumber() { var user = await GetCurrentUserAsync(); if (user != null) { var result = await _userManager.SetPhoneNumberAsync(user, null); if (result.Succeeded) { await _signInManager.SignInAsync(user, isPersistent: false); return RedirectToAction(nameof(Index), new { Message = ManageMessageId.RemovePhoneSuccess }); } } return RedirectToAction(nameof(Index), new { Message = ManageMessageId.Error }); } // // GET: /Manage/ChangePassword [HttpGet] public IActionResult ChangePassword() { return View(); } // // POST: /Manage/ChangePassword [HttpPost] [ValidateAntiForgeryToken] public async Task ChangePassword(ChangePasswordViewModel model) { if (!ModelState.IsValid) { return View(model); } var user = await GetCurrentUserAsync(); if (user != null) { var result = await _userManager.ChangePasswordAsync(user, model.OldPassword, model.NewPassword); if (result.Succeeded) { await _signInManager.SignInAsync(user, isPersistent: false); _logger.LogInformation(3, "User changed their password successfully."); return RedirectToAction(nameof(Index), new { Message = ManageMessageId.ChangePasswordSuccess }); } AddErrors(result); return View(model); } return RedirectToAction(nameof(Index), new { Message = ManageMessageId.Error }); } // // GET: /Manage/SetPassword [HttpGet] public IActionResult SetPassword() { return View(); } // // POST: /Manage/SetPassword [HttpPost] [ValidateAntiForgeryToken] public async Task SetPassword(SetPasswordViewModel model) { if (!ModelState.IsValid) { return View(model); } var user = await GetCurrentUserAsync(); if (user != null) { var result = await _userManager.AddPasswordAsync(user, model.NewPassword); if (result.Succeeded) { await _signInManager.SignInAsync(user, isPersistent: false); return RedirectToAction(nameof(Index), new { Message = ManageMessageId.SetPasswordSuccess }); } AddErrors(result); return View(model); } return RedirectToAction(nameof(Index), new { Message = ManageMessageId.Error }); } //GET: /Manage/ManageLogins [HttpGet] public async Task ManageLogins(ManageMessageId? message = null) { ViewData["StatusMessage"] = message == ManageMessageId.RemoveLoginSuccess ? "The external login was removed." : message == ManageMessageId.AddLoginSuccess ? "The external login was added." : message == ManageMessageId.Error ? "An error has occurred." : ""; var user = await GetCurrentUserAsync(); if (user == null) { return View("Error"); } var userLogins = await _userManager.GetLoginsAsync(user); var schemes = await _signInManager.GetExternalAuthenticationSchemesAsync(); var otherLogins = schemes.Where(auth => userLogins.All(ul => auth.Name != ul.LoginProvider)).ToList(); ViewData["ShowRemoveButton"] = user.PasswordHash != null || userLogins.Count > 1; return View(new ManageLoginsViewModel { CurrentLogins = userLogins, OtherLogins = otherLogins }); } // // POST: /Manage/LinkLogin [HttpPost] [ValidateAntiForgeryToken] public IActionResult LinkLogin(string provider) { // Request a redirect to the external login provider to link a login for the current user var redirectUrl = Url.Action("LinkLoginCallback", "Manage"); var properties = _signInManager.ConfigureExternalAuthenticationProperties(provider, redirectUrl, _userManager.GetUserId(User)); return Challenge(properties, provider); } // // GET: /Manage/LinkLoginCallback [HttpGet] public async Task LinkLoginCallback() { var user = await GetCurrentUserAsync(); if (user == null) { return View("Error"); } var info = await _signInManager.GetExternalLoginInfoAsync(await _userManager.GetUserIdAsync(user)); if (info == null) { return RedirectToAction(nameof(ManageLogins), new { Message = ManageMessageId.Error }); } var result = await _userManager.AddLoginAsync(user, info); var message = result.Succeeded ? ManageMessageId.AddLoginSuccess : ManageMessageId.Error; return RedirectToAction(nameof(ManageLogins), new { Message = message }); } #region Helpers private void AddErrors(IdentityResult result) { foreach (var error in result.Errors) { ModelState.AddModelError(string.Empty, error.Description); } } public enum ManageMessageId { AddPhoneSuccess, AddLoginSuccess, ChangePasswordSuccess, SetTwoFactorSuccess, SetPasswordSuccess, RemoveLoginSuccess, RemovePhoneSuccess, Error } private Task GetCurrentUserAsync() { return _userManager.GetUserAsync(HttpContext.User); } #endregion } } ================================================ FILE: src/AdminLTE/Controllers/RoleController.cs ================================================ using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.Linq; using System.Threading.Tasks; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Identity; using Microsoft.AspNetCore.Identity.EntityFrameworkCore; using Microsoft.AspNetCore.Mvc; using AdminLTE.Models; using AdminLTE.Models.RoleViewModels; namespace AdminLTE.Controllers { [Authorize(Roles = "SuperAdmins")] public class RoleController : Controller { private RoleManager roleManager; private UserManager userManager; public RoleController(RoleManager roleMgr, UserManager userMgr) { roleManager = roleMgr; userManager = userMgr; } public IActionResult Index() { return View(roleManager.Roles); } private void AddErrors(IdentityResult result) { foreach (IdentityError error in result.Errors) { ModelState.AddModelError("", error.Description); } } public IActionResult Create() { return View(); } [HttpPost] [ValidateAntiForgeryToken] public async Task Create([Required] string name) { if (ModelState.IsValid) { IdentityResult result = await roleManager.CreateAsync(new IdentityRole(name)); if (result.Succeeded) { return RedirectToAction("Index"); } else { AddErrors(result); } } return View(name); } public async Task Edit(string id) { IdentityRole role = await roleManager.FindByIdAsync(id); List members = new List(); List nonMember = new List(); foreach (ApplicationUser user in userManager.Users.ToArray()) { var list = await userManager.IsInRoleAsync(user, role.Name) ? members : nonMember; list.Add(user); } return View(new EditRoleVm { Role = role, Members = members, NonMembers = nonMember }); } [HttpPost] [ValidateAntiForgeryToken] public async Task Edit(ModifyRoleVm modifyRole) { IdentityResult result; if (ModelState.IsValid) { IdentityRole role = await roleManager.FindByIdAsync(modifyRole.RoleId); role.Name = modifyRole.RoleName; result = await roleManager.UpdateAsync(role); if (!result.Succeeded) { AddErrors(result); } foreach (string userId in modifyRole.IdsToAdd ?? new string[] { }) { ApplicationUser user = await userManager.FindByIdAsync(userId); if (user != null) { result = await userManager.AddToRoleAsync(user, modifyRole.RoleName); if (!result.Succeeded) { AddErrors(result); } } } foreach (string userId in modifyRole.IdsToRemove ?? new string[] { }) { ApplicationUser user = await userManager.FindByIdAsync(userId); if (user != null) { result = await userManager.RemoveFromRoleAsync(user, modifyRole.RoleName); if (!result.Succeeded) { AddErrors(result); } } } } if (ModelState.IsValid) { return RedirectToAction("Index"); } return View(modifyRole.RoleId); } public async Task Delete(string id) { IdentityRole role = await roleManager.FindByIdAsync(id); if (role != null) { IdentityResult result = await roleManager.DeleteAsync(role); if (result.Succeeded) { return RedirectToAction("Index"); } else { AddErrors(result); } } else { ModelState.AddModelError("", "No role found"); } return View("Index", roleManager.Roles); } } } ================================================ FILE: src/AdminLTE/Controllers/SuperAdminController.cs ================================================ using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.Linq; using System.Threading.Tasks; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Identity; using Microsoft.AspNetCore.Identity.EntityFrameworkCore; using Microsoft.AspNetCore.Mvc; using AdminLTE.Models; using AdminLTE.Models.SuperAdminViewModels; namespace AdminLTE.Controllers { [Authorize(Roles = "SuperAdmins")] public class SuperAdminController : Controller { private UserManager userManager; private IUserValidator userValidator; private IPasswordValidator passwordValidator; private IPasswordHasher passwordHasher; private ApplicationUser testUser = new ApplicationUser { UserName = "TestTestForPassword", Email = "testForPassword@test.test" }; public SuperAdminController(UserManager userMgr, IUserValidator userValid, IPasswordValidator passValid, IPasswordHasher passHasher) { userManager = userMgr; userValidator = userValid; passwordValidator = passValid; passwordHasher = passHasher; } // GET: // public ViewResult Index() { return View(userManager.Users); } public ViewResult Create() { return View(); } [HttpPost] [ValidateAntiForgeryToken] public async Task Create(CreateVm createVm) { if (ModelState.IsValid) { ApplicationUser user = new ApplicationUser { UserName = createVm.Email, Email = createVm.Email, //extended properties FirstName = createVm.FirstName, LastName = createVm.LastName, AvatarURL = "/images/user.png", DateRegistered = DateTime.UtcNow.ToString(), Position = "", NickName = "", }; IdentityResult result = await userManager.CreateAsync(user, createVm.Password); if (result.Succeeded) { return RedirectToAction("Index"); } else { foreach (IdentityError error in result.Errors) { ModelState.AddModelError("", error.Description); } } } return View(createVm); } private void AddErrors(IdentityResult result) { foreach (IdentityError error in result.Errors) { ModelState.TryAddModelError("", error.Description); } } public async Task Delete(string id) { ApplicationUser user = await userManager.FindByIdAsync(id); if (user != null) { IdentityResult result = await userManager.DeleteAsync(user); if (result.Succeeded) { return RedirectToAction("Index"); } else { AddErrors(result); } } else { ModelState.AddModelError("", "User Not Found"); } return View("Index", userManager.Users); } public async Task Edit(string id) { ApplicationUser user = await userManager.FindByIdAsync(id); if (user != null) { return View(user); } else { return RedirectToAction("Index"); } } [HttpPost] [ValidateAntiForgeryToken] // the names of its parameters must be the same as the property of the User class if we use asp-for in the view // otherwise form values won't be passed properly public async Task Edit(string id, string userName, string email) { ApplicationUser user = await userManager.FindByIdAsync(id); if (user != null) { // Validate UserName and Email user.UserName = userName; // UserName won't be changed in the database until UpdateAsync is executed successfully user.Email = email; IdentityResult validUseResult = await userValidator.ValidateAsync(userManager, user); if (!validUseResult.Succeeded) { AddErrors(validUseResult); } // Update user info if (validUseResult.Succeeded) { // UpdateAsync validates user info such as UserName and Email except password since it's been hashed IdentityResult result = await userManager.UpdateAsync(user); if (result.Succeeded) { return RedirectToAction("Index", "SuperAdmin"); } else { AddErrors(result); } } } else { ModelState.AddModelError("", "User Not Found"); } ; return View(user); } public async Task ChangePassword(string id) { ApplicationUser user = await userManager.FindByIdAsync(id); if (user != null) { return View(user); } else { return RedirectToAction("Index"); } } [HttpPost] [ValidateAntiForgeryToken] public async Task ChangePassword(string id, string password) { ApplicationUser user = await userManager.FindByIdAsync(id); if (user != null) { // Validate password // Step 1: using built in validations IdentityResult passwordResult = await userManager.CreateAsync(testUser, password); if (passwordResult.Succeeded) { await userManager.DeleteAsync(testUser); } else { AddErrors(passwordResult); } /* Step 2: Because of DI, IPasswordValidator is injected into the custom password validator. So the built in password validation stop working here */ IdentityResult validPasswordResult = await passwordValidator.ValidateAsync(userManager, user, password); if (validPasswordResult.Succeeded) { user.PasswordHash = passwordHasher.HashPassword(user, password); } else { AddErrors(validPasswordResult); } // Update user info if (passwordResult.Succeeded && validPasswordResult.Succeeded) { // UpdateAsync validates user info such as UserName and Email except password since it's been hashed IdentityResult result = await userManager.UpdateAsync(user); if (result.Succeeded) { return RedirectToAction("Index", "SuperAdmin"); } else { AddErrors(result); } } } else { ModelState.AddModelError("", "User Not Found"); } return View(user); } } } ================================================ FILE: src/AdminLTE/Controllers/UserLogsController.cs ================================================ using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.Linq; using System.Threading.Tasks; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Identity; using Microsoft.AspNetCore.Identity.EntityFrameworkCore; using Microsoft.AspNetCore.Mvc; using AdminLTE.Models; using AdminLTE.Models.SuperAdminViewModels; using AdminLTE.Data; namespace AdminLTE.Controllers { [Authorize(Roles = "SuperAdmins")] public class UserLogsController : Controller { private readonly ApplicationDbContext _context; public UserLogsController(ApplicationDbContext context) { _context = context; } // GET: // public ViewResult Index() { return View(_context.UserAuditEvents.ToList()); } } } ================================================ FILE: src/AdminLTE/Data/AppClaimsPrincipalFactory.cs ================================================ using System.Security.Claims; using System.Threading.Tasks; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Identity; using Microsoft.AspNetCore.Identity.EntityFrameworkCore; using Microsoft.Extensions.Options; using AdminLTE.Common; using AdminLTE.Models; namespace AdminLTE.Data { public class AppClaimsPrincipalFactory : UserClaimsPrincipalFactory { public AppClaimsPrincipalFactory( UserManager userManager, RoleManager roleManager, IOptions optionsAccessor) : base(userManager, roleManager, optionsAccessor) { } public override async Task CreateAsync(ApplicationUser user) { var principal = await base.CreateAsync(user); ((ClaimsIdentity)principal.Identity).AddClaims(new[] { new Claim(CustomClaimTypes.GivenName, user.FirstName), new Claim(CustomClaimTypes.Surname, user.LastName), new Claim(CustomClaimTypes.AvatarURL, user.AvatarURL), new Claim(CustomClaimTypes.Position, user.Position), new Claim(CustomClaimTypes.NickName, user.NickName), new Claim(CustomClaimTypes.DateRegistered, user.DateRegistered), }); return principal; } } } ================================================ FILE: src/AdminLTE/Data/ApplicationDbContext.cs ================================================ using Microsoft.AspNetCore.Identity.EntityFrameworkCore; using Microsoft.EntityFrameworkCore; using AdminLTE.Models; namespace AdminLTE.Data { public class ApplicationDbContext : IdentityDbContext { public DbSet UserAuditEvents { get; set; } public ApplicationDbContext(DbContextOptions options) : base(options) { } protected override void OnModelCreating(ModelBuilder builder) { base.OnModelCreating(builder); // Customize the ASP.NET Identity model and override the defaults if needed. // For example, you can rename the ASP.NET Identity table names and more. // Add your customizations after calling base.OnModelCreating(builder); } } } ================================================ FILE: src/AdminLTE/Data/AuditableSignInManager.cs ================================================ using AdminLTE.Models; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Identity; using Microsoft.AspNetCore.Identity.EntityFrameworkCore; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using System; using System.Threading.Tasks; using AdminLTE.Common; using AdminLTE.Common.Extensions; using Microsoft.AspNetCore.Authentication; namespace AdminLTE.Data { public class AuditableSignInManager : SignInManager where TUser : class { private readonly UserManager _userManager; private readonly ApplicationDbContext _db; private readonly IHttpContextAccessor _contextAccessor; public AuditableSignInManager(UserManager userManager, IHttpContextAccessor contextAccessor, IUserClaimsPrincipalFactory claimsFactory, IOptions optionsAccessor, ILogger> logger, ApplicationDbContext dbContext) : base(userManager, contextAccessor, claimsFactory, optionsAccessor, logger, null, null) { if (userManager == null) throw new ArgumentNullException(nameof(userManager)); if (dbContext == null) throw new ArgumentNullException(nameof(dbContext)); if (contextAccessor == null) throw new ArgumentNullException(nameof(contextAccessor)); _userManager = userManager; _contextAccessor = contextAccessor; _db = dbContext; } public override async Task PasswordSignInAsync(TUser user, string password, bool isPersistent, bool lockoutOnFailure) { var result = await base.PasswordSignInAsync(user, password, isPersistent, lockoutOnFailure); var appUser = user as IdentityUser; if (appUser != null) // We can only log an audit record if we can access the user object and it's ID { var ip = _contextAccessor.HttpContext.Connection.RemoteIpAddress.ToString(); UserAudit auditRecord = null; switch (result.ToString()) { case "Succeeded": auditRecord = UserAudit.CreateAuditEvent(appUser.Id, UserAuditEventType.Login, ip); break; case "Failed": auditRecord = UserAudit.CreateAuditEvent(appUser.Id, UserAuditEventType.FailedLogin, ip); break; } if (auditRecord != null) { _db.UserAuditEvents.Add(auditRecord); await _db.SaveChangesAsync(); } } return result; } public override async Task SignOutAsync() { await _contextAccessor.HttpContext.SignOutAsync(_contextAccessor.HttpContext.Features.Get().AuthenticateResult?.Ticket?.AuthenticationScheme); var user = await _userManager.FindByIdAsync(_userManager.GetUserId(_contextAccessor.HttpContext.User)) as IdentityUser; if (user != null) { var ip = _contextAccessor.HttpContext.Connection.RemoteIpAddress.ToString(); var auditRecord = UserAudit.CreateAuditEvent(user.Id, UserAuditEventType.LogOut, ip); _db.UserAuditEvents.Add(auditRecord); await _db.SaveChangesAsync(); } } } } ================================================ FILE: src/AdminLTE/Data/DataSeed.cs ================================================ using System; using System.Collections.Generic; using System.Linq; using System.Security.Claims; using System.Threading.Tasks; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Identity; using Microsoft.AspNetCore.Identity.EntityFrameworkCore; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using AdminLTE.Models; using AdminLTE.Common; namespace AdminLTE.Data { public static class DataSeed { public static async Task Seed(IServiceProvider serviceProvider) { IServiceScopeFactory scopeFactory = serviceProvider.GetRequiredService(); using (IServiceScope scope = scopeFactory.CreateScope()) { var context = scope.ServiceProvider.GetRequiredService(); context.Database.Migrate(); UserManager _userManager = scope.ServiceProvider.GetRequiredService>(); RoleManager roleManager = scope.ServiceProvider.GetRequiredService>(); // Seed database code goes here // User Info //string userName = "SuperAdmin"; string firstName = "Super"; string lastName = "Admin"; string email = "superadmin@admin.com"; string password = "Qwaszx123$"; string role = "SuperAdmins"; string role2 = "SeniorManagers"; string role3 = "Managers"; if (await _userManager.FindByNameAsync(email) == null) { // Create SuperAdmins role if it doesn't exist if (await roleManager.FindByNameAsync(role) == null) { await roleManager.CreateAsync(new IdentityRole(role)); } if (await roleManager.FindByNameAsync(role2) == null) { await roleManager.CreateAsync(new IdentityRole(role2)); } if (await roleManager.FindByNameAsync(role3) == null) { await roleManager.CreateAsync(new IdentityRole(role3)); } // Create user account if it doesn't exist ApplicationUser user = new ApplicationUser { UserName = email, Email = email, //extended properties FirstName = firstName, LastName = lastName, AvatarURL = "/images/user.png", DateRegistered = DateTime.UtcNow.ToString(), Position = "", NickName = "", }; IdentityResult result = await _userManager.CreateAsync(user, password); // Assign role to the user if (result.Succeeded) { await _userManager.AddClaimAsync(user, new Claim(CustomClaimTypes.GivenName, user.FirstName)); await _userManager.AddClaimAsync(user, new Claim(CustomClaimTypes.Surname, user.LastName)); await _userManager.AddClaimAsync(user, new Claim(CustomClaimTypes.AvatarURL, user.AvatarURL)); //SignInManager _signInManager = serviceProvider.GetRequiredService>(); //await _signInManager.SignInAsync(user, isPersistent: false); await _userManager.AddToRoleAsync(user, role); } } } } } } ================================================ FILE: src/AdminLTE/Data/Migrations/00000000000000_CreateIdentitySchema.Designer.cs ================================================ using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Infrastructure; using Microsoft.EntityFrameworkCore.Metadata; using Microsoft.EntityFrameworkCore.Migrations; namespace AdminLTE.Data.Migrations { [DbContext(typeof(ApplicationDbContext))] [Migration("00000000000000_CreateIdentitySchema")] partial class CreateIdentitySchema { protected override void BuildTargetModel(ModelBuilder modelBuilder) { modelBuilder .HasAnnotation("ProductVersion", "1.0.0-rc3") .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); modelBuilder.Entity("Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityRole", b => { b.Property("Id"); b.Property("ConcurrencyStamp") .IsConcurrencyToken(); b.Property("Name") .HasAnnotation("MaxLength", 256); b.Property("NormalizedName") .HasAnnotation("MaxLength", 256); b.HasKey("Id"); b.HasIndex("NormalizedName") .HasDatabaseName("RoleNameIndex"); b.ToTable("AspNetRoles"); }); modelBuilder.Entity("Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityRoleClaim", b => { b.Property("Id") .ValueGeneratedOnAdd(); b.Property("ClaimType"); b.Property("ClaimValue"); b.Property("RoleId") .IsRequired(); b.HasKey("Id"); b.HasIndex("RoleId"); b.ToTable("AspNetRoleClaims"); }); modelBuilder.Entity("Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityUserClaim", b => { b.Property("Id") .ValueGeneratedOnAdd(); b.Property("ClaimType"); b.Property("ClaimValue"); b.Property("UserId") .IsRequired(); b.HasKey("Id"); b.HasIndex("UserId"); b.ToTable("AspNetUserClaims"); }); modelBuilder.Entity("Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityUserLogin", b => { b.Property("LoginProvider"); b.Property("ProviderKey"); b.Property("ProviderDisplayName"); b.Property("UserId") .IsRequired(); b.HasKey("LoginProvider", "ProviderKey"); b.HasIndex("UserId"); b.ToTable("AspNetUserLogins"); }); modelBuilder.Entity("Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityUserRole", b => { b.Property("UserId"); b.Property("RoleId"); b.HasKey("UserId", "RoleId"); b.HasIndex("RoleId"); b.HasIndex("UserId"); b.ToTable("AspNetUserRoles"); }); modelBuilder.Entity("Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityUserToken", b => { b.Property("UserId"); b.Property("LoginProvider"); b.Property("Name"); b.Property("Value"); b.HasKey("UserId", "LoginProvider", "Name"); b.ToTable("AspNetUserTokens"); }); modelBuilder.Entity("AdminLTE.Models.ApplicationUser", b => { b.Property("Id"); b.Property("AccessFailedCount"); b.Property("ConcurrencyStamp") .IsConcurrencyToken(); b.Property("Email") .HasAnnotation("MaxLength", 256); b.Property("EmailConfirmed"); b.Property("LockoutEnabled"); b.Property("LockoutEnd"); b.Property("NormalizedEmail") .HasAnnotation("MaxLength", 256); b.Property("NormalizedUserName") .HasAnnotation("MaxLength", 256); b.Property("PasswordHash"); b.Property("PhoneNumber"); b.Property("PhoneNumberConfirmed"); b.Property("SecurityStamp"); b.Property("TwoFactorEnabled"); b.Property("UserName") .HasAnnotation("MaxLength", 256); b.HasKey("Id"); b.HasIndex("NormalizedEmail") .HasDatabaseName("EmailIndex"); b.HasIndex("NormalizedUserName") .IsUnique() .HasDatabaseName("UserNameIndex"); b.ToTable("AspNetUsers"); }); modelBuilder.Entity("Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityRoleClaim", b => { b.HasOne("Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityRole") .WithMany("Claims") .HasForeignKey("RoleId") .OnDelete(DeleteBehavior.Cascade); }); modelBuilder.Entity("Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityUserClaim", b => { b.HasOne("AdminLTE.Models.ApplicationUser") .WithMany("Claims") .HasForeignKey("UserId") .OnDelete(DeleteBehavior.Cascade); }); modelBuilder.Entity("Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityUserLogin", b => { b.HasOne("AdminLTE.Models.ApplicationUser") .WithMany("Logins") .HasForeignKey("UserId") .OnDelete(DeleteBehavior.Cascade); }); modelBuilder.Entity("Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityUserRole", b => { b.HasOne("Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityRole") .WithMany("Users") .HasForeignKey("RoleId") .OnDelete(DeleteBehavior.Cascade); b.HasOne("AdminLTE.Models.ApplicationUser") .WithMany("Roles") .HasForeignKey("UserId") .OnDelete(DeleteBehavior.Cascade); }); } } } ================================================ FILE: src/AdminLTE/Data/Migrations/00000000000000_CreateIdentitySchema.cs ================================================ using System; using Microsoft.EntityFrameworkCore.Metadata; using Microsoft.EntityFrameworkCore.Migrations; namespace AdminLTE.Data.Migrations { public partial class CreateIdentitySchema : Migration { protected override void Up(MigrationBuilder migrationBuilder) { migrationBuilder.CreateTable( name: "AspNetRoles", columns: table => new { Id = table.Column(nullable: false), ConcurrencyStamp = table.Column(nullable: true), Name = table.Column(maxLength: 256, nullable: true), NormalizedName = table.Column(maxLength: 256, nullable: true) }, constraints: table => { table.PrimaryKey("PK_AspNetRoles", x => x.Id); }); migrationBuilder.CreateTable( name: "AspNetUserTokens", columns: table => new { UserId = table.Column(nullable: false), LoginProvider = table.Column(nullable: false), Name = table.Column(nullable: false), Value = table.Column(nullable: true) }, constraints: table => { table.PrimaryKey("PK_AspNetUserTokens", x => new { x.UserId, x.LoginProvider, x.Name }); }); migrationBuilder.CreateTable( name: "AspNetUsers", columns: table => new { Id = table.Column(nullable: false), AccessFailedCount = table.Column(nullable: false), ConcurrencyStamp = table.Column(nullable: true), Email = table.Column(maxLength: 256, nullable: true), EmailConfirmed = table.Column(nullable: false), LockoutEnabled = table.Column(nullable: false), LockoutEnd = table.Column(nullable: true), NormalizedEmail = table.Column(maxLength: 256, nullable: true), NormalizedUserName = table.Column(maxLength: 256, nullable: true), PasswordHash = table.Column(nullable: true), PhoneNumber = table.Column(nullable: true), PhoneNumberConfirmed = table.Column(nullable: false), SecurityStamp = table.Column(nullable: true), TwoFactorEnabled = table.Column(nullable: false), UserName = table.Column(maxLength: 256, nullable: true) }, constraints: table => { table.PrimaryKey("PK_AspNetUsers", x => x.Id); }); migrationBuilder.CreateTable( name: "AspNetRoleClaims", columns: table => new { Id = table.Column(nullable: false) .Annotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn), ClaimType = table.Column(nullable: true), ClaimValue = table.Column(nullable: true), RoleId = table.Column(nullable: false) }, constraints: table => { table.PrimaryKey("PK_AspNetRoleClaims", x => x.Id); table.ForeignKey( name: "FK_AspNetRoleClaims_AspNetRoles_RoleId", column: x => x.RoleId, principalTable: "AspNetRoles", principalColumn: "Id", onDelete: ReferentialAction.Cascade); }); migrationBuilder.CreateTable( name: "AspNetUserClaims", columns: table => new { Id = table.Column(nullable: false) .Annotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn), ClaimType = table.Column(nullable: true), ClaimValue = table.Column(nullable: true), UserId = table.Column(nullable: false) }, constraints: table => { table.PrimaryKey("PK_AspNetUserClaims", x => x.Id); table.ForeignKey( name: "FK_AspNetUserClaims_AspNetUsers_UserId", column: x => x.UserId, principalTable: "AspNetUsers", principalColumn: "Id", onDelete: ReferentialAction.Cascade); }); migrationBuilder.CreateTable( name: "AspNetUserLogins", columns: table => new { LoginProvider = table.Column(nullable: false), ProviderKey = table.Column(nullable: false), ProviderDisplayName = table.Column(nullable: true), UserId = table.Column(nullable: false) }, constraints: table => { table.PrimaryKey("PK_AspNetUserLogins", x => new { x.LoginProvider, x.ProviderKey }); table.ForeignKey( name: "FK_AspNetUserLogins_AspNetUsers_UserId", column: x => x.UserId, principalTable: "AspNetUsers", principalColumn: "Id", onDelete: ReferentialAction.Cascade); }); migrationBuilder.CreateTable( name: "AspNetUserRoles", columns: table => new { UserId = table.Column(nullable: false), RoleId = table.Column(nullable: false) }, constraints: table => { table.PrimaryKey("PK_AspNetUserRoles", x => new { x.UserId, x.RoleId }); table.ForeignKey( name: "FK_AspNetUserRoles_AspNetRoles_RoleId", column: x => x.RoleId, principalTable: "AspNetRoles", principalColumn: "Id", onDelete: ReferentialAction.Cascade); table.ForeignKey( name: "FK_AspNetUserRoles_AspNetUsers_UserId", column: x => x.UserId, principalTable: "AspNetUsers", principalColumn: "Id", onDelete: ReferentialAction.Cascade); }); migrationBuilder.CreateIndex( name: "RoleNameIndex", table: "AspNetRoles", column: "NormalizedName"); migrationBuilder.CreateIndex( name: "IX_AspNetRoleClaims_RoleId", table: "AspNetRoleClaims", column: "RoleId"); migrationBuilder.CreateIndex( name: "IX_AspNetUserClaims_UserId", table: "AspNetUserClaims", column: "UserId"); migrationBuilder.CreateIndex( name: "IX_AspNetUserLogins_UserId", table: "AspNetUserLogins", column: "UserId"); migrationBuilder.CreateIndex( name: "IX_AspNetUserRoles_RoleId", table: "AspNetUserRoles", column: "RoleId"); migrationBuilder.CreateIndex( name: "IX_AspNetUserRoles_UserId", table: "AspNetUserRoles", column: "UserId"); migrationBuilder.CreateIndex( name: "EmailIndex", table: "AspNetUsers", column: "NormalizedEmail"); migrationBuilder.CreateIndex( name: "UserNameIndex", table: "AspNetUsers", column: "NormalizedUserName", unique: true); } protected override void Down(MigrationBuilder migrationBuilder) { migrationBuilder.DropTable( name: "AspNetRoleClaims"); migrationBuilder.DropTable( name: "AspNetUserClaims"); migrationBuilder.DropTable( name: "AspNetUserLogins"); migrationBuilder.DropTable( name: "AspNetUserRoles"); migrationBuilder.DropTable( name: "AspNetUserTokens"); migrationBuilder.DropTable( name: "AspNetRoles"); migrationBuilder.DropTable( name: "AspNetUsers"); } } } ================================================ FILE: src/AdminLTE/Data/Migrations/20160801092435_ExtendASPNetUser.Designer.cs ================================================ using System; using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Infrastructure; using Microsoft.EntityFrameworkCore.Metadata; using Microsoft.EntityFrameworkCore.Migrations; using AdminLTE.Data; namespace AdminLTE.Data.Migrations { [DbContext(typeof(ApplicationDbContext))] [Migration("20160801092435_ExtendASPNetUser")] partial class ExtendASPNetUser { protected override void BuildTargetModel(ModelBuilder modelBuilder) { modelBuilder .HasAnnotation("ProductVersion", "1.0.0-rtm-21431") .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); modelBuilder.Entity("AdminLTE.Models.ApplicationUser", b => { b.Property("Id"); b.Property("AccessFailedCount"); b.Property("AvatarURL"); b.Property("ConcurrencyStamp") .IsConcurrencyToken(); b.Property("Email") .HasAnnotation("MaxLength", 256); b.Property("EmailConfirmed"); b.Property("FirstName"); b.Property("LastName"); b.Property("LockoutEnabled"); b.Property("LockoutEnd"); b.Property("NormalizedEmail") .HasAnnotation("MaxLength", 256); b.Property("NormalizedUserName") .HasAnnotation("MaxLength", 256); b.Property("PasswordHash"); b.Property("PhoneNumber"); b.Property("PhoneNumberConfirmed"); b.Property("SecurityStamp"); b.Property("TwoFactorEnabled"); b.Property("UserName") .HasAnnotation("MaxLength", 256); b.HasKey("Id"); b.HasIndex("NormalizedEmail") .HasDatabaseName("EmailIndex"); b.HasIndex("NormalizedUserName") .IsUnique() .HasDatabaseName("UserNameIndex"); b.ToTable("AspNetUsers"); }); modelBuilder.Entity("Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityRole", b => { b.Property("Id"); b.Property("ConcurrencyStamp") .IsConcurrencyToken(); b.Property("Name") .HasAnnotation("MaxLength", 256); b.Property("NormalizedName") .HasAnnotation("MaxLength", 256); b.HasKey("Id"); b.HasIndex("NormalizedName") .HasDatabaseName("RoleNameIndex"); b.ToTable("AspNetRoles"); }); modelBuilder.Entity("Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityRoleClaim", b => { b.Property("Id") .ValueGeneratedOnAdd(); b.Property("ClaimType"); b.Property("ClaimValue"); b.Property("RoleId") .IsRequired(); b.HasKey("Id"); b.HasIndex("RoleId"); b.ToTable("AspNetRoleClaims"); }); modelBuilder.Entity("Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityUserClaim", b => { b.Property("Id") .ValueGeneratedOnAdd(); b.Property("ClaimType"); b.Property("ClaimValue"); b.Property("UserId") .IsRequired(); b.HasKey("Id"); b.HasIndex("UserId"); b.ToTable("AspNetUserClaims"); }); modelBuilder.Entity("Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityUserLogin", b => { b.Property("LoginProvider"); b.Property("ProviderKey"); b.Property("ProviderDisplayName"); b.Property("UserId") .IsRequired(); b.HasKey("LoginProvider", "ProviderKey"); b.HasIndex("UserId"); b.ToTable("AspNetUserLogins"); }); modelBuilder.Entity("Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityUserRole", b => { b.Property("UserId"); b.Property("RoleId"); b.HasKey("UserId", "RoleId"); b.HasIndex("RoleId"); b.HasIndex("UserId"); b.ToTable("AspNetUserRoles"); }); modelBuilder.Entity("Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityUserToken", b => { b.Property("UserId"); b.Property("LoginProvider"); b.Property("Name"); b.Property("Value"); b.HasKey("UserId", "LoginProvider", "Name"); b.ToTable("AspNetUserTokens"); }); modelBuilder.Entity("Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityRoleClaim", b => { b.HasOne("Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityRole") .WithMany("Claims") .HasForeignKey("RoleId") .OnDelete(DeleteBehavior.Cascade); }); modelBuilder.Entity("Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityUserClaim", b => { b.HasOne("AdminLTE.Models.ApplicationUser") .WithMany("Claims") .HasForeignKey("UserId") .OnDelete(DeleteBehavior.Cascade); }); modelBuilder.Entity("Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityUserLogin", b => { b.HasOne("AdminLTE.Models.ApplicationUser") .WithMany("Logins") .HasForeignKey("UserId") .OnDelete(DeleteBehavior.Cascade); }); modelBuilder.Entity("Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityUserRole", b => { b.HasOne("Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityRole") .WithMany("Users") .HasForeignKey("RoleId") .OnDelete(DeleteBehavior.Cascade); b.HasOne("AdminLTE.Models.ApplicationUser") .WithMany("Roles") .HasForeignKey("UserId") .OnDelete(DeleteBehavior.Cascade); }); } } } ================================================ FILE: src/AdminLTE/Data/Migrations/20160801092435_ExtendASPNetUser.cs ================================================ using Microsoft.EntityFrameworkCore.Migrations; namespace AdminLTE.Data.Migrations { public partial class ExtendASPNetUser : Migration { protected override void Up(MigrationBuilder migrationBuilder) { migrationBuilder.AddColumn( name: "AvatarURL", table: "AspNetUsers", nullable: true); migrationBuilder.AddColumn( name: "FirstName", table: "AspNetUsers", nullable: true); migrationBuilder.AddColumn( name: "LastName", table: "AspNetUsers", nullable: true); } protected override void Down(MigrationBuilder migrationBuilder) { migrationBuilder.DropColumn( name: "AvatarURL", table: "AspNetUsers"); migrationBuilder.DropColumn( name: "FirstName", table: "AspNetUsers"); migrationBuilder.DropColumn( name: "LastName", table: "AspNetUsers"); } } } ================================================ FILE: src/AdminLTE/Data/Migrations/20160802025049_UserAuditTable.Designer.cs ================================================ using System; using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Infrastructure; using Microsoft.EntityFrameworkCore.Metadata; using Microsoft.EntityFrameworkCore.Migrations; using AdminLTE.Data; namespace AdminLTE.Data.Migrations { [DbContext(typeof(ApplicationDbContext))] [Migration("20160802025049_UserAuditTable")] partial class UserAuditTable { protected override void BuildTargetModel(ModelBuilder modelBuilder) { modelBuilder .HasAnnotation("ProductVersion", "1.0.0-rtm-21431") .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); modelBuilder.Entity("AdminLTE.Models.ApplicationUser", b => { b.Property("Id"); b.Property("AccessFailedCount"); b.Property("AvatarURL"); b.Property("ConcurrencyStamp") .IsConcurrencyToken(); b.Property("Email") .HasAnnotation("MaxLength", 256); b.Property("EmailConfirmed"); b.Property("FirstName"); b.Property("LastName"); b.Property("LockoutEnabled"); b.Property("LockoutEnd"); b.Property("NormalizedEmail") .HasAnnotation("MaxLength", 256); b.Property("NormalizedUserName") .HasAnnotation("MaxLength", 256); b.Property("PasswordHash"); b.Property("PhoneNumber"); b.Property("PhoneNumberConfirmed"); b.Property("SecurityStamp"); b.Property("TwoFactorEnabled"); b.Property("UserName") .HasAnnotation("MaxLength", 256); b.HasKey("Id"); b.HasIndex("NormalizedEmail") .HasDatabaseName("EmailIndex"); b.HasIndex("NormalizedUserName") .IsUnique() .HasDatabaseName("UserNameIndex"); b.ToTable("AspNetUsers"); }); modelBuilder.Entity("AdminLTE.Models.UserAudit", b => { b.Property("UserAuditId") .ValueGeneratedOnAdd(); b.Property("AuditEvent"); b.Property("IpAddress"); b.Property("Timestamp"); b.Property("UserId") .IsRequired(); b.HasKey("UserAuditId"); b.ToTable("UserAuditEvents"); }); modelBuilder.Entity("Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityRole", b => { b.Property("Id"); b.Property("ConcurrencyStamp") .IsConcurrencyToken(); b.Property("Name") .HasAnnotation("MaxLength", 256); b.Property("NormalizedName") .HasAnnotation("MaxLength", 256); b.HasKey("Id"); b.HasIndex("NormalizedName") .HasDatabaseName("RoleNameIndex"); b.ToTable("AspNetRoles"); }); modelBuilder.Entity("Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityRoleClaim", b => { b.Property("Id") .ValueGeneratedOnAdd(); b.Property("ClaimType"); b.Property("ClaimValue"); b.Property("RoleId") .IsRequired(); b.HasKey("Id"); b.HasIndex("RoleId"); b.ToTable("AspNetRoleClaims"); }); modelBuilder.Entity("Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityUserClaim", b => { b.Property("Id") .ValueGeneratedOnAdd(); b.Property("ClaimType"); b.Property("ClaimValue"); b.Property("UserId") .IsRequired(); b.HasKey("Id"); b.HasIndex("UserId"); b.ToTable("AspNetUserClaims"); }); modelBuilder.Entity("Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityUserLogin", b => { b.Property("LoginProvider"); b.Property("ProviderKey"); b.Property("ProviderDisplayName"); b.Property("UserId") .IsRequired(); b.HasKey("LoginProvider", "ProviderKey"); b.HasIndex("UserId"); b.ToTable("AspNetUserLogins"); }); modelBuilder.Entity("Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityUserRole", b => { b.Property("UserId"); b.Property("RoleId"); b.HasKey("UserId", "RoleId"); b.HasIndex("RoleId"); b.HasIndex("UserId"); b.ToTable("AspNetUserRoles"); }); modelBuilder.Entity("Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityUserToken", b => { b.Property("UserId"); b.Property("LoginProvider"); b.Property("Name"); b.Property("Value"); b.HasKey("UserId", "LoginProvider", "Name"); b.ToTable("AspNetUserTokens"); }); modelBuilder.Entity("Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityRoleClaim", b => { b.HasOne("Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityRole") .WithMany("Claims") .HasForeignKey("RoleId") .OnDelete(DeleteBehavior.Cascade); }); modelBuilder.Entity("Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityUserClaim", b => { b.HasOne("AdminLTE.Models.ApplicationUser") .WithMany("Claims") .HasForeignKey("UserId") .OnDelete(DeleteBehavior.Cascade); }); modelBuilder.Entity("Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityUserLogin", b => { b.HasOne("AdminLTE.Models.ApplicationUser") .WithMany("Logins") .HasForeignKey("UserId") .OnDelete(DeleteBehavior.Cascade); }); modelBuilder.Entity("Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityUserRole", b => { b.HasOne("Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityRole") .WithMany("Users") .HasForeignKey("RoleId") .OnDelete(DeleteBehavior.Cascade); b.HasOne("AdminLTE.Models.ApplicationUser") .WithMany("Roles") .HasForeignKey("UserId") .OnDelete(DeleteBehavior.Cascade); }); } } } ================================================ FILE: src/AdminLTE/Data/Migrations/20160802025049_UserAuditTable.cs ================================================ using System; using Microsoft.EntityFrameworkCore.Migrations; using Microsoft.EntityFrameworkCore.Metadata; namespace AdminLTE.Data.Migrations { public partial class UserAuditTable : Migration { protected override void Up(MigrationBuilder migrationBuilder) { migrationBuilder.CreateTable( name: "UserAuditEvents", columns: table => new { UserAuditId = table.Column(nullable: false) .Annotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn), AuditEvent = table.Column(nullable: false), IpAddress = table.Column(nullable: true), Timestamp = table.Column(nullable: false), UserId = table.Column(nullable: false) }, constraints: table => { table.PrimaryKey("PK_UserAuditEvents", x => x.UserAuditId); }); } protected override void Down(MigrationBuilder migrationBuilder) { migrationBuilder.DropTable( name: "UserAuditEvents"); } } } ================================================ FILE: src/AdminLTE/Data/Migrations/20160802083550_AddedAdditionalUserFields.Designer.cs ================================================ using System; using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Infrastructure; using Microsoft.EntityFrameworkCore.Metadata; using Microsoft.EntityFrameworkCore.Migrations; using AdminLTE.Data; namespace AdminLTE.Data.Migrations { [DbContext(typeof(ApplicationDbContext))] [Migration("20160802083550_AddedAdditionalUserFields")] partial class AddedAdditionalUserFields { protected override void BuildTargetModel(ModelBuilder modelBuilder) { modelBuilder .HasAnnotation("ProductVersion", "1.0.0-rtm-21431") .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); modelBuilder.Entity("AdminLTE.Models.ApplicationUser", b => { b.Property("Id"); b.Property("AccessFailedCount"); b.Property("AvatarURL"); b.Property("ConcurrencyStamp") .IsConcurrencyToken(); b.Property("DateRegistered"); b.Property("Email") .HasAnnotation("MaxLength", 256); b.Property("EmailConfirmed"); b.Property("FirstName"); b.Property("LastName"); b.Property("LockoutEnabled"); b.Property("LockoutEnd"); b.Property("NickName"); b.Property("NormalizedEmail") .HasAnnotation("MaxLength", 256); b.Property("NormalizedUserName") .HasAnnotation("MaxLength", 256); b.Property("PasswordHash"); b.Property("PhoneNumber"); b.Property("PhoneNumberConfirmed"); b.Property("Position"); b.Property("SecurityStamp"); b.Property("TwoFactorEnabled"); b.Property("UserName") .HasAnnotation("MaxLength", 256); b.HasKey("Id"); b.HasIndex("NormalizedEmail") .HasDatabaseName("EmailIndex"); b.HasIndex("NormalizedUserName") .IsUnique() .HasDatabaseName("UserNameIndex"); b.ToTable("AspNetUsers"); }); modelBuilder.Entity("AdminLTE.Models.UserAudit", b => { b.Property("UserAuditId") .ValueGeneratedOnAdd(); b.Property("AuditEvent"); b.Property("IpAddress"); b.Property("Timestamp"); b.Property("UserId") .IsRequired(); b.HasKey("UserAuditId"); b.ToTable("UserAuditEvents"); }); modelBuilder.Entity("Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityRole", b => { b.Property("Id"); b.Property("ConcurrencyStamp") .IsConcurrencyToken(); b.Property("Name") .HasAnnotation("MaxLength", 256); b.Property("NormalizedName") .HasAnnotation("MaxLength", 256); b.HasKey("Id"); b.HasIndex("NormalizedName") .HasDatabaseName("RoleNameIndex"); b.ToTable("AspNetRoles"); }); modelBuilder.Entity("Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityRoleClaim", b => { b.Property("Id") .ValueGeneratedOnAdd(); b.Property("ClaimType"); b.Property("ClaimValue"); b.Property("RoleId") .IsRequired(); b.HasKey("Id"); b.HasIndex("RoleId"); b.ToTable("AspNetRoleClaims"); }); modelBuilder.Entity("Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityUserClaim", b => { b.Property("Id") .ValueGeneratedOnAdd(); b.Property("ClaimType"); b.Property("ClaimValue"); b.Property("UserId") .IsRequired(); b.HasKey("Id"); b.HasIndex("UserId"); b.ToTable("AspNetUserClaims"); }); modelBuilder.Entity("Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityUserLogin", b => { b.Property("LoginProvider"); b.Property("ProviderKey"); b.Property("ProviderDisplayName"); b.Property("UserId") .IsRequired(); b.HasKey("LoginProvider", "ProviderKey"); b.HasIndex("UserId"); b.ToTable("AspNetUserLogins"); }); modelBuilder.Entity("Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityUserRole", b => { b.Property("UserId"); b.Property("RoleId"); b.HasKey("UserId", "RoleId"); b.HasIndex("RoleId"); b.HasIndex("UserId"); b.ToTable("AspNetUserRoles"); }); modelBuilder.Entity("Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityUserToken", b => { b.Property("UserId"); b.Property("LoginProvider"); b.Property("Name"); b.Property("Value"); b.HasKey("UserId", "LoginProvider", "Name"); b.ToTable("AspNetUserTokens"); }); modelBuilder.Entity("Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityRoleClaim", b => { b.HasOne("Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityRole") .WithMany("Claims") .HasForeignKey("RoleId") .OnDelete(DeleteBehavior.Cascade); }); modelBuilder.Entity("Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityUserClaim", b => { b.HasOne("AdminLTE.Models.ApplicationUser") .WithMany("Claims") .HasForeignKey("UserId") .OnDelete(DeleteBehavior.Cascade); }); modelBuilder.Entity("Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityUserLogin", b => { b.HasOne("AdminLTE.Models.ApplicationUser") .WithMany("Logins") .HasForeignKey("UserId") .OnDelete(DeleteBehavior.Cascade); }); modelBuilder.Entity("Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityUserRole", b => { b.HasOne("Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityRole") .WithMany("Users") .HasForeignKey("RoleId") .OnDelete(DeleteBehavior.Cascade); b.HasOne("AdminLTE.Models.ApplicationUser") .WithMany("Roles") .HasForeignKey("UserId") .OnDelete(DeleteBehavior.Cascade); }); } } } ================================================ FILE: src/AdminLTE/Data/Migrations/20160802083550_AddedAdditionalUserFields.cs ================================================ using System; using System.Collections.Generic; using Microsoft.EntityFrameworkCore.Migrations; namespace AdminLTE.Data.Migrations { public partial class AddedAdditionalUserFields : Migration { protected override void Up(MigrationBuilder migrationBuilder) { migrationBuilder.AddColumn( name: "DateRegistered", table: "AspNetUsers", nullable: true); migrationBuilder.AddColumn( name: "NickName", table: "AspNetUsers", nullable: true); migrationBuilder.AddColumn( name: "Position", table: "AspNetUsers", nullable: true); } protected override void Down(MigrationBuilder migrationBuilder) { migrationBuilder.DropColumn( name: "DateRegistered", table: "AspNetUsers"); migrationBuilder.DropColumn( name: "NickName", table: "AspNetUsers"); migrationBuilder.DropColumn( name: "Position", table: "AspNetUsers"); } } } ================================================ FILE: src/AdminLTE/Data/Migrations/20251217031644_UpdateEF10.Designer.cs ================================================ // using System; using AdminLTE.Data; using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Infrastructure; using Microsoft.EntityFrameworkCore.Metadata; using Microsoft.EntityFrameworkCore.Migrations; using Microsoft.EntityFrameworkCore.Storage.ValueConversion; #nullable disable namespace AdminLTE.Data.Migrations { [DbContext(typeof(ApplicationDbContext))] [Migration("20251217031644_UpdateEF10")] partial class UpdateEF10 { /// protected override void BuildTargetModel(ModelBuilder modelBuilder) { #pragma warning disable 612, 618 modelBuilder .HasAnnotation("ProductVersion", "10.0.1") .HasAnnotation("Relational:MaxIdentifierLength", 128); SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); modelBuilder.Entity("AdminLTE.Models.ApplicationUser", b => { b.Property("Id") .HasColumnType("nvarchar(450)"); b.Property("AccessFailedCount") .HasColumnType("int"); b.Property("AvatarURL") .HasColumnType("nvarchar(max)"); b.Property("ConcurrencyStamp") .IsConcurrencyToken() .HasColumnType("nvarchar(max)"); b.Property("DateRegistered") .HasColumnType("nvarchar(max)"); b.Property("Email") .HasMaxLength(256) .HasColumnType("nvarchar(256)"); b.Property("EmailConfirmed") .HasColumnType("bit"); b.Property("FirstName") .HasColumnType("nvarchar(max)"); b.Property("LastName") .HasColumnType("nvarchar(max)"); b.Property("LockoutEnabled") .HasColumnType("bit"); b.Property("LockoutEnd") .HasColumnType("datetimeoffset"); b.Property("NickName") .HasColumnType("nvarchar(max)"); b.Property("NormalizedEmail") .HasMaxLength(256) .HasColumnType("nvarchar(256)"); b.Property("NormalizedUserName") .HasMaxLength(256) .HasColumnType("nvarchar(256)"); b.Property("PasswordHash") .HasColumnType("nvarchar(max)"); b.Property("PhoneNumber") .HasColumnType("nvarchar(max)"); b.Property("PhoneNumberConfirmed") .HasColumnType("bit"); b.Property("Position") .HasColumnType("nvarchar(max)"); b.Property("SecurityStamp") .HasColumnType("nvarchar(max)"); b.Property("TwoFactorEnabled") .HasColumnType("bit"); b.Property("UserName") .HasMaxLength(256) .HasColumnType("nvarchar(256)"); b.HasKey("Id"); b.HasIndex("NormalizedEmail") .HasDatabaseName("EmailIndex"); b.HasIndex("NormalizedUserName") .IsUnique() .HasDatabaseName("UserNameIndex") .HasFilter("[NormalizedUserName] IS NOT NULL"); b.ToTable("AspNetUsers", (string)null); }); modelBuilder.Entity("AdminLTE.Models.UserAudit", b => { b.Property("UserAuditId") .ValueGeneratedOnAdd() .HasColumnType("int"); SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("UserAuditId")); b.Property("AuditEvent") .HasColumnType("int"); b.Property("IpAddress") .HasColumnType("nvarchar(max)"); b.Property("Timestamp") .HasColumnType("datetimeoffset"); b.Property("UserId") .IsRequired() .HasColumnType("nvarchar(max)"); b.HasKey("UserAuditId"); b.ToTable("UserAuditEvents"); }); modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRole", b => { b.Property("Id") .HasColumnType("nvarchar(450)"); b.Property("ConcurrencyStamp") .IsConcurrencyToken() .HasColumnType("nvarchar(max)"); b.Property("Name") .HasMaxLength(256) .HasColumnType("nvarchar(256)"); b.Property("NormalizedName") .HasMaxLength(256) .HasColumnType("nvarchar(256)"); b.HasKey("Id"); b.HasIndex("NormalizedName") .IsUnique() .HasDatabaseName("RoleNameIndex") .HasFilter("[NormalizedName] IS NOT NULL"); b.ToTable("AspNetRoles", (string)null); }); modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => { b.Property("Id") .ValueGeneratedOnAdd() .HasColumnType("int"); SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); b.Property("ClaimType") .HasColumnType("nvarchar(max)"); b.Property("ClaimValue") .HasColumnType("nvarchar(max)"); b.Property("RoleId") .IsRequired() .HasColumnType("nvarchar(450)"); b.HasKey("Id"); b.HasIndex("RoleId"); b.ToTable("AspNetRoleClaims", (string)null); }); modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => { b.Property("Id") .ValueGeneratedOnAdd() .HasColumnType("int"); SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); b.Property("ClaimType") .HasColumnType("nvarchar(max)"); b.Property("ClaimValue") .HasColumnType("nvarchar(max)"); b.Property("UserId") .IsRequired() .HasColumnType("nvarchar(450)"); b.HasKey("Id"); b.HasIndex("UserId"); b.ToTable("AspNetUserClaims", (string)null); }); modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => { b.Property("LoginProvider") .HasColumnType("nvarchar(450)"); b.Property("ProviderKey") .HasColumnType("nvarchar(450)"); b.Property("ProviderDisplayName") .HasColumnType("nvarchar(max)"); b.Property("UserId") .IsRequired() .HasColumnType("nvarchar(450)"); b.HasKey("LoginProvider", "ProviderKey"); b.HasIndex("UserId"); b.ToTable("AspNetUserLogins", (string)null); }); modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b => { b.Property("UserId") .HasColumnType("nvarchar(450)"); b.Property("RoleId") .HasColumnType("nvarchar(450)"); b.HasKey("UserId", "RoleId"); b.HasIndex("RoleId"); b.ToTable("AspNetUserRoles", (string)null); }); modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => { b.Property("UserId") .HasColumnType("nvarchar(450)"); b.Property("LoginProvider") .HasColumnType("nvarchar(450)"); b.Property("Name") .HasColumnType("nvarchar(450)"); b.Property("Value") .HasColumnType("nvarchar(max)"); b.HasKey("UserId", "LoginProvider", "Name"); b.ToTable("AspNetUserTokens", (string)null); }); modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => { b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole", null) .WithMany() .HasForeignKey("RoleId") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); }); modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => { b.HasOne("AdminLTE.Models.ApplicationUser", null) .WithMany() .HasForeignKey("UserId") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); }); modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => { b.HasOne("AdminLTE.Models.ApplicationUser", null) .WithMany() .HasForeignKey("UserId") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); }); modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b => { b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole", null) .WithMany() .HasForeignKey("RoleId") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); b.HasOne("AdminLTE.Models.ApplicationUser", null) .WithMany() .HasForeignKey("UserId") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); }); modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => { b.HasOne("AdminLTE.Models.ApplicationUser", null) .WithMany() .HasForeignKey("UserId") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); }); #pragma warning restore 612, 618 } } } ================================================ FILE: src/AdminLTE/Data/Migrations/20251217031644_UpdateEF10.cs ================================================ using Microsoft.EntityFrameworkCore.Migrations; #nullable disable namespace AdminLTE.Data.Migrations { /// public partial class UpdateEF10 : Migration { /// protected override void Up(MigrationBuilder migrationBuilder) { migrationBuilder.DropIndex( name: "UserNameIndex", table: "AspNetUsers"); migrationBuilder.DropIndex( name: "IX_AspNetUserRoles_UserId", table: "AspNetUserRoles"); migrationBuilder.DropIndex( name: "RoleNameIndex", table: "AspNetRoles"); migrationBuilder.CreateIndex( name: "UserNameIndex", table: "AspNetUsers", column: "NormalizedUserName", unique: true, filter: "[NormalizedUserName] IS NOT NULL"); migrationBuilder.CreateIndex( name: "RoleNameIndex", table: "AspNetRoles", column: "NormalizedName", unique: true, filter: "[NormalizedName] IS NOT NULL"); migrationBuilder.AddForeignKey( name: "FK_AspNetUserTokens_AspNetUsers_UserId", table: "AspNetUserTokens", column: "UserId", principalTable: "AspNetUsers", principalColumn: "Id", onDelete: ReferentialAction.Cascade); } /// protected override void Down(MigrationBuilder migrationBuilder) { migrationBuilder.DropForeignKey( name: "FK_AspNetUserTokens_AspNetUsers_UserId", table: "AspNetUserTokens"); migrationBuilder.DropIndex( name: "UserNameIndex", table: "AspNetUsers"); migrationBuilder.DropIndex( name: "RoleNameIndex", table: "AspNetRoles"); migrationBuilder.CreateIndex( name: "UserNameIndex", table: "AspNetUsers", column: "NormalizedUserName", unique: true); migrationBuilder.CreateIndex( name: "IX_AspNetUserRoles_UserId", table: "AspNetUserRoles", column: "UserId"); migrationBuilder.CreateIndex( name: "RoleNameIndex", table: "AspNetRoles", column: "NormalizedName"); } } } ================================================ FILE: src/AdminLTE/Data/Migrations/ApplicationDbContextModelSnapshot.cs ================================================ // using System; using AdminLTE.Data; using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Infrastructure; using Microsoft.EntityFrameworkCore.Metadata; using Microsoft.EntityFrameworkCore.Storage.ValueConversion; #nullable disable namespace AdminLTE.Data.Migrations { [DbContext(typeof(ApplicationDbContext))] partial class ApplicationDbContextModelSnapshot : ModelSnapshot { protected override void BuildModel(ModelBuilder modelBuilder) { #pragma warning disable 612, 618 modelBuilder .HasAnnotation("ProductVersion", "10.0.1") .HasAnnotation("Relational:MaxIdentifierLength", 128); SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); modelBuilder.Entity("AdminLTE.Models.ApplicationUser", b => { b.Property("Id") .HasColumnType("nvarchar(450)"); b.Property("AccessFailedCount") .HasColumnType("int"); b.Property("AvatarURL") .HasColumnType("nvarchar(max)"); b.Property("ConcurrencyStamp") .IsConcurrencyToken() .HasColumnType("nvarchar(max)"); b.Property("DateRegistered") .HasColumnType("nvarchar(max)"); b.Property("Email") .HasMaxLength(256) .HasColumnType("nvarchar(256)"); b.Property("EmailConfirmed") .HasColumnType("bit"); b.Property("FirstName") .HasColumnType("nvarchar(max)"); b.Property("LastName") .HasColumnType("nvarchar(max)"); b.Property("LockoutEnabled") .HasColumnType("bit"); b.Property("LockoutEnd") .HasColumnType("datetimeoffset"); b.Property("NickName") .HasColumnType("nvarchar(max)"); b.Property("NormalizedEmail") .HasMaxLength(256) .HasColumnType("nvarchar(256)"); b.Property("NormalizedUserName") .HasMaxLength(256) .HasColumnType("nvarchar(256)"); b.Property("PasswordHash") .HasColumnType("nvarchar(max)"); b.Property("PhoneNumber") .HasColumnType("nvarchar(max)"); b.Property("PhoneNumberConfirmed") .HasColumnType("bit"); b.Property("Position") .HasColumnType("nvarchar(max)"); b.Property("SecurityStamp") .HasColumnType("nvarchar(max)"); b.Property("TwoFactorEnabled") .HasColumnType("bit"); b.Property("UserName") .HasMaxLength(256) .HasColumnType("nvarchar(256)"); b.HasKey("Id"); b.HasIndex("NormalizedEmail") .HasDatabaseName("EmailIndex"); b.HasIndex("NormalizedUserName") .IsUnique() .HasDatabaseName("UserNameIndex") .HasFilter("[NormalizedUserName] IS NOT NULL"); b.ToTable("AspNetUsers", (string)null); }); modelBuilder.Entity("AdminLTE.Models.UserAudit", b => { b.Property("UserAuditId") .ValueGeneratedOnAdd() .HasColumnType("int"); SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("UserAuditId")); b.Property("AuditEvent") .HasColumnType("int"); b.Property("IpAddress") .HasColumnType("nvarchar(max)"); b.Property("Timestamp") .HasColumnType("datetimeoffset"); b.Property("UserId") .IsRequired() .HasColumnType("nvarchar(max)"); b.HasKey("UserAuditId"); b.ToTable("UserAuditEvents"); }); modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRole", b => { b.Property("Id") .HasColumnType("nvarchar(450)"); b.Property("ConcurrencyStamp") .IsConcurrencyToken() .HasColumnType("nvarchar(max)"); b.Property("Name") .HasMaxLength(256) .HasColumnType("nvarchar(256)"); b.Property("NormalizedName") .HasMaxLength(256) .HasColumnType("nvarchar(256)"); b.HasKey("Id"); b.HasIndex("NormalizedName") .IsUnique() .HasDatabaseName("RoleNameIndex") .HasFilter("[NormalizedName] IS NOT NULL"); b.ToTable("AspNetRoles", (string)null); }); modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => { b.Property("Id") .ValueGeneratedOnAdd() .HasColumnType("int"); SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); b.Property("ClaimType") .HasColumnType("nvarchar(max)"); b.Property("ClaimValue") .HasColumnType("nvarchar(max)"); b.Property("RoleId") .IsRequired() .HasColumnType("nvarchar(450)"); b.HasKey("Id"); b.HasIndex("RoleId"); b.ToTable("AspNetRoleClaims", (string)null); }); modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => { b.Property("Id") .ValueGeneratedOnAdd() .HasColumnType("int"); SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); b.Property("ClaimType") .HasColumnType("nvarchar(max)"); b.Property("ClaimValue") .HasColumnType("nvarchar(max)"); b.Property("UserId") .IsRequired() .HasColumnType("nvarchar(450)"); b.HasKey("Id"); b.HasIndex("UserId"); b.ToTable("AspNetUserClaims", (string)null); }); modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => { b.Property("LoginProvider") .HasColumnType("nvarchar(450)"); b.Property("ProviderKey") .HasColumnType("nvarchar(450)"); b.Property("ProviderDisplayName") .HasColumnType("nvarchar(max)"); b.Property("UserId") .IsRequired() .HasColumnType("nvarchar(450)"); b.HasKey("LoginProvider", "ProviderKey"); b.HasIndex("UserId"); b.ToTable("AspNetUserLogins", (string)null); }); modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b => { b.Property("UserId") .HasColumnType("nvarchar(450)"); b.Property("RoleId") .HasColumnType("nvarchar(450)"); b.HasKey("UserId", "RoleId"); b.HasIndex("RoleId"); b.ToTable("AspNetUserRoles", (string)null); }); modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => { b.Property("UserId") .HasColumnType("nvarchar(450)"); b.Property("LoginProvider") .HasColumnType("nvarchar(450)"); b.Property("Name") .HasColumnType("nvarchar(450)"); b.Property("Value") .HasColumnType("nvarchar(max)"); b.HasKey("UserId", "LoginProvider", "Name"); b.ToTable("AspNetUserTokens", (string)null); }); modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => { b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole", null) .WithMany() .HasForeignKey("RoleId") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); }); modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => { b.HasOne("AdminLTE.Models.ApplicationUser", null) .WithMany() .HasForeignKey("UserId") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); }); modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => { b.HasOne("AdminLTE.Models.ApplicationUser", null) .WithMany() .HasForeignKey("UserId") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); }); modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b => { b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole", null) .WithMany() .HasForeignKey("RoleId") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); b.HasOne("AdminLTE.Models.ApplicationUser", null) .WithMany() .HasForeignKey("UserId") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); }); modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => { b.HasOne("AdminLTE.Models.ApplicationUser", null) .WithMany() .HasForeignKey("UserId") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); }); #pragma warning restore 612, 618 } } } ================================================ FILE: src/AdminLTE/Models/AccountViewModels/ExternalLoginConfirmationViewModel.cs ================================================ using System.ComponentModel.DataAnnotations; namespace AdminLTE.Models.AccountViewModels { public class ExternalLoginConfirmationViewModel { [Required] [EmailAddress] public string Email { get; set; } } } ================================================ FILE: src/AdminLTE/Models/AccountViewModels/ForgotPasswordViewModel.cs ================================================ using System.ComponentModel.DataAnnotations; namespace AdminLTE.Models.AccountViewModels { public class ForgotPasswordViewModel { [Required] [EmailAddress] public string Email { get; set; } } } ================================================ FILE: src/AdminLTE/Models/AccountViewModels/LoginViewModel.cs ================================================ using System.ComponentModel.DataAnnotations; namespace AdminLTE.Models.AccountViewModels { public class LoginViewModel { [Required] [EmailAddress] public string Email { get; set; } [Required] [DataType(DataType.Password)] public string Password { get; set; } [Display(Name = "Remember Me")] public bool RememberMe { get; set; } } } ================================================ FILE: src/AdminLTE/Models/AccountViewModels/RegisterViewModel.cs ================================================ using System.ComponentModel.DataAnnotations; namespace AdminLTE.Models.AccountViewModels { public class RegisterViewModel { [Required] [EmailAddress] [Display(Name = "Email")] public string Email { get; set; } [Required] [StringLength(100, ErrorMessage = "The {0} must be at least {2} and at max {1} characters long.", MinimumLength = 6)] [DataType(DataType.Password)] [Display(Name = "Password")] public string Password { get; set; } [DataType(DataType.Password)] [Display(Name = "Confirm password")] [Compare("Password", ErrorMessage = "The password and confirmation password do not match.")] public string ConfirmPassword { get; set; } [Required] [Display(Name = "FirstName")] public string FirstName { get; set; } [Required] [Display(Name = "LastName")] public string LastName { get; set; } } } ================================================ FILE: src/AdminLTE/Models/AccountViewModels/ResetPasswordViewModel.cs ================================================ using System.ComponentModel.DataAnnotations; namespace AdminLTE.Models.AccountViewModels { public class ResetPasswordViewModel { [Required] [EmailAddress] public string Email { get; set; } [Required] [StringLength(100, ErrorMessage = "The {0} must be at least {2} and at max {1} characters long.", MinimumLength = 6)] [DataType(DataType.Password)] public string Password { get; set; } [DataType(DataType.Password)] [Display(Name = "Confirm password")] [Compare("Password", ErrorMessage = "The password and confirmation password do not match.")] public string ConfirmPassword { get; set; } public string Code { get; set; } } } ================================================ FILE: src/AdminLTE/Models/AccountViewModels/SendCodeViewModel.cs ================================================ using System.Collections.Generic; using Microsoft.AspNetCore.Mvc.Rendering; namespace AdminLTE.Models.AccountViewModels { public class SendCodeViewModel { public string SelectedProvider { get; set; } public ICollection Providers { get; set; } public string ReturnUrl { get; set; } public bool RememberMe { get; set; } } } ================================================ FILE: src/AdminLTE/Models/AccountViewModels/VerifyCodeViewModel.cs ================================================ using System.ComponentModel.DataAnnotations; namespace AdminLTE.Models.AccountViewModels { public class VerifyCodeViewModel { [Required] public string Provider { get; set; } [Required] public string Code { get; set; } public string ReturnUrl { get; set; } [Display(Name = "Remember this browser?")] public bool RememberBrowser { get; set; } [Display(Name = "Remember me?")] public bool RememberMe { get; set; } } } ================================================ FILE: src/AdminLTE/Models/ApplicationUser.cs ================================================ using Microsoft.AspNetCore.Identity; using System; namespace AdminLTE.Models { // Add profile data for application users by adding properties to the ApplicationUser class public class ApplicationUser : IdentityUser { public string FirstName { get; set; } public string LastName { get; set; } public string AvatarURL { get; set; } public string DateRegistered { get; set; } public string Position { get; set; } public string NickName { get; set; } } } ================================================ FILE: src/AdminLTE/Models/ManageViewModels/AddPhoneNumberViewModel.cs ================================================ using System.ComponentModel.DataAnnotations; namespace AdminLTE.Models.ManageViewModels { public class AddPhoneNumberViewModel { [Required] [Phone] [Display(Name = "Phone number")] public string PhoneNumber { get; set; } } } ================================================ FILE: src/AdminLTE/Models/ManageViewModels/ChangePasswordViewModel.cs ================================================ using System.ComponentModel.DataAnnotations; namespace AdminLTE.Models.ManageViewModels { public class ChangePasswordViewModel { [Required] [DataType(DataType.Password)] [Display(Name = "Current password")] public string OldPassword { get; set; } [Required] [StringLength(100, ErrorMessage = "The {0} must be at least {2} and at max {1} characters long.", MinimumLength = 6)] [DataType(DataType.Password)] [Display(Name = "New password")] public string NewPassword { get; set; } [DataType(DataType.Password)] [Display(Name = "Confirm new password")] [Compare("NewPassword", ErrorMessage = "The new password and confirmation password do not match.")] public string ConfirmPassword { get; set; } } } ================================================ FILE: src/AdminLTE/Models/ManageViewModels/ConfigureTwoFactorViewModel.cs ================================================ using System.Collections.Generic; using Microsoft.AspNetCore.Mvc.Rendering; namespace AdminLTE.Models.ManageViewModels { public class ConfigureTwoFactorViewModel { public string SelectedProvider { get; set; } public ICollection Providers { get; set; } } } ================================================ FILE: src/AdminLTE/Models/ManageViewModels/FactorViewModel.cs ================================================ namespace AdminLTE.Models.ManageViewModels { public class FactorViewModel { public string Purpose { get; set; } } } ================================================ FILE: src/AdminLTE/Models/ManageViewModels/IndexViewModel.cs ================================================ using System.Collections.Generic; using Microsoft.AspNetCore.Identity; namespace AdminLTE.Models.ManageViewModels { public class IndexViewModel { public bool HasPassword { get; set; } public IList Logins { get; set; } public string PhoneNumber { get; set; } public bool TwoFactor { get; set; } public bool BrowserRemembered { get; set; } } } ================================================ FILE: src/AdminLTE/Models/ManageViewModels/ManageLoginsViewModel.cs ================================================ using System.Collections.Generic; using Microsoft.AspNetCore.Authentication; using Microsoft.AspNetCore.Identity; namespace AdminLTE.Models.ManageViewModels { public class ManageLoginsViewModel { public IList CurrentLogins { get; set; } public IList OtherLogins { get; set; } } } ================================================ FILE: src/AdminLTE/Models/ManageViewModels/RemoveLoginViewModel.cs ================================================ namespace AdminLTE.Models.ManageViewModels { public class RemoveLoginViewModel { public string LoginProvider { get; set; } public string ProviderKey { get; set; } } } ================================================ FILE: src/AdminLTE/Models/ManageViewModels/SetPasswordViewModel.cs ================================================ using System.ComponentModel.DataAnnotations; namespace AdminLTE.Models.ManageViewModels { public class SetPasswordViewModel { [Required] [StringLength(100, ErrorMessage = "The {0} must be at least {2} and at max {1} characters long.", MinimumLength = 6)] [DataType(DataType.Password)] [Display(Name = "New password")] public string NewPassword { get; set; } [DataType(DataType.Password)] [Display(Name = "Confirm new password")] [Compare("NewPassword", ErrorMessage = "The new password and confirmation password do not match.")] public string ConfirmPassword { get; set; } } } ================================================ FILE: src/AdminLTE/Models/ManageViewModels/VerifyPhoneNumberViewModel.cs ================================================ using System.ComponentModel.DataAnnotations; namespace AdminLTE.Models.ManageViewModels { public class VerifyPhoneNumberViewModel { [Required] public string Code { get; set; } [Required] [Phone] [Display(Name = "Phone number")] public string PhoneNumber { get; set; } } } ================================================ FILE: src/AdminLTE/Models/Message.cs ================================================ using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; namespace AdminLTE.Models { public class Message { public int Id { get; set; } public string UserId { get; set; } public string DisplayName { get; set; } public string FontAwesomeIcon { get; set; } public string AvatarURL { get; set; } public string URLPath { get; set; } public string ShortDesc { get; set; } public string TimeSpan { get; set; } public int Percentage { get; set; } public string Type { get; set; } } } ================================================ FILE: src/AdminLTE/Models/RoleViewModels/EditRoleVm.cs ================================================ using Microsoft.AspNetCore.Identity; using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; namespace AdminLTE.Models.RoleViewModels { public class EditRoleVm { public IdentityRole Role { get; set; } public IEnumerable Members { get; set; } public IEnumerable NonMembers { get; set; } } } ================================================ FILE: src/AdminLTE/Models/RoleViewModels/ModifyRoleVm.cs ================================================ using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.Linq; using System.Threading.Tasks; namespace AdminLTE.Models.RoleViewModels { public class ModifyRoleVm { [Required] public string RoleName { get; set; } public string RoleId { get; set; } public string[] IdsToAdd { get; set; } public string[] IdsToRemove { get; set; } } } ================================================ FILE: src/AdminLTE/Models/SalesOrderDetail.cs ================================================ using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace AdminLTE.Models { public class SalesOrderDetail { public int sr { get; set; } public string ordertracknumber { get; set; } public int quantity { get; set; } public string productname { get; set; } public string specialoffer { get; set; } public double unitprice { get; set; } public double unitpricediscount { get; set; } } } ================================================ FILE: src/AdminLTE/Models/SidebarMenu.cs ================================================ using System; using System.Collections.Generic; namespace AdminLTE.Models { public class SidebarMenu { public SidebarMenuType Type { get; set; } public bool IsActive { get; set; } = false; public string Name { get; set; } public string IconClassName { get; set; } public string URLPath { get; set; } public List TreeChild { get; set; } public Tuple LinkCounter { get; set; } } public enum SidebarMenuType { Header, Link, Tree } } ================================================ FILE: src/AdminLTE/Models/SuperAdminViewModels/CreateVm.cs ================================================ using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.Linq; using System.Threading.Tasks; namespace AdminLTE.Models.SuperAdminViewModels { public class CreateVm { [Required] [EmailAddress] [Display(Name = "Email")] public string Email { get; set; } [Required] [StringLength(100, ErrorMessage = "The {0} must be at least {2} and at max {1} characters long.", MinimumLength = 6)] [DataType(DataType.Password)] [Display(Name = "Password")] public string Password { get; set; } [DataType(DataType.Password)] [Display(Name = "Confirm password")] [Compare("Password", ErrorMessage = "The password and confirmation password do not match.")] public string ConfirmPassword { get; set; } [Required] [Display(Name = "FirstName")] public string FirstName { get; set; } [Required] [Display(Name = "LastName")] public string LastName { get; set; } } } ================================================ FILE: src/AdminLTE/Models/UserAudit.cs ================================================ using System; using System.ComponentModel.DataAnnotations; namespace AdminLTE.Models { public class UserAudit { [Key] public int UserAuditId { get; private set; } [Required] public string UserId { get; private set; } [Required] public DateTimeOffset Timestamp { get; private set; } = DateTime.UtcNow; [Required] public UserAuditEventType AuditEvent { get; set; } public string IpAddress { get; private set; } public static UserAudit CreateAuditEvent(string userId, UserAuditEventType auditEventType, string ipAddress) { return new UserAudit { UserId = userId, AuditEvent = auditEventType, IpAddress = ipAddress }; } } public enum UserAuditEventType { Login = 1, FailedLogin = 2, LogOut = 3 } } ================================================ FILE: src/AdminLTE/Program.cs ================================================ using AdminLTE.Data; using AdminLTE.Models; using AdminLTE.Services; using Microsoft.AspNetCore.Authentication.Cookies; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Identity; using Microsoft.AspNetCore.Mvc.Authorization; using Microsoft.EntityFrameworkCore; using System; var builder = WebApplication.CreateBuilder(args); // Add services to the container. var connectionString = builder.Configuration.GetConnectionString("DefaultConnection") ?? throw new InvalidOperationException("Connection string 'DefaultConnection' not found."); builder.Services.AddDbContext(options => options.UseSqlServer(connectionString)); builder.Services.AddDatabaseDeveloperPageExceptionFilter(); builder.Services.AddIdentity() .AddEntityFrameworkStores() .AddDefaultTokenProviders(); builder.Services.AddControllersWithViews(); builder.Services.AddScoped, AppClaimsPrincipalFactory>(); builder.Services.AddScoped, AuditableSignInManager>(); var mvcBuilder = builder.Services.AddMvc(config => { var policy = new AuthorizationPolicyBuilder() .RequireAuthenticatedUser() .Build(); config.Filters.Add(new AuthorizeFilter(policy)); }); builder.Services.Configure(options => { options.LoginPath = new PathString("/Account/Login"); }); // Add application services. builder.Services.AddTransient(); builder.Services.AddTransient(); builder.Services.AddControllersWithViews().AddRazorRuntimeCompilation(); var app = builder.Build(); // Configure the HTTP request pipeline. if (app.Environment.IsDevelopment()) { app.UseDeveloperExceptionPage(); app.UseMigrationsEndPoint(); } else { app.UseExceptionHandler("/Home/Error"); // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts. app.UseHsts(); } app.UseStatusCodePagesWithRedirects("~/Home/Error/{0}"); app.UseHttpsRedirection(); app.UseStaticFiles(); app.UseRouting(); app.UseAuthentication(); app.UseAuthorization(); //Add middleware here app.UseMiddleware(); app.MapControllerRoute( name: "default", pattern: "{controller=Home}/{action=Index}/{id?}"); app.MapRazorPages(); // Populate default user admin DataSeed.Seed(app.Services).Wait(); app.Run(); ================================================ FILE: src/AdminLTE/Project_Readme.html ================================================  Welcome to ASP.NET Core ================================================ FILE: src/AdminLTE/Properties/launchSettings.json ================================================ { "iisSettings": { "windowsAuthentication": false, "anonymousAuthentication": true, "iisExpress": { "applicationUrl": "http://localhost:9889/", "sslPort": 0 } }, "profiles": { "IIS Express": { "commandName": "IISExpress", "launchBrowser": true, "environmentVariables": { "ASPNETCORE_ENVIRONMENT": "Development" } }, "AdminLTE": { "commandName": "Project", "launchBrowser": true, "launchUrl": "https://localhost:5001", "environmentVariables": { "ASPNETCORE_ENVIRONMENT": "Development" }, "applicationUrl": "https://localhost:5001;http://localhost:5000" } } } ================================================ FILE: src/AdminLTE/Services/IEmailSender.cs ================================================ using System.Threading.Tasks; namespace AdminLTE.Services { public interface IEmailSender { Task SendEmailAsync(string email, string subject, string message); } } ================================================ FILE: src/AdminLTE/Services/ISmsSender.cs ================================================ using System.Threading.Tasks; namespace AdminLTE.Services { public interface ISmsSender { Task SendSmsAsync(string number, string message); } } ================================================ FILE: src/AdminLTE/Services/MessageServices.cs ================================================ using System.Threading.Tasks; namespace AdminLTE.Services { // This class is used by the application to send Email and SMS // when you turn on two-factor authentication in ASP.NET Identity. // For more details see this link http://go.microsoft.com/fwlink/?LinkID=532713 public class AuthMessageSender : IEmailSender, ISmsSender { public Task SendEmailAsync(string email, string subject, string message) { // Plug in your email service here to send an email. return Task.FromResult(0); } public Task SendSmsAsync(string number, string message) { // Plug in your SMS service here to send a text message. return Task.FromResult(0); } } } ================================================ FILE: src/AdminLTE/Services/RequestLoggingMiddleware.cs ================================================ using Microsoft.AspNetCore.Http; using Microsoft.Extensions.Logging; using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Threading.Tasks; namespace AdminLTE.Services { public class RequestLoggingMiddleware { private readonly RequestDelegate _next; private readonly ILogger _logger; public RequestLoggingMiddleware(RequestDelegate next, ILogger logger) { _next = next; _logger = logger; } public async Task Invoke(HttpContext context) { var startTime = DateTime.UtcNow; var watch = Stopwatch.StartNew(); await _next.Invoke(context); watch.Stop(); var logTemplate = @"Client IP: {clientIP} Request path: {requestPath} Request content type: {requestContentType} Request content length: {requestContentLength} Start time: {startTime} Duration: {duration}"; _logger.LogInformation(logTemplate, context.Connection.RemoteIpAddress.ToString(), context.Request.Path, context.Request.ContentType, context.Request.ContentLength, startTime, watch.ElapsedMilliseconds); } } } ================================================ FILE: src/AdminLTE/ViewComponents/BreadcrumbViewComponent.cs ================================================ using AdminLTE.Models; using Microsoft.AspNetCore.Mvc; using System.Collections.Generic; namespace AdminLTE.ViewComponents { public class BreadcrumbViewComponent : ViewComponent { public BreadcrumbViewComponent() { } public IViewComponentResult Invoke(string filter) { if (ViewBag.Breadcrumb == null) { ViewBag.Breadcrumb = new List(); } return View(ViewBag.Breadcrumb as List); } } } ================================================ FILE: src/AdminLTE/ViewComponents/ControlSidebarViewComponent.cs ================================================ using Microsoft.AspNetCore.Mvc; using System; using System.Diagnostics; using System.IO; namespace AdminLTE.ViewComponents { public class ControlSidebarViewComponent : ViewComponent { public ControlSidebarViewComponent() { } public IViewComponentResult Invoke(string filter) { if (string.IsNullOrEmpty(ViewBag.PageHelpFileName)) { return View(string.Empty); } ViewBag.PageHelpContainer = LoadData(ViewBag.PageHelpFileName); return View(); } private string LoadData(string filepath) { var basePath = Directory.GetCurrentDirectory() + @"\wwwroot\files\"; var baseExtension = @".html"; var absoluteFilePath = basePath + filepath + baseExtension; string result = string.Empty; try { if (!File.Exists(absoluteFilePath)) { return string.Empty; } using (StreamReader sr = new StreamReader(new FileStream(absoluteFilePath, FileMode.Open, FileAccess.Read))) { result = sr.ReadToEnd(); } } catch (FileNotFoundException fex) { Debug.Write(fex); return string.Empty; } catch (Exception ex) { Debug.Write(ex); return string.Empty; } return result; } //private List LoadData(string filename) //{ // var result = new List(); // try // { // using (StreamReader sr = new StreamReader(new FileStream(Directory.GetCurrentDirectory() + $"\\wwwroot\\files\\{filename}", FileMode.Open, FileAccess.Read))) // { // var line = string.Empty; // while ((line = sr.ReadLine()) != null) // { // // Adding. // result.Add(line); // } // return result; // } // } // catch (Exception ex) // { // Debug.Write(ex); // } // return result; //} } } ================================================ FILE: src/AdminLTE/ViewComponents/FooterViewComponent.cs ================================================ using Microsoft.AspNetCore.Mvc; namespace AdminLTE.ViewComponents { public class FooterViewComponent : ViewComponent { public FooterViewComponent() { } public IViewComponentResult Invoke(string filter) { return View(); } } } ================================================ FILE: src/AdminLTE/ViewComponents/HeaderViewComponent.cs ================================================ using Microsoft.AspNetCore.Mvc; namespace AdminLTE.ViewComponents { public class HeaderViewComponent : ViewComponent { public HeaderViewComponent() { } public IViewComponentResult Invoke(string filter) { return View(); } } } ================================================ FILE: src/AdminLTE/ViewComponents/MenuMessageViewComponent.cs ================================================ using AdminLTE.Models; using Microsoft.AspNetCore.Mvc; using System.Collections.Generic; using System.Security.Claims; using AdminLTE.Common.Extensions; using AdminLTE.Common; namespace AdminLTE.ViewComponents { public class MenuMessageViewComponent : ViewComponent { public MenuMessageViewComponent() { } public IViewComponentResult Invoke(string filter) { var messages = GetData(); return View(messages); } private List GetData() { var messages = new List(); messages.Add(new Message { Id = 1, UserId = ((ClaimsPrincipal)User).GetUserProperty(CustomClaimTypes.NameIdentifier), DisplayName = "Support Team", AvatarURL = "/images/user.png", ShortDesc = "Why not buy a new awesome theme?", TimeSpan = "5 mins", URLPath = "#", }); messages.Add(new Message { Id = 1, UserId = ((ClaimsPrincipal)User).GetUserProperty(CustomClaimTypes.NameIdentifier), DisplayName = "Ken", AvatarURL = "/images/user.png", ShortDesc = "For approval", TimeSpan = "15 mins", URLPath = "#", }); return messages; } } } ================================================ FILE: src/AdminLTE/ViewComponents/MenuNotificationViewComponent.cs ================================================ using AdminLTE.Models; using Microsoft.AspNetCore.Mvc; using System.Collections.Generic; namespace AdminLTE.ViewComponents { public class MenuNotificationViewComponent : ViewComponent { public MenuNotificationViewComponent() { } public IViewComponentResult Invoke(string filter) { var messages = GetData(); return View(messages); } private List GetData() { var messages = new List(); messages.Add(new Message { Id = 1, FontAwesomeIcon = "bi bi-people-fill text-aqua", ShortDesc = "5 new members joined today", URLPath = "#", }); return messages; } } } ================================================ FILE: src/AdminLTE/ViewComponents/MenuTaskViewComponent.cs ================================================ using AdminLTE.Models; using Microsoft.AspNetCore.Mvc; using System.Collections.Generic; namespace AdminLTE.ViewComponents { public class MenuTaskViewComponent : ViewComponent { public MenuTaskViewComponent() { } public IViewComponentResult Invoke(string filter) { var messages = GetData(); return View(messages); } private List GetData() { var messages = new List(); messages.Add(new Message { Id = 1, ShortDesc = "Design some buttons", URLPath = "#", Percentage = 20, }); return messages; } } } ================================================ FILE: src/AdminLTE/ViewComponents/MenuUserViewComponent.cs ================================================ using AdminLTE.Models; using Microsoft.AspNetCore.Mvc; using System.Collections.Generic; namespace AdminLTE.ViewComponents { public class MenuUserViewComponent : ViewComponent { public MenuUserViewComponent() { } public IViewComponentResult Invoke(string filter) { return View(); } } } ================================================ FILE: src/AdminLTE/ViewComponents/PageAlertViewComponent.cs ================================================ using AdminLTE.Models; using Microsoft.AspNetCore.Mvc; using System; using System.Collections.Generic; namespace AdminLTE.ViewComponents { public class PageAlertViewComponent : ViewComponent { public PageAlertViewComponent() { } public IViewComponentResult Invoke(string filter) { List messages; if (ViewBag.PageAlerts == null) { messages = new List(); } else { messages = new List(ViewBag.PageAlerts); } return View(messages); } } } ================================================ FILE: src/AdminLTE/ViewComponents/PageHeaderViewComponent.cs ================================================ using Microsoft.AspNetCore.Mvc; using System; namespace AdminLTE.ViewComponents { public class PageHeaderViewComponent : ViewComponent { public PageHeaderViewComponent() { } public IViewComponentResult Invoke(string filter) { Tuple message; if (ViewBag.PageHeader == null) { message = Tuple.Create(string.Empty, string.Empty); } else { message = ViewBag.PageHeader as Tuple; } return View(message); } } } ================================================ FILE: src/AdminLTE/ViewComponents/SidebarViewComponent.cs ================================================ using System.Collections.Generic; using System.Linq; using Microsoft.AspNetCore.Mvc; using AdminLTE.Common; using AdminLTE.Models; using System.Security.Claims; using AdminLTE.Common.Extensions; using System; namespace AdminLTE.ViewComponents { public class SidebarViewComponent : ViewComponent { public SidebarViewComponent() { } public IViewComponentResult Invoke(string filter) { //you can do the access rights checking here by using session, user, and/or filter parameter var sidebars = new List(); //if (((ClaimsPrincipal)User).GetUserProperty("AccessProfile").Contains("VES_008, Payroll")) //{ //} sidebars.Add(ModuleHelper.AddHeader("MAIN NAVIGATION")); sidebars.Add(ModuleHelper.AddModule(ModuleHelper.Module.Home)); sidebars.Add(ModuleHelper.AddModule(ModuleHelper.Module.Error, Tuple.Create(0, 0, 1))); sidebars.Add(ModuleHelper.AddModule(ModuleHelper.Module.About, Tuple.Create(0, 1, 0))); sidebars.Add(ModuleHelper.AddModule(ModuleHelper.Module.Contact, Tuple.Create(1, 0, 0))); sidebars.Add(ModuleHelper.AddTree("Account")); sidebars.Last().TreeChild = new List() { ModuleHelper.AddModule(ModuleHelper.Module.Login), ModuleHelper.AddModule(ModuleHelper.Module.Register, Tuple.Create(1, 1, 1)), }; if (User.IsInRole("SuperAdmins")) { sidebars.Add(ModuleHelper.AddTree("Administration")); sidebars.Last().TreeChild = new List() { ModuleHelper.AddModule(ModuleHelper.Module.SuperAdmin), ModuleHelper.AddModule(ModuleHelper.Module.Role), }; sidebars.Add(ModuleHelper.AddModule(ModuleHelper.Module.UserLogs)); } return View(sidebars); } } } ================================================ FILE: src/AdminLTE/Views/Account/ConfirmEmail.cshtml ================================================ @{ ViewData["Title"] = "Confirm Email"; }

@ViewData["Title"].

Thank you for confirming your email. Please Click here to Log in.

================================================ FILE: src/AdminLTE/Views/Account/ExternalLoginConfirmation.cshtml ================================================ @model ExternalLoginConfirmationViewModel @{ ViewData["Title"] = "Register"; }

@ViewData["Title"].

Associate your @ViewData["LoginProvider"] account.

Association Form


You've successfully authenticated with @ViewData["LoginProvider"]. Please enter an email address for this site below and click the Register button to finish logging in.

@section Scripts { @{ await Html.RenderPartialAsync("_ValidationScriptsPartial"); } } ================================================ FILE: src/AdminLTE/Views/Account/ExternalLoginFailure.cshtml ================================================ @{ ViewData["Title"] = "Login Failure"; }

@ViewData["Title"].

Unsuccessful login with service.

================================================ FILE: src/AdminLTE/Views/Account/ForgotPassword.cshtml ================================================ @model ForgotPasswordViewModel @{ ViewData["Title"] = "Forgot your password?"; }

@ViewData["Title"]

For more information on how to enable reset password please see this article.

@*

Enter your email.


*@ @section Scripts { @{ await Html.RenderPartialAsync("_ValidationScriptsPartial"); } } ================================================ FILE: src/AdminLTE/Views/Account/ForgotPasswordConfirmation.cshtml ================================================ @{ ViewData["Title"] = "Forgot Password Confirmation"; }

@ViewData["Title"].

Please check your email to reset your password.

================================================ FILE: src/AdminLTE/Views/Account/Lockout.cshtml ================================================ @{ ViewData["Title"] = "Locked out"; }

Locked out.

This account has been locked out, please try again later.

================================================ FILE: src/AdminLTE/Views/Account/Login.cshtml ================================================ @using System.Collections.Generic @using Microsoft.AspNetCore.Http @model LoginViewModel @inject SignInManager SignInManager @{ ViewData["Title"] = "Log in"; Layout = ""; } AdminLTE 4 | Login Page @section Scripts { @{ await Html.RenderPartialAsync("_ValidationScriptsPartial"); } } ================================================ FILE: src/AdminLTE/Views/Account/Register.cshtml ================================================ @model RegisterViewModel @{ ViewData["Title"] = "Register"; Layout = ""; } AdminLTE 4 | Registration Page
I already have a membership
@section Scripts { @{ await Html.RenderPartialAsync("_ValidationScriptsPartial"); } } ================================================ FILE: src/AdminLTE/Views/Account/ResetPassword.cshtml ================================================ @model ResetPasswordViewModel @{ ViewData["Title"] = "Reset password"; }

@ViewData["Title"].

Reset your password.


@section Scripts { @{ await Html.RenderPartialAsync("_ValidationScriptsPartial"); } } ================================================ FILE: src/AdminLTE/Views/Account/ResetPasswordConfirmation.cshtml ================================================ @{ ViewData["Title"] = "Reset password confirmation"; }

@ViewData["Title"].

Your password has been reset. Please Click here to log in.

================================================ FILE: src/AdminLTE/Views/Account/SendCode.cshtml ================================================ @model SendCodeViewModel @{ ViewData["Title"] = "Send Verification Code"; }

@ViewData["Title"].

Select Two-Factor Authentication Provider:
@section Scripts { @{await Html.RenderPartialAsync("_ValidationScriptsPartial"); } } ================================================ FILE: src/AdminLTE/Views/Account/VerifyCode.cshtml ================================================ @model VerifyCodeViewModel @{ ViewData["Title"] = "Verify"; }

@ViewData["Title"].

@ViewData["Status"]


@section Scripts { @{ await Html.RenderPartialAsync("_ValidationScriptsPartial"); } } ================================================ FILE: src/AdminLTE/Views/Home/About.cshtml ================================================ @{ ViewData["Title"] = "About"; }

@ViewData["Title"].

@ViewData["Message"]

Use this area to provide additional information.

================================================ FILE: src/AdminLTE/Views/Home/Contact.cshtml ================================================ @{ ViewData["Title"] = "Contact"; }

@ViewData["Title"].

@ViewData["Message"]

One Microsoft Way
Redmond, WA 98052-6399
P: 425.555.0100
Support: Support@example.com
Marketing: Marketing@example.com
================================================ FILE: src/AdminLTE/Views/Home/Error.cshtml ================================================ @{ Layout = ""; } AdminLTE
404
Page not found
Unfortunately we're having trouble loading the page you are looking for. Please verify if you have the right permission and try again or use action below.
© All Rights Reserved AdminLTE @DateTime.Now.Year
================================================ FILE: src/AdminLTE/Views/Home/Index.cshtml ================================================ 
Sr Order Track Number Quantity Product Name Special Offer Unit Price Unit Price Discount Options
================================================ FILE: src/AdminLTE/Views/Manage/AddPhoneNumber.cshtml ================================================ @model AddPhoneNumberViewModel @{ ViewData["Title"] = "Add Phone Number"; }

@ViewData["Title"].

Add a phone number.


@section Scripts { @{ await Html.RenderPartialAsync("_ValidationScriptsPartial"); } } ================================================ FILE: src/AdminLTE/Views/Manage/ChangePassword.cshtml ================================================ @model ChangePasswordViewModel @{ ViewData["Title"] = "Change Password"; }

@ViewData["Title"].

Change Password Form


@section Scripts { @{ await Html.RenderPartialAsync("_ValidationScriptsPartial"); } } ================================================ FILE: src/AdminLTE/Views/Manage/Index.cshtml ================================================ @model IndexViewModel @{ ViewData["Title"] = "Manage your account"; }

@ViewData["Title"].

@ViewData["StatusMessage"]

Change your account settings


Password:
@if (Model.HasPassword) { Change } else { Create }
External Logins:
@Model.Logins.Count Manage
Phone Number:

Phone Numbers can used as a second factor of verification in two-factor authentication. See this article for details on setting up this ASP.NET application to support two-factor authentication using SMS.

@*@(Model.PhoneNumber ?? "None") @if (Model.PhoneNumber != null) {
Change
[]
} else { Add }*@
Two-Factor Authentication:

There are no two-factor authentication providers configured. See this article for setting up this application to support two-factor authentication.

@*@if (Model.TwoFactor) {
Enabled
} else {
Disabled
}*@
================================================ FILE: src/AdminLTE/Views/Manage/ManageLogins.cshtml ================================================ @model ManageLoginsViewModel @{ ViewData["Title"] = "Manage your external logins"; }

@ViewData["Title"].

@ViewData["StatusMessage"]

@if (Model.CurrentLogins.Count > 0) {

Registered Logins

@for (var index = 0; index < Model.CurrentLogins.Count; index++) { }
@Model.CurrentLogins[index].LoginProvider @if ((bool)ViewData["ShowRemoveButton"]) {
} else { @:   }
} @if (Model.OtherLogins.Count > 0) {

Add another service to log in.


@foreach (var provider in Model.OtherLogins) { }

} ================================================ FILE: src/AdminLTE/Views/Manage/SetPassword.cshtml ================================================ @model SetPasswordViewModel @{ ViewData["Title"] = "Set Password"; }

You do not have a local username/password for this site. Add a local account so you can log in without an external login.

Set your password


@section Scripts { @{ await Html.RenderPartialAsync("_ValidationScriptsPartial"); } } ================================================ FILE: src/AdminLTE/Views/Manage/VerifyPhoneNumber.cshtml ================================================ @model VerifyPhoneNumberViewModel @{ ViewData["Title"] = "Verify Phone Number"; }

@ViewData["Title"].

Add a phone number.

@ViewData["Status"]

@section Scripts { @{ await Html.RenderPartialAsync("_ValidationScriptsPartial"); } } ================================================ FILE: src/AdminLTE/Views/Role/Create.cshtml ================================================ @model string @{ ViewData["Title"] = "Create Role"; }

@ViewData["Title"].

Cancel
================================================ FILE: src/AdminLTE/Views/Role/Edit.cshtml ================================================ @model AdminLTE.Models.RoleViewModels.EditRoleVm @{ ViewData["Title"] = "Edit Role"; }

@ViewData["Title"].

Add to @Model.Role.Name
@if (Model.NonMembers.Count() == 0) { } else { foreach (ApplicationUser user in Model.NonMembers) { } }
All Users Are @Model.Role.Name
@user.UserName
Remove from @Model.Role.Name
@if (Model.Members.Count() == 0) { } else { foreach (ApplicationUser user in Model.Members) { } }
No Users are @Model.Role.Name
@user.UserName
Cancel
================================================ FILE: src/AdminLTE/Views/Role/Index.cshtml ================================================  @model IEnumerable @{ ViewData["Title"] = "Roles"; }

@ViewData["Title"].

@if (Model.Count() == 0) { } else { foreach (var role in Model) { } }
ID Name Users
No roles
@role.Id @role.Name Edit Delete
Create Home ================================================ FILE: src/AdminLTE/Views/Shared/Components/Breadcrumb/Default.cshtml ================================================ @model IEnumerable ================================================ FILE: src/AdminLTE/Views/Shared/Components/ControlSidebar/Default.cshtml ================================================  ================================================ FILE: src/AdminLTE/Views/Shared/Components/Footer/Default.cshtml ================================================ 
Copyright © @DateTime.Now.Year Company. All rights reserved.
================================================ FILE: src/AdminLTE/Views/Shared/Components/Header/Default.cshtml ================================================  ================================================ FILE: src/AdminLTE/Views/Shared/Components/MenuMessage/Default.cshtml ================================================ @model IEnumerable ================================================ FILE: src/AdminLTE/Views/Shared/Components/MenuNotification/Default.cshtml ================================================ @model IEnumerable ================================================ FILE: src/AdminLTE/Views/Shared/Components/MenuTask/Default.cshtml ================================================  ================================================ FILE: src/AdminLTE/Views/Shared/Components/MenuUser/Default.cshtml ================================================ 
================================================ FILE: src/AdminLTE/Views/Shared/Components/PageAlert/Default.cshtml ================================================ @model IEnumerable @foreach (var item in Model) { if (item.Type == "error") {
Error! @Html.Raw(@item.ShortDesc)
} if (item.Type == "info") {
Info! @Html.Raw(@item.ShortDesc)
} if (item.Type == "warning") {
Warning! @Html.Raw(@item.ShortDesc)
} if (item.Type == "success") {
Success! @Html.Raw(@item.ShortDesc)
} } ================================================ FILE: src/AdminLTE/Views/Shared/Components/PageHeader/Default.cshtml ================================================ @model Tuple

@Model.Item1 @Model.Item2

================================================ FILE: src/AdminLTE/Views/Shared/Components/Sidebar/Default.cshtml ================================================ @model IEnumerable ================================================ FILE: src/AdminLTE/Views/Shared/Error.cshtml ================================================ @{ ViewData["Title"] = "Error"; }

Error.

An error occurred while processing your request.

Development Mode

Swapping to Development environment will display more detailed information about the error that occurred.

Development environment should not be enabled in deployed applications, as it can result in sensitive information from exceptions being displayed to end users. For local debugging, development environment can be enabled by setting the ASPNETCORE_ENVIRONMENT environment variable to Development, and restarting the application.

================================================ FILE: src/AdminLTE/Views/Shared/_Layout.cshtml ================================================  AdminLTE v4 | Starter
@await Component.InvokeAsync("Header") @await Component.InvokeAsync("Sidebar")
@await Component.InvokeAsync("PageHeader")
@await Component.InvokeAsync("Breadcrumb")

@await Component.InvokeAsync("PageAlert")
@RenderBody()
@await Component.InvokeAsync("Footer") @await Component.InvokeAsync("ControlSidebar")
@RenderSection("scripts", required: false) ================================================ FILE: src/AdminLTE/Views/Shared/_LoginPartial.cshtml ================================================ @using Microsoft.AspNetCore.Identity @using AdminLTE.Models @inject SignInManager SignInManager @inject UserManager UserManager @if (SignInManager.IsSignedIn(User)) { } else { } ================================================ FILE: src/AdminLTE/Views/Shared/_ValidationScriptsPartial.cshtml ================================================  ================================================ FILE: src/AdminLTE/Views/SuperAdmin/ChangePassword.cshtml ================================================ @model ApplicationUser @{ ViewData["Title"] = "Change Password"; }

@ViewData["Title"].

Cancel
================================================ FILE: src/AdminLTE/Views/SuperAdmin/Create.cshtml ================================================ @model AdminLTE.Models.SuperAdminViewModels.CreateVm @{ ViewData["Title"] = "Create User"; }

@ViewData["Title"].

Cancel
================================================ FILE: src/AdminLTE/Views/SuperAdmin/Edit.cshtml ================================================ @model ApplicationUser @{ ViewData["Title"] = "Edit User"; }

@ViewData["Title"].

Cancel
================================================ FILE: src/AdminLTE/Views/SuperAdmin/Index.cshtml ================================================  @model IEnumerable @{ ViewData["Title"] = "User Accounts"; }

@ViewData["Title"].

@if (Model.Count() == 0) { } else { foreach (ApplicationUser user in Model) { } }
ID Name Email
No User Accounts
@user.Id @user.UserName @user.Email Edit Change Password Delete
Create Home ================================================ FILE: src/AdminLTE/Views/UserLogs/Index.cshtml ================================================  @model System.Collections.Generic.IEnumerable @{ ViewData["Title"] = "User Logs"; }

@ViewData["Title"].


@foreach (var item in Model) { }
@Html.DisplayNameFor(model => model.UserAuditId) @Html.DisplayNameFor(model => model.UserId) @Html.DisplayNameFor(model => model.Timestamp) @Html.DisplayNameFor(model => model.AuditEvent) @Html.DisplayNameFor(model => model.IpAddress)
@Html.DisplayFor(modelItem => item.UserAuditId) @Html.DisplayFor(modelItem => item.UserId) @Html.DisplayFor(modelItem => item.Timestamp) @Html.DisplayFor(modelItem => item.AuditEvent) @Html.DisplayFor(modelItem => item.IpAddress)
================================================ FILE: src/AdminLTE/Views/_ViewImports.cshtml ================================================ @using AdminLTE @using AdminLTE.Models @using AdminLTE.Models.AccountViewModels @using AdminLTE.Models.ManageViewModels @using Microsoft.AspNetCore.Identity @addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers @using AdminLTE.Common.Extensions @using AdminLTE.Common ================================================ FILE: src/AdminLTE/Views/_ViewStart.cshtml ================================================ @{ Layout = "_Layout"; } ================================================ FILE: src/AdminLTE/appsettings.json ================================================ { "ConnectionStrings": { "DefaultConnection": "Server=(localdb)\\MSSQLLocalDB;Database=AdminLTECore-sample;Integrated Security=true;" }, "Logging": { "IncludeScopes": false, "LogLevel": { "Default": "Debug", "System": "Information", "Microsoft": "Information" } } } ================================================ FILE: src/AdminLTE/bundleconfig.json ================================================ // Configure bundling and minification for the project. // More info at https://go.microsoft.com/fwlink/?LinkId=808241 [ { "outputFileName": "wwwroot/css/site.min.css", // An array of relative input file paths. Globbing patterns supported "inputFiles": [ "wwwroot/css/site.css" ] }, { "outputFileName": "wwwroot/js/site.min.js", "inputFiles": [ "wwwroot/js/site.js" ], // Optionally specify minification options "minify": { "enabled": true, "renameLocals": true }, // Optinally generate .map file "sourceMap": false } ] ================================================ FILE: src/AdminLTE/libman.json ================================================ { "version": "1.0", "defaultProvider": "cdnjs", "libraries": [ { "library": "twitter-bootstrap@5.3.8", "destination": "wwwroot/lib/bootstrap/" }, { "library": "jquery@3.7.1", "destination": "wwwroot/lib/jquery/" }, { "library": "jquery-validate@1.21.0", "destination": "wwwroot/lib/jquery-validation/" }, { "library": "jquery-validation-unobtrusive@4.0.0", "destination": "wwwroot/lib/jquery-validation-unobtrusive/" }, { "library": "datatables.net@2.3.4", "destination": "wwwroot/lib/datatables/" }, { "library": "datatables.net-bs5@2.3.4", "destination": "wwwroot/lib/datatables-bs/" }, { "library": "pace@1.2.4", "destination": "wwwroot/lib/pace/" }, { "library": "fastclick@1.0.6", "destination": "wwwroot/lib/fastclick/" }, { "library": "bootstrap-icons@1.13.1", "destination": "wwwroot/lib/bootstrap-icons/" }, { "library": "icheck-bootstrap@3.0.1", "destination": "wwwroot/lib/icheck-bootstrap/" }, { "provider": "jsdelivr", "library": "admin-lte@4.0.0-rc6", "destination": "wwwroot/lib/admin-lte/", "files": [ "dist/css/adminlte.css", "dist/css/adminlte.css.map", "dist/css/adminlte.min.css", "dist/js/adminlte.js", "dist/js/adminlte.js.map", "dist/js/adminlte.min.js", "dist/js/adminlte.min.js.map", "dist/assets/img/AdminLTELogo.png" ] } ] } ================================================ FILE: src/AdminLTE/web.config ================================================  ================================================ FILE: src/AdminLTE/wwwroot/_references.js ================================================ /// /// /// /// /// /// /// /// /// /// ================================================ FILE: src/AdminLTE/wwwroot/css/animation.css ================================================ .animated{-webkit-animation-fill-mode:both;-moz-animation-fill-mode:both;-ms-animation-fill-mode:both;-o-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-duration:1s;-moz-animation-duration:1s;-ms-animation-duration:1s;-o-animation-duration:1s;animation-duration:1s;}.animated.hinge{-webkit-animation-duration:1s;-moz-animation-duration:1s;-ms-animation-duration:1s;-o-animation-duration:1s;animation-duration:1s;} @-webkit-keyframes fadeIn { 0% {opacity: 0;} 100% {opacity: 1;} } @-moz-keyframes fadeIn { 0% {opacity: 0;} 100% {opacity: 1;} } @-o-keyframes fadeIn { 0% {opacity: 0;} 100% {opacity: 1;} } @keyframes fadeIn { 0% {opacity: 0;} 100% {opacity: 1;} } .fadeIn { -webkit-animation-name: fadeIn; -moz-animation-name: fadeIn; -o-animation-name: fadeIn; animation-name: fadeIn; } @-webkit-keyframes fadeInUp { 0% { opacity: 0; -webkit-transform: translateY(60px); } 100% { opacity: 1; -webkit-transform: translateY(0); } } @-moz-keyframes fadeInUp { 0% { opacity: 0; -moz-transform: translateY(60px); } 100% { opacity: 1; -moz-transform: translateY(0); } } @-o-keyframes fadeInUp { 0% { opacity: 0; -o-transform: translateY(60px); } 100% { opacity: 1; -o-transform: translateY(0); } } @keyframes fadeInUp { 0% { opacity: 0; transform: translateY(60px); } 100% { opacity: 1; transform: translateY(0); } } .fadeInUp { -webkit-animation-name: fadeInUp; -moz-animation-name: fadeInUp; -o-animation-name: fadeInUp; animation-name: fadeInUp; } @-webkit-keyframes fadeInDown { 0% { opacity: 0; -webkit-transform: translateY(-40px); } 100% { opacity: 1; -webkit-transform: translateY(0); } } @-moz-keyframes fadeInDown { 0% { opacity: 0; -moz-transform: translateY(-40px); } 100% { opacity: 1; -moz-transform: translateY(0); } } @-o-keyframes fadeInDown { 0% { opacity: 0; -o-transform: translateY(-40px); } 100% { opacity: 1; -o-transform: translateY(0); } } @keyframes fadeInDown { 0% { opacity: 0; transform: translateY(-40px); } 100% { opacity: 1; transform: translateY(0); } } .fadeInDown { -webkit-animation-name: fadeInDown; -moz-animation-name: fadeInDown; -o-animation-name: fadeInDown; animation-name: fadeInDown; } @-webkit-keyframes fadeInLeft { 0% { opacity: 0; -webkit-transform: translateX(-20px); } 100% { opacity: 1; -webkit-transform: translateX(0); } } @-moz-keyframes fadeInLeft { 0% { opacity: 0; -moz-transform: translateX(-20px); } 100% { opacity: 1; -moz-transform: translateX(0); } } @-o-keyframes fadeInLeft { 0% { opacity: 0; -o-transform: translateX(-20px); } 100% { opacity: 1; -o-transform: translateX(0); } } @keyframes fadeInLeft { 0% { opacity: 0; transform: translateX(-20px); } 100% { opacity: 1; transform: translateX(0); } } .fadeInLeft { -webkit-animation-name: fadeInLeft; -moz-animation-name: fadeInLeft; -o-animation-name: fadeInLeft; animation-name: fadeInLeft; } @-webkit-keyframes fadeInRight { 0% { opacity: 0; -webkit-transform: translateX(20px); } 100% { opacity: 1; -webkit-transform: translateX(0); } } @-moz-keyframes fadeInRight { 0% { opacity: 0; -moz-transform: translateX(20px); } 100% { opacity: 1; -moz-transform: translateX(0); } } @-o-keyframes fadeInRight { 0% { opacity: 0; -o-transform: translateX(20px); } 100% { opacity: 1; -o-transform: translateX(0); } } @keyframes fadeInRight { 0% { opacity: 0; transform: translateX(20px); } 100% { opacity: 1; transform: translateX(0); } } .fadeInRight { -webkit-animation-name: fadeInRight; -moz-animation-name: fadeInRight; -o-animation-name: fadeInRight; animation-name: fadeInRight; } @-webkit-keyframes fadeOut { 0% {opacity: 1;} 100% {opacity: 0;} } @-moz-keyframes fadeOut { 0% {opacity: 1;} 100% {opacity: 0;} } @-o-keyframes fadeOut { 0% {opacity: 1;} 100% {opacity: 0;} } @keyframes fadeOut { 0% {opacity: 1;} 100% {opacity: 0;} } .fadeOut { -webkit-animation-name: fadeOut; -moz-animation-name: fadeOut; -o-animation-name: fadeOut; animation-name: fadeOut; } @-webkit-keyframes fadeOutUp { 0% { opacity: 1; -webkit-transform: translateY(0); } 100% { opacity: 0; -webkit-transform: translateY(-20px); } } @-moz-keyframes fadeOutUp { 0% { opacity: 1; -moz-transform: translateY(0); } 100% { opacity: 0; -moz-transform: translateY(-20px); } } @-o-keyframes fadeOutUp { 0% { opacity: 1; -o-transform: translateY(0); } 100% { opacity: 0; -o-transform: translateY(-20px); } } @keyframes fadeOutUp { 0% { opacity: 1; transform: translateY(0); } 100% { opacity: 0; transform: translateY(-20px); } } .fadeOutUp { -webkit-animation-name: fadeOutUp; -moz-animation-name: fadeOutUp; -o-animation-name: fadeOutUp; animation-name: fadeOutUp; } @-webkit-keyframes fadeOutDown { 0% { opacity: 1; -webkit-transform: translateY(0); } 100% { opacity: 0; -webkit-transform: translateY(20px); } } @-moz-keyframes fadeOutDown { 0% { opacity: 1; -moz-transform: translateY(0); } 100% { opacity: 0; -moz-transform: translateY(20px); } } @-o-keyframes fadeOutDown { 0% { opacity: 1; -o-transform: translateY(0); } 100% { opacity: 0; -o-transform: translateY(20px); } } @keyframes fadeOutDown { 0% { opacity: 1; transform: translateY(0); } 100% { opacity: 0; transform: translateY(20px); } } .fadeOutDown { -webkit-animation-name: fadeOutDown; -moz-animation-name: fadeOutDown; -o-animation-name: fadeOutDown; animation-name: fadeOutDown; } @-webkit-keyframes fadeOutLeft { 0% { opacity: 1; -webkit-transform: translateX(0); } 100% { opacity: 0; -webkit-transform: translateX(-20px); } } @-moz-keyframes fadeOutLeft { 0% { opacity: 1; -moz-transform: translateX(0); } 100% { opacity: 0; -moz-transform: translateX(-20px); } } @-o-keyframes fadeOutLeft { 0% { opacity: 1; -o-transform: translateX(0); } 100% { opacity: 0; -o-transform: translateX(-20px); } } @keyframes fadeOutLeft { 0% { opacity: 1; transform: translateX(0); } 100% { opacity: 0; transform: translateX(-20px); } } .fadeOutLeft { -webkit-animation-name: fadeOutLeft; -moz-animation-name: fadeOutLeft; -o-animation-name: fadeOutLeft; animation-name: fadeOutLeft; } @-webkit-keyframes fadeOutRight { 0% { opacity: 1; -webkit-transform: translateX(0); } 100% { opacity: 0; -webkit-transform: translateX(20px); } } @-moz-keyframes fadeOutRight { 0% { opacity: 1; -moz-transform: translateX(0); } 100% { opacity: 0; -moz-transform: translateX(20px); } } @-o-keyframes fadeOutRight { 0% { opacity: 1; -o-transform: translateX(0); } 100% { opacity: 0; -o-transform: translateX(20px); } } @keyframes fadeOutRight { 0% { opacity: 1; transform: translateX(0); } 100% { opacity: 0; transform: translateX(20px); } } .fadeOutRight { -webkit-animation-name: fadeOutRight; -moz-animation-name: fadeOutRight; -o-animation-name: fadeOutRight; animation-name: fadeOutRight; } @-webkit-keyframes bounceIn { 0% { opacity: 0; -webkit-transform: scale(.3); } 50% { opacity: 1; -webkit-transform: scale(1.05); } 70% { -webkit-transform: scale(.9); } 100% { opacity: 1; -webkit-transform: scale(1); } } @-moz-keyframes bounceIn { 0% { opacity: 0; -moz-transform: scale(.3); } 50% { opacity: 1; -moz-transform: scale(1.05); } 70% { -moz-transform: scale(.9); } 100% { opacity: 1; -moz-transform: scale(1); } } @-o-keyframes bounceIn { 0% { opacity: 0; -o-transform: scale(.3); } 50% { opacity: 1; -o-transform: scale(1.05); } 70% { -o-transform: scale(.9); } 100% { opacity: 1; -o-transform: scale(1); } } @keyframes bounceIn { 0% { opacity: 0; transform: scale(.3); } 50% { opacity: 1; transform: scale(1.05); } 70% { transform: scale(.9); } 100% { opacity: 1; transform: scale(1); } } .bounceIn { -webkit-animation-name: bounceIn; -moz-animation-name: bounceIn; -o-animation-name: bounceIn; animation-name: bounceIn; } @-webkit-keyframes bounceOut { 0% { -webkit-transform: scale(1); } 25% { -webkit-transform: scale(.95); } 50% { opacity: 1; -webkit-transform: scale(1.1); } 100% { opacity: 0; -webkit-transform: scale(.3); } } @-moz-keyframes bounceOut { 0% { -moz-transform: scale(1); } 25% { -moz-transform: scale(.95); } 50% { opacity: 1; -moz-transform: scale(1.1); } 100% { opacity: 0; -moz-transform: scale(.3); } } @-o-keyframes bounceOut { 0% { -o-transform: scale(1); } 25% { -o-transform: scale(.95); } 50% { opacity: 1; -o-transform: scale(1.1); } 100% { opacity: 0; -o-transform: scale(.3); } } @keyframes bounceOut { 0% { transform: scale(1); } 25% { transform: scale(.95); } 50% { opacity: 1; transform: scale(1.1); } 100% { opacity: 0; transform: scale(.3); } } .bounceOut { -webkit-animation-name: bounceOut; -moz-animation-name: bounceOut; -o-animation-name: bounceOut; animation-name: bounceOut; } @-webkit-keyframes bounceInLeft { 0% { opacity: 0; -webkit-transform: translateX(-2000px); } 60% { opacity: 1; -webkit-transform: translateX(30px); } 80% { -webkit-transform: translateX(-10px); } 100% { opacity: 1; -webkit-transform: translateX(0); } } @-moz-keyframes bounceInLeft { 0% { opacity: 0; -moz-transform: translateX(-2000px); } 60% { opacity: 1; -moz-transform: translateX(30px); } 80% { -moz-transform: translateX(-10px); } 100% { opacity: 1; -moz-transform: translateX(0); } } @-o-keyframes bounceInLeft { 0% { opacity: 0; -o-transform: translateX(-2000px); } 60% { opacity: 1; -o-transform: translateX(30px); } 80% { -o-transform: translateX(-10px); } 100% { opacity: 1; -o-transform: translateX(0); } } @keyframes bounceInLeft { 0% { opacity: 0; transform: translateX(-2000px); } 60% { opacity: 1; transform: translateX(30px); } 80% { transform: translateX(-10px); } 100% { opacity: 1; transform: translateX(0); } } .bounceInLeft { -webkit-animation-name: bounceInLeft; -moz-animation-name: bounceInLeft; -o-animation-name: bounceInLeft; animation-name: bounceInLeft; } @-webkit-keyframes bounceInRight { 0% { opacity: 0; -webkit-transform: translateX(2000px); } 60% { opacity: 1; -webkit-transform: translateX(-30px); } 80% { -webkit-transform: translateX(10px); } 100% { opacity: 1; -webkit-transform: translateX(0); } } @-moz-keyframes bounceInRight { 0% { opacity: 0; -moz-transform: translateX(2000px); } 60% { opacity: 1; -moz-transform: translateX(-30px); } 80% { -moz-transform: translateX(10px); } 100% { opacity: 1; -moz-transform: translateX(0); } } @-o-keyframes bounceInRight { 0% { opacity: 0; -o-transform: translateX(2000px); } 60% { opacity: 1; -o-transform: translateX(-30px); } 80% { -o-transform: translateX(10px); } 100% { opacity: 1; -o-transform: translateX(0); } } @keyframes bounceInRight { 0% { opacity: 0; transform: translateX(2000px); } 60% { opacity: 1; transform: translateX(-30px); } 80% { transform: translateX(10px); } 100% { opacity: 1; transform: translateX(0); } } .bounceInRight { -webkit-animation-name: bounceInRight; -moz-animation-name: bounceInRight; -o-animation-name: bounceInRight; animation-name: bounceInRight; } ================================================ FILE: src/AdminLTE/wwwroot/css/error.css ================================================ @charset "UTF-8"; html * { outline: none !important; } html, body { font-size: 12px; padding: 0px; margin: 0px; overflow: hidden; background: #334454; font-family: 'Open Sans', sans-serif; } a { color: #2f9fe0; } /* Layout */ .center {text-align: center; margin-left: auto; margin-right: auto; margin-bottom: auto; margin-top: auto;} [class^='col-xs-'], [class^='col-sm-'], [class^='col-md-'], [class^='col-lg-'] { position: relative; min-height: 1px; padding-left: 10px; padding-right: 10px; } .container .row { margin-left: 0px; margin-right: 0px; } /* eof layout */ /* error block */ .block-error { width: 400px; margin: 10% auto 0px; } .block-error .error-num { font-size: 190px; font-weight: 100; text-align: center; float: left; width: 100%; color: #FFF; line-height: 180px; } .block-error .error-text { font-size: 31px; color: #F5F5F5; float: left; width: 100%; font-weight: 200; text-align: center; margin-top: 10px; text-transform: uppercase; } .block-error .error-description { font-size: 13px; color: #F0F0F0; float: left; width: 100%; font-weight: 300; margin: 30px 0px; text-align: center; } .block-error .copy { float: left; width: 100%; text-align: center; color: #FFF; margin-top: 30px; color: #dddddd; } /* eof error */ ================================================ FILE: src/AdminLTE/wwwroot/css/site.css ================================================  /*PACE.js Related*/ .pace { pointer-events: none; -webkit-user-select: none; -moz-user-select: none; user-select: none; } .pace-inactive { display: none; } .pace .pace-progress { /*background: #29d;*/ background: green; position: fixed; z-index: 2000; top: 0; right: 100%; width: 100%; height: 50px; } /*site specifics*/ .site-loader-color { color: #000000 !important; font-size: 50px !important; } .site-datatable-button-container{ margin-left: 10px; } .button-create{ } ================================================ FILE: src/AdminLTE/wwwroot/files/SalesOrderDetail.txt ================================================ 0,1,2,3,4,5,6 1,4911-403C-98,1,Mountain-100 Black. 42,No Discount,2024.994,0.00 2,4911-403C-98,3,Mountain-100 Black. 44,No Discount,2024.994,0.00 3,4911-403C-98,1,Mountain-100 Black. 48,No Discount,2024.994,0.00 4,4911-403C-98,1,Mountain-100 Silver. 38,No Discount,2039.994,0.00 5,4911-403C-98,1,Mountain-100 Silver. 42,No Discount,2039.994,0.00 6,4911-403C-98,2,Mountain-100 Silver. 44,No Discount,2039.994,0.00 7,4911-403C-98,1,Mountain-100 Silver. 48,No Discount,2039.994,0.00 8,4911-403C-98,3,Long-Sleeve Logo Jersey. M,No Discount,28.8404,0.00 9,4911-403C-98,1,Long-Sleeve Logo Jersey. XL,No Discount,28.8404,0.00 10,4911-403C-98,6,Mountain Bike Socks. M,No Discount,5.70,0.00 11,4911-403C-98,2,AWC Logo Cap,No Discount,5.1865,0.00 12,4911-403C-98,4,Sport-100 Helmet. Blue,No Discount,20.1865,0.00 13,6431-4D57-83,1,Road-650 Red. 44,No Discount,419.4589,0.00 14,6431-4D57-83,1,Road-450 Red. 52,No Discount,874.794,0.00 15,4E0A-4F89-AE,1,HL Mountain Frame - Black. 48,No Discount,809.76,0.00 16,4E0A-4F89-AE,1,HL Mountain Frame - Black. 42,No Discount,714.7043,0.00 17,4E0A-4F89-AE,2,HL Mountain Frame - Black. 38,No Discount,714.7043,0.00 18,4E0A-4F89-AE,4,AWC Logo Cap,No Discount,5.1865,0.00 19,4E0A-4F89-AE,4,Long-Sleeve Logo Jersey. L,No Discount,28.8404,0.00 20,4E0A-4F89-AE,2,HL Mountain Frame - Silver. 46,No Discount,722.5949,0.00 21,4E0A-4F89-AE,3,Mountain-100 Black. 38,No Discount,2024.994,0.00 22,4E0A-4F89-AE,2,Mountain-100 Black. 48,No Discount,2024.994,0.00 23,4E0A-4F89-AE,2,Sport-100 Helmet. Blue,No Discount,20.1865,0.00 24,4E0A-4F89-AE,2,HL Mountain Frame - Silver. 48,No Discount,818.70,0.00 25,4E0A-4F89-AE,4,Mountain-100 Black. 42,No Discount,2024.994,0.00 26,4E0A-4F89-AE,2,Mountain-100 Silver. 44,No Discount,2039.994,0.00 27,4E0A-4F89-AE,2,Long-Sleeve Logo Jersey. XL,No Discount,28.8404,0.00 28,4E0A-4F89-AE,2,Mountain-100 Black. 44,No Discount,2024.994,0.00 29,4E0A-4F89-AE,5,Sport-100 Helmet. Black,No Discount,20.1865,0.00 30,2E53-4802-85,3,Road-650 Red. 52,No Discount,419.4589,0.00 31,2E53-4802-85,5,Road-650 Black. 52,No Discount,419.4589,0.00 32,2E53-4802-85,2,LL Road Frame - Red. 62,No Discount,183.9382,0.00 33,2E53-4802-85,4,Road-450 Red. 58,No Discount,874.794,0.00 34,2E53-4802-85,3,LL Road Frame - Red. 44,No Discount,183.9382,0.00 35,2E53-4802-85,5,Road-650 Red. 44,No Discount,419.4589,0.00 36,2E53-4802-85,3,Road-650 Black. 58,No Discount,419.4589,0.00 37,2E53-4802-85,2,Road-650 Black. 44,No Discount,419.4589,0.00 38,2E53-4802-85,1,Road-150 Red. 56,No Discount,2146.962,0.00 39,2E53-4802-85,1,Road-450 Red. 44,No Discount,874.794,0.00 40,2E53-4802-85,3,Road-650 Red. 48,No Discount,419.4589,0.00 41,2E53-4802-85,1,ML Road Frame - Red. 48,No Discount,356.898,0.00 42,2E53-4802-85,6,Road-450 Red. 52,No Discount,874.794,0.00 43,2E53-4802-85,1,LL Road Frame - Red. 60,No Discount,183.9382,0.00 44,2E53-4802-85,3,LL Road Frame - Black. 58,No Discount,178.5808,0.00 45,2E53-4802-85,1,Road-150 Red. 62,No Discount,2146.962,0.00 46,2E53-4802-85,3,Road-650 Red. 60,No Discount,419.4589,0.00 47,2E53-4802-85,1,LL Road Frame - Red. 48,No Discount,183.9382,0.00 48,2E53-4802-85,1,ML Road Frame - Red. 52,No Discount,356.898,0.00 49,2E53-4802-85,1,LL Road Frame - Black. 52,No Discount,178.5808,0.00 50,2E53-4802-85,3,Road-650 Black. 60,No Discount,419.4589,0.00 51,2E53-4802-85,1,Road-450 Red. 60,No Discount,874.794,0.00 52,1E90-4FBF-B6,1,Road-650 Red. 60,No Discount,419.4589,0.00 53,2F44-4BA1-BB,1,Mountain-100 Silver. 42,No Discount,2039.994,0.00 54,2F44-4BA1-BB,4,Mountain-100 Black. 38,No Discount,2024.994,0.00 55,2F44-4BA1-BB,1,Long-Sleeve Logo Jersey. M,No Discount,28.8404,0.00 56,2F44-4BA1-BB,1,Long-Sleeve Logo Jersey. XL,No Discount,28.8404,0.00 57,2F44-4BA1-BB,2,Mountain-100 Black. 44,No Discount,2024.994,0.00 58,2F44-4BA1-BB,3,Mountain-100 Silver. 38,No Discount,2039.994,0.00 59,2F44-4BA1-BB,1,Mountain-100 Silver. 44,No Discount,2039.994,0.00 60,2F44-4BA1-BB,1,Mountain-100 Black. 48,No Discount,2024.994,0.00 61,19F0-4638-8E,2,Sport-100 Helmet. Blue,No Discount,20.1865,0.00 62,19F0-4638-8E,1,Mountain-100 Silver. 44,No Discount,2039.994,0.00 63,19F0-4638-8E,1,Sport-100 Helmet. Red,No Discount,20.1865,0.00 64,19F0-4638-8E,2,Long-Sleeve Logo Jersey. L,No Discount,28.8404,0.00 65,19F0-4638-8E,2,Mountain-100 Black. 44,No Discount,2024.994,0.00 66,19F0-4638-8E,2,AWC Logo Cap,No Discount,5.1865,0.00 67,19F0-4638-8E,2,Mountain-100 Black. 38,No Discount,2024.994,0.00 68,19F0-4638-8E,1,Mountain-100 Black. 48,No Discount,2024.994,0.00 69,19F0-4638-8E,6,Mountain Bike Socks. M,No Discount,5.70,0.00 70,19F0-4638-8E,1,Mountain-100 Black. 42,No Discount,2024.994,0.00 71,D46A-40CA-8D,1,Road-650 Red. 52,No Discount,419.4589,0.00 72,D46A-40CA-8D,1,Road-150 Red. 56,No Discount,2146.962,0.00 73,D46A-40CA-8D,1,ML Road Frame - Red. 48,No Discount,356.898,0.00 74,D46A-40CA-8D,1,Road-450 Red. 44,No Discount,874.794,0.00 75,D46A-40CA-8D,2,Road-650 Black. 44,No Discount,419.4589,0.00 76,D46A-40CA-8D,1,Road-650 Black. 60,No Discount,419.4589,0.00 77,4DFB-4B10-A6,3,Mountain Bike Socks. L,No Discount,5.70,0.00 78,4DFB-4B10-A6,1,Mountain-100 Silver. 44,No Discount,2039.994,0.00 79,4DFB-4B10-A6,1,Mountain-100 Black. 48,No Discount,2024.994,0.00 80,4DFB-4B10-A6,1,Mountain-100 Black. 38,No Discount,2024.994,0.00 81,365D-4C9A-BE,3,Road-450 Red. 44,No Discount,874.794,0.00 82,365D-4C9A-BE,2,Road-150 Red. 56,No Discount,2146.962,0.00 83,365D-4C9A-BE,7,Road-650 Red. 60,No Discount,419.4589,0.00 84,365D-4C9A-BE,6,Road-650 Black. 58,No Discount,419.4589,0.00 85,365D-4C9A-BE,6,Long-Sleeve Logo Jersey. L,No Discount,28.8404,0.00 86,365D-4C9A-BE,6,LL Road Frame - Red. 62,No Discount,183.9382,0.00 87,365D-4C9A-BE,2,Sport-100 Helmet. Red,No Discount,20.1865,0.00 88,365D-4C9A-BE,2,Sport-100 Helmet. Blue,No Discount,20.1865,0.00 89,365D-4C9A-BE,2,Road-450 Red. 58,No Discount,874.794,0.00 90,365D-4C9A-BE,4,AWC Logo Cap,No Discount,5.1865,0.00 91,365D-4C9A-BE,2,LL Road Frame - Red. 60,No Discount,183.9382,0.00 92,365D-4C9A-BE,3,Road-450 Red. 60,No Discount,874.794,0.00 93,365D-4C9A-BE,3,Road-650 Red. 62,No Discount,419.4589,0.00 94,365D-4C9A-BE,2,Road-650 Black. 52,No Discount,419.4589,0.00 95,365D-4C9A-BE,3,LL Road Frame - Red. 48,No Discount,183.9382,0.00 96,365D-4C9A-BE,2,Road-650 Red. 52,No Discount,419.4589,0.00 97,365D-4C9A-BE,2,Road-650 Black. 60,No Discount,419.4589,0.00 98,365D-4C9A-BE,2,LL Road Frame - Red. 44,No Discount,183.9382,0.00 99,365D-4C9A-BE,1,Long-Sleeve Logo Jersey. XL,No Discount,28.8404,0.00 100,365D-4C9A-BE,2,Road-650 Black. 44,No Discount,419.4589,0.00 101,365D-4C9A-BE,4,ML Road Frame - Red. 48,No Discount,356.898,0.00 102,365D-4C9A-BE,6,Road-450 Red. 52,No Discount,874.794,0.00 103,365D-4C9A-BE,4,Road-650 Red. 44,No Discount,419.4589,0.00 104,365D-4C9A-BE,3,LL Road Frame - Black. 52,No Discount,178.5808,0.00 105,365D-4C9A-BE,4,Long-Sleeve Logo Jersey. M,No Discount,28.8404,0.00 106,365D-4C9A-BE,3,LL Road Frame - Black. 58,No Discount,178.5808,0.00 107,365D-4C9A-BE,1,Sport-100 Helmet. Black,No Discount,20.1865,0.00 108,365D-4C9A-BE,3,ML Road Frame - Red. 52,No Discount,356.898,0.00 109,365D-4C9A-BE,3,Road-650 Red. 48,No Discount,419.4589,0.00 110,B65C-4867-86,1,HL Mountain Frame - Black. 38,No Discount,714.7043,0.00 111,F101-4649-85,1,Mountain Bike Socks. L,No Discount,5.70,0.00 112,F101-4649-85,2,Mountain Bike Socks. M,No Discount,5.70,0.00 113,F101-4649-85,2,Mountain-100 Silver. 44,No Discount,2039.994,0.00 114,F101-4649-85,1,Mountain-100 Black. 42,No Discount,2024.994,0.00 115,DFD9-41B7-94,1,Road-150 Red. 56,No Discount,2146.962,0.00 116,DFD9-41B7-94,2,Long-Sleeve Logo Jersey. M,No Discount,28.8404,0.00 117,DFD9-41B7-94,1,Road-450 Red. 44,No Discount,874.794,0.00 118,DFD9-41B7-94,2,Road-650 Black. 44,No Discount,419.4589,0.00 119,DFD9-41B7-94,2,ML Road Frame - Red. 48,No Discount,356.898,0.00 120,DFD9-41B7-94,2,Road-650 Red. 48,No Discount,419.4589,0.00 121,DFD9-41B7-94,2,Road-450 Red. 60,No Discount,874.794,0.00 122,DFD9-41B7-94,2,Road-650 Red. 52,No Discount,419.4589,0.00 123,DFD9-41B7-94,1,Long-Sleeve Logo Jersey. XL,No Discount,28.8404,0.00 124,DFD9-41B7-94,1,Sport-100 Helmet. Blue,No Discount,20.1865,0.00 125,DFD9-41B7-94,1,Sport-100 Helmet. Black,No Discount,20.1865,0.00 126,F4B5-48D0-BA,6,Mountain Bike Socks. M,No Discount,5.70,0.00 127,F4B5-48D0-BA,2,Mountain-100 Black. 42,No Discount,2024.994,0.00 128,F4B5-48D0-BA,1,Mountain-100 Silver. 48,No Discount,2039.994,0.00 129,260F-4DCF-A1,1,Road-450 Red. 58,No Discount,874.794,0.00 130,260F-4DCF-A1,3,Long-Sleeve Logo Jersey. L,No Discount,28.8404,0.00 131,260F-4DCF-A1,1,LL Road Frame - Red. 60,No Discount,183.9382,0.00 132,260F-4DCF-A1,2,Road-650 Red. 62,No Discount,419.4589,0.00 133,260F-4DCF-A1,1,Road-650 Red. 44,No Discount,419.4589,0.00 134,260F-4DCF-A1,2,LL Road Frame - Black. 52,No Discount,178.5808,0.00 135,260F-4DCF-A1,2,Road-650 Black. 52,No Discount,419.4589,0.00 136,260F-4DCF-A1,1,AWC Logo Cap,No Discount,5.1865,0.00 137,260F-4DCF-A1,2,Sport-100 Helmet. Black,No Discount,20.1865,0.00 138,260F-4DCF-A1,1,Sport-100 Helmet. Blue,No Discount,20.1865,0.00 139,260F-4DCF-A1,4,Sport-100 Helmet. Red,No Discount,20.1865,0.00 140,4C12-4FF9-80,3,Road-450 Red. 52,No Discount,874.794,0.00 141,5069-4470-BE,4,Road-650 Red. 62,No Discount,419.4589,0.00 142,5069-4470-BE,5,Sport-100 Helmet. Blue,No Discount,20.1865,0.00 143,5069-4470-BE,2,LL Road Frame - Black. 52,No Discount,178.5808,0.00 144,5069-4470-BE,1,Sport-100 Helmet. Black,No Discount,20.1865,0.00 145,5069-4470-BE,2,Road-650 Red. 44,No Discount,419.4589,0.00 146,5069-4470-BE,2,Road-450 Red. 52,No Discount,874.794,0.00 147,5069-4470-BE,2,AWC Logo Cap,No Discount,5.1865,0.00 148,5069-4470-BE,1,Road-450 Red. 58,No Discount,874.794,0.00 149,5069-4470-BE,3,Long-Sleeve Logo Jersey. L,No Discount,28.8404,0.00 150,11BA-4D19-B7,2,Mountain-100 Black. 42,No Discount,2024.994,0.00 151,11BA-4D19-B7,2,Mountain-100 Black. 48,No Discount,2024.994,0.00 152,11BA-4D19-B7,1,Mountain Bike Socks. L,No Discount,5.70,0.00 153,11BA-4D19-B7,3,Mountain-100 Black. 38,No Discount,2024.994,0.00 154,11BA-4D19-B7,4,Mountain Bike Socks. M,No Discount,5.70,0.00 155,8E3A-4564-99,3,Long-Sleeve Logo Jersey. L,No Discount,28.8404,0.00 156,8E3A-4564-99,1,Road-150 Red. 56,No Discount,2146.962,0.00 157,8E3A-4564-99,1,Road-450 Red. 52,No Discount,874.794,0.00 158,8E3A-4564-99,1,Road-650 Black. 52,No Discount,419.4589,0.00 159,8E3A-4564-99,2,Sport-100 Helmet. Black,No Discount,20.1865,0.00 160,8E3A-4564-99,4,Road-650 Red. 60,No Discount,419.4589,0.00 161,8E3A-4564-99,2,Road-650 Black. 58,No Discount,419.4589,0.00 162,8E3A-4564-99,1,Road-650 Red. 48,No Discount,419.4589,0.00 163,8E3A-4564-99,5,AWC Logo Cap,No Discount,5.1865,0.00 164,8E3A-4564-99,1,Sport-100 Helmet. Red,No Discount,20.1865,0.00 165,8E3A-4564-99,1,Road-450 Red. 58,No Discount,874.794,0.00 166,8E3A-4564-99,2,LL Road Frame - Red. 60,No Discount,183.9382,0.00 167,FBD8-4CE4-8B,1,Road-650 Red. 60,No Discount,419.4589,0.00 168,FBD8-4CE4-8B,2,LL Road Frame - Black. 52,No Discount,178.5808,0.00 169,FBD8-4CE4-8B,1,Road-650 Black. 58,No Discount,419.4589,0.00 170,FBD8-4CE4-8B,2,ML Road Frame - Red. 48,No Discount,356.898,0.00 171,FBD8-4CE4-8B,3,Road-650 Red. 44,No Discount,419.4589,0.00 172,FBD8-4CE4-8B,2,Road-650 Red. 62,No Discount,419.4589,0.00 173,FBD8-4CE4-8B,3,AWC Logo Cap,No Discount,5.1865,0.00 174,FBD8-4CE4-8B,4,Sport-100 Helmet. Black,No Discount,20.1865,0.00 175,FBD8-4CE4-8B,2,LL Road Frame - Red. 60,No Discount,183.9382,0.00 176,FBD8-4CE4-8B,1,Road-450 Red. 44,No Discount,874.794,0.00 177,FBD8-4CE4-8B,2,LL Road Frame - Red. 44,No Discount,183.9382,0.00 178,FBD8-4CE4-8B,1,Long-Sleeve Logo Jersey. XL,No Discount,28.8404,0.00 179,FBD8-4CE4-8B,1,Road-650 Black. 52,No Discount,419.4589,0.00 180,FBD8-4CE4-8B,2,Road-450 Red. 52,No Discount,874.794,0.00 181,FBD8-4CE4-8B,2,Long-Sleeve Logo Jersey. L,No Discount,28.8404,0.00 182,FBD8-4CE4-8B,1,Road-450 Red. 58,No Discount,874.794,0.00 183,FBD8-4CE4-8B,1,Road-450 Red. 60,No Discount,874.794,0.00 184,FBD8-4CE4-8B,3,Sport-100 Helmet. Blue,No Discount,20.1865,0.00 185,FBD8-4CE4-8B,1,Sport-100 Helmet. Red,No Discount,20.1865,0.00 186,918F-49F3-AD,1,Road-650 Red. 60,No Discount,419.4589,0.00 187,918F-49F3-AD,2,Road-650 Black. 52,No Discount,419.4589,0.00 188,918F-49F3-AD,2,Long-Sleeve Logo Jersey. L,No Discount,28.8404,0.00 189,FF1F-4DD0-98,3,Road-650 Red. 60,No Discount,419.4589,0.00 190,FF1F-4DD0-98,2,Road-450 Red. 44,No Discount,874.794,0.00 191,FF1F-4DD0-98,2,LL Road Frame - Black. 52,No Discount,178.5808,0.00 192,FF1F-4DD0-98,4,Sport-100 Helmet. Red,No Discount,20.1865,0.00 193,FF1F-4DD0-98,1,LL Road Frame - Red. 60,No Discount,183.9382,0.00 194,FF1F-4DD0-98,1,Sport-100 Helmet. Blue,No Discount,20.1865,0.00 195,FF1F-4DD0-98,2,Long-Sleeve Logo Jersey. L,No Discount,28.8404,0.00 196,FF1F-4DD0-98,2,LL Road Frame - Red. 44,No Discount,183.9382,0.00 197,FF1F-4DD0-98,1,Road-450 Red. 52,No Discount,874.794,0.00 198,FF1F-4DD0-98,1,Road-650 Red. 62,No Discount,419.4589,0.00 199,FF1F-4DD0-98,2,Road-150 Red. 56,No Discount,2146.962,0.00 200,FF1F-4DD0-98,2,Sport-100 Helmet. Black,No Discount,20.1865,0.00 201,FF1F-4DD0-98,3,Road-650 Black. 58,No Discount,419.4589,0.00 202,FF1F-4DD0-98,3,AWC Logo Cap,No Discount,5.1865,0.00 203,FF1F-4DD0-98,1,Road-650 Red. 48,No Discount,419.4589,0.00 204,6D51-449D-B3,6,Long-Sleeve Logo Jersey. L,No Discount,28.8404,0.00 205,6D51-449D-B3,5,Road-650 Red. 44,No Discount,419.4589,0.00 206,6D51-449D-B3,1,ML Road Frame - Red. 48,No Discount,356.898,0.00 207,6D51-449D-B3,1,Sport-100 Helmet. Red,No Discount,20.1865,0.00 208,6D51-449D-B3,1,LL Road Frame - Red. 60,No Discount,183.9382,0.00 209,6D51-449D-B3,2,Sport-100 Helmet. Black,No Discount,20.1865,0.00 210,6D51-449D-B3,3,Road-650 Black. 52,No Discount,419.4589,0.00 211,6D51-449D-B3,2,LL Road Frame - Red. 62,No Discount,183.9382,0.00 212,6D51-449D-B3,3,Road-450 Red. 52,No Discount,874.794,0.00 213,6D51-449D-B3,1,Road-650 Black. 44,No Discount,419.4589,0.00 214,6D51-449D-B3,2,Road-650 Red. 62,No Discount,419.4589,0.00 215,6D51-449D-B3,2,LL Road Frame - Black. 52,No Discount,178.5808,0.00 216,6D51-449D-B3,1,Road-150 Red. 56,No Discount,2146.962,0.00 217,6D51-449D-B3,2,Long-Sleeve Logo Jersey. M,No Discount,28.8404,0.00 218,6D51-449D-B3,2,Road-650 Red. 52,No Discount,419.4589,0.00 219,6D51-449D-B3,2,Road-650 Red. 60,No Discount,419.4589,0.00 220,6D51-449D-B3,1,Road-450 Red. 44,No Discount,874.794,0.00 221,6D51-449D-B3,2,Long-Sleeve Logo Jersey. XL,No Discount,28.8404,0.00 222,6D51-449D-B3,2,Sport-100 Helmet. Blue,No Discount,20.1865,0.00 223,6D51-449D-B3,1,LL Road Frame - Red. 44,No Discount,183.9382,0.00 224,6D51-449D-B3,2,AWC Logo Cap,No Discount,5.1865,0.00 225,ECD4-43A8-A8,2,Road-450 Red. 52,No Discount,874.794,0.00 226,ECD4-43A8-A8,1,Road-650 Red. 44,No Discount,419.4589,0.00 227,ECD4-43A8-A8,2,Road-650 Red. 60,No Discount,419.4589,0.00 228,ECD4-43A8-A8,2,Road-650 Black. 52,No Discount,419.4589,0.00 229,ECD4-43A8-A8,1,Long-Sleeve Logo Jersey. L,No Discount,28.8404,0.00 230,2299-44F7-95,2,Mountain-100 Black. 42,No Discount,2024.994,0.00 231,2299-44F7-95,2,Long-Sleeve Logo Jersey. L,No Discount,28.8404,0.00 232,2299-44F7-95,2,Mountain-100 Silver. 44,No Discount,2039.994,0.00 233,2299-44F7-95,1,Mountain-100 Silver. 48,No Discount,2039.994,0.00 234,2299-44F7-95,1,Sport-100 Helmet. Black,No Discount,20.1865,0.00 235,2299-44F7-95,2,Sport-100 Helmet. Blue,No Discount,20.1865,0.00 236,2299-44F7-95,3,AWC Logo Cap,No Discount,5.1865,0.00 237,2299-44F7-95,4,Mountain-100 Black. 38,No Discount,2024.994,0.00 238,2299-44F7-95,6,Mountain-100 Black. 44,No Discount,2024.994,0.00 239,2299-44F7-95,1,Mountain-100 Silver. 42,No Discount,2039.994,0.00 240,2299-44F7-95,3,Sport-100 Helmet. Red,No Discount,20.1865,0.00 241,2299-44F7-95,5,Mountain-100 Black. 48,No Discount,2024.994,0.00 242,2299-44F7-95,6,Mountain Bike Socks. M,No Discount,5.70,0.00 243,8C01-4CC0-A9,2,Road-450 Red. 58,No Discount,874.794,0.00 244,8C01-4CC0-A9,2,Road-650 Red. 44,No Discount,419.4589,0.00 245,8C01-4CC0-A9,1,Road-650 Red. 60,No Discount,419.4589,0.00 246,8C01-4CC0-A9,2,Road-450 Red. 52,No Discount,874.794,0.00 247,8C01-4CC0-A9,1,Road-650 Black. 52,No Discount,419.4589,0.00 248,8C01-4CC0-A9,1,Road-650 Red. 48,No Discount,419.4589,0.00 249,C519-4AB3-88,3,Road-650 Black. 58,No Discount,419.4589,0.00 250,C519-4AB3-88,1,Road-650 Red. 48,No Discount,419.4589,0.00 251,C519-4AB3-88,1,Road-450 Red. 58,No Discount,874.794,0.00 252,C519-4AB3-88,1,LL Road Frame - Red. 44,No Discount,183.9382,0.00 253,FBD0-4F71-80,3,Road-450 Red. 52,No Discount,874.794,0.00 254,FBD0-4F71-80,1,Road-650 Red. 44,No Discount,419.4589,0.00 255,FBD0-4F71-80,1,Road-650 Black. 52,No Discount,419.4589,0.00 256,61FA-475A-AC,1,Road-650 Black. 44,No Discount,419.4589,0.00 257,61FA-475A-AC,2,Road-650 Black. 58,No Discount,419.4589,0.00 258,16F4-456B-9A,1,LL Road Frame - Red. 44,No Discount,183.9382,0.00 259,16F4-456B-9A,2,Road-650 Red. 60,No Discount,419.4589,0.00 260,16F4-456B-9A,3,Road-650 Red. 44,No Discount,419.4589,0.00 261,16F4-456B-9A,1,LL Road Frame - Black. 52,No Discount,178.5808,0.00 262,16F4-456B-9A,1,Road-650 Red. 48,No Discount,419.4589,0.00 263,16F4-456B-9A,2,LL Road Frame - Red. 60,No Discount,183.9382,0.00 264,16F4-456B-9A,2,Road-450 Red. 58,No Discount,874.794,0.00 265,16F4-456B-9A,2,Road-450 Red. 52,No Discount,874.794,0.00 266,16F4-456B-9A,3,Road-650 Black. 58,No Discount,419.4589,0.00 267,16F4-456B-9A,1,Road-650 Black. 52,No Discount,419.4589,0.00 268,16F4-456B-9A,2,Road-150 Red. 56,No Discount,2146.962,0.00 269,DCD9-4C9A-AB,3,Road-650 Red. 52,No Discount,419.4589,0.00 270,DCD9-4C9A-AB,2,LL Road Frame - Black. 52,No Discount,178.5808,0.00 271,DCD9-4C9A-AB,2,LL Road Frame - Red. 44,No Discount,183.9382,0.00 272,DCD9-4C9A-AB,1,Road-150 Red. 56,No Discount,2146.962,0.00 273,DCD9-4C9A-AB,2,Road-450 Red. 60,No Discount,874.794,0.00 274,DCD9-4C9A-AB,4,Road-650 Black. 60,No Discount,419.4589,0.00 275,DCD9-4C9A-AB,2,Road-650 Black. 52,No Discount,419.4589,0.00 276,DCD9-4C9A-AB,7,Road-650 Red. 60,No Discount,419.4589,0.00 277,DCD9-4C9A-AB,3,LL Road Frame - Red. 48,No Discount,183.9382,0.00 278,DCD9-4C9A-AB,1,LL Road Frame - Black. 58,No Discount,178.5808,0.00 279,DCD9-4C9A-AB,6,Road-650 Red. 48,No Discount,419.4589,0.00 280,DCD9-4C9A-AB,2,LL Road Frame - Red. 60,No Discount,183.9382,0.00 281,DCD9-4C9A-AB,2,LL Road Frame - Red. 62,No Discount,183.9382,0.00 282,DCD9-4C9A-AB,2,ML Road Frame - Red. 48,No Discount,356.898,0.00 283,DCD9-4C9A-AB,5,Road-650 Black. 58,No Discount,419.4589,0.00 284,DCD9-4C9A-AB,2,Road-650 Black. 44,No Discount,419.4589,0.00 285,DCD9-4C9A-AB,2,Road-650 Red. 62,No Discount,419.4589,0.00 286,DCD9-4C9A-AB,3,Road-450 Red. 52,No Discount,874.794,0.00 287,DCD9-4C9A-AB,2,Road-150 Red. 62,No Discount,2146.962,0.00 288,DCD9-4C9A-AB,9,Road-650 Red. 44,No Discount,419.4589,0.00 289,DCD9-4C9A-AB,4,Road-450 Red. 58,No Discount,874.794,0.00 290,7A3C-492F-A6,1,Long-Sleeve Logo Jersey. L,No Discount,28.8404,0.00 291,7A3C-492F-A6,1,Road-650 Black. 52,No Discount,419.4589,0.00 292,7A3C-492F-A6,2,AWC Logo Cap,No Discount,5.1865,0.00 293,7A3C-492F-A6,2,Road-650 Red. 60,No Discount,419.4589,0.00 294,272B-4319-9E,1,Road-450 Red. 52,No Discount,874.794,0.00 295,BFA9-470E-B4,5,Road-650 Black. 52,No Discount,419.4589,0.00 296,BFA9-470E-B4,1,LL Road Frame - Red. 44,No Discount,183.9382,0.00 297,BFA9-470E-B4,8,Road-450 Red. 58,No Discount,874.794,0.00 298,BFA9-470E-B4,2,LL Road Frame - Red. 62,No Discount,183.9382,0.00 299,BFA9-470E-B4,10,Long-Sleeve Logo Jersey. L,No Discount,28.8404,0.00 300,BFA9-470E-B4,1,Road-650 Black. 44,No Discount,419.4589,0.00 301,BFA9-470E-B4,4,Road-450 Red. 44,No Discount,874.794,0.00 302,BFA9-470E-B4,2,LL Road Frame - Black. 52,No Discount,178.5808,0.00 303,BFA9-470E-B4,8,Road-450 Red. 52,No Discount,874.794,0.00 304,BFA9-470E-B4,3,Sport-100 Helmet. Black,No Discount,20.1865,0.00 305,BFA9-470E-B4,6,Road-650 Red. 44,No Discount,419.4589,0.00 306,BFA9-470E-B4,3,ML Road Frame - Red. 48,No Discount,356.898,0.00 307,BFA9-470E-B4,6,AWC Logo Cap,No Discount,5.1865,0.00 308,BFA9-470E-B4,4,Long-Sleeve Logo Jersey. M,No Discount,28.8404,0.00 309,BFA9-470E-B4,7,Road-650 Red. 60,No Discount,419.4589,0.00 310,BFA9-470E-B4,2,Road-450 Red. 60,No Discount,874.794,0.00 311,BFA9-470E-B4,4,Long-Sleeve Logo Jersey. XL,No Discount,28.8404,0.00 312,BFA9-470E-B4,2,Road-650 Black. 58,No Discount,419.4589,0.00 313,BFA9-470E-B4,1,Road-650 Red. 52,No Discount,419.4589,0.00 314,BFA9-470E-B4,2,Road-150 Red. 56,No Discount,2146.962,0.00 315,BFA9-470E-B4,1,Road-650 Black. 60,No Discount,419.4589,0.00 316,BFA9-470E-B4,1,LL Road Frame - Black. 58,No Discount,178.5808,0.00 317,BFA9-470E-B4,3,Road-650 Red. 62,No Discount,419.4589,0.00 318,BFA9-470E-B4,3,Sport-100 Helmet. Blue,No Discount,20.1865,0.00 319,BFA9-470E-B4,1,Road-650 Red. 48,No Discount,419.4589,0.00 320,BFA9-470E-B4,2,LL Road Frame - Red. 60,No Discount,183.9382,0.00 321,BFA9-470E-B4,4,Sport-100 Helmet. Red,No Discount,20.1865,0.00 322,BFA9-470E-B4,2,LL Road Frame - Red. 48,No Discount,183.9382,0.00 323,EC62-4BB3-9B,3,Long-Sleeve Logo Jersey. XL,No Discount,28.8404,0.00 324,EC62-4BB3-9B,1,Mountain-100 Silver. 44,No Discount,2039.994,0.00 325,EC62-4BB3-9B,6,Mountain Bike Socks. M,No Discount,5.70,0.00 326,EC62-4BB3-9B,2,Sport-100 Helmet. Red,No Discount,20.1865,0.00 327,EC62-4BB3-9B,3,Mountain-100 Silver. 38,No Discount,2039.994,0.00 328,EC62-4BB3-9B,2,Sport-100 Helmet. Black,No Discount,20.1865,0.00 329,EC62-4BB3-9B,1,Mountain-100 Silver. 48,No Discount,2039.994,0.00 330,EC62-4BB3-9B,3,Mountain-100 Black. 44,No Discount,2024.994,0.00 331,EC62-4BB3-9B,1,Mountain-100 Silver. 42,No Discount,2039.994,0.00 332,EC62-4BB3-9B,1,Mountain-100 Black. 48,No Discount,2024.994,0.00 333,EC3D-48E0-A6,3,Mountain-100 Black. 42,No Discount,2024.994,0.00 334,EC3D-48E0-A6,3,Mountain-100 Silver. 38,No Discount,2039.994,0.00 335,EC3D-48E0-A6,2,Long-Sleeve Logo Jersey. L,No Discount,28.8404,0.00 336,EC3D-48E0-A6,1,Mountain-100 Silver. 42,No Discount,2039.994,0.00 337,EC3D-48E0-A6,3,Long-Sleeve Logo Jersey. XL,No Discount,28.8404,0.00 338,EC3D-48E0-A6,1,Sport-100 Helmet. Red,No Discount,20.1865,0.00 339,EC3D-48E0-A6,1,Sport-100 Helmet. Black,No Discount,20.1865,0.00 340,EC3D-48E0-A6,1,Mountain-100 Silver. 48,No Discount,2039.994,0.00 341,EC3D-48E0-A6,2,Mountain-100 Silver. 44,No Discount,2039.994,0.00 342,EC3D-48E0-A6,1,AWC Logo Cap,No Discount,5.1865,0.00 343,EC3D-48E0-A6,5,Sport-100 Helmet. Blue,No Discount,20.1865,0.00 344,A89C-4D25-B9,2,Mountain-100 Silver. 48,No Discount,2039.994,0.00 345,A89C-4D25-B9,2,HL Mountain Frame - Silver. 38,No Discount,722.5949,0.00 346,A89C-4D25-B9,1,HL Mountain Frame - Black. 38,No Discount,714.7043,0.00 347,A89C-4D25-B9,1,HL Mountain Frame - Silver. 46,No Discount,722.5949,0.00 348,A89C-4D25-B9,5,Mountain-100 Black. 44,No Discount,2024.994,0.00 349,A89C-4D25-B9,6,Mountain-100 Black. 48,No Discount,2024.994,0.00 350,A89C-4D25-B9,2,Mountain Bike Socks. M,No Discount,5.70,0.00 351,A89C-4D25-B9,5,Mountain-100 Black. 38,No Discount,2024.994,0.00 352,50C1-41FA-BE,1,Road-650 Red. 44,No Discount,419.4589,0.00 353,NULL,1,Road-150 Red. 62,No Discount,3578.27,0.00 354,NULL,1,Mountain-100 Silver. 44,No Discount,3399.99,0.00 355,NULL,1,Mountain-100 Silver. 44,No Discount,3399.99,0.00 356,NULL,1,Road-650 Black. 62,No Discount,699.0982,0.00 357,NULL,1,Mountain-100 Silver. 44,No Discount,3399.99,0.00 358,NULL,1,Road-150 Red. 44,No Discount,3578.27,0.00 359,NULL,1,Road-150 Red. 62,No Discount,3578.27,0.00 360,NULL,1,Mountain-100 Black. 48,No Discount,3374.99,0.00 361,NULL,1,Mountain-100 Silver. 38,No Discount,3399.99,0.00 362,NULL,1,Road-150 Red. 48,No Discount,3578.27,0.00 363,NULL,1,Road-150 Red. 48,No Discount,3578.27,0.00 364,NULL,1,Road-650 Red. 52,No Discount,699.0982,0.00 365,NULL,1,Road-150 Red. 52,No Discount,3578.27,0.00 366,NULL,1,Road-150 Red. 56,No Discount,3578.27,0.00 367,NULL,1,Road-150 Red. 56,No Discount,3578.27,0.00 368,NULL,1,Road-150 Red. 44,No Discount,3578.27,0.00 369,NULL,1,Road-150 Red. 62,No Discount,3578.27,0.00 370,NULL,1,Road-150 Red. 44,No Discount,3578.27,0.00 371,NULL,1,Road-150 Red. 56,No Discount,3578.27,0.00 372,NULL,1,Road-150 Red. 44,No Discount,3578.27,0.00 373,NULL,1,Road-650 Black. 62,No Discount,699.0982,0.00 374,NULL,1,Road-150 Red. 44,No Discount,3578.27,0.00 375,NULL,1,Road-150 Red. 48,No Discount,3578.27,0.00 376,NULL,1,Road-150 Red. 44,No Discount,3578.27,0.00 377,NULL,1,Road-150 Red. 62,No Discount,3578.27,0.00 378,NULL,1,Road-150 Red. 48,No Discount,3578.27,0.00 379,NULL,1,Road-650 Black. 58,No Discount,699.0982,0.00 380,NULL,1,Road-150 Red. 44,No Discount,3578.27,0.00 381,NULL,1,Road-150 Red. 44,No Discount,3578.27,0.00 382,NULL,1,Road-650 Black. 58,No Discount,699.0982,0.00 383,NULL,1,Road-150 Red. 44,No Discount,3578.27,0.00 384,NULL,1,Road-150 Red. 52,No Discount,3578.27,0.00 385,NULL,1,Mountain-100 Silver. 44,No Discount,3399.99,0.00 386,NULL,1,Mountain-100 Silver. 44,No Discount,3399.99,0.00 387,NULL,1,Road-150 Red. 56,No Discount,3578.27,0.00 388,NULL,1,Mountain-100 Black. 44,No Discount,3374.99,0.00 389,NULL,1,Road-150 Red. 48,No Discount,3578.27,0.00 390,NULL,1,Road-150 Red. 48,No Discount,3578.27,0.00 391,NULL,1,Road-150 Red. 62,No Discount,3578.27,0.00 392,NULL,1,Mountain-100 Silver. 44,No Discount,3399.99,0.00 393,NULL,1,Road-150 Red. 44,No Discount,3578.27,0.00 394,NULL,1,Road-150 Red. 48,No Discount,3578.27,0.00 395,NULL,1,Road-150 Red. 62,No Discount,3578.27,0.00 396,NULL,1,Road-150 Red. 48,No Discount,3578.27,0.00 397,NULL,1,Road-150 Red. 62,No Discount,3578.27,0.00 398,NULL,1,Road-150 Red. 56,No Discount,3578.27,0.00 399,NULL,1,Mountain-100 Silver. 48,No Discount,3399.99,0.00 400,NULL,1,Road-150 Red. 52,No Discount,3578.27,0.00 401,NULL,1,Road-150 Red. 44,No Discount,3578.27,0.00 402,NULL,1,Road-150 Red. 48,No Discount,3578.27,0.00 403,NULL,1,Road-150 Red. 56,No Discount,3578.27,0.00 404,NULL,1,Road-150 Red. 52,No Discount,3578.27,0.00 405,NULL,1,Road-150 Red. 56,No Discount,3578.27,0.00 406,NULL,1,Road-150 Red. 44,No Discount,3578.27,0.00 407,NULL,1,Road-150 Red. 52,No Discount,3578.27,0.00 408,NULL,1,Road-150 Red. 44,No Discount,3578.27,0.00 409,NULL,1,Road-150 Red. 62,No Discount,3578.27,0.00 410,NULL,1,Road-150 Red. 48,No Discount,3578.27,0.00 411,NULL,1,Road-150 Red. 44,No Discount,3578.27,0.00 412,NULL,1,Road-650 Black. 58,No Discount,699.0982,0.00 413,NULL,1,Mountain-100 Black. 44,No Discount,3374.99,0.00 414,NULL,1,Road-150 Red. 62,No Discount,3578.27,0.00 415,NULL,1,Road-150 Red. 62,No Discount,3578.27,0.00 416,NULL,1,Road-150 Red. 56,No Discount,3578.27,0.00 417,NULL,1,Road-150 Red. 62,No Discount,3578.27,0.00 418,NULL,1,Road-150 Red. 56,No Discount,3578.27,0.00 419,NULL,1,Road-150 Red. 52,No Discount,3578.27,0.00 420,NULL,1,Road-150 Red. 62,No Discount,3578.27,0.00 421,NULL,1,Mountain-100 Silver. 44,No Discount,3399.99,0.00 422,NULL,1,Road-150 Red. 52,No Discount,3578.27,0.00 423,NULL,1,Mountain-100 Black. 44,No Discount,3374.99,0.00 424,NULL,1,Road-150 Red. 48,No Discount,3578.27,0.00 425,NULL,1,Road-150 Red. 48,No Discount,3578.27,0.00 426,NULL,1,Road-150 Red. 48,No Discount,3578.27,0.00 427,NULL,1,Road-650 Red. 52,No Discount,699.0982,0.00 428,NULL,1,Road-150 Red. 48,No Discount,3578.27,0.00 429,NULL,1,Road-150 Red. 56,No Discount,3578.27,0.00 430,NULL,1,Road-150 Red. 52,No Discount,3578.27,0.00 431,NULL,1,Mountain-100 Silver. 48,No Discount,3399.99,0.00 432,NULL,1,Road-150 Red. 56,No Discount,3578.27,0.00 433,NULL,1,Road-150 Red. 44,No Discount,3578.27,0.00 434,NULL,1,Mountain-100 Silver. 42,No Discount,3399.99,0.00 435,NULL,1,Road-650 Red. 44,No Discount,699.0982,0.00 436,NULL,1,Road-150 Red. 44,No Discount,3578.27,0.00 437,NULL,1,Road-150 Red. 48,No Discount,3578.27,0.00 438,NULL,1,Road-150 Red. 48,No Discount,3578.27,0.00 439,NULL,1,Road-150 Red. 48,No Discount,3578.27,0.00 440,NULL,1,Road-150 Red. 62,No Discount,3578.27,0.00 441,NULL,1,Road-150 Red. 44,No Discount,3578.27,0.00 442,NULL,1,Road-150 Red. 44,No Discount,3578.27,0.00 443,NULL,1,Mountain-100 Silver. 38,No Discount,3399.99,0.00 444,NULL,1,Mountain-100 Black. 48,No Discount,3374.99,0.00 445,NULL,1,Mountain-100 Black. 48,No Discount,3374.99,0.00 446,NULL,1,Mountain-100 Silver. 38,No Discount,3399.99,0.00 447,NULL,1,Road-150 Red. 56,No Discount,3578.27,0.00 448,NULL,1,Road-150 Red. 48,No Discount,3578.27,0.00 449,NULL,1,Mountain-100 Silver. 38,No Discount,3399.99,0.00 450,NULL,1,Mountain-100 Silver. 48,No Discount,3399.99,0.00 451,NULL,1,Road-150 Red. 48,No Discount,3578.27,0.00 452,NULL,1,Road-650 Black. 52,No Discount,699.0982,0.00 453,NULL,1,Road-150 Red. 48,No Discount,3578.27,0.00 454,NULL,1,Road-150 Red. 62,No Discount,3578.27,0.00 455,NULL,1,Road-150 Red. 48,No Discount,3578.27,0.00 456,NULL,1,Road-150 Red. 44,No Discount,3578.27,0.00 457,NULL,1,Road-150 Red. 44,No Discount,3578.27,0.00 458,NULL,1,Road-150 Red. 48,No Discount,3578.27,0.00 459,NULL,1,Road-150 Red. 56,No Discount,3578.27,0.00 460,NULL,1,Road-150 Red. 62,No Discount,3578.27,0.00 461,NULL,1,Road-650 Red. 48,No Discount,699.0982,0.00 462,NULL,1,Road-150 Red. 48,No Discount,3578.27,0.00 463,NULL,1,Road-150 Red. 48,No Discount,3578.27,0.00 464,NULL,1,Road-150 Red. 52,No Discount,3578.27,0.00 465,NULL,1,Road-150 Red. 62,No Discount,3578.27,0.00 466,NULL,1,Mountain-100 Silver. 42,No Discount,3399.99,0.00 467,NULL,1,Mountain-100 Silver. 44,No Discount,3399.99,0.00 468,NULL,1,Road-150 Red. 48,No Discount,3578.27,0.00 469,NULL,1,Mountain-100 Black. 44,No Discount,3374.99,0.00 470,NULL,1,Mountain-100 Black. 44,No Discount,3374.99,0.00 471,NULL,1,Road-150 Red. 44,No Discount,3578.27,0.00 472,NULL,1,Road-150 Red. 56,No Discount,3578.27,0.00 473,NULL,1,Road-150 Red. 62,No Discount,3578.27,0.00 474,NULL,1,Road-150 Red. 48,No Discount,3578.27,0.00 475,NULL,1,Mountain-100 Silver. 44,No Discount,3399.99,0.00 476,NULL,1,Road-150 Red. 48,No Discount,3578.27,0.00 477,NULL,1,Road-150 Red. 62,No Discount,3578.27,0.00 478,NULL,1,Road-150 Red. 52,No Discount,3578.27,0.00 479,NULL,1,Road-650 Black. 52,No Discount,699.0982,0.00 480,NULL,1,Road-650 Black. 44,No Discount,699.0982,0.00 481,NULL,1,Road-150 Red. 52,No Discount,3578.27,0.00 482,NULL,1,Mountain-100 Black. 38,No Discount,3374.99,0.00 483,NULL,1,Road-650 Black. 44,No Discount,699.0982,0.00 484,NULL,1,Road-150 Red. 62,No Discount,3578.27,0.00 485,NULL,1,Road-150 Red. 62,No Discount,3578.27,0.00 486,NULL,1,Road-150 Red. 44,No Discount,3578.27,0.00 487,NULL,1,Mountain-100 Black. 42,No Discount,3374.99,0.00 488,NULL,1,Road-150 Red. 62,No Discount,3578.27,0.00 489,NULL,1,Road-150 Red. 62,No Discount,3578.27,0.00 490,NULL,1,Mountain-100 Black. 38,No Discount,3374.99,0.00 491,NULL,1,Mountain-100 Black. 38,No Discount,3374.99,0.00 492,NULL,1,Road-650 Red. 62,No Discount,699.0982,0.00 493,NULL,1,Mountain-100 Black. 44,No Discount,3374.99,0.00 494,NULL,1,Road-150 Red. 52,No Discount,3578.27,0.00 495,NULL,1,Road-150 Red. 44,No Discount,3578.27,0.00 496,NULL,1,Road-650 Red. 44,No Discount,699.0982,0.00 497,NULL,1,Road-150 Red. 56,No Discount,3578.27,0.00 498,NULL,1,Road-150 Red. 48,No Discount,3578.27,0.00 499,AEB6-4356-80,2,Mountain-100 Silver. 48,No Discount,2039.994,0.00 500,AEB6-4356-80,2,Mountain-100 Black. 48,No Discount,2024.994,0.00 501,AEB6-4356-80,2,HL Mountain Frame - Silver. 46,No Discount,722.5949,0.00 502,AEB6-4356-80,5,Mountain-100 Black. 44,No Discount,2024.994,0.00 503,AEB6-4356-80,2,HL Mountain Frame - Silver. 38,No Discount,722.5949,0.00 504,AEB6-4356-80,1,HL Mountain Frame - Silver. 48,No Discount,818.70,0.00 505,AEB6-4356-80,1,HL Mountain Frame - Black. 48,No Discount,809.76,0.00 506,AEB6-4356-80,2,Mountain-100 Silver. 38,No Discount,2039.994,0.00 507,AEB6-4356-80,2,Mountain Bike Socks. M,No Discount,5.70,0.00 508,AEB6-4356-80,3,Mountain-100 Black. 42,No Discount,2024.994,0.00 509,15C3-40C5-AC,4,Mountain-100 Black. 38,No Discount,2024.994,0.00 510,15C3-40C5-AC,2,Mountain-100 Black. 42,No Discount,2024.994,0.00 511,15C3-40C5-AC,3,Mountain-100 Black. 44,No Discount,2024.994,0.00 512,15C3-40C5-AC,1,Mountain-100 Black. 48,No Discount,2024.994,0.00 513,2E65-4D8B-9A,1,LL Road Frame - Red. 44,No Discount,183.9382,0.00 514,2E65-4D8B-9A,3,Long-Sleeve Logo Jersey. L,No Discount,28.8404,0.00 515,2E65-4D8B-9A,1,Road-650 Black. 52,No Discount,419.4589,0.00 516,2E65-4D8B-9A,2,Road-650 Red. 48,No Discount,419.4589,0.00 517,2E65-4D8B-9A,2,Road-650 Red. 62,No Discount,419.4589,0.00 518,2E65-4D8B-9A,1,Road-450 Red. 58,No Discount,874.794,0.00 519,2E65-4D8B-9A,2,Road-650 Black. 58,No Discount,419.4589,0.00 520,2E65-4D8B-9A,2,Road-150 Red. 56,No Discount,2146.962,0.00 521,2E65-4D8B-9A,1,LL Road Frame - Red. 60,No Discount,183.9382,0.00 522,2E65-4D8B-9A,4,AWC Logo Cap,No Discount,5.1865,0.00 523,A787-4CD2-A0,3,LL Road Frame - Red. 60,No Discount,183.9382,0.00 524,A787-4CD2-A0,1,AWC Logo Cap,No Discount,5.1865,0.00 525,A787-4CD2-A0,1,LL Road Frame - Black. 52,No Discount,178.5808,0.00 526,A787-4CD2-A0,1,LL Road Frame - Red. 44,No Discount,183.9382,0.00 527,4E09-4638-82,1,Long-Sleeve Logo Jersey. L,No Discount,28.8404,0.00 528,4E09-4638-82,1,AWC Logo Cap,No Discount,5.1865,0.00 529,4E09-4638-82,1,Road-450 Red. 52,No Discount,874.794,0.00 530,FB94-4C38-B1,1,Mountain-100 Silver. 44,No Discount,2039.994,0.00 531,FB94-4C38-B1,1,Mountain-100 Black. 48,No Discount,2024.994,0.00 532,FB94-4C38-B1,1,Mountain-100 Black. 38,No Discount,2024.994,0.00 533,FB94-4C38-B1,4,Mountain-100 Black. 42,No Discount,2024.994,0.00 534,FB94-4C38-B1,2,Mountain-100 Silver. 38,No Discount,2039.994,0.00 535,D0B8-4476-BA,2,Mountain-100 Black. 42,No Discount,2024.994,0.00 536,D0B8-4476-BA,1,Long-Sleeve Logo Jersey. M,No Discount,28.8404,0.00 537,D0B8-4476-BA,2,Mountain-100 Black. 44,No Discount,2024.994,0.00 538,D0B8-4476-BA,2,Mountain-100 Silver. 38,No Discount,2039.994,0.00 539,D0B8-4476-BA,1,Sport-100 Helmet. Blue,No Discount,20.1865,0.00 540,D0B8-4476-BA,1,Mountain-100 Silver. 44,No Discount,2039.994,0.00 541,D0B8-4476-BA,4,Long-Sleeve Logo Jersey. L,No Discount,28.8404,0.00 542,D0B8-4476-BA,1,Mountain-100 Silver. 42,No Discount,2039.994,0.00 543,D0B8-4476-BA,1,Sport-100 Helmet. Red,No Discount,20.1865,0.00 544,D0B8-4476-BA,2,Mountain-100 Silver. 48,No Discount,2039.994,0.00 545,D0B8-4476-BA,1,Sport-100 Helmet. Black,No Discount,20.1865,0.00 546,EBA6-4C6F-86,1,Road-650 Black. 58,No Discount,419.4589,0.00 547,EBA6-4C6F-86,1,Road-450 Red. 60,No Discount,874.794,0.00 548,EBA6-4C6F-86,1,Road-650 Red. 62,No Discount,419.4589,0.00 549,EBA6-4C6F-86,2,Road-650 Red. 44,No Discount,419.4589,0.00 550,EBA6-4C6F-86,1,Road-150 Red. 56,No Discount,2146.962,0.00 551,EBA6-4C6F-86,3,LL Road Frame - Red. 44,No Discount,183.9382,0.00 552,EBA6-4C6F-86,1,LL Road Frame - Red. 60,No Discount,183.9382,0.00 553,EBA6-4C6F-86,3,Road-450 Red. 52,No Discount,874.794,0.00 554,EBA6-4C6F-86,1,Road-450 Red. 44,No Discount,874.794,0.00 555,EBA6-4C6F-86,3,ML Road Frame - Red. 48,No Discount,356.898,0.00 556,EBA6-4C6F-86,1,LL Road Frame - Black. 52,No Discount,178.5808,0.00 557,56EA-48EB-96,2,Road-650 Red. 62,No Discount,419.4589,0.00 558,56EA-48EB-96,1,Road-650 Red. 60,No Discount,419.4589,0.00 559,56EA-48EB-96,1,Sport-100 Helmet. Blue,No Discount,20.1865,0.00 560,56EA-48EB-96,3,Road-650 Black. 52,No Discount,419.4589,0.00 561,56EA-48EB-96,1,Sport-100 Helmet. Red,No Discount,20.1865,0.00 562,56EA-48EB-96,1,LL Road Frame - Red. 44,No Discount,183.9382,0.00 563,56EA-48EB-96,1,Road-450 Red. 58,No Discount,874.794,0.00 564,56EA-48EB-96,3,LL Road Frame - Black. 52,No Discount,178.5808,0.00 565,56EA-48EB-96,1,Road-150 Red. 56,No Discount,2146.962,0.00 566,56EA-48EB-96,1,Road-650 Black. 58,No Discount,419.4589,0.00 567,56EA-48EB-96,1,AWC Logo Cap,No Discount,5.1865,0.00 568,56EA-48EB-96,3,Sport-100 Helmet. Black,No Discount,20.1865,0.00 569,C745-45C2-A1,1,Mountain-100 Black. 42,No Discount,2024.994,0.00 570,434D-4DAA-96,2,Mountain-100 Black. 44,No Discount,2024.994,0.00 571,434D-4DAA-96,1,Mountain-100 Silver. 44,No Discount,2039.994,0.00 572,434D-4DAA-96,1,Mountain-100 Silver. 38,No Discount,2039.994,0.00 573,434D-4DAA-96,4,Mountain-100 Black. 42,No Discount,2024.994,0.00 574,434D-4DAA-96,2,Mountain-100 Black. 38,No Discount,2024.994,0.00 575,434D-4DAA-96,3,Mountain-100 Black. 48,No Discount,2024.994,0.00 576,D379-445F-92,2,Road-450 Red. 52,No Discount,874.794,0.00 577,FB88-4B92-82,2,Road-650 Black. 58,No Discount,419.4589,0.00 578,FB88-4B92-82,2,Road-650 Red. 60,No Discount,419.4589,0.00 579,FB88-4B92-82,1,Road-150 Red. 56,No Discount,2146.962,0.00 580,FB88-4B92-82,4,Road-650 Red. 62,No Discount,419.4589,0.00 581,FB88-4B92-82,1,LL Road Frame - Black. 52,No Discount,178.5808,0.00 582,FB88-4B92-82,3,Road-650 Red. 44,No Discount,419.4589,0.00 583,FB88-4B92-82,2,ML Road Frame - Red. 48,No Discount,356.898,0.00 584,FB88-4B92-82,1,Road-650 Black. 60,No Discount,419.4589,0.00 585,FB88-4B92-82,1,LL Road Frame - Red. 48,No Discount,183.9382,0.00 586,FB88-4B92-82,2,Road-650 Black. 52,No Discount,419.4589,0.00 587,FB88-4B92-82,1,LL Road Frame - Red. 44,No Discount,183.9382,0.00 588,FB88-4B92-82,1,Road-450 Red. 60,No Discount,874.794,0.00 589,FB88-4B92-82,2,Road-650 Black. 44,No Discount,419.4589,0.00 590,745E-4F74-BC,2,Mountain Bike Socks. M,No Discount,5.70,0.00 591,745E-4F74-BC,1,Mountain-100 Black. 44,No Discount,2024.994,0.00 592,0CD4-4091-9B,1,Road-650 Red. 60,No Discount,419.4589,0.00 593,0CD4-4091-9B,1,Road-650 Black. 58,No Discount,419.4589,0.00 594,0CD4-4091-9B,2,Road-650 Red. 44,No Discount,419.4589,0.00 595,0CD4-4091-9B,3,Road-450 Red. 52,No Discount,874.794,0.00 596,0CD4-4091-9B,1,Long-Sleeve Logo Jersey. L,No Discount,28.8404,0.00 597,0CD4-4091-9B,3,AWC Logo Cap,No Discount,5.1865,0.00 598,0CD4-4091-9B,1,Long-Sleeve Logo Jersey. XL,No Discount,28.8404,0.00 599,0CD4-4091-9B,1,LL Road Frame - Red. 44,No Discount,183.9382,0.00 600,0CD4-4091-9B,2,Sport-100 Helmet. Blue,No Discount,20.1865,0.00 601,0CD4-4091-9B,1,Sport-100 Helmet. Black,No Discount,20.1865,0.00 602,0CD4-4091-9B,2,LL Road Frame - Black. 52,No Discount,178.5808,0.00 603,0CD4-4091-9B,1,Road-650 Red. 48,No Discount,419.4589,0.00 604,0CD4-4091-9B,2,Road-450 Red. 58,No Discount,874.794,0.00 605,0CD4-4091-9B,2,Sport-100 Helmet. Red,No Discount,20.1865,0.00 606,8FFA-4339-B7,2,Road-650 Red. 44,No Discount,419.4589,0.00 607,8FFA-4339-B7,2,Road-650 Red. 62,No Discount,419.4589,0.00 608,8FFA-4339-B7,5,Road-650 Black. 52,No Discount,419.4589,0.00 609,8FFA-4339-B7,1,Road-650 Black. 58,No Discount,419.4589,0.00 610,8FFA-4339-B7,2,LL Road Frame - Black. 52,No Discount,178.5808,0.00 611,8FFA-4339-B7,3,Road-650 Red. 48,No Discount,419.4589,0.00 612,8FFA-4339-B7,2,Road-450 Red. 58,No Discount,874.794,0.00 613,8FFA-4339-B7,1,LL Road Frame - Black. 58,No Discount,178.5808,0.00 614,8FFA-4339-B7,2,Road-150 Red. 56,No Discount,2146.962,0.00 615,8FFA-4339-B7,1,LL Road Frame - Red. 48,No Discount,183.9382,0.00 616,8FFA-4339-B7,1,Road-650 Black. 60,No Discount,419.4589,0.00 617,8FFA-4339-B7,1,LL Road Frame - Red. 60,No Discount,183.9382,0.00 618,8FFA-4339-B7,1,Road-450 Red. 44,No Discount,874.794,0.00 619,2C16-4AA6-B4,1,Long-Sleeve Logo Jersey. L,No Discount,28.8404,0.00 620,2C16-4AA6-B4,1,Road-650 Red. 44,No Discount,419.4589,0.00 621,2C16-4AA6-B4,3,Road-450 Red. 52,No Discount,874.794,0.00 622,2C16-4AA6-B4,2,Road-650 Red. 60,No Discount,419.4589,0.00 623,E57D-4B4B-BF,2,Road-650 Red. 62,No Discount,419.4589,0.00 624,E57D-4B4B-BF,1,Road-650 Black. 52,No Discount,419.4589,0.00 625,E57D-4B4B-BF,2,Road-450 Red. 52,No Discount,874.794,0.00 626,E57D-4B4B-BF,2,Road-650 Black. 58,No Discount,419.4589,0.00 627,E57D-4B4B-BF,1,ML Road Frame - Red. 48,No Discount,356.898,0.00 628,E57D-4B4B-BF,1,Road-650 Red. 44,No Discount,419.4589,0.00 629,E57D-4B4B-BF,1,LL Road Frame - Black. 52,No Discount,178.5808,0.00 630,E57D-4B4B-BF,1,Road-650 Black. 44,No Discount,419.4589,0.00 631,E57D-4B4B-BF,2,Road-150 Red. 56,No Discount,2146.962,0.00 632,E57D-4B4B-BF,1,LL Road Frame - Red. 60,No Discount,183.9382,0.00 633,E57D-4B4B-BF,1,Road-650 Red. 48,No Discount,419.4589,0.00 634,E57D-4B4B-BF,1,Road-450 Red. 44,No Discount,874.794,0.00 635,0CC0-4166-9E,1,ML Road Frame - Red. 48,No Discount,356.898,0.00 636,0CC0-4166-9E,3,Road-650 Red. 52,No Discount,419.4589,0.00 637,0CC0-4166-9E,5,Road-650 Black. 52,No Discount,419.4589,0.00 638,0CC0-4166-9E,2,Road-650 Black. 44,No Discount,419.4589,0.00 639,0CC0-4166-9E,1,LL Road Frame - Red. 44,No Discount,183.9382,0.00 640,0CC0-4166-9E,9,Long-Sleeve Logo Jersey. L,No Discount,28.8404,0.00 641,0CC0-4166-9E,4,Road-650 Black. 58,No Discount,419.4589,0.00 642,0CC0-4166-9E,1,Road-150 Red. 56,No Discount,2146.962,0.00 643,0CC0-4166-9E,2,ML Road Frame - Red. 52,No Discount,356.898,0.00 644,0CC0-4166-9E,2,LL Road Frame - Red. 62,No Discount,183.9382,0.00 645,0CC0-4166-9E,2,Road-650 Black. 60,No Discount,419.4589,0.00 646,0CC0-4166-9E,4,Sport-100 Helmet. Blue,No Discount,20.1865,0.00 647,0CC0-4166-9E,3,Road-450 Red. 58,No Discount,874.794,0.00 648,0CC0-4166-9E,2,Road-450 Red. 44,No Discount,874.794,0.00 649,0CC0-4166-9E,2,LL Road Frame - Red. 60,No Discount,183.9382,0.00 650,0CC0-4166-9E,4,Road-650 Red. 60,No Discount,419.4589,0.00 651,0CC0-4166-9E,2,Road-450 Red. 60,No Discount,874.794,0.00 652,0CC0-4166-9E,6,Long-Sleeve Logo Jersey. XL,No Discount,28.8404,0.00 653,0CC0-4166-9E,2,Road-650 Red. 48,No Discount,419.4589,0.00 654,0CC0-4166-9E,2,Road-450 Red. 52,No Discount,874.794,0.00 655,0CC0-4166-9E,9,AWC Logo Cap,No Discount,5.1865,0.00 656,0CC0-4166-9E,2,Road-650 Red. 62,No Discount,419.4589,0.00 657,0CC0-4166-9E,4,Sport-100 Helmet. Red,No Discount,20.1865,0.00 658,0CC0-4166-9E,1,LL Road Frame - Black. 52,No Discount,178.5808,0.00 659,0CC0-4166-9E,3,Long-Sleeve Logo Jersey. M,No Discount,28.8404,0.00 660,0CC0-4166-9E,2,LL Road Frame - Black. 58,No Discount,178.5808,0.00 661,0CC0-4166-9E,3,Sport-100 Helmet. Black,No Discount,20.1865,0.00 662,68A2-4B5C-A7,4,Mountain-100 Silver. 38,No Discount,2039.994,0.00 663,68A2-4B5C-A7,1,HL Mountain Frame - Silver. 48,No Discount,818.70,0.00 664,68A2-4B5C-A7,3,Mountain-100 Black. 44,No Discount,2024.994,0.00 665,68A2-4B5C-A7,4,Mountain-100 Silver. 44,No Discount,2039.994,0.00 666,68A2-4B5C-A7,2,HL Mountain Frame - Black. 38,No Discount,714.7043,0.00 667,68A2-4B5C-A7,2,HL Mountain Frame - Silver. 38,No Discount,722.5949,0.00 668,68A2-4B5C-A7,2,Mountain-100 Silver. 48,No Discount,2039.994,0.00 669,68A2-4B5C-A7,1,HL Mountain Frame - Black. 48,No Discount,809.76,0.00 670,68A2-4B5C-A7,4,Mountain Bike Socks. M,No Discount,5.70,0.00 671,D0C0-435D-A2,1,Road-450 Red. 52,No Discount,874.794,0.00 672,D0C0-435D-A2,1,AWC Logo Cap,No Discount,5.1865,0.00 673,D0C0-435D-A2,1,Road-650 Red. 60,No Discount,419.4589,0.00 674,D0C0-435D-A2,1,Road-650 Red. 44,No Discount,419.4589,0.00 675,B5D8-4B03-96,5,Mountain-100 Silver. 42,No Discount,2039.994,0.00 676,B5D8-4B03-96,1,HL Mountain Frame - Black. 38,No Discount,714.7043,0.00 677,B5D8-4B03-96,2,HL Mountain Frame - Silver. 48,No Discount,818.70,0.00 678,B5D8-4B03-96,2,Mountain-100 Black. 48,No Discount,2024.994,0.00 679,B5D8-4B03-96,4,Mountain-100 Black. 42,No Discount,2024.994,0.00 680,B5D8-4B03-96,1,HL Mountain Frame - Silver. 38,No Discount,722.5949,0.00 681,B5D8-4B03-96,2,Mountain-100 Silver. 38,No Discount,2039.994,0.00 682,B5D8-4B03-96,4,Mountain-100 Silver. 44,No Discount,2039.994,0.00 683,B5D8-4B03-96,1,HL Mountain Frame - Black. 48,No Discount,809.76,0.00 684,071C-4913-89,1,Road-450 Red. 52,No Discount,874.794,0.00 685,071C-4913-89,2,Road-650 Black. 52,No Discount,419.4589,0.00 686,071C-4913-89,1,Road-150 Red. 56,No Discount,2146.962,0.00 687,071C-4913-89,4,Road-650 Red. 60,No Discount,419.4589,0.00 688,071C-4913-89,1,LL Road Frame - Red. 44,No Discount,183.9382,0.00 689,071C-4913-89,4,LL Road Frame - Red. 60,No Discount,183.9382,0.00 690,071C-4913-89,1,Road-650 Red. 44,No Discount,419.4589,0.00 691,071C-4913-89,2,Road-650 Red. 48,No Discount,419.4589,0.00 692,071C-4913-89,5,Long-Sleeve Logo Jersey. L,No Discount,28.8404,0.00 693,071C-4913-89,1,LL Road Frame - Black. 52,No Discount,178.5808,0.00 694,071C-4913-89,3,AWC Logo Cap,No Discount,5.1865,0.00 695,071C-4913-89,3,Road-650 Black. 58,No Discount,419.4589,0.00 696,071C-4913-89,3,Road-650 Red. 62,No Discount,419.4589,0.00 697,071C-4913-89,3,Road-450 Red. 58,No Discount,874.794,0.00 698,B6E8-4721-85,1,Mountain-100 Silver. 38,No Discount,2039.994,0.00 699,B6E8-4721-85,1,Mountain-100 Black. 44,No Discount,2024.994,0.00 700,B6E8-4721-85,2,Mountain Bike Socks. M,No Discount,5.70,0.00 701,061F-4449-BE,1,Sport-100 Helmet. Black,No Discount,20.1865,0.00 702,061F-4449-BE,1,Mountain-100 Silver. 48,No Discount,2039.994,0.00 703,061F-4449-BE,2,Mountain-100 Black. 42,No Discount,2024.994,0.00 704,061F-4449-BE,2,Long-Sleeve Logo Jersey. L,No Discount,28.8404,0.00 705,061F-4449-BE,2,Mountain-100 Silver. 44,No Discount,2039.994,0.00 706,061F-4449-BE,2,Mountain Bike Socks. M,No Discount,5.70,0.00 707,061F-4449-BE,3,Long-Sleeve Logo Jersey. M,No Discount,28.8404,0.00 708,061F-4449-BE,4,Mountain-100 Silver. 38,No Discount,2039.994,0.00 709,061F-4449-BE,2,Sport-100 Helmet. Blue,No Discount,20.1865,0.00 710,061F-4449-BE,1,Sport-100 Helmet. Red,No Discount,20.1865,0.00 711,061F-4449-BE,2,Mountain-100 Black. 48,No Discount,2024.994,0.00 712,061F-4449-BE,4,AWC Logo Cap,No Discount,5.1865,0.00 713,061F-4449-BE,2,HL Mountain Frame - Black. 42,No Discount,714.7043,0.00 714,061F-4449-BE,1,HL Mountain Frame - Silver. 38,No Discount,722.5949,0.00 715,061F-4449-BE,3,HL Mountain Frame - Silver. 46,No Discount,722.5949,0.00 716,061F-4449-BE,2,HL Mountain Frame - Silver. 48,No Discount,818.70,0.00 717,061F-4449-BE,2,Mountain-100 Black. 44,No Discount,2024.994,0.00 718,061F-4449-BE,1,Long-Sleeve Logo Jersey. XL,No Discount,28.8404,0.00 719,5E0C-45B4-9D,1,Road-150 Red. 62,No Discount,2146.962,0.00 720,96FA-4DF1-81,1,HL Mountain Frame - Black. 38,No Discount,714.7043,0.00 721,96FA-4DF1-81,5,Mountain-100 Black. 38,No Discount,2024.994,0.00 722,96FA-4DF1-81,2,Mountain-100 Black. 44,No Discount,2024.994,0.00 723,96FA-4DF1-81,2,HL Mountain Frame - Black. 48,No Discount,809.76,0.00 724,96FA-4DF1-81,5,Mountain-100 Silver. 38,No Discount,2039.994,0.00 725,96FA-4DF1-81,4,Mountain-100 Silver. 42,No Discount,2039.994,0.00 726,96FA-4DF1-81,1,HL Mountain Frame - Black. 42,No Discount,714.7043,0.00 727,96FA-4DF1-81,1,Mountain-100 Silver. 48,No Discount,2039.994,0.00 728,96FA-4DF1-81,5,Mountain-100 Black. 48,No Discount,2024.994,0.00 729,96FA-4DF1-81,2,HL Mountain Frame - Silver. 46,No Discount,722.5949,0.00 730,1722-46CA-96,3,Road-650 Red. 60,No Discount,419.4589,0.00 731,1722-46CA-96,2,Road-650 Red. 44,No Discount,419.4589,0.00 732,1722-46CA-96,3,Long-Sleeve Logo Jersey. L,No Discount,28.8404,0.00 733,1722-46CA-96,3,Road-650 Black. 52,No Discount,419.4589,0.00 734,1722-46CA-96,1,Road-450 Red. 52,No Discount,874.794,0.00 735,01F1-4AD5-A5,1,AWC Logo Cap,No Discount,5.1865,0.00 736,01F1-4AD5-A5,1,Road-650 Red. 62,No Discount,419.4589,0.00 737,01F1-4AD5-A5,2,LL Road Frame - Red. 60,No Discount,183.9382,0.00 738,01F1-4AD5-A5,2,Sport-100 Helmet. Red,No Discount,20.1865,0.00 739,01F1-4AD5-A5,1,Road-450 Red. 52,No Discount,874.794,0.00 740,01F1-4AD5-A5,1,LL Road Frame - Red. 44,No Discount,183.9382,0.00 741,01F1-4AD5-A5,1,Road-650 Red. 44,No Discount,419.4589,0.00 742,01F1-4AD5-A5,2,Long-Sleeve Logo Jersey. L,No Discount,28.8404,0.00 743,01F1-4AD5-A5,3,Road-450 Red. 58,No Discount,874.794,0.00 744,01F1-4AD5-A5,1,Road-150 Red. 56,No Discount,2146.962,0.00 745,01F1-4AD5-A5,4,Sport-100 Helmet. Black,No Discount,20.1865,0.00 746,01F1-4AD5-A5,2,Road-650 Red. 60,No Discount,419.4589,0.00 747,01F1-4AD5-A5,3,Road-650 Black. 52,No Discount,419.4589,0.00 748,01F1-4AD5-A5,4,Sport-100 Helmet. Blue,No Discount,20.1865,0.00 749,52FF-45CD-9B,1,Road-650 Red. 48,No Discount,419.4589,0.00 750,52FF-45CD-9B,1,Sport-100 Helmet. Black,No Discount,20.1865,0.00 751,52FF-45CD-9B,3,Road-450 Red. 52,No Discount,874.794,0.00 752,52FF-45CD-9B,2,Road-450 Red. 44,No Discount,874.794,0.00 753,52FF-45CD-9B,1,Road-650 Black. 58,No Discount,419.4589,0.00 754,52FF-45CD-9B,2,Sport-100 Helmet. Blue,No Discount,20.1865,0.00 755,52FF-45CD-9B,4,Sport-100 Helmet. Red,No Discount,20.1865,0.00 756,52FF-45CD-9B,2,LL Road Frame - Red. 44,No Discount,183.9382,0.00 757,52FF-45CD-9B,1,ML Road Frame - Red. 48,No Discount,356.898,0.00 758,52FF-45CD-9B,1,LL Road Frame - Black. 52,No Discount,178.5808,0.00 759,52FF-45CD-9B,1,Road-150 Red. 56,No Discount,2146.962,0.00 760,52FF-45CD-9B,2,Road-450 Red. 58,No Discount,874.794,0.00 761,52FF-45CD-9B,1,Road-450 Red. 60,No Discount,874.794,0.00 762,52FF-45CD-9B,4,Long-Sleeve Logo Jersey. XL,No Discount,28.8404,0.00 763,52FF-45CD-9B,1,Road-650 Red. 60,No Discount,419.4589,0.00 764,52FF-45CD-9B,4,AWC Logo Cap,No Discount,5.1865,0.00 765,494C-48D2-BD,6,Road-650 Black. 52,No Discount,419.4589,0.00 766,494C-48D2-BD,2,Road-650 Red. 52,No Discount,419.4589,0.00 767,494C-48D2-BD,2,Road-150 Red. 62,No Discount,2146.962,0.00 768,494C-48D2-BD,5,LL Road Frame - Red. 48,No Discount,183.9382,0.00 769,494C-48D2-BD,5,LL Road Frame - Red. 60,No Discount,183.9382,0.00 770,494C-48D2-BD,1,Road-450 Red. 60,No Discount,874.794,0.00 771,494C-48D2-BD,1,LL Road Frame - Black. 52,No Discount,178.5808,0.00 772,494C-48D2-BD,3,Road-650 Black. 60,No Discount,419.4589,0.00 773,494C-48D2-BD,3,LL Road Frame - Black. 58,No Discount,178.5808,0.00 774,494C-48D2-BD,5,Road-450 Red. 52,No Discount,874.794,0.00 775,494C-48D2-BD,5,Road-650 Red. 60,No Discount,419.4589,0.00 776,494C-48D2-BD,3,ML Road Frame - Red. 52,No Discount,356.898,0.00 777,494C-48D2-BD,2,Road-650 Black. 44,No Discount,419.4589,0.00 778,494C-48D2-BD,1,Road-450 Red. 44,No Discount,874.794,0.00 779,494C-48D2-BD,5,Sport-100 Helmet. Red,No Discount,20.1865,0.00 780,494C-48D2-BD,1,Road-650 Black. 58,No Discount,419.4589,0.00 781,494C-48D2-BD,2,Sport-100 Helmet. Blue,No Discount,20.1865,0.00 782,494C-48D2-BD,6,Road-450 Red. 58,No Discount,874.794,0.00 783,494C-48D2-BD,3,LL Road Frame - Red. 62,No Discount,183.9382,0.00 784,494C-48D2-BD,6,Road-650 Red. 62,No Discount,419.4589,0.00 785,494C-48D2-BD,5,Road-650 Red. 48,No Discount,419.4589,0.00 786,494C-48D2-BD,1,Long-Sleeve Logo Jersey. XL,No Discount,28.8404,0.00 787,494C-48D2-BD,5,Long-Sleeve Logo Jersey. L,No Discount,28.8404,0.00 788,494C-48D2-BD,1,Long-Sleeve Logo Jersey. M,No Discount,28.8404,0.00 789,494C-48D2-BD,4,Road-650 Red. 44,No Discount,419.4589,0.00 790,494C-48D2-BD,2,LL Road Frame - Red. 44,No Discount,183.9382,0.00 791,494C-48D2-BD,2,Road-150 Red. 56,No Discount,2146.962,0.00 792,494C-48D2-BD,6,ML Road Frame - Red. 48,No Discount,356.898,0.00 793,190B-4F56-9E,1,Road-650 Red. 48,No Discount,419.4589,0.00 794,CE1F-4E31-89,6,Mountain-100 Black. 48,No Discount,2024.994,0.00 795,CE1F-4E31-89,2,HL Mountain Frame - Black. 38,No Discount,714.7043,0.00 796,CE1F-4E31-89,1,HL Mountain Frame - Silver. 48,No Discount,818.70,0.00 797,CE1F-4E31-89,2,Mountain Bike Socks. M,No Discount,5.70,0.00 798,CE1F-4E31-89,2,Long-Sleeve Logo Jersey. L,No Discount,28.8404,0.00 799,CE1F-4E31-89,7,Mountain-100 Silver. 48,No Discount,2039.994,0.00 800,CE1F-4E31-89,6,Mountain-100 Silver. 38,No Discount,2039.994,0.00 801,CE1F-4E31-89,2,Sport-100 Helmet. Red,No Discount,20.1865,0.00 802,CE1F-4E31-89,5,HL Mountain Frame - Silver. 38,No Discount,722.5949,0.00 803,CE1F-4E31-89,12,Mountain-100 Silver. 44,Volume Discount 11 to 14,1971.9942,0.02 804,CE1F-4E31-89,1,HL Mountain Frame - Black. 48,No Discount,809.76,0.00 805,CE1F-4E31-89,13,Mountain-100 Black. 38,Volume Discount 11 to 14,1957.4942,0.02 806,CE1F-4E31-89,2,Mountain-100 Silver. 42,No Discount,2039.994,0.00 807,CE1F-4E31-89,8,Mountain-100 Black. 42,No Discount,2024.994,0.00 808,CE1F-4E31-89,2,HL Mountain Frame - Black. 42,No Discount,714.7043,0.00 809,CE1F-4E31-89,2,AWC Logo Cap,No Discount,5.1865,0.00 810,CE1F-4E31-89,2,Mountain-100 Black. 44,No Discount,2024.994,0.00 811,CE1F-4E31-89,3,Long-Sleeve Logo Jersey. XL,No Discount,28.8404,0.00 812,CE1F-4E31-89,5,Sport-100 Helmet. Black,No Discount,20.1865,0.00 813,CE1F-4E31-89,3,HL Mountain Frame - Silver. 46,No Discount,722.5949,0.00 814,CE1F-4E31-89,2,Long-Sleeve Logo Jersey. M,No Discount,28.8404,0.00 815,1E6F-4150-A3,2,Road-650 Red. 44,No Discount,419.4589,0.00 816,1E6F-4150-A3,1,Road-450 Red. 52,No Discount,874.794,0.00 817,1E6F-4150-A3,3,Road-650 Red. 48,No Discount,419.4589,0.00 818,1E6F-4150-A3,2,Road-450 Red. 58,No Discount,874.794,0.00 819,1E6F-4150-A3,2,LL Road Frame - Red. 44,No Discount,183.9382,0.00 820,1E6F-4150-A3,2,Road-650 Red. 62,No Discount,419.4589,0.00 821,1E6F-4150-A3,2,Road-650 Black. 52,No Discount,419.4589,0.00 822,1E6F-4150-A3,2,LL Road Frame - Red. 60,No Discount,183.9382,0.00 823,4ECF-42F2-A7,4,Long-Sleeve Logo Jersey. L,No Discount,28.8404,0.00 824,4ECF-42F2-A7,2,Sport-100 Helmet. Black,No Discount,20.1865,0.00 825,4ECF-42F2-A7,5,Mountain Bike Socks. M,No Discount,5.70,0.00 826,4ECF-42F2-A7,3,Mountain-100 Silver. 38,No Discount,2039.994,0.00 827,4ECF-42F2-A7,2,Mountain-100 Black. 38,No Discount,2024.994,0.00 828,4ECF-42F2-A7,4,Mountain-100 Silver. 48,No Discount,2039.994,0.00 829,4ECF-42F2-A7,1,Mountain-100 Black. 48,No Discount,2024.994,0.00 830,4ECF-42F2-A7,1,Long-Sleeve Logo Jersey. XL,No Discount,28.8404,0.00 831,4ECF-42F2-A7,1,Sport-100 Helmet. Blue,No Discount,20.1865,0.00 832,4ECF-42F2-A7,2,Sport-100 Helmet. Red,No Discount,20.1865,0.00 833,FC28-4F00-A9,1,Mountain-100 Silver. 42,No Discount,2039.994,0.00 834,FC28-4F00-A9,1,Mountain-100 Silver. 38,No Discount,2039.994,0.00 835,EDC5-4BD5-8F,3,Road-650 Red. 44,No Discount,419.4589,0.00 836,EDC5-4BD5-8F,2,Road-650 Red. 48,No Discount,419.4589,0.00 837,EDC5-4BD5-8F,3,Road-650 Red. 60,No Discount,419.4589,0.00 838,EDC5-4BD5-8F,2,Road-650 Red. 52,No Discount,419.4589,0.00 839,EDC5-4BD5-8F,2,Long-Sleeve Logo Jersey. L,No Discount,28.8404,0.00 840,EDC5-4BD5-8F,4,LL Road Frame - Red. 44,No Discount,183.9382,0.00 841,EDC5-4BD5-8F,4,Long-Sleeve Logo Jersey. M,No Discount,28.8404,0.00 842,EDC5-4BD5-8F,4,Road-650 Black. 52,No Discount,419.4589,0.00 843,EDC5-4BD5-8F,3,LL Road Frame - Red. 62,No Discount,183.9382,0.00 844,EDC5-4BD5-8F,2,Road-450 Red. 58,No Discount,874.794,0.00 845,EDC5-4BD5-8F,2,LL Road Frame - Red. 48,No Discount,183.9382,0.00 846,EDC5-4BD5-8F,1,Long-Sleeve Logo Jersey. XL,No Discount,28.8404,0.00 847,EDC5-4BD5-8F,2,Road-650 Black. 60,No Discount,419.4589,0.00 848,EDC5-4BD5-8F,3,Road-650 Black. 58,No Discount,419.4589,0.00 849,EDC5-4BD5-8F,3,LL Road Frame - Red. 60,No Discount,183.9382,0.00 850,EDC5-4BD5-8F,1,Road-650 Black. 44,No Discount,419.4589,0.00 851,EDC5-4BD5-8F,5,Sport-100 Helmet. Black,No Discount,20.1865,0.00 852,EDC5-4BD5-8F,3,Road-450 Red. 52,No Discount,874.794,0.00 853,EDC5-4BD5-8F,1,Road-450 Red. 44,No Discount,874.794,0.00 854,EDC5-4BD5-8F,3,LL Road Frame - Black. 52,No Discount,178.5808,0.00 855,EDC5-4BD5-8F,2,Road-450 Red. 60,No Discount,874.794,0.00 856,EDC5-4BD5-8F,4,Sport-100 Helmet. Red,No Discount,20.1865,0.00 857,EDC5-4BD5-8F,5,Sport-100 Helmet. Blue,No Discount,20.1865,0.00 858,EDC5-4BD5-8F,5,LL Road Frame - Black. 58,No Discount,178.5808,0.00 859,EDC5-4BD5-8F,1,Road-150 Red. 56,No Discount,2146.962,0.00 860,EDC5-4BD5-8F,13,AWC Logo Cap,Volume Discount 11 to 14,5.0136,0.02 861,3269-4442-87,3,Road-650 Red. 60,No Discount,419.4589,0.00 862,3269-4442-87,2,Road-450 Red. 60,No Discount,874.794,0.00 863,3269-4442-87,3,Road-650 Red. 44,No Discount,419.4589,0.00 864,3269-4442-87,3,Road-650 Black. 52,No Discount,419.4589,0.00 865,3269-4442-87,1,Road-650 Black. 60,No Discount,419.4589,0.00 866,3269-4442-87,1,LL Road Frame - Black. 52,No Discount,178.5808,0.00 867,3269-4442-87,1,ML Road Frame - Red. 48,No Discount,356.898,0.00 868,3269-4442-87,2,Road-150 Red. 56,No Discount,2146.962,0.00 869,3269-4442-87,2,Road-450 Red. 44,No Discount,874.794,0.00 870,3269-4442-87,2,LL Road Frame - Red. 44,No Discount,183.9382,0.00 871,3269-4442-87,2,Road-450 Red. 52,No Discount,874.794,0.00 872,3269-4442-87,1,Road-650 Red. 52,No Discount,419.4589,0.00 873,3269-4442-87,1,Road-650 Black. 44,No Discount,419.4589,0.00 874,89D3-483D-8F,2,Mountain-100 Black. 42,No Discount,2024.994,0.00 875,89D3-483D-8F,2,Mountain-100 Black. 48,No Discount,2024.994,0.00 876,89D3-483D-8F,5,Mountain-100 Silver. 42,No Discount,2039.994,0.00 877,89D3-483D-8F,3,Mountain-100 Silver. 48,No Discount,2039.994,0.00 878,89D3-483D-8F,3,Mountain-100 Black. 44,No Discount,2024.994,0.00 879,89D3-483D-8F,2,Long-Sleeve Logo Jersey. M,No Discount,28.8404,0.00 880,89D3-483D-8F,4,Mountain-100 Silver. 44,No Discount,2039.994,0.00 881,89D3-483D-8F,21,Mountain Bike Socks. M,Volume Discount 15 to 24,5.225,0.05 882,8137-47B8-9B,1,Mountain-100 Black. 48,No Discount,2024.994,0.00 883,E43E-40BF-9B,2,LL Road Frame - Red. 48,No Discount,183.9382,0.00 884,E43E-40BF-9B,1,ML Road Frame - Red. 48,No Discount,356.898,0.00 885,E43E-40BF-9B,2,Road-650 Red. 48,No Discount,419.4589,0.00 886,E43E-40BF-9B,1,Road-650 Black. 44,No Discount,419.4589,0.00 887,E43E-40BF-9B,2,Road-650 Black. 52,No Discount,419.4589,0.00 888,E43E-40BF-9B,2,AWC Logo Cap,No Discount,5.1865,0.00 889,E43E-40BF-9B,2,Road-650 Red. 60,No Discount,419.4589,0.00 890,E43E-40BF-9B,1,LL Road Frame - Black. 58,No Discount,178.5808,0.00 891,E43E-40BF-9B,1,LL Road Frame - Red. 44,No Discount,183.9382,0.00 892,E43E-40BF-9B,3,LL Road Frame - Black. 52,No Discount,178.5808,0.00 893,E43E-40BF-9B,1,Road-150 Red. 62,No Discount,2146.962,0.00 894,E43E-40BF-9B,3,Road-650 Red. 44,No Discount,419.4589,0.00 895,E43E-40BF-9B,3,Road-450 Red. 52,No Discount,874.794,0.00 896,E43E-40BF-9B,2,Road-450 Red. 58,No Discount,874.794,0.00 897,E43E-40BF-9B,2,Road-650 Red. 62,No Discount,419.4589,0.00 898,E43E-40BF-9B,2,Road-150 Red. 56,No Discount,2146.962,0.00 899,E43E-40BF-9B,2,Road-650 Black. 58,No Discount,419.4589,0.00 900,728A-44AB-A8,3,HL Mountain Frame - Black. 38,No Discount,714.7043,0.00 901,728A-44AB-A8,4,Sport-100 Helmet. Black,No Discount,20.1865,0.00 902,728A-44AB-A8,3,HL Mountain Frame - Black. 48,No Discount,809.76,0.00 903,728A-44AB-A8,10,Long-Sleeve Logo Jersey. L,No Discount,28.8404,0.00 904,728A-44AB-A8,10,Mountain-100 Black. 44,No Discount,2024.994,0.00 905,728A-44AB-A8,5,Mountain-100 Black. 42,No Discount,2024.994,0.00 906,728A-44AB-A8,5,Mountain-100 Silver. 44,No Discount,2039.994,0.00 907,728A-44AB-A8,3,HL Mountain Frame - Silver. 48,No Discount,818.70,0.00 908,728A-44AB-A8,5,Sport-100 Helmet. Blue,No Discount,20.1865,0.00 909,728A-44AB-A8,4,Mountain-100 Black. 48,No Discount,2024.994,0.00 910,728A-44AB-A8,6,Long-Sleeve Logo Jersey. XL,No Discount,28.8404,0.00 911,728A-44AB-A8,1,HL Mountain Frame - Silver. 38,No Discount,722.5949,0.00 912,728A-44AB-A8,8,Mountain-100 Silver. 38,No Discount,2039.994,0.00 913,728A-44AB-A8,8,AWC Logo Cap,No Discount,5.1865,0.00 914,728A-44AB-A8,2,Mountain-100 Black. 38,No Discount,2024.994,0.00 915,728A-44AB-A8,3,HL Mountain Frame - Black. 42,No Discount,714.7043,0.00 916,728A-44AB-A8,14,Mountain-100 Silver. 42,Volume Discount 11 to 14,1971.9942,0.02 917,728A-44AB-A8,4,Sport-100 Helmet. Red,No Discount,20.1865,0.00 918,728A-44AB-A8,4,Mountain-100 Silver. 48,No Discount,2039.994,0.00 919,728A-44AB-A8,4,Mountain Bike Socks. M,No Discount,5.70,0.00 920,728A-44AB-A8,1,HL Mountain Frame - Silver. 46,No Discount,722.5949,0.00 921,728A-44AB-A8,1,Long-Sleeve Logo Jersey. M,No Discount,28.8404,0.00 922,190F-4A02-89,4,Mountain Bike Socks. L,No Discount,5.70,0.00 923,190F-4A02-89,8,Mountain Bike Socks. M,No Discount,5.70,0.00 924,CE58-49B5-82,2,Road-450 Red. 58,No Discount,874.794,0.00 925,CE58-49B5-82,1,Road-650 Red. 48,No Discount,419.4589,0.00 926,CE58-49B5-82,2,LL Road Frame - Red. 48,No Discount,183.9382,0.00 927,CE58-49B5-82,1,Road-650 Black. 44,No Discount,419.4589,0.00 928,CE58-49B5-82,2,Road-450 Red. 44,No Discount,874.794,0.00 929,CE58-49B5-82,3,Sport-100 Helmet. Blue,No Discount,20.1865,0.00 930,CE58-49B5-82,6,AWC Logo Cap,No Discount,5.1865,0.00 931,CE58-49B5-82,1,Sport-100 Helmet. Black,No Discount,20.1865,0.00 932,CE58-49B5-82,2,Road-450 Red. 52,No Discount,874.794,0.00 933,CE58-49B5-82,2,Road-650 Black. 52,No Discount,419.4589,0.00 934,CE58-49B5-82,5,Road-650 Red. 60,No Discount,419.4589,0.00 935,CE58-49B5-82,1,ML Road Frame - Red. 52,No Discount,356.898,0.00 936,CE58-49B5-82,1,Long-Sleeve Logo Jersey. XL,No Discount,28.8404,0.00 937,CE58-49B5-82,1,LL Road Frame - Red. 62,No Discount,183.9382,0.00 938,CE58-49B5-82,1,Road-450 Red. 60,No Discount,874.794,0.00 939,CE58-49B5-82,1,LL Road Frame - Black. 58,No Discount,178.5808,0.00 940,CE58-49B5-82,5,Long-Sleeve Logo Jersey. M,No Discount,28.8404,0.00 941,CE58-49B5-82,1,Road-650 Black. 60,No Discount,419.4589,0.00 942,CE58-49B5-82,3,Road-650 Red. 44,No Discount,419.4589,0.00 943,CE58-49B5-82,2,Road-150 Red. 56,No Discount,2146.962,0.00 944,CE58-49B5-82,4,Long-Sleeve Logo Jersey. L,No Discount,28.8404,0.00 945,790D-448C-AA,1,Road-650 Black. 58,No Discount,419.4589,0.00 946,7AED-4154-93,1,Road-650 Red. 52,No Discount,419.4589,0.00 947,7AED-4154-93,1,Road-450 Red. 60,No Discount,874.794,0.00 948,7AED-4154-93,2,LL Road Frame - Black. 52,No Discount,178.5808,0.00 949,7AED-4154-93,1,LL Road Frame - Red. 44,No Discount,183.9382,0.00 950,7AED-4154-93,1,Road-650 Black. 44,No Discount,419.4589,0.00 951,7AED-4154-93,2,Road-650 Red. 60,No Discount,419.4589,0.00 952,7AED-4154-93,1,Road-150 Red. 56,No Discount,2146.962,0.00 953,7AED-4154-93,2,Road-450 Red. 44,No Discount,874.794,0.00 954,7AED-4154-93,5,Road-450 Red. 58,No Discount,874.794,0.00 955,7AED-4154-93,2,Road-650 Black. 52,No Discount,419.4589,0.00 956,7AED-4154-93,2,LL Road Frame - Red. 62,No Discount,183.9382,0.00 957,7AED-4154-93,2,Road-650 Red. 48,No Discount,419.4589,0.00 958,7AED-4154-93,2,Road-650 Black. 58,No Discount,419.4589,0.00 959,7AED-4154-93,1,LL Road Frame - Red. 48,No Discount,183.9382,0.00 960,F108-4D76-8A,1,Mountain-100 Black. 48,No Discount,2024.994,0.00 961,F108-4D76-8A,2,Long-Sleeve Logo Jersey. XL,No Discount,28.8404,0.00 962,6787-4174-98,5,Mountain-100 Silver. 38,No Discount,2039.994,0.00 963,6787-4174-98,2,Mountain-100 Black. 44,No Discount,2024.994,0.00 964,6787-4174-98,7,Mountain-100 Silver. 44,No Discount,2039.994,0.00 965,6787-4174-98,2,Mountain-100 Silver. 48,No Discount,2039.994,0.00 966,6787-4174-98,3,HL Mountain Frame - Silver. 46,No Discount,722.5949,0.00 967,6787-4174-98,5,Mountain-100 Silver. 42,No Discount,2039.994,0.00 968,6787-4174-98,2,Mountain-100 Black. 42,No Discount,2024.994,0.00 969,6787-4174-98,1,HL Mountain Frame - Silver. 38,No Discount,722.5949,0.00 970,6787-4174-98,1,HL Mountain Frame - Black. 38,No Discount,714.7043,0.00 971,6787-4174-98,8,Mountain-100 Black. 38,No Discount,2024.994,0.00 972,6787-4174-98,4,Mountain Bike Socks. M,No Discount,5.70,0.00 973,6787-4174-98,3,Mountain-100 Black. 48,No Discount,2024.994,0.00 974,6787-4174-98,3,HL Mountain Frame - Black. 48,No Discount,809.76,0.00 975,1094-43CB-B1,2,Mountain-100 Black. 38,No Discount,2024.994,0.00 976,1094-43CB-B1,2,Mountain Bike Socks. L,No Discount,5.70,0.00 977,1094-43CB-B1,1,Mountain-100 Black. 48,No Discount,2024.994,0.00 978,1094-43CB-B1,3,Mountain-100 Silver. 44,No Discount,2039.994,0.00 979,1094-43CB-B1,3,Mountain-100 Silver. 38,No Discount,2039.994,0.00 980,1094-43CB-B1,4,Mountain Bike Socks. M,No Discount,5.70,0.00 981,1094-43CB-B1,2,Mountain-100 Black. 42,No Discount,2024.994,0.00 982,1094-43CB-B1,3,Mountain-100 Silver. 42,No Discount,2039.994,0.00 983,1094-43CB-B1,2,Mountain-100 Black. 44,No Discount,2024.994,0.00 984,0D3C-4E1F-9C,2,Road-650 Red. 44,No Discount,419.4589,0.00 985,0D3C-4E1F-9C,3,Long-Sleeve Logo Jersey. L,No Discount,28.8404,0.00 986,0D3C-4E1F-9C,2,Road-150 Red. 56,No Discount,2146.962,0.00 987,0D3C-4E1F-9C,3,AWC Logo Cap,No Discount,5.1865,0.00 988,0D3C-4E1F-9C,2,Road-650 Red. 48,No Discount,419.4589,0.00 989,0D3C-4E1F-9C,5,Road-650 Red. 60,No Discount,419.4589,0.00 990,0D3C-4E1F-9C,1,LL Road Frame - Red. 60,No Discount,183.9382,0.00 991,0D3C-4E1F-9C,2,Sport-100 Helmet. Blue,No Discount,20.1865,0.00 992,0D3C-4E1F-9C,2,Road-450 Red. 58,No Discount,874.794,0.00 993,0D3C-4E1F-9C,3,Road-650 Black. 52,No Discount,419.4589,0.00 994,0D3C-4E1F-9C,4,Road-650 Red. 62,No Discount,419.4589,0.00 995,0D3C-4E1F-9C,3,Road-450 Red. 52,No Discount,874.794,0.00 996,0D3C-4E1F-9C,2,Road-650 Black. 58,No Discount,419.4589,0.00 997,7C5D-46AA-A7,1,Road-650 Black. 52,No Discount,419.4589,0.00 998,7DF2-4E54-B0,3,Mountain Bike Socks. L,No Discount,5.70,0.00 999,7DF2-4E54-B0,2,Mountain-100 Black. 44,No Discount,2024.994,0.00 1000,7DF2-4E54-B0,3,Mountain-100 Black. 38,No Discount,2024.994,0.00 ================================================ FILE: src/AdminLTE/wwwroot/js/site.js ================================================ /*\ |*| |*| :: cookies.js :: |*| |*| A complete cookies reader/writer framework with full unicode support. |*| |*| Revision #1 - September 4, 2014 |*| |*| https://developer.mozilla.org/en-US/docs/Web/API/document.cookie |*| https://developer.mozilla.org/User:fusionchess |*| |*| This framework is released under the GNU Public License, version 3 or later. |*| http://www.gnu.org/licenses/gpl-3.0-standalone.html |*| |*| Syntaxes: |*| |*| * docCookies.setItem(name, value[, end[, path[, domain[, secure]]]]) |*| * docCookies.getItem(name) |*| * docCookies.removeItem(name[, path[, domain]]) |*| * docCookies.hasItem(name) |*| * docCookies.keys() |*| \*/ var docCookies = { getItem: function (sKey) { if (!sKey) { return null; } return decodeURIComponent(document.cookie.replace(new RegExp("(?:(?:^|.*;)\\s*" + encodeURIComponent(sKey).replace(/[\-\.\+\*]/g, "\\$&") + "\\s*\\=\\s*([^;]*).*$)|^.*$"), "$1")) || null; }, setItem: function (sKey, sValue, vEnd, sPath, sDomain, bSecure) { if (!sKey || /^(?:expires|max\-age|path|domain|secure)$/i.test(sKey)) { return false; } var sExpires = ""; if (vEnd) { switch (vEnd.constructor) { case Number: sExpires = vEnd === Infinity ? "; expires=Fri, 31 Dec 9999 23:59:59 GMT" : "; max-age=" + vEnd; break; case String: sExpires = "; expires=" + vEnd; break; case Date: sExpires = "; expires=" + vEnd.toUTCString(); break; } } document.cookie = encodeURIComponent(sKey) + "=" + encodeURIComponent(sValue) + sExpires + (sDomain ? "; domain=" + sDomain : "") + (sPath ? "; path=" + sPath : "") + (bSecure ? "; secure" : ""); return true; }, removeItem: function (sKey, sPath, sDomain) { if (!this.hasItem(sKey)) { return false; } document.cookie = encodeURIComponent(sKey) + "=; expires=Thu, 01 Jan 1970 00:00:00 GMT" + (sDomain ? "; domain=" + sDomain : "") + (sPath ? "; path=" + sPath : ""); return true; }, hasItem: function (sKey) { if (!sKey) { return false; } return (new RegExp("(?:^|;\\s*)" + encodeURIComponent(sKey).replace(/[\-\.\+\*]/g, "\\$&") + "\\s*\\=")).test(document.cookie); }, keys: function () { var aKeys = document.cookie.replace(/((?:^|\s*;)[^\=]+)(?=;|$)|^\s*|\s*(?:\=[^;]*)?(?:\1|$)/g, "").split(/\s*(?:\=[^;]*)?;\s*/); for (var nLen = aKeys.length, nIdx = 0; nIdx < nLen; nIdx++) { aKeys[nIdx] = decodeURIComponent(aKeys[nIdx]); } return aKeys; } }; /* collapse/expand */ if (docCookies.hasItem("sidebarstate")) { $("body").addClass(docCookies.getItem("sidebarstate")); } /*global datatable defaults*/ //$.extend(true, $.fn.dataTable.defaults, { //}); /* automatically defaults all submit button to be disabled */ function useSubmitClass() { $('form').submit(function () { if ($(this).valid()) { $(this).find(':submit').attr('disabled', 'disabled'); } }); } function useDeleteConfirmation() { $('.btn-delete').on("click", function (e) { e.preventDefault(); var choice = confirm("Are you sure you want to delete?"); if (choice) { window.location.href = $(this).attr('href'); } }); }