├── Views ├── _ViewStart.cshtml ├── Default │ └── Index.cshtml ├── Shared │ ├── Partials │ │ ├── _CardHeader.cshtml │ │ └── _ContentHeader.cshtml │ └── navMenu.json ├── web.config └── Login │ └── ForgetPassword.cshtml ├── WebCore ├── dist │ └── img │ │ ├── avatar.png │ │ ├── icons.png │ │ ├── photo1.png │ │ ├── photo2.png │ │ ├── photo3.jpg │ │ ├── photo4.jpg │ │ ├── prod-1.jpg │ │ ├── prod-2.jpg │ │ ├── prod-3.jpg │ │ ├── prod-4.jpg │ │ ├── prod-5.jpg │ │ ├── avatar04.png │ │ ├── avatar2.png │ │ ├── avatar3.png │ │ ├── avatar5.png │ │ ├── boxed-bg.jpg │ │ ├── boxed-bg.png │ │ ├── credit │ │ ├── visa.png │ │ ├── cirrus.png │ │ ├── mestro.png │ │ ├── paypal.png │ │ ├── paypal2.png │ │ ├── mastercard.png │ │ └── american-express.png │ │ ├── AdminLTELogo.png │ │ ├── user1-128x128.jpg │ │ ├── user2-160x160.jpg │ │ ├── user3-128x128.jpg │ │ ├── user4-128x128.jpg │ │ ├── user5-128x128.jpg │ │ ├── user6-128x128.jpg │ │ ├── user7-128x128.jpg │ │ ├── user8-128x128.jpg │ │ └── default-150x150.png └── build │ ├── scss │ ├── parts │ │ ├── _miscellaneous.scss │ │ ├── _extra-components.scss │ │ ├── _core.scss │ │ ├── _components.scss │ │ ├── _pages.scss │ │ └── _plugins.scss │ ├── pages │ │ ├── _invoice.scss │ │ ├── _projects.scss │ │ ├── _profile.scss │ │ ├── _404_500_errors.scss │ │ ├── _e-commerce.scss │ │ ├── _lockscreen.scss │ │ ├── _mailbox.scss │ │ └── _login_and_register.scss │ ├── _elevation.scss │ ├── _mixins.scss │ ├── mixins │ │ ├── _direct-chat.scss │ │ ├── _toasts.scss │ │ ├── _navbar.scss │ │ ├── _miscellaneous.scss │ │ ├── _backgrounds.scss │ │ ├── _cards.scss │ │ ├── _custom-forms.scss │ │ ├── _accent.scss │ │ └── _sidebar.scss │ ├── _carousel.scss │ ├── plugins │ │ ├── _jqvmap.scss │ │ ├── _bootstrap-slider.scss │ │ ├── _miscellaneous.scss │ │ ├── _sweetalert2.scss │ │ ├── _toastr.scss │ │ ├── _icheck-bootstrap.scss │ │ ├── _mapael.scss │ │ ├── _mixins.scss │ │ ├── _fullcalendar.scss │ │ ├── _bootstrap-switch.scss │ │ └── _pace.scss │ ├── AdminLTE-core.scss │ ├── AdminLTE-pages.scss │ ├── AdminLTE-plugins.scss │ ├── .csslintrc │ ├── AdminLTE-components.scss │ ├── AdminLTE-extra-components.scss │ ├── _text.scss │ ├── AdminLTE.scss │ ├── _modals.scss │ ├── _alerts.scss │ ├── _users-list.scss │ ├── AdminLTE-raw.scss │ ├── _toasts.scss │ ├── _products.scss │ ├── _callout.scss │ ├── _print.scss │ ├── _progress-bars.scss │ ├── _table.scss │ ├── _brand.scss │ ├── _social-widgets.scss │ ├── _colors.scss │ ├── _navs.scss │ ├── _buttons.scss │ ├── _small-box.scss │ ├── _timeline.scss │ ├── _info-box.scss │ ├── _main-header.scss │ ├── _sidebar-mini.scss │ ├── _control-sidebar.scss │ └── _direct-chat.scss │ ├── config │ ├── postcss.config.js │ └── rollup.config.js │ ├── js │ ├── AdminLTE.js │ ├── .jscsrc │ ├── DirectChat.js │ ├── TodoList.js │ ├── SiteSearch.js │ ├── Dropdown.js │ └── CardRefresh.js │ └── npm │ ├── DocsPublish.js │ ├── DocsPlugins.js │ └── Publish.js ├── Entity ├── Enums │ ├── Gender.cs │ └── UserRole.cs └── User.cs ├── Models ├── ContentHeaderModel.cs ├── UserLoginModel.cs └── SampleData.cs ├── Repository ├── Infra │ ├── IRepositoryWrapper.cs │ ├── IRepository.cs │ ├── RepositoryWrapper.cs │ └── RepositoryBase.cs ├── IUserRepository.cs ├── RepositoryContext.cs └── UserRepository.cs ├── Configs ├── connectionStrings.config └── appSettings.config ├── App_Start ├── RouteConfig.cs ├── AutofacConfig.cs └── WebApiConfig.cs ├── Utils ├── AppSettings.cs ├── Encryption.cs └── RijndaelCrypt.cs ├── Controllers ├── DefaultController.cs └── LoginController.cs ├── Infrastructure ├── ApiAuthorizeAttribute.cs ├── ApiExceptionHandlerAttribute.cs └── BaseApiController.cs ├── .github └── workflows │ └── main.yml ├── Migrations ├── 202007131656182_AddingUserTable.Designer.cs ├── 202007131656182_AddingUserTable.cs └── Configuration.cs ├── LICENSE ├── AspMVCAdminLTE.sln ├── Web.Debug.config ├── Web.Release.config ├── Properties └── AssemblyInfo.cs ├── ApiControllers └── AccountController.cs ├── Providers └── TokenAuthProvider.cs ├── packages.config ├── Startup.cs ├── .gitattributes ├── README.md └── Web.config /Views/_ViewStart.cshtml: -------------------------------------------------------------------------------- 1 | @{ 2 | Layout = "~/Views/Shared/_DefaultLayout.cshtml"; 3 | } -------------------------------------------------------------------------------- /Views/Default/Index.cshtml: -------------------------------------------------------------------------------- 1 | @{ 2 | ViewBag.Title = "Index"; 3 | } 4 | 5 |

Index

-------------------------------------------------------------------------------- /WebCore/dist/img/avatar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mak-thevar/AdminLTEAspNetMVC/HEAD/WebCore/dist/img/avatar.png -------------------------------------------------------------------------------- /WebCore/dist/img/icons.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mak-thevar/AdminLTEAspNetMVC/HEAD/WebCore/dist/img/icons.png -------------------------------------------------------------------------------- /WebCore/dist/img/photo1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mak-thevar/AdminLTEAspNetMVC/HEAD/WebCore/dist/img/photo1.png -------------------------------------------------------------------------------- /WebCore/dist/img/photo2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mak-thevar/AdminLTEAspNetMVC/HEAD/WebCore/dist/img/photo2.png -------------------------------------------------------------------------------- /WebCore/dist/img/photo3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mak-thevar/AdminLTEAspNetMVC/HEAD/WebCore/dist/img/photo3.jpg -------------------------------------------------------------------------------- /WebCore/dist/img/photo4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mak-thevar/AdminLTEAspNetMVC/HEAD/WebCore/dist/img/photo4.jpg -------------------------------------------------------------------------------- /WebCore/dist/img/prod-1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mak-thevar/AdminLTEAspNetMVC/HEAD/WebCore/dist/img/prod-1.jpg -------------------------------------------------------------------------------- /WebCore/dist/img/prod-2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mak-thevar/AdminLTEAspNetMVC/HEAD/WebCore/dist/img/prod-2.jpg -------------------------------------------------------------------------------- /WebCore/dist/img/prod-3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mak-thevar/AdminLTEAspNetMVC/HEAD/WebCore/dist/img/prod-3.jpg -------------------------------------------------------------------------------- /WebCore/dist/img/prod-4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mak-thevar/AdminLTEAspNetMVC/HEAD/WebCore/dist/img/prod-4.jpg -------------------------------------------------------------------------------- /WebCore/dist/img/prod-5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mak-thevar/AdminLTEAspNetMVC/HEAD/WebCore/dist/img/prod-5.jpg -------------------------------------------------------------------------------- /WebCore/dist/img/avatar04.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mak-thevar/AdminLTEAspNetMVC/HEAD/WebCore/dist/img/avatar04.png -------------------------------------------------------------------------------- /WebCore/dist/img/avatar2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mak-thevar/AdminLTEAspNetMVC/HEAD/WebCore/dist/img/avatar2.png -------------------------------------------------------------------------------- /WebCore/dist/img/avatar3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mak-thevar/AdminLTEAspNetMVC/HEAD/WebCore/dist/img/avatar3.png -------------------------------------------------------------------------------- /WebCore/dist/img/avatar5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mak-thevar/AdminLTEAspNetMVC/HEAD/WebCore/dist/img/avatar5.png -------------------------------------------------------------------------------- /WebCore/dist/img/boxed-bg.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mak-thevar/AdminLTEAspNetMVC/HEAD/WebCore/dist/img/boxed-bg.jpg -------------------------------------------------------------------------------- /WebCore/dist/img/boxed-bg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mak-thevar/AdminLTEAspNetMVC/HEAD/WebCore/dist/img/boxed-bg.png -------------------------------------------------------------------------------- /WebCore/dist/img/credit/visa.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mak-thevar/AdminLTEAspNetMVC/HEAD/WebCore/dist/img/credit/visa.png -------------------------------------------------------------------------------- /WebCore/dist/img/AdminLTELogo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mak-thevar/AdminLTEAspNetMVC/HEAD/WebCore/dist/img/AdminLTELogo.png -------------------------------------------------------------------------------- /WebCore/dist/img/credit/cirrus.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mak-thevar/AdminLTEAspNetMVC/HEAD/WebCore/dist/img/credit/cirrus.png -------------------------------------------------------------------------------- /WebCore/dist/img/credit/mestro.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mak-thevar/AdminLTEAspNetMVC/HEAD/WebCore/dist/img/credit/mestro.png -------------------------------------------------------------------------------- /WebCore/dist/img/credit/paypal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mak-thevar/AdminLTEAspNetMVC/HEAD/WebCore/dist/img/credit/paypal.png -------------------------------------------------------------------------------- /WebCore/dist/img/user1-128x128.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mak-thevar/AdminLTEAspNetMVC/HEAD/WebCore/dist/img/user1-128x128.jpg -------------------------------------------------------------------------------- /WebCore/dist/img/user2-160x160.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mak-thevar/AdminLTEAspNetMVC/HEAD/WebCore/dist/img/user2-160x160.jpg -------------------------------------------------------------------------------- /WebCore/dist/img/user3-128x128.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mak-thevar/AdminLTEAspNetMVC/HEAD/WebCore/dist/img/user3-128x128.jpg -------------------------------------------------------------------------------- /WebCore/dist/img/user4-128x128.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mak-thevar/AdminLTEAspNetMVC/HEAD/WebCore/dist/img/user4-128x128.jpg -------------------------------------------------------------------------------- /WebCore/dist/img/user5-128x128.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mak-thevar/AdminLTEAspNetMVC/HEAD/WebCore/dist/img/user5-128x128.jpg -------------------------------------------------------------------------------- /WebCore/dist/img/user6-128x128.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mak-thevar/AdminLTEAspNetMVC/HEAD/WebCore/dist/img/user6-128x128.jpg -------------------------------------------------------------------------------- /WebCore/dist/img/user7-128x128.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mak-thevar/AdminLTEAspNetMVC/HEAD/WebCore/dist/img/user7-128x128.jpg -------------------------------------------------------------------------------- /WebCore/dist/img/user8-128x128.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mak-thevar/AdminLTEAspNetMVC/HEAD/WebCore/dist/img/user8-128x128.jpg -------------------------------------------------------------------------------- /WebCore/dist/img/credit/paypal2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mak-thevar/AdminLTEAspNetMVC/HEAD/WebCore/dist/img/credit/paypal2.png -------------------------------------------------------------------------------- /WebCore/dist/img/default-150x150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mak-thevar/AdminLTEAspNetMVC/HEAD/WebCore/dist/img/default-150x150.png -------------------------------------------------------------------------------- /WebCore/dist/img/credit/mastercard.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mak-thevar/AdminLTEAspNetMVC/HEAD/WebCore/dist/img/credit/mastercard.png -------------------------------------------------------------------------------- /WebCore/dist/img/credit/american-express.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mak-thevar/AdminLTEAspNetMVC/HEAD/WebCore/dist/img/credit/american-express.png -------------------------------------------------------------------------------- /Entity/Enums/Gender.cs: -------------------------------------------------------------------------------- 1 | namespace AspMVCAdminLTE.Entity.Enums 2 | { 3 | public enum Gender 4 | { 5 | Male = 1, 6 | Female = 2 7 | } 8 | } -------------------------------------------------------------------------------- /Entity/Enums/UserRole.cs: -------------------------------------------------------------------------------- 1 | namespace AspMVCAdminLTE.Entity.Enums 2 | { 3 | public enum UserRole 4 | { 5 | Admin, 6 | Normal 7 | } 8 | } -------------------------------------------------------------------------------- /Models/ContentHeaderModel.cs: -------------------------------------------------------------------------------- 1 | namespace AspMVCAdminLTE.Models 2 | { 3 | public class ContentHeaderModel 4 | { 5 | public string Title { get; set; } 6 | } 7 | } -------------------------------------------------------------------------------- /WebCore/build/scss/parts/_miscellaneous.scss: -------------------------------------------------------------------------------- 1 | // 2 | // Part: Miscellaneous 3 | // 4 | 5 | @import '../miscellaneous'; 6 | @import '../print'; 7 | @import '../text'; 8 | @import '../elevation'; 9 | @import '../colors'; -------------------------------------------------------------------------------- /Repository/Infra/IRepositoryWrapper.cs: -------------------------------------------------------------------------------- 1 | namespace AspMVCAdminLTE.Repository 2 | { 3 | public interface IRepositoryWrapper 4 | { 5 | IUserRepository User { get; } 6 | 7 | void Save(); 8 | } 9 | } -------------------------------------------------------------------------------- /WebCore/build/scss/pages/_invoice.scss: -------------------------------------------------------------------------------- 1 | // 2 | // Pages: Invoice 3 | // 4 | 5 | .invoice { 6 | background: $white; 7 | border: 1px solid $card-border-color; 8 | position: relative; 9 | } 10 | 11 | .invoice-title { 12 | margin-top: 0; 13 | } -------------------------------------------------------------------------------- /WebCore/build/scss/parts/_extra-components.scss: -------------------------------------------------------------------------------- 1 | // 2 | // Part: Extra Components 3 | // 4 | 5 | @import '../small-box'; 6 | @import '../info-box'; 7 | @import '../timeline'; 8 | @import '../products'; 9 | @import '../direct-chat'; 10 | @import '../users-list'; 11 | @import '../social-widgets'; -------------------------------------------------------------------------------- /WebCore/build/scss/parts/_core.scss: -------------------------------------------------------------------------------- 1 | // 2 | // Part: Core 3 | // 4 | 5 | @import '../layout'; 6 | @import '../main-header'; 7 | @import '../brand'; 8 | @import '../main-sidebar'; 9 | @import '../sidebar-mini'; 10 | @import '../control-sidebar'; 11 | @import '../dropdown'; 12 | @import '../navs'; -------------------------------------------------------------------------------- /WebCore/build/scss/_elevation.scss: -------------------------------------------------------------------------------- 1 | // 2 | // Component: Elevation 3 | // 4 | 5 | .elevation-0 { 6 | box-shadow: none !important; 7 | } 8 | 9 | // Background colors (colors) 10 | @each $name, $value in $elevations { 11 | .elevation-#{$name} { 12 | box-shadow: $value !important; 13 | } 14 | } -------------------------------------------------------------------------------- /WebCore/build/scss/parts/_components.scss: -------------------------------------------------------------------------------- 1 | // 2 | // Part: Components 3 | // 4 | 5 | @import '../forms'; 6 | @import '../progress-bars'; 7 | @import '../cards'; 8 | @import '../modals'; 9 | @import '../toasts'; 10 | @import '../buttons'; 11 | @import '../callout'; 12 | @import '../alerts'; 13 | @import '../table'; 14 | @import '../carousel'; -------------------------------------------------------------------------------- /WebCore/build/scss/parts/_pages.scss: -------------------------------------------------------------------------------- 1 | // 2 | // Part: Pages 3 | // 4 | 5 | @import '../pages/mailbox'; 6 | @import '../pages/lockscreen'; 7 | @import '../pages/login_and_register'; 8 | @import '../pages/404_500_errors'; 9 | @import '../pages/invoice'; 10 | @import '../pages/profile'; 11 | @import '../pages/e-commerce'; 12 | @import '../pages/projects'; -------------------------------------------------------------------------------- /Configs/connectionStrings.config: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /WebCore/build/scss/_mixins.scss: -------------------------------------------------------------------------------- 1 | // 2 | // General: Mixins 3 | // 4 | 5 | @import 'mixins/cards'; 6 | @import 'mixins/sidebar'; 7 | @import 'mixins/navbar'; 8 | @import 'mixins/accent'; 9 | @import 'mixins/custom-forms'; 10 | @import 'mixins/backgrounds'; 11 | @import 'mixins/direct-chat'; 12 | @import 'mixins/toasts'; 13 | @import 'mixins/miscellaneous'; -------------------------------------------------------------------------------- /WebCore/build/config/postcss.config.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | 3 | module.exports = (ctx) => ({ 4 | map: ctx.file.dirname.includes('examples') ? false : { 5 | inline: false, 6 | annotation: true, 7 | sourcesContent: true 8 | }, 9 | plugins: { 10 | autoprefixer: { 11 | cascade: false 12 | } 13 | } 14 | }) -------------------------------------------------------------------------------- /Configs/appSettings.config: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /Repository/IUserRepository.cs: -------------------------------------------------------------------------------- 1 | using AspMVCAdminLTE.Entity; 2 | using AspMVCAdminLTE.Repository.Infra; 3 | 4 | namespace AspMVCAdminLTE.Repository 5 | { 6 | public interface IUserRepository : IRepository 7 | { 8 | User ValidateUser(string userName, string password); 9 | 10 | User ValidateAdminUser(string userName, string password); 11 | } 12 | } -------------------------------------------------------------------------------- /Repository/RepositoryContext.cs: -------------------------------------------------------------------------------- 1 | using AspMVCAdminLTE.Entity; 2 | using System.Data.Entity; 3 | 4 | namespace AspMVCAdminLTE.Repository 5 | { 6 | public class RepositoryContext : DbContext 7 | { 8 | public RepositoryContext() 9 | : base("DefaultContext") 10 | { 11 | } 12 | 13 | public DbSet Users { get; set; } 14 | } 15 | } -------------------------------------------------------------------------------- /Models/UserLoginModel.cs: -------------------------------------------------------------------------------- 1 | using System.ComponentModel.DataAnnotations; 2 | 3 | namespace AspMVCAdminLTE.Models 4 | { 5 | public class UserLoginModel 6 | { 7 | public string UserName { get; set; } 8 | 9 | public string Password { get; set; } 10 | 11 | [DataType(DataType.EmailAddress, ErrorMessage = "Please enter a valid email address")] 12 | public string Email { get; set; } 13 | } 14 | } -------------------------------------------------------------------------------- /WebCore/build/scss/mixins/_direct-chat.scss: -------------------------------------------------------------------------------- 1 | // 2 | // Mixins: Direct Chat 3 | // 4 | 5 | // Direct Chat Variant 6 | @mixin direct-chat-variant($bg-color, $color: #fff) { 7 | .right > .direct-chat-text { 8 | background: $bg-color; 9 | border-color: $bg-color; 10 | color: color-yiq($bg-color); 11 | 12 | &::after, 13 | &::before { 14 | border-left-color: $bg-color; 15 | } 16 | } 17 | } -------------------------------------------------------------------------------- /Repository/Infra/IRepository.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Linq; 3 | using System.Linq.Expressions; 4 | 5 | namespace AspMVCAdminLTE.Repository.Infra 6 | { 7 | public interface IRepository 8 | { 9 | IQueryable FindAll(); 10 | 11 | IQueryable FindByCondition(Expression> expression); 12 | 13 | T Create(T entity); 14 | 15 | T Update(T entity); 16 | 17 | void Delete(T entity); 18 | } 19 | } -------------------------------------------------------------------------------- /WebCore/build/scss/_carousel.scss: -------------------------------------------------------------------------------- 1 | // 2 | // Component: Carousel 3 | // 4 | 5 | .carousel-control { 6 | &.left, 7 | &.right { 8 | background-image: none; 9 | } 10 | 11 | > .fa, 12 | > .fas, 13 | > .far, 14 | > .fab, 15 | > .glyphicon, 16 | > .ion { 17 | display: inline-block; 18 | font-size: 40px; 19 | margin-top: -20px; 20 | position: absolute; 21 | top: 50%; 22 | z-index: 5; 23 | } 24 | } -------------------------------------------------------------------------------- /WebCore/build/scss/pages/_projects.scss: -------------------------------------------------------------------------------- 1 | // 2 | // Pages: Projects 3 | // 4 | 5 | .projects { 6 | td { 7 | vertical-align: middle; 8 | } 9 | 10 | .list-inline { 11 | margin-bottom: 0; 12 | } 13 | // table avatar 14 | img.table-avatar, 15 | .table-avatar img { 16 | border-radius: 50%; 17 | display: inline; 18 | width: 2.5rem; 19 | } 20 | // project state 21 | .project-state { 22 | text-align: center; 23 | } 24 | } -------------------------------------------------------------------------------- /Views/Shared/Partials/_CardHeader.cshtml: -------------------------------------------------------------------------------- 1 |
2 |

@ViewData["title"]

3 | @if (ViewData.ContainsKey("cardtools") && ((bool)ViewData["cardtools"] )) 4 | { 5 |
6 | 7 | 8 |
9 | } 10 |
-------------------------------------------------------------------------------- /WebCore/build/scss/parts/_plugins.scss: -------------------------------------------------------------------------------- 1 | // 2 | // Part: Plugins 3 | // 4 | 5 | @import '../plugins/mixins'; 6 | @import '../plugins/fullcalendar'; 7 | @import '../plugins/select2'; 8 | @import '../plugins/bootstrap-slider'; 9 | @import '../plugins/icheck-bootstrap'; 10 | @import '../plugins/mapael'; 11 | @import '../plugins/jqvmap'; 12 | @import '../plugins/sweetalert2'; 13 | @import '../plugins/toastr'; 14 | @import '../plugins/pace'; 15 | @import '../plugins/bootstrap-switch'; 16 | @import '../plugins/miscellaneous'; -------------------------------------------------------------------------------- /Models/SampleData.cs: -------------------------------------------------------------------------------- 1 | using Newtonsoft.Json; 2 | 3 | namespace AspMVCAdminLTE.Models 4 | { 5 | public partial class SampleData 6 | { 7 | [JsonProperty("ID")] 8 | public long Id { get; set; } 9 | 10 | [JsonProperty("User")] 11 | public string User { get; set; } 12 | 13 | [JsonProperty("Date")] 14 | public string Date { get; set; } 15 | 16 | [JsonProperty("Status")] 17 | public string Status { get; set; } 18 | 19 | [JsonProperty("Reason")] 20 | public string Reason { get; set; } 21 | } 22 | } -------------------------------------------------------------------------------- /WebCore/build/scss/mixins/_toasts.scss: -------------------------------------------------------------------------------- 1 | // 2 | // Mixins: Toasts 3 | // 4 | 5 | // Toast Variant 6 | @mixin toast-variant($name, $color) { 7 | &.bg-#{$name} { 8 | background: rgba($color, .9) !important; 9 | 10 | @if (color-yiq($color) == $yiq-text-light) { 11 | .close { 12 | color: color-yiq($color); 13 | text-shadow: 0 1px 0 #000; 14 | } 15 | } 16 | 17 | .toast-header { 18 | background: rgba($color, .85); 19 | color: color-yiq($color); 20 | } 21 | } 22 | } -------------------------------------------------------------------------------- /App_Start/RouteConfig.cs: -------------------------------------------------------------------------------- 1 | using System.Web.Mvc; 2 | using System.Web.Routing; 3 | 4 | namespace AspMVCAdminLTE 5 | { 6 | public class RouteConfig 7 | { 8 | public static void RegisterRoutes(RouteCollection routes) 9 | { 10 | routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 11 | 12 | routes.MapRoute( 13 | name: "Default", 14 | url: "{controller}/{action}/{id}", 15 | defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } 16 | ); 17 | } 18 | } 19 | } -------------------------------------------------------------------------------- /Utils/AppSettings.cs: -------------------------------------------------------------------------------- 1 | using System.Configuration; 2 | 3 | namespace AspMVCAdminLTE.Utils 4 | { 5 | public static class AppSettings 6 | { 7 | public static string EncrKey { get; set; } = ConfigurationManager.AppSettings["EncryptionKey"]; 8 | public static string BrandTitle { get; } = "AdminLTEAspNetMVC"; 9 | public static string FooterText { get; } = "2014-2019 AdminLTEAspNetMVC."; 10 | public static string BrandImg { get; set; } = "/WebCore/dist/img/AdminLTELogo.png"; 11 | } 12 | } -------------------------------------------------------------------------------- /WebCore/build/scss/plugins/_jqvmap.scss: -------------------------------------------------------------------------------- 1 | // 2 | // Plugins: JQVMap 3 | // 4 | 5 | // Zoom Button size fixes 6 | .jqvmap-zoomin, 7 | .jqvmap-zoomout { 8 | background-color: $button-default-background-color; 9 | border: 1px solid $button-default-border-color; 10 | border-radius: $btn-border-radius; 11 | color: $button-default-color; 12 | height: 15px; 13 | width: 15px; 14 | 15 | &:hover, 16 | &:active, 17 | &.hover { 18 | background-color: darken($button-default-background-color, 5%); 19 | color: darken($button-default-color, 10%); 20 | } 21 | } -------------------------------------------------------------------------------- /Views/Shared/Partials/_ContentHeader.cshtml: -------------------------------------------------------------------------------- 1 |
2 |
3 |
4 |
5 |

@ViewData["Title"]

6 |
7 |
8 | 12 |
13 |
14 |
15 |
-------------------------------------------------------------------------------- /WebCore/build/js/AdminLTE.js: -------------------------------------------------------------------------------- 1 | import ControlSidebar from './ControlSidebar' 2 | import Layout from './Layout' 3 | import PushMenu from './PushMenu' 4 | import Treeview from './Treeview' 5 | import DirectChat from './DirectChat' 6 | import TodoList from './TodoList' 7 | import CardWidget from './CardWidget' 8 | import CardRefresh from './CardRefresh' 9 | import Dropdown from './Dropdown' 10 | import Toasts from './Toasts' 11 | 12 | export { 13 | ControlSidebar, 14 | Layout, 15 | PushMenu, 16 | Treeview, 17 | DirectChat, 18 | TodoList, 19 | CardWidget, 20 | CardRefresh, 21 | Dropdown, 22 | Toasts 23 | } -------------------------------------------------------------------------------- /WebCore/build/scss/AdminLTE-core.scss: -------------------------------------------------------------------------------- 1 | /*! 2 | * AdminLTE v3.0.5 3 | * Only Core 4 | * Author: Colorlib 5 | * Website: AdminLTE.io 6 | * License: Open source - MIT 7 | */ 8 | // Bootstrap 9 | // --------------------------------------------------- 10 | @import '~bootstrap/scss/functions'; 11 | @import 'bootstrap-variables'; 12 | @import '~bootstrap/scss/bootstrap'; 13 | 14 | // Variables and Mixins 15 | // --------------------------------------------------- 16 | @import 'variables'; 17 | @import 'mixins'; 18 | 19 | @import 'parts/core'; 20 | @import 'parts/miscellaneous'; -------------------------------------------------------------------------------- /WebCore/build/scss/AdminLTE-pages.scss: -------------------------------------------------------------------------------- 1 | /*! 2 | * AdminLTE v3.0.5 3 | * Only Pages 4 | * Author: Colorlib 5 | * Website: AdminLTE.io 6 | * License: Open source - MIT 7 | */ 8 | // Bootstrap 9 | // --------------------------------------------------- 10 | @import '~bootstrap/scss/functions'; 11 | @import 'bootstrap-variables'; 12 | @import '~bootstrap/scss/mixins'; 13 | @import '~bootstrap/scss/close'; 14 | 15 | // Variables and Mixins 16 | // --------------------------------------------------- 17 | @import 'variables'; 18 | @import 'mixins'; 19 | 20 | @import 'parts/pages'; -------------------------------------------------------------------------------- /Controllers/DefaultController.cs: -------------------------------------------------------------------------------- 1 | using System.Web.Mvc; 2 | 3 | namespace AspMVCAdminLTE.Controllers 4 | { 5 | public class DefaultController : Controller 6 | { 7 | // GET: Default 8 | public ActionResult Index() 9 | { 10 | return View(); 11 | } 12 | 13 | public ActionResult AdvancedForm() 14 | { 15 | return View(); 16 | } 17 | 18 | public ActionResult SimpleTables() 19 | { 20 | return View(); 21 | } 22 | 23 | public ActionResult SimpleForm() 24 | { 25 | return View(); 26 | } 27 | } 28 | } -------------------------------------------------------------------------------- /Views/Shared/navMenu.json: -------------------------------------------------------------------------------- 1 | { 2 | "items": [ 3 | { 4 | "name": "Default", 5 | "isParent": true, 6 | "icon": "nav-icon fas fa-copy", 7 | "childItems": [ 8 | { 9 | "name": "AdvancedForm", 10 | "isParent": false, 11 | "url": "/Default/AdvancedForm" 12 | }, 13 | { 14 | "name": "SimpleTables", 15 | "isParent": false, 16 | "url": "/Default/SimpleTables" 17 | }, 18 | { 19 | "name": "SimpleForm", 20 | "isParent": false, 21 | "url": "/Default/SimpleForm" 22 | } 23 | ] 24 | } 25 | ] 26 | } -------------------------------------------------------------------------------- /WebCore/build/scss/AdminLTE-plugins.scss: -------------------------------------------------------------------------------- 1 | /*! 2 | * AdminLTE v3.0.5 3 | * Only Plugins 4 | * Author: Colorlib 5 | * Website: AdminLTE.io 6 | * License: Open source - MIT 7 | */ 8 | // Bootstrap 9 | // --------------------------------------------------- 10 | @import '~bootstrap/scss/functions'; 11 | @import 'bootstrap-variables'; 12 | @import '~bootstrap/scss/mixins'; 13 | // @import '~bootstrap/scss/bootstrap'; 14 | 15 | // Variables and Mixins 16 | // --------------------------------------------------- 17 | @import 'variables'; 18 | @import 'mixins'; 19 | 20 | @import 'parts/plugins'; -------------------------------------------------------------------------------- /WebCore/build/scss/.csslintrc: -------------------------------------------------------------------------------- 1 | { 2 | "adjoining-classes": false, 3 | "box-sizing": false, 4 | "box-model": false, 5 | "compatible-vendor-prefixes": false, 6 | "floats": false, 7 | "font-sizes": false, 8 | "gradients": false, 9 | "important": false, 10 | "known-properties": false, 11 | "outline-none": false, 12 | "qualified-headings": false, 13 | "regex-selectors": false, 14 | "shorthand": false, 15 | "text-indent": false, 16 | "unique-headings": false, 17 | "universal-selector": false, 18 | "unqualified-attributes": false, 19 | "ids": false, 20 | "fallback-colors": false, 21 | "vendor-prefix": false, 22 | "import": false 23 | } -------------------------------------------------------------------------------- /WebCore/build/scss/AdminLTE-components.scss: -------------------------------------------------------------------------------- 1 | /*! 2 | * AdminLTE v3.0.5 3 | * Only Components 4 | * Author: Colorlib 5 | * Website: AdminLTE.io 6 | * License: Open source - MIT 7 | */ 8 | // Bootstrap 9 | // --------------------------------------------------- 10 | @import '~bootstrap/scss/functions'; 11 | @import 'bootstrap-variables'; 12 | @import '~bootstrap/scss/mixins'; 13 | // @import '~bootstrap/scss/bootstrap'; 14 | 15 | // Variables and Mixins 16 | // --------------------------------------------------- 17 | @import 'variables'; 18 | @import 'mixins'; 19 | 20 | @import 'parts/components'; -------------------------------------------------------------------------------- /Repository/Infra/RepositoryWrapper.cs: -------------------------------------------------------------------------------- 1 | namespace AspMVCAdminLTE.Repository 2 | { 3 | public class RepositoryWrapper : IRepositoryWrapper 4 | { 5 | private RepositoryContext _repositoryContext; 6 | private IUserRepository _user; 7 | 8 | public RepositoryWrapper(RepositoryContext repositoryContext) 9 | { 10 | this._repositoryContext = repositoryContext; 11 | this._user = new UserRepository(repositoryContext); 12 | } 13 | 14 | public IUserRepository User => _user; 15 | 16 | public void Save() 17 | { 18 | _repositoryContext.SaveChanges(); 19 | } 20 | } 21 | } -------------------------------------------------------------------------------- /WebCore/build/scss/AdminLTE-extra-components.scss: -------------------------------------------------------------------------------- 1 | /*! 2 | * AdminLTE v3.0.5 3 | * Only Extra Components 4 | * Author: Colorlib 5 | * Website: AdminLTE.io 6 | * License: Open source - MIT 7 | */ 8 | // Bootstrap 9 | // --------------------------------------------------- 10 | @import '~bootstrap/scss/functions'; 11 | @import 'bootstrap-variables'; 12 | @import '~bootstrap/scss/mixins'; 13 | // @import '~bootstrap/scss/bootstrap'; 14 | 15 | // Variables and Mixins 16 | // --------------------------------------------------- 17 | @import 'variables'; 18 | @import 'mixins'; 19 | 20 | @import 'parts/extra-components'; -------------------------------------------------------------------------------- /Infrastructure/ApiAuthorizeAttribute.cs: -------------------------------------------------------------------------------- 1 | using System.Net; 2 | using System.Net.Http; 3 | using System.Web; 4 | using System.Web.Http; 5 | using System.Web.Http.Controllers; 6 | 7 | namespace AspMVCAdminLTE.Infrastructure 8 | { 9 | public class ApiAuthorizeAttribute : AuthorizeAttribute 10 | { 11 | protected override void HandleUnauthorizedRequest(HttpActionContext actionContext) 12 | { 13 | HttpContext.Current.Response.SuppressFormsAuthenticationRedirect = true; 14 | var response = actionContext.Request.CreateResponse(HttpStatusCode.Unauthorized, new { error = "UnAuthorized Access" }); 15 | actionContext.Response = response; 16 | } 17 | } 18 | } -------------------------------------------------------------------------------- /WebCore/build/scss/_text.scss: -------------------------------------------------------------------------------- 1 | // 2 | // Component: Text 3 | // 4 | 5 | // text modification 6 | .text-bold { 7 | &, &.table td, &.table th { 8 | font-weight: 700; 9 | } 10 | } 11 | 12 | .text-xs { 13 | font-size: $font-size-xs !important; 14 | } 15 | 16 | .text-sm { 17 | font-size: $font-size-sm !important; 18 | } 19 | 20 | .text-md { 21 | font-size: $font-size-base !important; 22 | } 23 | 24 | .text-lg { 25 | font-size: $font-size-lg !important; 26 | } 27 | 28 | .text-xl { 29 | font-size: $font-size-xl !important; 30 | } 31 | 32 | // text color variations 33 | @each $name, $color in $colors { 34 | .text-#{$name} { 35 | color: #{$color} !important; 36 | } 37 | } -------------------------------------------------------------------------------- /WebCore/build/scss/pages/_profile.scss: -------------------------------------------------------------------------------- 1 | // 2 | // Pages: Profile 3 | // 4 | 5 | .profile-user-img { 6 | border: 3px solid $gray-500; 7 | margin: 0 auto; 8 | padding: 3px; 9 | width: 100px; 10 | } 11 | 12 | .profile-username { 13 | font-size: 21px; 14 | margin-top: 5px; 15 | } 16 | 17 | .post { 18 | border-bottom: 1px solid $gray-500; 19 | color: #666; 20 | margin-bottom: 15px; 21 | padding-bottom: 15px; 22 | 23 | &:last-of-type { 24 | border-bottom: 0; 25 | margin-bottom: 0; 26 | padding-bottom: 0; 27 | } 28 | 29 | .user-block { 30 | margin-bottom: 15px; 31 | width: 100%; 32 | } 33 | 34 | .row { 35 | width: 100%; 36 | } 37 | } -------------------------------------------------------------------------------- /WebCore/build/scss/AdminLTE.scss: -------------------------------------------------------------------------------- 1 | /*! 2 | * AdminLTE v3.0.5 3 | * Author: Colorlib 4 | * Website: AdminLTE.io 5 | * License: Open source - MIT 6 | */ 7 | // Bootstrap 8 | // --------------------------------------------------- 9 | @import '~bootstrap/scss/functions'; 10 | @import 'bootstrap-variables'; 11 | @import '~bootstrap/scss/bootstrap'; 12 | 13 | // Variables and Mixins 14 | // --------------------------------------------------- 15 | @import 'variables'; 16 | @import 'mixins'; 17 | 18 | @import 'parts/core'; 19 | @import 'parts/components'; 20 | @import 'parts/extra-components'; 21 | @import 'parts/pages'; 22 | @import 'parts/plugins'; 23 | @import 'parts/miscellaneous'; -------------------------------------------------------------------------------- /WebCore/build/scss/plugins/_bootstrap-slider.scss: -------------------------------------------------------------------------------- 1 | // 2 | // Plugin: Bootstrap Slider 3 | // 4 | 5 | // Tooltip fix 6 | .slider .tooltip.in { 7 | opacity: $tooltip-opacity; 8 | } 9 | 10 | // Style override 11 | .slider { 12 | &.slider-vertical { 13 | height: 100%; 14 | } 15 | 16 | &.slider-horizontal { 17 | width: 100%; 18 | } 19 | } 20 | 21 | // Colors 22 | @each $name, $color in $theme-colors { 23 | .slider-#{$name} .slider { 24 | .slider-selection { 25 | background: $color; 26 | } 27 | } 28 | } 29 | 30 | @each $name, $color in $colors { 31 | .slider-#{$name} .slider { 32 | .slider-selection { 33 | background: $color; 34 | } 35 | } 36 | } -------------------------------------------------------------------------------- /WebCore/build/config/rollup.config.js: -------------------------------------------------------------------------------- 1 | import babel from 'rollup-plugin-babel' 2 | 3 | const pkg = require('../../package') 4 | const year = new Date().getFullYear() 5 | 6 | const globals = { 7 | jquery: 'jQuery' 8 | } 9 | 10 | export default { 11 | input: 'build/js/AdminLTE.js', 12 | output: { 13 | banner: `/*! 14 | * AdminLTE v${pkg.version} (${pkg.homepage}) 15 | * Copyright 2014-${year} ${pkg.author} 16 | * Licensed under MIT (https://github.com/ColorlibHQ/AdminLTE/blob/master/LICENSE) 17 | */`, 18 | file: 'dist/js/adminlte.js', 19 | format: 'umd', 20 | globals, 21 | name: 'adminlte' 22 | }, 23 | plugins: [ 24 | babel({ 25 | exclude: 'node_modules/**', 26 | externalHelpers: true 27 | }) 28 | ] 29 | } -------------------------------------------------------------------------------- /WebCore/build/scss/plugins/_miscellaneous.scss: -------------------------------------------------------------------------------- 1 | // 2 | // Plugins: Miscellaneous 3 | // Old plugin codes 4 | // 5 | 6 | // _fix for sparkline tooltip 7 | .jqstooltip { 8 | height: auto !important; 9 | padding: 5px !important; 10 | width: auto !important; 11 | } 12 | 13 | // jQueryUI 14 | .connectedSortable { 15 | min-height: 100px; 16 | } 17 | 18 | .ui-helper-hidden-accessible { 19 | border: 0; 20 | clip: rect(0 0 0 0); 21 | height: 1px; 22 | margin: -1px; 23 | overflow: hidden; 24 | padding: 0; 25 | position: absolute; 26 | width: 1px; 27 | } 28 | 29 | .sort-highlight { 30 | background: $gray-100; 31 | border: 1px dashed $gray-300; 32 | margin-bottom: 10px; 33 | } 34 | 35 | // Charts 36 | .chart { 37 | overflow: hidden; 38 | position: relative; 39 | } -------------------------------------------------------------------------------- /WebCore/build/scss/_modals.scss: -------------------------------------------------------------------------------- 1 | // 2 | // Component: Modals 3 | // 4 | 5 | // Overlay 6 | .modal-dialog { 7 | .overlay { 8 | background-color: $black; 9 | display: block; 10 | height: 100%; 11 | left: 0; 12 | opacity: .7; 13 | position: absolute; 14 | top: 0; 15 | width: 100%; 16 | z-index: ($zindex-modal + 2); 17 | } 18 | } 19 | 20 | // BG Color Variations Fixes 21 | .modal-content { 22 | &.bg-warning { 23 | .modal-header, 24 | .modal-footer { 25 | border-color: $gray-800; 26 | } 27 | } 28 | 29 | &.bg-primary, 30 | &.bg-secondary, 31 | &.bg-info, 32 | &.bg-danger, 33 | &.bg-success, { 34 | .close { 35 | color: $white; 36 | text-shadow: 0 1px 0 #000; 37 | } 38 | } 39 | } -------------------------------------------------------------------------------- /WebCore/build/scss/_alerts.scss: -------------------------------------------------------------------------------- 1 | // 2 | // Component: Alert 3 | // 4 | 5 | .alert { 6 | .icon { 7 | margin-right: 10px; 8 | } 9 | 10 | .close { 11 | color: $black; 12 | opacity: .2; 13 | 14 | &:hover { 15 | opacity: .5; 16 | } 17 | } 18 | 19 | a { 20 | color: $white; 21 | text-decoration: underline; 22 | } 23 | } 24 | 25 | //Alert Variants 26 | @each $color, $value in $theme-colors { 27 | .alert-#{$color} { 28 | color: color-yiq($value); 29 | background: $value; 30 | border-color: darken($value, 5%); 31 | } 32 | 33 | .alert-default-#{$color} { 34 | @include alert-variant(theme-color-level($color, $alert-bg-level), theme-color-level($color, $alert-border-level), theme-color-level($color, $alert-color-level)); 35 | } 36 | } -------------------------------------------------------------------------------- /WebCore/build/scss/mixins/_navbar.scss: -------------------------------------------------------------------------------- 1 | // 2 | // Mixins: Navbar 3 | // 4 | 5 | // Navbar Variant 6 | @mixin navbar-variant($color, $font-color: rgba(255, 255, 255, 0.8), $hover-color: #f6f6f6, $hover-bg: rgba(0, 0, 0, 0.1)) { 7 | background-color: $color; 8 | 9 | .nav > li > a { 10 | color: $font-color; 11 | } 12 | 13 | .nav > li > a:hover, 14 | .nav > li > a:active, 15 | .nav > li > a:focus, 16 | .nav .open > a, 17 | .nav .open > a:hover, 18 | .nav .open > a:focus, 19 | .nav > .active > a { 20 | background: $hover-bg; 21 | color: $hover-color; 22 | } 23 | // Add color to the sidebar toggle button 24 | .sidebar-toggle { 25 | color: $font-color; 26 | 27 | &:hover, 28 | &:focus { 29 | background: $hover-bg; 30 | color: $hover-color; 31 | } 32 | } 33 | } -------------------------------------------------------------------------------- /WebCore/build/scss/plugins/_sweetalert2.scss: -------------------------------------------------------------------------------- 1 | // 2 | // Plugin: SweetAlert2 3 | // 4 | 5 | // Icon Colors 6 | .swal2-icon { 7 | &.swal2-info { 8 | border-color: ligthen($info, 20%); 9 | color: $info; 10 | } 11 | 12 | &.swal2-warning { 13 | border-color: ligthen($warning, 20%); 14 | color: $warning; 15 | } 16 | 17 | &.swal2-error { 18 | border-color: ligthen($danger, 20%); 19 | color: $danger; 20 | } 21 | 22 | &.swal2-question { 23 | border-color: ligthen($secondary, 20%); 24 | color: $secondary; 25 | } 26 | 27 | &.swal2-success { 28 | border-color: ligthen($success, 20%); 29 | color: $success; 30 | 31 | .swal2-success-ring { 32 | border-color: ligthen($success, 20%); 33 | } 34 | 35 | [class^='swal2-success-line'] { 36 | background-color: $success; 37 | } 38 | } 39 | } -------------------------------------------------------------------------------- /WebCore/build/scss/_users-list.scss: -------------------------------------------------------------------------------- 1 | // 2 | // Component: Users List 3 | // 4 | 5 | .users-list { 6 | @include list-unstyled; 7 | 8 | > li { 9 | float: left; 10 | padding: 10px; 11 | text-align: center; 12 | width: 25%; 13 | 14 | img { 15 | @include border-radius(50%); 16 | height: auto; 17 | max-width: 100%; 18 | } 19 | 20 | > a:hover { 21 | &, 22 | .users-list-name { 23 | color: #999; 24 | } 25 | } 26 | } 27 | } 28 | 29 | .users-list-name, 30 | .users-list-date { 31 | display: block; 32 | } 33 | 34 | .users-list-name { 35 | color: $gray-700; 36 | font-size: $font-size-sm; 37 | overflow: hidden; 38 | text-overflow: ellipsis; 39 | white-space: nowrap; 40 | } 41 | 42 | .users-list-date { 43 | color: darken($gray-500, 20%); 44 | font-size: 12px; 45 | } -------------------------------------------------------------------------------- /.github/workflows/main.yml: -------------------------------------------------------------------------------- 1 | name: Build the project 2 | 3 | on: 4 | push: 5 | branches: master 6 | 7 | jobs: 8 | build: 9 | runs-on: windows-latest 10 | steps: 11 | - uses: actions/checkout@v2 12 | - name: Setup MSBuild 13 | uses: microsoft/setup-msbuild@v1 14 | 15 | - name: Setup NuGet 16 | uses: NuGet/setup-nuget@v1.0.2 17 | 18 | - name: Navigate to Workspace 19 | run: cd $GITHUB_WORKSPACE 20 | 21 | - name: Create Build Directory 22 | run: mkdir _build 23 | 24 | - name: Restore Packages 25 | run: nuget restore AspMVCAdminLTE.sln 26 | 27 | - name: Build Solution 28 | run: | 29 | msbuild.exe AspMVCAdminLTE.sln /nologo /nr:false /p:DeployOnBuild=true /p:DeployDefaultTarget=WebPublish /p:WebPublishMethod=FileSystem /p:DeleteExistingFiles=True /p:platform="Any CPU" /p:configuration="Release" /p:PublishUrl="../_build" 30 | 31 | -------------------------------------------------------------------------------- /Migrations/202007131656182_AddingUserTable.Designer.cs: -------------------------------------------------------------------------------- 1 | // 2 | namespace AspMVCAdminLTE.Migrations 3 | { 4 | using System.CodeDom.Compiler; 5 | using System.Data.Entity.Migrations; 6 | using System.Data.Entity.Migrations.Infrastructure; 7 | using System.Resources; 8 | 9 | [GeneratedCode("EntityFramework.Migrations", "6.4.4")] 10 | public sealed partial class AddingUserTable : IMigrationMetadata 11 | { 12 | private readonly ResourceManager Resources = new ResourceManager(typeof(AddingUserTable)); 13 | 14 | string IMigrationMetadata.Id 15 | { 16 | get { return "202007131656182_AddingUserTable"; } 17 | } 18 | 19 | string IMigrationMetadata.Source 20 | { 21 | get { return null; } 22 | } 23 | 24 | string IMigrationMetadata.Target 25 | { 26 | get { return Resources.GetString("Target"); } 27 | } 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /WebCore/build/scss/pages/_404_500_errors.scss: -------------------------------------------------------------------------------- 1 | // 2 | // Pages: 400 and 500 error pages 3 | // 4 | 5 | .error-page { 6 | margin: 20px auto 0; 7 | width: 600px; 8 | 9 | @include media-breakpoint-down(sm) { 10 | width: 100%; 11 | } 12 | //For the error number e.g: 404 13 | > .headline { 14 | float: left; 15 | font-size: 100px; 16 | font-weight: 300; 17 | 18 | @include media-breakpoint-down(sm) { 19 | float: none; 20 | text-align: center; 21 | } 22 | } 23 | //For the message 24 | > .error-content { 25 | display: block; 26 | margin-left: 190px; 27 | 28 | @include media-breakpoint-down(sm) { 29 | margin-left: 0; 30 | } 31 | 32 | > h3 { 33 | font-size: 25px; 34 | font-weight: 300; 35 | 36 | @include media-breakpoint-down(sm) { 37 | text-align: center; 38 | } 39 | } 40 | } 41 | } -------------------------------------------------------------------------------- /WebCore/build/scss/pages/_e-commerce.scss: -------------------------------------------------------------------------------- 1 | // 2 | // Pages: E-commerce 3 | // 4 | 5 | // product image 6 | .product-image { 7 | @include img-fluid; 8 | width: 100%; 9 | } 10 | 11 | // product image thumbnails list 12 | .product-image-thumbs { 13 | align-items: stretch; 14 | display: flex; 15 | margin-top: 2rem; 16 | } 17 | 18 | // product image thumbnail 19 | .product-image-thumb { 20 | @include box-shadow($thumbnail-box-shadow); 21 | @include border-radius($thumbnail-border-radius); 22 | background-color: $thumbnail-bg; 23 | border: $thumbnail-border-width solid $thumbnail-border-color; 24 | display: flex; 25 | margin-right: 1rem; 26 | max-width: 6.5rem + ($thumbnail-padding * 2); 27 | padding: $thumbnail-padding * 2; 28 | 29 | img { 30 | @include img-fluid; 31 | align-self: center; 32 | } 33 | 34 | &:hover { 35 | opacity: 0.5; 36 | } 37 | } 38 | 39 | // product share 40 | .product-share { 41 | a { 42 | margin-right: .5rem; 43 | } 44 | } -------------------------------------------------------------------------------- /Infrastructure/ApiExceptionHandlerAttribute.cs: -------------------------------------------------------------------------------- 1 | using System.Data.Entity.Validation; 2 | using System.Linq; 3 | using System.Web.Http.Filters; 4 | 5 | namespace AspMVCAdminLTE.Infrastructure 6 | { 7 | public class ApiExceptionHandlerAttribute : ExceptionFilterAttribute 8 | { 9 | public override void OnException(HttpActionExecutedContext actionExecutedContext) 10 | { 11 | if (actionExecutedContext.Exception.GetType() == typeof(DbEntityValidationException)) 12 | { 13 | var errorMessages = ((DbEntityValidationException)actionExecutedContext.Exception).EntityValidationErrors 14 | .SelectMany(x => x.ValidationErrors) 15 | .Select(x => x.ErrorMessage); 16 | actionExecutedContext.Exception = new DbEntityValidationException(string.Join("\n", errorMessages), ((DbEntityValidationException)actionExecutedContext.Exception).EntityValidationErrors); 17 | } 18 | base.OnException(actionExecutedContext); 19 | } 20 | } 21 | } -------------------------------------------------------------------------------- /WebCore/build/scss/mixins/_miscellaneous.scss: -------------------------------------------------------------------------------- 1 | // 2 | // Mixins: Miscellaneous 3 | // 4 | 5 | // ETC 6 | @mixin translate($x, $y) { 7 | transform: translate($x, $y); 8 | } 9 | 10 | // Different radius each side 11 | @mixin border-radius-sides($top-left, $top-right, $bottom-left, $bottom-right) { 12 | border-radius: $top-left $top-right $bottom-left $bottom-right; 13 | } 14 | 15 | @mixin calc($property, $expression) { 16 | #{$property}: calc(#{$expression}); 17 | } 18 | 19 | @mixin rotate($value) { 20 | transform: rotate($value); 21 | } 22 | 23 | @mixin animation($animation) { 24 | animation: $animation; 25 | } 26 | 27 | // Gradient background 28 | @mixin gradient($color: #F5F5F5, $start: #EEE, $stop: #FFF) { 29 | background: $color; 30 | background: -webkit-gradient(linear, left bottom, left top, color-stop(0, $start), color-stop(1, $stop)); 31 | background: -ms-linear-gradient(bottom, $start, $stop); 32 | background: -moz-linear-gradient(center bottom, $start 0%, $stop 100%); 33 | background: -o-linear-gradient($stop, $start); 34 | } -------------------------------------------------------------------------------- /Infrastructure/BaseApiController.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Linq; 3 | using System.Net; 4 | using System.Net.Http; 5 | using System.Security.Claims; 6 | using System.Web.Http; 7 | 8 | namespace AspMVCAdminLTE.Infrastructure 9 | { 10 | public class BaseApiController : ApiController 11 | { 12 | protected IHttpActionResult CreateResponse(T content) 13 | { 14 | if (!ModelState.IsValid) 15 | return ModelError(); 16 | else 17 | return Success(content); 18 | } 19 | 20 | protected int GetUserId() 21 | { 22 | return Convert.ToInt32(((ClaimsIdentity)User.Identity).Claims.SingleOrDefault(x => x.Type == "Id").Value); 23 | } 24 | 25 | protected IHttpActionResult ModelError() 26 | { 27 | return ResponseMessage(Request.CreateErrorResponse(HttpStatusCode.BadRequest, ModelState)); 28 | } 29 | 30 | protected IHttpActionResult Success(T content) 31 | { 32 | return Ok(content); 33 | } 34 | } 35 | } -------------------------------------------------------------------------------- /WebCore/build/scss/AdminLTE-raw.scss: -------------------------------------------------------------------------------- 1 | /*! 2 | * AdminLTE v3.0.5 3 | * Author: Colorlib 4 | * Website: AdminLTE.io 5 | * License: Open source - MIT 6 | */ 7 | // 8 | // ------------------------------------------------------------------ 9 | // This file is to be included in your custom SCSS. Before importing 10 | // this file, you should include your custom AdminLTE and Bootstrap 11 | // variables followed by bootstrap.scss and then this file. It's 12 | // ok to import this file without custom variables too! 13 | // NOTE: be sure to keep the license notice in the generated css. 14 | // ------------------------------------------------------------------ 15 | // 16 | // Variables and Mixins 17 | // --------------------------------------------------- 18 | @import 'bootstrap-variables'; 19 | @import 'variables'; 20 | @import 'mixins'; 21 | 22 | @import 'parts/core'; 23 | @import 'parts/components'; 24 | @import 'parts/extra-components'; 25 | @import 'parts/pages'; 26 | @import 'parts/plugins'; 27 | @import 'parts/miscellaneous'; -------------------------------------------------------------------------------- /WebCore/build/scss/_toasts.scss: -------------------------------------------------------------------------------- 1 | // 2 | // Component: Toasts 3 | // 4 | 5 | .toasts-top-right { 6 | position: absolute; 7 | right: 0; 8 | top: 0; 9 | z-index: $zindex-toasts; 10 | 11 | &.fixed { 12 | position: fixed; 13 | } 14 | } 15 | 16 | .toasts-top-left { 17 | left: 0; 18 | position: absolute; 19 | top: 0; 20 | z-index: $zindex-toasts; 21 | 22 | &.fixed { 23 | position: fixed; 24 | } 25 | } 26 | 27 | .toasts-bottom-right { 28 | bottom: 0; 29 | position: absolute; 30 | right: 0; 31 | z-index: $zindex-toasts; 32 | 33 | &.fixed { 34 | position: fixed; 35 | } 36 | } 37 | 38 | .toasts-bottom-left { 39 | bottom: 0; 40 | left: 0; 41 | position: absolute; 42 | z-index: $zindex-toasts; 43 | 44 | &.fixed { 45 | position: fixed; 46 | } 47 | } 48 | 49 | .toast { 50 | @each $name, $color in $theme-colors { 51 | @include toast-variant($name, $color); 52 | } 53 | 54 | @each $name, $color in $colors { 55 | @include toast-variant($name, $color); 56 | } 57 | } -------------------------------------------------------------------------------- /App_Start/AutofacConfig.cs: -------------------------------------------------------------------------------- 1 | using AspMVCAdminLTE.Repository; 2 | using Autofac; 3 | using Autofac.Integration.Mvc; 4 | using Autofac.Integration.WebApi; 5 | using System.Reflection; 6 | using System.Web.Mvc; 7 | 8 | namespace AspMVCAdminLTE.App_Start 9 | { 10 | public class AutofacConfig 11 | { 12 | public static Autofac.IContainer RegisterComponents() 13 | { 14 | var builder = new ContainerBuilder(); 15 | 16 | builder.RegisterAssemblyTypes(typeof(UserRepository).Assembly) 17 | .Where(x => x.Namespace.Contains("Repository")) 18 | .AsImplementedInterfaces(); 19 | builder.RegisterApiControllers(Assembly.GetExecutingAssembly()).InstancePerRequest(); 20 | builder.RegisterControllers(typeof(Controllers.DefaultController).Assembly); 21 | builder.RegisterType().AsSelf().InstancePerRequest(); 22 | 23 | var container = builder.Build(); 24 | DependencyResolver.SetResolver(new AutofacDependencyResolver(container)); 25 | return container; 26 | } 27 | } 28 | } -------------------------------------------------------------------------------- /WebCore/build/scss/_products.scss: -------------------------------------------------------------------------------- 1 | // 2 | // Component: Products 3 | // 4 | 5 | .products-list { 6 | list-style: none; 7 | margin: 0; 8 | padding: 0; 9 | 10 | > .item { 11 | @include clearfix; 12 | 13 | @if $enable-rounded { 14 | @include border-radius($border-radius); 15 | } 16 | 17 | background: $white; 18 | padding: 10px 0; 19 | } 20 | 21 | .product-img { 22 | float: left; 23 | 24 | img { 25 | height: 50px; 26 | width: 50px; 27 | } 28 | } 29 | 30 | .product-info { 31 | margin-left: 60px; 32 | } 33 | 34 | .product-title { 35 | font-weight: 600; 36 | } 37 | 38 | .product-description { 39 | color: $gray-600; 40 | display: block; 41 | overflow: hidden; 42 | text-overflow: ellipsis; 43 | white-space: nowrap; 44 | } 45 | } 46 | 47 | .product-list-in-card > .item { 48 | @include border-radius(0); 49 | border-bottom: 1px solid $card-border-color; 50 | 51 | &:last-of-type { 52 | border-bottom-width: 0; 53 | } 54 | } -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2020 Muthukumar Thevar 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /WebCore/build/npm/DocsPublish.js: -------------------------------------------------------------------------------- 1 | const Plugins = require('./DocsPlugins') 2 | const fse = require('fs-extra') 3 | 4 | class Publish { 5 | constructor() { 6 | this.options = { 7 | verbose: false 8 | } 9 | 10 | this.getArguments() 11 | } 12 | 13 | getArguments() { 14 | if (process.argv.length > 2) { 15 | let arg = process.argv[2] 16 | switch (arg) { 17 | case '-v': 18 | case '--verbose': 19 | this.options.verbose = true 20 | break 21 | default: 22 | throw new Error(`Unknown option ${arg}`) 23 | } 24 | } 25 | } 26 | 27 | run() { 28 | // Publish files 29 | Plugins.forEach((module) => { 30 | try { 31 | fse.copySync(module.from, module.to) 32 | 33 | if (this.options.verbose) { 34 | console.log(`Copied ${module.from} to ${module.to}`) 35 | } 36 | } catch (err) { 37 | console.error(`Error: ${err}`) 38 | } 39 | }) 40 | } 41 | } 42 | 43 | (new Publish()).run() -------------------------------------------------------------------------------- /AspMVCAdminLTE.sln: -------------------------------------------------------------------------------- 1 | 2 | Microsoft Visual Studio Solution File, Format Version 12.00 3 | # Visual Studio Version 16 4 | VisualStudioVersion = 16.0.30002.166 5 | MinimumVisualStudioVersion = 10.0.40219.1 6 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AspMVCAdminLTE", "AspMVCAdminLTE.csproj", "{A225B6F4-EB9B-4014-A3D0-204C8157F242}" 7 | EndProject 8 | Global 9 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 10 | Debug|Any CPU = Debug|Any CPU 11 | Release|Any CPU = Release|Any CPU 12 | EndGlobalSection 13 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 14 | {A225B6F4-EB9B-4014-A3D0-204C8157F242}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 15 | {A225B6F4-EB9B-4014-A3D0-204C8157F242}.Debug|Any CPU.Build.0 = Debug|Any CPU 16 | {A225B6F4-EB9B-4014-A3D0-204C8157F242}.Release|Any CPU.ActiveCfg = Release|Any CPU 17 | {A225B6F4-EB9B-4014-A3D0-204C8157F242}.Release|Any CPU.Build.0 = Release|Any CPU 18 | EndGlobalSection 19 | GlobalSection(SolutionProperties) = preSolution 20 | HideSolutionNode = FALSE 21 | EndGlobalSection 22 | GlobalSection(ExtensibilityGlobals) = postSolution 23 | SolutionGuid = {960B6935-D80D-43A1-88FC-4B8A96C04456} 24 | EndGlobalSection 25 | EndGlobal 26 | -------------------------------------------------------------------------------- /WebCore/build/scss/_callout.scss: -------------------------------------------------------------------------------- 1 | // 2 | // Component: Callout 3 | // 4 | 5 | // Base styles (regardless of theme) 6 | .callout { 7 | @if $enable-rounded { 8 | @include border-radius($border-radius); 9 | } 10 | 11 | @if $enable-shadows { 12 | box-shadow: map-get($elevations, 1); 13 | } 14 | @else { 15 | border: 1px solid $gray-300; 16 | } 17 | 18 | background-color: $white; 19 | border-left: 5px solid $gray-200; 20 | margin-bottom: map-get($spacers, 3); 21 | padding: 1rem; 22 | 23 | a { 24 | color: $gray-700; 25 | text-decoration: underline; 26 | 27 | &:hover { 28 | color: $gray-200; 29 | } 30 | } 31 | 32 | p:last-child { 33 | margin-bottom: 0; 34 | } 35 | // Themes for different contexts 36 | &.callout-danger { 37 | border-left-color: darken(theme-color('danger'), 10%); 38 | } 39 | 40 | &.callout-warning { 41 | border-left-color: darken(theme-color('warning'), 10%); 42 | } 43 | 44 | &.callout-info { 45 | border-left-color: darken(theme-color('info'), 10%); 46 | } 47 | 48 | &.callout-success { 49 | border-left-color: darken(theme-color('success'), 10%); 50 | } 51 | } -------------------------------------------------------------------------------- /WebCore/build/scss/_print.scss: -------------------------------------------------------------------------------- 1 | // 2 | // Misc: Print 3 | // 4 | 5 | @media print { 6 | //Add to elements that you do not want to show when printing 7 | .no-print { 8 | display: none !important; 9 | } 10 | 11 | //Elements that we want to hide when printing 12 | .main-sidebar, 13 | .main-header, 14 | .content-header { 15 | @extend .no-print; 16 | } 17 | 18 | //This is the only element that should appear, so let's remove the margins 19 | .content-wrapper, 20 | .main-footer { 21 | @include translate(0, 0); 22 | margin-left: 0 !important; 23 | min-height: 0 !important; 24 | } 25 | 26 | .layout-fixed .content-wrapper { 27 | padding-top: 0 !important; 28 | } 29 | 30 | //Invoice printing 31 | .invoice { 32 | border: 0; 33 | margin: 0; 34 | padding: 0; 35 | width: 100%; 36 | } 37 | 38 | .invoice-col { 39 | float: left; 40 | width: 33.3333333%; 41 | } 42 | 43 | //Make sure table content displays properly 44 | .table-responsive { 45 | overflow: auto; 46 | 47 | > .table tr th, 48 | > .table tr td { 49 | white-space: normal !important; 50 | } 51 | } 52 | } -------------------------------------------------------------------------------- /Repository/UserRepository.cs: -------------------------------------------------------------------------------- 1 | using AspMVCAdminLTE.Entity; 2 | using AspMVCAdminLTE.Repository.Infra; 3 | using AspMVCAdminLTE.Utils; 4 | using System.Linq; 5 | 6 | namespace AspMVCAdminLTE.Repository 7 | { 8 | public class UserRepository : RepositoryBase, IUserRepository 9 | { 10 | private RepositoryContext repositoryContext; 11 | 12 | public UserRepository(RepositoryContext repositoryContext) : base(repositoryContext) 13 | { 14 | this.repositoryContext = repositoryContext; 15 | } 16 | 17 | public User ValidateUser(string userName, string password) 18 | { 19 | var user = RepositoryContext.Users.Where(x => x.UserName == userName || x.Mobile == userName || x.Email == userName).SingleOrDefault(); 20 | return Encryption.CompareHash(user.Password, password) ? user : null; 21 | } 22 | 23 | public User ValidateAdminUser(string userName, string password) 24 | { 25 | //var compareHash = Encryption.CompareHash(x.Password, password); 26 | return repositoryContext.Users.Where(x => x.UserName == userName && x.UserRole == Entity.Enums.UserRole.Admin).AsEnumerable().Where(x => Encryption.CompareHash(x.Password, password)).FirstOrDefault(); 27 | } 28 | } 29 | } -------------------------------------------------------------------------------- /Repository/Infra/RepositoryBase.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Data.Entity; 3 | using System.Linq; 4 | using System.Linq.Expressions; 5 | 6 | namespace AspMVCAdminLTE.Repository.Infra 7 | { 8 | public abstract class RepositoryBase : IRepository where T : class 9 | { 10 | protected RepositoryContext RepositoryContext { get; set; } 11 | 12 | public RepositoryBase(RepositoryContext repositoryContext) 13 | { 14 | this.RepositoryContext = repositoryContext; 15 | } 16 | 17 | public IQueryable FindAll() 18 | { 19 | return this.RepositoryContext.Set().AsNoTracking(); 20 | } 21 | 22 | public IQueryable FindByCondition(Expression> expression) 23 | { 24 | return this.RepositoryContext.Set().Where(expression).AsNoTracking(); 25 | } 26 | 27 | public T Create(T entity) 28 | { 29 | return this.RepositoryContext.Set().Add(entity); 30 | } 31 | 32 | public T Update(T entity) 33 | { 34 | return this.RepositoryContext.Set().Add(entity); 35 | } 36 | 37 | public void Delete(T entity) 38 | { 39 | this.RepositoryContext.Set().Remove(entity); 40 | } 41 | } 42 | } -------------------------------------------------------------------------------- /WebCore/build/scss/_progress-bars.scss: -------------------------------------------------------------------------------- 1 | // 2 | // Component: Progress Bar 3 | // 4 | 5 | //General CSS 6 | .progress { 7 | @include box-shadow(none); 8 | @include border-radius($progress-bar-border-radius); 9 | // Vertical bars 10 | &.vertical { 11 | display: inline-block; 12 | height: 200px; 13 | margin-right: 10px; 14 | position: relative; 15 | width: 30px; 16 | 17 | > .progress-bar { 18 | bottom: 0; 19 | position: absolute; 20 | width: 100%; 21 | } 22 | //Sizes 23 | &.sm, 24 | &.progress-sm { 25 | width: 20px; 26 | } 27 | 28 | &.xs, 29 | &.progress-xs { 30 | width: 10px; 31 | } 32 | 33 | &.xxs, 34 | &.progress-xxs { 35 | width: 3px; 36 | } 37 | } 38 | } 39 | 40 | .progress-group { 41 | margin-bottom: map-get($spacers, 2); 42 | } 43 | 44 | // size variation 45 | .progress-sm { 46 | height: 10px; 47 | } 48 | 49 | .progress-xs { 50 | height: 7px; 51 | } 52 | 53 | .progress-xxs { 54 | height: 3px; 55 | } 56 | 57 | // Remove margins from progress bars when put in a table 58 | .table { 59 | tr > td { 60 | .progress { 61 | margin: 0; 62 | } 63 | } 64 | } -------------------------------------------------------------------------------- /WebCore/build/npm/DocsPlugins.js: -------------------------------------------------------------------------------- 1 | const Plugins = [ 2 | // AdminLTE Dist 3 | { 4 | from: 'dist/css/', 5 | to: 'docs/assets/css/' 6 | }, 7 | { 8 | from: 'dist/js/', 9 | to: 'docs/assets/js/' 10 | }, 11 | // jQuery 12 | { 13 | from: 'node_modules/jquery/dist/', 14 | to: 'docs/assets/plugins/jquery/' 15 | }, 16 | // Popper 17 | { 18 | from: 'node_modules/popper.js/dist/', 19 | to: 'docs/assets/plugins/popper/' 20 | }, 21 | // Bootstrap 22 | { 23 | from: 'node_modules/bootstrap/dist/js/', 24 | to: 'docs/assets/plugins/bootstrap/js/' 25 | }, 26 | // Font Awesome 27 | { 28 | from: 'node_modules/@fortawesome/fontawesome-free/css/', 29 | to: 'docs/assets/plugins/fontawesome-free/css/' 30 | }, 31 | { 32 | from: 'node_modules/@fortawesome/fontawesome-free/webfonts/', 33 | to: 'docs/assets/plugins/fontawesome-free/webfonts/' 34 | }, 35 | // overlayScrollbars 36 | { 37 | from: 'node_modules/overlayscrollbars/js/', 38 | to: 'docs/assets/plugins/overlayScrollbars/js/' 39 | }, 40 | { 41 | from: 'node_modules/overlayscrollbars/css/', 42 | to: 'docs/assets/plugins/overlayScrollbars/css/' 43 | } 44 | ] 45 | 46 | module.exports = Plugins -------------------------------------------------------------------------------- /Web.Debug.config: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 17 | 18 | 29 | 30 | -------------------------------------------------------------------------------- /App_Start/WebApiConfig.cs: -------------------------------------------------------------------------------- 1 | using AspMVCAdminLTE.Infrastructure; 2 | using Newtonsoft.Json.Converters; 3 | using Newtonsoft.Json.Serialization; 4 | using System.Linq; 5 | using System.Net.Http.Formatting; 6 | using System.Web.Http; 7 | 8 | namespace AspMVCAdminLTE 9 | { 10 | public static class WebApiConfig 11 | { 12 | public static void Register(HttpConfiguration config) 13 | { 14 | // Web API configuration and services 15 | 16 | // Web API routes 17 | config.MapHttpAttributeRoutes(); 18 | 19 | config.Routes.MapHttpRoute( 20 | name: "DefaultApi", 21 | routeTemplate: "api/{controller}/{id}", 22 | defaults: new { id = RouteParameter.Optional } 23 | ); 24 | var jsonFormatter = config.Formatters.OfType().First(); 25 | jsonFormatter.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver(); 26 | jsonFormatter.SerializerSettings.Converters.Add(new StringEnumConverter()); 27 | config.Filters.Add(new ApiExceptionHandlerAttribute()); 28 | config.Formatters.JsonFormatter.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore; 29 | config.IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Always; 30 | } 31 | } 32 | } -------------------------------------------------------------------------------- /WebCore/build/npm/Publish.js: -------------------------------------------------------------------------------- 1 | const Plugins = require('./Plugins') 2 | const fse = require('fs-extra') 3 | 4 | class Publish { 5 | constructor() { 6 | this.options = { 7 | verbose: false 8 | } 9 | 10 | this.getArguments() 11 | } 12 | 13 | getArguments() { 14 | if (process.argv.length > 2) { 15 | let arg = process.argv[2] 16 | switch (arg) { 17 | case '-v': 18 | case '--verbose': 19 | this.options.verbose = true 20 | break 21 | default: 22 | throw new Error(`Unknown option ${arg}`) 23 | } 24 | } 25 | } 26 | 27 | run() { 28 | // Publish files 29 | Plugins.forEach((module) => { 30 | try { 31 | if (fse.existsSync(module.from)) { 32 | fse.copySync(module.from, module.to) 33 | } else { 34 | fse.copySync(module.from.replace('node_modules/', '../'), module.to) 35 | } 36 | 37 | if (this.options.verbose) { 38 | console.log(`Copied ${module.from} to ${module.to}`) 39 | } 40 | } catch (err) { 41 | console.error(`Error: ${err}`) 42 | } 43 | }) 44 | } 45 | } 46 | 47 | (new Publish()).run() -------------------------------------------------------------------------------- /Web.Release.config: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 17 | 18 | 19 | 30 | 31 | -------------------------------------------------------------------------------- /Entity/User.cs: -------------------------------------------------------------------------------- 1 | using AspMVCAdminLTE.Entity.Enums; 2 | using System; 3 | using System.ComponentModel.DataAnnotations; 4 | using System.ComponentModel.DataAnnotations.Schema; 5 | 6 | namespace AspMVCAdminLTE.Entity 7 | { 8 | public class User 9 | { 10 | [Key] 11 | public int Id { get; set; } 12 | 13 | [Required] 14 | public string FirstName { get; set; } 15 | 16 | public string LastName { get; set; } 17 | 18 | [Required] 19 | [Index("IX_MobileNumber", IsUnique = true)] 20 | [MaxLength(12)] 21 | public string Mobile { get; set; } 22 | 23 | [Required] 24 | [Index("IX_Username", IsUnique = true)] 25 | [MaxLength(20)] 26 | public string UserName { get; set; } 27 | 28 | [Required] 29 | public string Password { get; set; } 30 | 31 | public bool IsMobileVerified { get; set; } = false; 32 | 33 | public DateTime? DateOfBirth { get; set; } 34 | 35 | [Index("IX_Email", IsUnique = true)] 36 | [MaxLength(100)] 37 | public string Email { get; set; } 38 | 39 | [EnumDataType(typeof(Gender))] 40 | public Gender Gender { get; set; } 41 | 42 | public bool IsEmailVerified { get; set; } = false; 43 | 44 | public string ProfilePic { get; set; } 45 | 46 | [EnumDataType(typeof(UserRole))] 47 | public UserRole UserRole { get; internal set; } 48 | } 49 | } -------------------------------------------------------------------------------- /Properties/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Reflection; 2 | using System.Runtime.InteropServices; 3 | 4 | // General Information about an assembly is controlled through the following 5 | // set of attributes. Change these attribute values to modify the information 6 | // associated with an assembly. 7 | [assembly: AssemblyTitle("AspMVCAdminLTE")] 8 | [assembly: AssemblyDescription("")] 9 | [assembly: AssemblyConfiguration("")] 10 | [assembly: AssemblyCompany("")] 11 | [assembly: AssemblyProduct("AspMVCAdminLTE")] 12 | [assembly: AssemblyCopyright("Copyright © 2020")] 13 | [assembly: AssemblyTrademark("")] 14 | [assembly: AssemblyCulture("")] 15 | 16 | // Setting ComVisible to false makes the types in this assembly not visible 17 | // to COM components. If you need to access a type in this assembly from 18 | // COM, set the ComVisible attribute to true on that type. 19 | [assembly: ComVisible(false)] 20 | 21 | // The following GUID is for the ID of the typelib if this project is exposed to COM 22 | [assembly: Guid("a225b6f4-eb9b-4014-a3d0-204c8157f242")] 23 | 24 | // Version information for an assembly consists of the following four values: 25 | // 26 | // Major Version 27 | // Minor Version 28 | // Build Number 29 | // Revision 30 | // 31 | // You can specify all the values or you can default the Revision and Build Numbers 32 | // by using the '*' as shown below: 33 | [assembly: AssemblyVersion("1.0.0.0")] 34 | [assembly: AssemblyFileVersion("1.0.0.0")] -------------------------------------------------------------------------------- /WebCore/build/scss/plugins/_toastr.scss: -------------------------------------------------------------------------------- 1 | // 2 | // Plugin: Toastr 3 | // 4 | 5 | // Background to FontAwesome Icons 6 | // #toast-container > .toast { 7 | // background-image: none !important; 8 | // } 9 | // #toast-container > .toast .toast-message:before { 10 | // font-family: 'Font Awesome 5 Free'; 11 | // font-size: 24px; 12 | // font-weight: 900; 13 | // line-height: 18px; 14 | // float: left; 15 | // color: #FFF; 16 | // padding-right: 0.5em; 17 | // margin: auto 0.5em auto -1.5em; 18 | // } 19 | // #toast-container > .toast-warning .toast-message:before { 20 | // content: "\f06a"; 21 | // } 22 | // #toast-container > .toast-error .toast-message:before { 23 | // content: "\f071"; 24 | // } 25 | // #toast-container > .toast-info .toast-message:before { 26 | // content: "\f05a"; 27 | // } 28 | // #toast-container > .toast-success .toast-message:before { 29 | // content: "\f058"; 30 | // } 31 | 32 | #toast-container { 33 | // Background color 34 | .toast { 35 | background-color: $primary; 36 | } 37 | 38 | .toast-success { 39 | background-color: $success; 40 | } 41 | 42 | .toast-error { 43 | background-color: $danger; 44 | } 45 | 46 | .toast-info { 47 | background-color: $info; 48 | } 49 | 50 | .toast-warning { 51 | background-color: $warning; 52 | } 53 | } 54 | 55 | // full width fix 56 | .toast-bottom-full-width .toast, 57 | .toast-top-full-width .toast { 58 | max-width: inherit; 59 | } -------------------------------------------------------------------------------- /WebCore/build/scss/pages/_lockscreen.scss: -------------------------------------------------------------------------------- 1 | // 2 | // Pages: Lock Screen 3 | // 4 | 5 | // ADD THIS CLASS TO THE TAG 6 | .lockscreen { 7 | background: $gray-200; 8 | // User name [optional] 9 | .lockscreen-name { 10 | font-weight: 600; 11 | text-align: center; 12 | } 13 | } 14 | 15 | .lockscreen-logo { 16 | font-size: 35px; 17 | font-weight: 300; 18 | margin-bottom: 25px; 19 | text-align: center; 20 | 21 | a { 22 | color: $gray-700; 23 | } 24 | } 25 | 26 | .lockscreen-wrapper { 27 | margin: 0 auto; 28 | margin-top: 10%; 29 | max-width: 400px; 30 | } 31 | 32 | // Will contain the image and the sign in form 33 | .lockscreen-item { 34 | @include border-radius(4px); 35 | background: $white; 36 | margin: 10px auto 30px; 37 | padding: 0; 38 | position: relative; 39 | width: 290px; 40 | } 41 | 42 | // User image 43 | .lockscreen-image { 44 | @include border-radius(50%); 45 | background: $white; 46 | left: -10px; 47 | padding: 5px; 48 | position: absolute; 49 | top: -25px; 50 | z-index: 10; 51 | 52 | > img { 53 | @include border-radius(50%); 54 | height: 70px; 55 | width: 70px; 56 | } 57 | } 58 | 59 | // Contains the password input and the login button 60 | .lockscreen-credentials { 61 | margin-left: 70px; 62 | 63 | .form-control { 64 | border: 0; 65 | } 66 | 67 | .btn { 68 | background-color: $white; 69 | border: 0; 70 | padding: 0 10px; 71 | } 72 | } 73 | 74 | .lockscreen-footer { 75 | margin-top: 10px; 76 | } -------------------------------------------------------------------------------- /Migrations/202007131656182_AddingUserTable.cs: -------------------------------------------------------------------------------- 1 | namespace AspMVCAdminLTE.Migrations 2 | { 3 | using System.Data.Entity.Migrations; 4 | 5 | public partial class AddingUserTable : DbMigration 6 | { 7 | public override void Up() 8 | { 9 | CreateTable( 10 | "dbo.Users", 11 | c => new 12 | { 13 | Id = c.Int(nullable: false, identity: true), 14 | FirstName = c.String(nullable: false), 15 | LastName = c.String(), 16 | Mobile = c.String(nullable: false, maxLength: 12), 17 | UserName = c.String(nullable: false, maxLength: 20), 18 | Password = c.String(nullable: false), 19 | IsMobileVerified = c.Boolean(nullable: false), 20 | DateOfBirth = c.DateTime(), 21 | Email = c.String(maxLength: 100), 22 | Gender = c.Int(nullable: false), 23 | IsEmailVerified = c.Boolean(nullable: false), 24 | ProfilePic = c.String(), 25 | UserRole = c.Int(nullable: false), 26 | }) 27 | .PrimaryKey(t => t.Id) 28 | .Index(t => t.Mobile, unique: true, name: "IX_MobileNumber") 29 | .Index(t => t.UserName, unique: true, name: "IX_Username") 30 | .Index(t => t.Email, unique: true); 31 | } 32 | 33 | public override void Down() 34 | { 35 | DropIndex("dbo.Users", new[] { "Email" }); 36 | DropIndex("dbo.Users", "IX_Username"); 37 | DropIndex("dbo.Users", "IX_MobileNumber"); 38 | DropTable("dbo.Users"); 39 | } 40 | } 41 | } -------------------------------------------------------------------------------- /WebCore/build/scss/_table.scss: -------------------------------------------------------------------------------- 1 | // 2 | // Component: Table 3 | // 4 | 5 | .table { 6 | &:not(.table-dark) { 7 | color: inherit; 8 | } 9 | // fixed table head 10 | &.table-head-fixed { 11 | thead tr:nth-child(1) th { 12 | background-color: $white; 13 | border-bottom: 0; 14 | box-shadow: inset 0 1px 0 $table-border-color, inset 0 -1px 0 $table-border-color; 15 | position: sticky; 16 | top: 0; 17 | z-index: 10; 18 | } 19 | 20 | &.table-dark { 21 | thead tr { 22 | &:nth-child(1) th { 23 | background-color: $table-dark-bg; 24 | box-shadow: inset 0 1px 0 $table-dark-border-color, inset 0 -1px 0 $table-dark-border-color; 25 | } 26 | } 27 | } 28 | } 29 | // no border 30 | &.no-border { 31 | &, 32 | td, 33 | th { 34 | border: 0; 35 | } 36 | } 37 | // .text-center in tables 38 | &.text-center { 39 | &, 40 | td, 41 | th { 42 | text-align: center; 43 | } 44 | } 45 | 46 | &.table-valign-middle { 47 | thead > tr > th, 48 | thead > tr > td, 49 | tbody > tr > th, 50 | tbody > tr > td { 51 | vertical-align: middle; 52 | } 53 | } 54 | 55 | .card-body.p-0 & { 56 | thead > tr > th, 57 | thead > tr > td, 58 | tbody > tr > th, 59 | tbody > tr > td { 60 | &:first-of-type { 61 | padding-left: map-get($spacers, 4); 62 | } 63 | 64 | &:last-of-type { 65 | padding-right: map-get($spacers, 4); 66 | } 67 | } 68 | } 69 | } -------------------------------------------------------------------------------- /Migrations/Configuration.cs: -------------------------------------------------------------------------------- 1 | namespace AspMVCAdminLTE.Migrations 2 | { 3 | using AspMVCAdminLTE.Entity; 4 | using System.Collections.Generic; 5 | using System.Data.Entity.Migrations; 6 | using System.Data.Entity.Validation; 7 | using System.Linq; 8 | 9 | internal sealed class Configuration : DbMigrationsConfiguration 10 | { 11 | public Configuration() 12 | { 13 | AutomaticMigrationsEnabled = false; 14 | } 15 | 16 | protected override void Seed(Repository.RepositoryContext context) 17 | { 18 | // This method will be called after migrating to the latest version. 19 | if (context.Users.Count() > 0) 20 | { 21 | return; 22 | } 23 | context.Users.AddRange(BuildUserList()); 24 | try 25 | { 26 | context.SaveChanges(); 27 | } 28 | catch (DbEntityValidationException ex) 29 | { 30 | throw; 31 | } 32 | } 33 | 34 | private IEnumerable BuildUserList() 35 | { 36 | var users = new List 37 | { 38 | new User 39 | { 40 | FirstName = "Super", 41 | LastName = "Admin", 42 | UserName = "sadmin", 43 | Email = "superadmin@gmail.com", 44 | Mobile = "0000000000", 45 | Password = Utils.Encryption.HashString("pwd@1234"), 46 | UserRole = Entity.Enums.UserRole.Admin, 47 | Gender = Entity.Enums.Gender.Male 48 | } 49 | }; 50 | return users; 51 | } 52 | } 53 | } -------------------------------------------------------------------------------- /WebCore/build/scss/plugins/_icheck-bootstrap.scss: -------------------------------------------------------------------------------- 1 | // 2 | // Plugin: iCheck Bootstrap 3 | // 4 | 5 | // iCheck colors (theme colors) 6 | @each $name, $color in $theme-colors { 7 | .icheck-#{$name} > input:first-child:not(:checked):not(:disabled):hover + label::before, 8 | .icheck-#{$name} > input:first-child:not(:checked):not(:disabled):hover + input[type="hidden"] + label::before { 9 | border-color: #{$color}; 10 | } 11 | 12 | .icheck-#{$name} > input:first-child:not(:checked):not(:disabled):focus + label::before, 13 | .icheck-#{$name} > input:first-child:not(:checked):not(:disabled):focus + input[type="hidden"] + label::before { 14 | border-color: #{$color}; 15 | } 16 | 17 | .icheck-#{$name} > input:first-child:checked + label::before, 18 | .icheck-#{$name} > input:first-child:checked + input[type="hidden"] + label::before { 19 | background-color: #{$color}; 20 | border-color: #{$color}; 21 | } 22 | } 23 | 24 | // iCheck colors (colors) 25 | @each $name, $color in $colors { 26 | .icheck-#{$name} > input:first-child:not(:checked):not(:disabled):hover + label::before, 27 | .icheck-#{$name} > input:first-child:not(:checked):not(:disabled):hover + input[type="hidden"] + label::before { 28 | border-color: #{$color}; 29 | } 30 | 31 | .icheck-#{$name} > input:first-child:not(:checked):not(:disabled):focus + label::before, 32 | .icheck-#{$name} > input:first-child:not(:checked):not(:disabled):focus + input[type="hidden"] + label::before { 33 | border-color: #{$color}; 34 | } 35 | 36 | .icheck-#{$name} > input:first-child:checked + label::before, 37 | .icheck-#{$name} > input:first-child:checked + input[type="hidden"] + label::before { 38 | background-color: #{$color}; 39 | border-color: #{$color}; 40 | } 41 | } -------------------------------------------------------------------------------- /WebCore/build/scss/plugins/_mapael.scss: -------------------------------------------------------------------------------- 1 | // 2 | // Plugins: jQuery Mapael 3 | // 4 | 5 | .mapael { 6 | .map { 7 | position: relative; 8 | } 9 | 10 | .mapTooltip { 11 | @include reset-text(); 12 | @include border-radius($tooltip-border-radius); 13 | @include font-size($tooltip-font-size); 14 | background-color: $tooltip-bg; 15 | color: $tooltip-color; 16 | display: block; 17 | max-width: $tooltip-max-width; 18 | padding: $tooltip-padding-y $tooltip-padding-x; 19 | position: absolute; 20 | text-align: center; 21 | word-wrap: break-word; 22 | z-index: $zindex-tooltip; 23 | } 24 | 25 | .myLegend { 26 | background-color: $gray-100; 27 | border: 1px solid $gray-500; 28 | padding: 10px; 29 | width: 600px; 30 | } 31 | 32 | .zoomButton { 33 | background-color: $button-default-background-color; 34 | border: 1px solid $button-default-border-color; 35 | border-radius: $btn-border-radius; 36 | color: $button-default-color; 37 | cursor: pointer; 38 | font-weight: bold; 39 | height: 16px; 40 | left: 10px; 41 | line-height: 14px; 42 | padding-left: 1px; 43 | position: absolute; 44 | text-align: center; 45 | top: 0; 46 | user-select: none; 47 | width: 16px; 48 | 49 | &:hover, 50 | &:active, 51 | &.hover { 52 | background-color: darken($button-default-background-color, 5%); 53 | color: darken($button-default-color, 10%); 54 | } 55 | } 56 | 57 | .zoomReset { 58 | line-height: 12px; 59 | top: 10px; 60 | } 61 | 62 | .zoomIn { 63 | top: 30px; 64 | } 65 | 66 | .zoomOut { 67 | top: 50px; 68 | } 69 | } -------------------------------------------------------------------------------- /ApiControllers/AccountController.cs: -------------------------------------------------------------------------------- 1 | using AspMVCAdminLTE.Entity; 2 | using AspMVCAdminLTE.Entity.Enums; 3 | using AspMVCAdminLTE.Infrastructure; 4 | using AspMVCAdminLTE.Repository; 5 | using System; 6 | using System.Linq; 7 | using System.Web.Http; 8 | 9 | namespace AspMVCAdminLTE.ApiControllers 10 | { 11 | public class AccountController : BaseApiController 12 | { 13 | private readonly IRepositoryWrapper repositoryWrapper; 14 | 15 | public AccountController(IRepositoryWrapper repositoryWrapper) 16 | { 17 | this.repositoryWrapper = repositoryWrapper; 18 | } 19 | 20 | [HttpPost] 21 | public IHttpActionResult Register(User user) 22 | { 23 | try 24 | { 25 | if (ModelState.IsValid) 26 | { 27 | user.UserRole = UserRole.Normal; //Make sure the userType is not set to admin. 28 | var result = repositoryWrapper.User.Create(user); 29 | if (result != null) 30 | return Success(result); 31 | else 32 | return InternalServerError(); 33 | } 34 | } 35 | catch (Exception ex) 36 | { 37 | ModelState.AddModelError("Error", ex.InnerException.InnerException.Message); 38 | } 39 | return ModelError(); 40 | } 41 | 42 | [Authorize(Roles = "Admin")] 43 | public IHttpActionResult Get() 44 | { 45 | return Success(repositoryWrapper.User.FindAll().ToList()); 46 | } 47 | 48 | [HttpGet] 49 | [Authorize(Roles = "Admin, Normal")] 50 | public IHttpActionResult GetProfile() 51 | { 52 | return Success(repositoryWrapper.User.FindByCondition(x => x.Id == GetUserId())); 53 | } 54 | } 55 | } -------------------------------------------------------------------------------- /WebCore/build/scss/_brand.scss: -------------------------------------------------------------------------------- 1 | // 2 | // Component: Brand 3 | // 4 | 5 | .brand-link { 6 | $brand-link-padding-y: $navbar-brand-padding-y + $navbar-padding-y; 7 | display: block; 8 | font-size: $navbar-brand-font-size; 9 | line-height: $line-height-lg; 10 | padding: $brand-link-padding-y $sidebar-padding-x; 11 | transition: width $transition-speed $transition-fn; 12 | white-space: nowrap; 13 | 14 | &:hover { 15 | color: $white; 16 | text-decoration: none; 17 | } 18 | 19 | .text-sm & { 20 | font-size: inherit; 21 | } 22 | 23 | [class*='sidebar-dark'] & { 24 | border-bottom: 1px solid lighten($dark, 10%); 25 | color: rgba($white, .8); 26 | } 27 | 28 | [class*='sidebar-light'] & { 29 | border-bottom: 1px solid $gray-300; 30 | color: rgba($black, .8); 31 | } 32 | 33 | .brand-image { 34 | float: left; 35 | line-height: .8; 36 | margin-left: .8rem; 37 | margin-right: .5rem; 38 | margin-top: -3px; 39 | max-height: 33px; 40 | width: auto; 41 | } 42 | 43 | .brand-image-xs { 44 | float: left; 45 | line-height: .8; 46 | margin-top: -.1rem; 47 | max-height: 33px; 48 | width: auto; 49 | } 50 | 51 | .brand-image-xl { 52 | line-height: .8; 53 | max-height: 40px; 54 | width: auto; 55 | 56 | &.single { 57 | margin-top: -.3rem; 58 | } 59 | } 60 | 61 | &.text-sm, 62 | .text-sm & { 63 | .brand-image { 64 | height: 29px; 65 | margin-bottom: -.25rem; 66 | margin-left: .95rem; 67 | margin-top: -.25rem; 68 | } 69 | 70 | .brand-image-xs { 71 | margin-top: -.2rem; 72 | max-height: 29px; 73 | } 74 | 75 | .brand-image-xl { 76 | margin-top: -.225rem; 77 | max-height: 38px; 78 | } 79 | } 80 | } -------------------------------------------------------------------------------- /Views/web.config: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 |
7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | -------------------------------------------------------------------------------- /WebCore/build/scss/pages/_mailbox.scss: -------------------------------------------------------------------------------- 1 | // 2 | // Pages: Mailbox 3 | // 4 | 5 | .mailbox-messages { 6 | > .table { 7 | margin: 0; 8 | } 9 | } 10 | 11 | .mailbox-controls { 12 | padding: 5px; 13 | 14 | &.with-border { 15 | border-bottom: 1px solid $card-border-color; 16 | } 17 | } 18 | 19 | .mailbox-read-info { 20 | border-bottom: 1px solid $card-border-color; 21 | padding: 10px; 22 | 23 | h3 { 24 | font-size: 20px; 25 | margin: 0; 26 | } 27 | 28 | h5 { 29 | margin: 0; 30 | padding: 5px 0 0; 31 | } 32 | } 33 | 34 | .mailbox-read-time { 35 | color: #999; 36 | font-size: 13px; 37 | } 38 | 39 | .mailbox-read-message { 40 | padding: 10px; 41 | } 42 | 43 | .mailbox-attachments { 44 | @include list-unstyled; 45 | 46 | li { 47 | border: 1px solid #eee; 48 | float: left; 49 | margin-bottom: 10px; 50 | margin-right: 10px; 51 | width: 200px; 52 | } 53 | } 54 | 55 | .mailbox-attachment-name { 56 | color: #666; 57 | font-weight: bold; 58 | } 59 | 60 | .mailbox-attachment-icon, 61 | .mailbox-attachment-info, 62 | .mailbox-attachment-size { 63 | display: block; 64 | } 65 | 66 | .mailbox-attachment-info { 67 | background: $gray-100; 68 | padding: 10px; 69 | } 70 | 71 | .mailbox-attachment-size { 72 | color: #999; 73 | font-size: 12px; 74 | 75 | > span { 76 | display: inline-block; 77 | padding-top: 0.75rem; 78 | } 79 | } 80 | 81 | .mailbox-attachment-icon { 82 | color: #666; 83 | font-size: 65px; 84 | max-height: 132.5px; 85 | padding: 20px 10px; 86 | text-align: center; 87 | 88 | &.has-img { 89 | padding: 0; 90 | 91 | > img { 92 | height: auto; 93 | max-width: 100%; 94 | } 95 | } 96 | } 97 | 98 | .mailbox-attachment-close { 99 | @extend .close; 100 | } -------------------------------------------------------------------------------- /WebCore/build/scss/_social-widgets.scss: -------------------------------------------------------------------------------- 1 | // 2 | // Component: Social Widgets 3 | // 4 | 5 | //General widget style 6 | .card-widget { 7 | border: 0; 8 | position: relative; 9 | } 10 | 11 | //User Widget Style 1 12 | .widget-user { 13 | //User name container 14 | .widget-user-header { 15 | @if $enable-rounded { 16 | @include border-top-radius($border-radius); 17 | } 18 | 19 | height: 135px; 20 | padding: 1rem; 21 | text-align: center; 22 | } 23 | //User name 24 | .widget-user-username { 25 | font-size: 25px; 26 | font-weight: 300; 27 | margin-bottom: 0; 28 | margin-top: 0; 29 | text-shadow: 0 1px 1px rgba($black, 0.2); 30 | } 31 | //User single line description 32 | .widget-user-desc { 33 | margin-top: 0; 34 | } 35 | //User image container 36 | .widget-user-image { 37 | left: 50%; 38 | margin-left: -45px; 39 | position: absolute; 40 | top: 80px; 41 | 42 | > img { 43 | border: 3px solid $white; 44 | height: auto; 45 | width: 90px; 46 | } 47 | } 48 | 49 | .card-footer { 50 | padding-top: 50px; 51 | } 52 | } 53 | 54 | //User Widget Style 2 55 | .widget-user-2 { 56 | //User name container 57 | .widget-user-header { 58 | @include border-top-radius($border-radius); 59 | padding: 1rem; 60 | } 61 | //User name 62 | .widget-user-username { 63 | font-size: 25px; 64 | font-weight: 300; 65 | margin-bottom: 5px; 66 | margin-top: 5px; 67 | } 68 | //User single line description 69 | .widget-user-desc { 70 | margin-top: 0; 71 | } 72 | 73 | .widget-user-username, 74 | .widget-user-desc { 75 | margin-left: 75px; 76 | } 77 | //User image container 78 | .widget-user-image { 79 | > img { 80 | float: left; 81 | height: auto; 82 | width: 65px; 83 | } 84 | } 85 | } -------------------------------------------------------------------------------- /WebCore/build/scss/mixins/_backgrounds.scss: -------------------------------------------------------------------------------- 1 | // 2 | // Mixins: Backgrounds 3 | // 4 | 5 | // Background Variant 6 | @mixin background-variant($name, $color) { 7 | .bg-#{$name} { 8 | background-color: #{$color} !important; 9 | 10 | &, 11 | > a { 12 | color: color-yiq($color) !important; 13 | } 14 | 15 | &.btn { 16 | &:hover { 17 | border-color: darken($color, 10%); 18 | color: darken(color-yiq($color), 7.5%); 19 | } 20 | 21 | &:not(:disabled):not(.disabled):active, 22 | &:not(:disabled):not(.disabled).active, 23 | &:active, 24 | &.active { 25 | background-color: darken($color, 10%) !important; 26 | border-color: darken($color, 12.5%); 27 | color: color-yiq(darken($color, 10%)); 28 | } 29 | } 30 | } 31 | } 32 | 33 | // Background Gradient Variant 34 | @mixin background-gradient-variant($name, $color) { 35 | .bg-gradient-#{$name} { 36 | @include bg-gradient-variant('&', $color); 37 | color: color-yiq($color); 38 | 39 | &.btn { 40 | &.disabled, 41 | &:disabled, 42 | &:not(:disabled):not(.disabled):active, 43 | &:not(:disabled):not(.disabled).active, 44 | .show > &.dropdown-toggle { 45 | background-image: none !important; 46 | } 47 | 48 | &:hover { 49 | @include bg-gradient-variant('&', darken($color, 7.5%)); 50 | border-color: darken($color, 10%); 51 | color: darken(color-yiq($color), 7.5%); 52 | } 53 | 54 | &:not(:disabled):not(.disabled):active, 55 | &:not(:disabled):not(.disabled).active, 56 | &:active, 57 | &.active { 58 | @include bg-gradient-variant('&', darken($color, 10%)); 59 | border-color: darken($color, 12.5%); 60 | color: color-yiq(darken($color, 10%)); 61 | } 62 | } 63 | } 64 | } -------------------------------------------------------------------------------- /WebCore/build/scss/_colors.scss: -------------------------------------------------------------------------------- 1 | // 2 | // Misc: Colors 3 | // 4 | 5 | // Background colors (theme colors) 6 | @each $name, $color in $theme-colors { 7 | @include background-variant($name, $color); 8 | } 9 | 10 | // Background colors (colors) 11 | @each $name, $color in $colors { 12 | @include background-variant($name, $color); 13 | } 14 | 15 | .bg-gray { 16 | background-color: $gray-500; 17 | color: color-yiq($gray-500); 18 | } 19 | 20 | .bg-gray-light { 21 | background-color: lighten($gray-200, 3%); 22 | color: color-yiq(lighten($gray-200, 3%)) !important; 23 | } 24 | 25 | .bg-black { 26 | background-color: $black; 27 | color: color-yiq($black) !important; 28 | } 29 | 30 | .bg-white { 31 | background-color: $white; 32 | color: color-yiq($white) !important; 33 | } 34 | 35 | // Gradient Background colors (theme colors) 36 | @each $name, $color in $theme-colors { 37 | @include background-gradient-variant($name, $color); 38 | } 39 | 40 | // Gradient Background colors (colors) 41 | @each $name, $color in $colors { 42 | @include background-gradient-variant($name, $color); 43 | } 44 | 45 | // Backgrund Color Disabled 46 | [class^='bg-'].disabled { 47 | opacity: .65; 48 | } 49 | 50 | // Text muted hover 51 | a.text-muted:hover { 52 | color: theme-color(primary) !important; 53 | } 54 | 55 | // Link Styles 56 | .link-muted { 57 | color: darken($gray-500, 30%); 58 | 59 | &:hover, 60 | &:focus { 61 | color: darken($gray-500, 40%); 62 | } 63 | } 64 | 65 | .link-black { 66 | color: $gray-600; 67 | 68 | &:hover, 69 | &:focus { 70 | color: lighten($gray-500, 20%); 71 | } 72 | } 73 | 74 | // Accent colors (theme colors) 75 | @each $name, $color in $theme-colors { 76 | @include accent-variant($name, $color); 77 | } 78 | 79 | // Accent colors (colors) 80 | @each $name, $color in $colors { 81 | @include accent-variant($name, $color); 82 | } 83 | 84 | // Accent button override fix 85 | [class*="accent-"] { 86 | @each $name, $color in $theme-colors { 87 | a.btn-#{$name} { 88 | color: color-yiq($color); 89 | } 90 | } 91 | } -------------------------------------------------------------------------------- /Controllers/LoginController.cs: -------------------------------------------------------------------------------- 1 | using AspMVCAdminLTE.Models; 2 | using AspMVCAdminLTE.Repository; 3 | using System; 4 | using System.Web.Mvc; 5 | using System.Web.Security; 6 | 7 | namespace AspMVCAdminLTE.Controllers 8 | { 9 | public class LoginController : Controller 10 | { 11 | private readonly IRepositoryWrapper repositoryWrapper; 12 | 13 | public LoginController(IRepositoryWrapper repositoryWrapper) 14 | { 15 | this.repositoryWrapper = repositoryWrapper; 16 | } 17 | 18 | // GET: Login 19 | public ActionResult Index() 20 | { 21 | return View(); 22 | } 23 | 24 | [HttpPost] 25 | public ActionResult AdminLogin(UserLoginModel userLoginModel) 26 | { 27 | if (ModelState.IsValid) 28 | { 29 | var user = repositoryWrapper.User.ValidateAdminUser(userLoginModel.UserName, userLoginModel.Password); 30 | if (user != null) 31 | { 32 | //SessionManager.User = Mapper.Map(user); 33 | FormsAuthentication.SetAuthCookie(user.UserName, false); 34 | return RedirectToAction("SimpleTables", "Default"); 35 | } 36 | else 37 | { 38 | ViewBag.Message = "Invalid username or password !"; 39 | } 40 | } 41 | return View("Index"); 42 | } 43 | 44 | public ActionResult ForgetPassword() 45 | { 46 | ViewBag.Success = false; 47 | return View(); 48 | } 49 | 50 | [HttpPost] 51 | public ActionResult ForgetPassword(UserLoginModel userLoginModel) 52 | { 53 | //Add reset password logic here 54 | throw new NotImplementedException(); 55 | } 56 | 57 | public void LogOut() 58 | { 59 | Session.RemoveAll(); 60 | Session.Clear(); 61 | FormsAuthentication.SignOut(); 62 | Session.Abandon(); 63 | FormsAuthentication.RedirectToLoginPage(); 64 | } 65 | } 66 | } -------------------------------------------------------------------------------- /Providers/TokenAuthProvider.cs: -------------------------------------------------------------------------------- 1 | using AspMVCAdminLTE.Entity; 2 | using AspMVCAdminLTE.Repository; 3 | using Microsoft.Owin.Security.OAuth; 4 | using System.Security.Claims; 5 | using System.Threading.Tasks; 6 | 7 | namespace AspMVCAdminLTE.Providers 8 | { 9 | public class TokenAuthProvider : OAuthAuthorizationServerProvider 10 | { 11 | private User user = null; 12 | private IRepositoryWrapper _repoWrapper; 13 | 14 | public TokenAuthProvider(IRepositoryWrapper repoWrapper) 15 | { 16 | _repoWrapper = repoWrapper; 17 | } 18 | 19 | public override async Task ValidateClientAuthentication(OAuthValidateClientAuthenticationContext context) 20 | { 21 | context.Validated(); 22 | } 23 | 24 | public override Task TokenEndpoint(OAuthTokenEndpointContext context) 25 | { 26 | context.AdditionalResponseParameters.Add("UserId", this.user.Id); 27 | context.AdditionalResponseParameters.Add("Firstname", this.user.FirstName); 28 | context.AdditionalResponseParameters.Add("Lastname", this.user.LastName); 29 | context.AdditionalResponseParameters.Add("Username", this.user.UserName); 30 | return base.TokenEndpoint(context); 31 | } 32 | 33 | public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context) 34 | { 35 | var user = _repoWrapper.User.ValidateUser(context.UserName, context.Password); 36 | if (user == null) 37 | { 38 | context.SetError("invalid_grant", "Provided username and password is incorrect"); 39 | return; 40 | } 41 | var identity = new ClaimsIdentity(context.Options.AuthenticationType); 42 | identity.AddClaim(new Claim(ClaimTypes.Role, user.UserRole.ToString())); 43 | identity.AddClaim(new Claim(ClaimTypes.Name, user.UserName)); 44 | identity.AddClaim(new Claim("Mobile", user.Mobile)); 45 | identity.AddClaim(new Claim("Id", user.Id.ToString())); 46 | this.user = user; 47 | context.Validated(identity); 48 | } 49 | } 50 | } -------------------------------------------------------------------------------- /WebCore/build/scss/mixins/_cards.scss: -------------------------------------------------------------------------------- 1 | // 2 | // Mixins: Cards Variant 3 | // 4 | 5 | @mixin cards-variant($name, $color) { 6 | .card-#{$name} { 7 | &:not(.card-outline) { 8 | > .card-header { 9 | background-color: $color; 10 | 11 | &, 12 | a { 13 | color: color-yiq($color); 14 | } 15 | 16 | a.active { 17 | color: color-yiq($white); 18 | } 19 | } 20 | } 21 | 22 | &.card-outline { 23 | border-top: 3px solid $color; 24 | } 25 | 26 | &.card-outline-tabs { 27 | > .card-header { 28 | a { 29 | &:hover { 30 | border-top: 3px solid $nav-tabs-border-color; 31 | } 32 | 33 | &.active { 34 | border-top: 3px solid $color; 35 | } 36 | } 37 | } 38 | } 39 | } 40 | 41 | .bg-#{$name}, 42 | .bg-gradient-#{$name}, 43 | .card-#{$name}:not(.card-outline) { 44 | .btn-tool { 45 | color: rgba(color-yiq($color), 0.8); 46 | 47 | &:hover { 48 | color: color-yiq($color); 49 | } 50 | } 51 | } 52 | 53 | .card.bg-#{$name}, 54 | .card.bg-gradient-#{$name} { 55 | .bootstrap-datetimepicker-widget { 56 | .table td, 57 | .table th { 58 | border: none; 59 | } 60 | 61 | table thead tr:first-child th:hover, 62 | table td.day:hover, 63 | table td.hour:hover, 64 | table td.minute:hover, 65 | table td.second:hover { 66 | background: darken($color, 8%); 67 | color: color-yiq($color); 68 | } 69 | 70 | table td.today::before { 71 | border-bottom-color: color-yiq($color); 72 | } 73 | 74 | table td.active, 75 | table td.active:hover { 76 | background: lighten($color, 10%); 77 | color: color-yiq($color); 78 | } 79 | } 80 | } 81 | } -------------------------------------------------------------------------------- /packages.config: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /WebCore/build/scss/pages/_login_and_register.scss: -------------------------------------------------------------------------------- 1 | // 2 | // Pages: Login & Register 3 | // 4 | 5 | .login-logo, 6 | .register-logo { 7 | font-size: 2.1rem; 8 | font-weight: 300; 9 | margin-bottom: .9rem; 10 | text-align: center; 11 | 12 | a { 13 | color: $gray-700; 14 | } 15 | } 16 | 17 | .login-page, 18 | .register-page { 19 | align-items: center; 20 | background: $gray-200; 21 | display: flex; 22 | flex-direction: column; 23 | height: 100vh; 24 | justify-content: center; 25 | } 26 | 27 | .login-box, 28 | .register-box { 29 | width: 360px; 30 | 31 | @media (max-width: map-get($grid-breakpoints, sm)) { 32 | margin-top: .5rem; 33 | width: 90%; 34 | } 35 | } 36 | 37 | .login-card-body, 38 | .register-card-body { 39 | background: $white; 40 | border-top: 0; 41 | color: #666; 42 | padding: 20px; 43 | 44 | .input-group { 45 | .form-control { 46 | border-right: 0; 47 | 48 | &:focus { 49 | box-shadow: none; 50 | 51 | & ~ .input-group-append .input-group-text { 52 | border-color: $input-focus-border-color; 53 | } 54 | } 55 | 56 | &.is-valid { 57 | &:focus { 58 | box-shadow: none; 59 | } 60 | 61 | & ~ .input-group-append .input-group-text { 62 | border-color: $success; 63 | } 64 | } 65 | 66 | &.is-invalid { 67 | &:focus { 68 | box-shadow: none; 69 | } 70 | 71 | & ~ .input-group-append .input-group-text { 72 | border-color: $danger; 73 | } 74 | } 75 | } 76 | 77 | .input-group-text { 78 | background-color: transparent; 79 | border-bottom-right-radius: $border-radius; 80 | border-left: 0; 81 | border-top-right-radius: $border-radius; 82 | color: #777; 83 | transition: $input-transition; 84 | } 85 | } 86 | } 87 | 88 | .login-box-msg, 89 | .register-box-msg { 90 | margin: 0; 91 | padding: 0 20px 20px; 92 | text-align: center; 93 | } 94 | 95 | .social-auth-links { 96 | margin: 10px 0; 97 | } -------------------------------------------------------------------------------- /Startup.cs: -------------------------------------------------------------------------------- 1 | using AspMVCAdminLTE.App_Start; 2 | using AspMVCAdminLTE.Providers; 3 | using AspMVCAdminLTE.Repository; 4 | using Autofac.Integration.WebApi; 5 | using Microsoft.Owin; 6 | using Microsoft.Owin.Security.OAuth; 7 | using Owin; 8 | using System; 9 | using System.Data.Entity; 10 | using System.Web.Http; 11 | using System.Web.Mvc; 12 | using System.Web.Routing; 13 | 14 | [assembly: OwinStartup(typeof(AspMVCAdminLTE.Startup))] 15 | 16 | namespace AspMVCAdminLTE 17 | { 18 | public class Startup 19 | { 20 | public static OAuthBearerAuthenticationOptions OAuthBearerOptions { get; private set; } 21 | 22 | public void Configuration(IAppBuilder app) 23 | { 24 | // For more information on how to configure your application, visit https://go.microsoft.com/fwlink/?LinkID=316888 25 | HttpConfiguration config = new HttpConfiguration(); 26 | var container = AutofacConfig.RegisterComponents(); 27 | AreaRegistration.RegisterAllAreas(); 28 | RouteConfig.RegisterRoutes(RouteTable.Routes); 29 | //AutoMapperConfig.Configure(); 30 | 31 | ConfigureOAuth(app); 32 | 33 | WebApiConfig.Register(config); 34 | app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll); 35 | app.UseWebApi(config); 36 | config.DependencyResolver = new AutofacWebApiDependencyResolver(container); 37 | Database.SetInitializer(new CreateDatabaseIfNotExists()); 38 | } 39 | 40 | public void ConfigureOAuth(IAppBuilder app) 41 | { 42 | OAuthBearerOptions = new OAuthBearerAuthenticationOptions(); 43 | OAuthAuthorizationServerOptions OAuthServerOptions = new OAuthAuthorizationServerOptions() 44 | { 45 | AllowInsecureHttp = true, 46 | TokenEndpointPath = new PathString("/token"), 47 | AccessTokenExpireTimeSpan = TimeSpan.FromDays(90), 48 | Provider = new TokenAuthProvider(new RepositoryWrapper(new RepositoryContext())) 49 | //RefreshTokenProvider = new RefreshTokenProvider() 50 | }; 51 | 52 | // Token Generation 53 | app.UseOAuthAuthorizationServer(OAuthServerOptions); 54 | app.UseOAuthBearerAuthentication(OAuthBearerOptions); 55 | } 56 | } 57 | } -------------------------------------------------------------------------------- /WebCore/build/js/.jscsrc: -------------------------------------------------------------------------------- 1 | { 2 | "esnext": true, 3 | "verbose": true, 4 | "disallowEmptyBlocks": true, 5 | "disallowKeywords": ["with"], 6 | "disallowMixedSpacesAndTabs": true, 7 | "disallowMultipleLineStrings": true, 8 | "disallowMultipleVarDecl": true, 9 | "disallowQuotedKeysInObjects": "allButReserved", 10 | "disallowSpaceAfterPrefixUnaryOperators": ["++", "--", "+", "-", "~", "!"], 11 | "disallowSpaceBeforeBinaryOperators": [","], 12 | "disallowSpaceBeforePostfixUnaryOperators": ["++", "--"], 13 | "disallowSpacesInFunctionDeclaration": { "beforeOpeningRoundBrace": true }, 14 | "disallowSpacesInNamedFunctionExpression": { "beforeOpeningRoundBrace": true }, 15 | "disallowSpacesInsideArrayBrackets": true, 16 | "disallowSpacesInsideParentheses": true, 17 | "disallowTrailingComma": true, 18 | "disallowTrailingWhitespace": true, 19 | "requireCamelCaseOrUpperCaseIdentifiers": true, 20 | "requireCapitalizedConstructors": true, 21 | "requireCommaBeforeLineBreak": true, 22 | "requireDollarBeforejQueryAssignment": true, 23 | "requireDotNotation": true, 24 | "requireLineFeedAtFileEnd": true, 25 | "requirePaddingNewLinesAfterUseStrict": true, 26 | "requirePaddingNewLinesBeforeExport": true, 27 | "requireSpaceAfterBinaryOperators": ["+", "-", "/", "*", "=", "==", "===", "!=", "!==", ">", "<", ">=", "<="], 28 | "requireSpaceAfterKeywords": ["if", "else", "for", "while", "do", "switch", "return", "try", "catch"], 29 | "requireSpaceAfterLineComment": true, 30 | "requireSpaceBeforeBinaryOperators": ["+", "-", "/", "*", "=", "==", "===", "!=", "!==", ">", "<", ">=", "<="], 31 | "requireSpaceBetweenArguments": true, 32 | "requireSpacesInAnonymousFunctionExpression": { "beforeOpeningCurlyBrace": true, "beforeOpeningRoundBrace": true, "allExcept": ["shorthand"] }, 33 | "requireSpacesInConditionalExpression": true, 34 | "requireSpacesInForStatement": true, 35 | "requireSpacesInFunctionDeclaration": { "beforeOpeningCurlyBrace": true }, 36 | "requireSpacesInFunctionExpression": { "beforeOpeningCurlyBrace": true }, 37 | "requireSpacesInNamedFunctionExpression": { "beforeOpeningCurlyBrace": true }, 38 | "requireSpacesInsideObjectBrackets": "allButNested", 39 | "validateAlignedFunctionParameters": true, 40 | "validateIndentation": 2, 41 | "validateLineBreaks": "LF", 42 | "validateNewlineAfterArrayElements": true, 43 | "validateQuoteMarks": "'" 44 | } 45 | -------------------------------------------------------------------------------- /WebCore/build/scss/plugins/_mixins.scss: -------------------------------------------------------------------------------- 1 | // 2 | // General: Mixins 3 | // 4 | 5 | // Select2 Variant 6 | @mixin select2-variant($name, $color) { 7 | .select2-#{$name} { 8 | + .select2-container--default { 9 | &.select2-container--open { 10 | .select2-selection--single { 11 | border-color: lighten($color, 25%); 12 | } 13 | } 14 | 15 | &.select2-container--focus .select2-selection--single { 16 | border-color: lighten($color, 25%); 17 | } 18 | } 19 | 20 | .select2-container--default &, 21 | .select2-container--default { 22 | &.select2-dropdown, 23 | .select2-dropdown, 24 | .select2-search--inline { 25 | .select2-search__field { 26 | &:focus { 27 | border: $input-border-width solid lighten($color, 25%); 28 | } 29 | } 30 | } 31 | 32 | .select2-results__option--highlighted { 33 | background-color: $color; 34 | color: color-yiq($color); 35 | 36 | &[aria-selected] { 37 | &, 38 | &:hover { 39 | background-color: darken($color, 3%); 40 | color: color-yiq(darken($color, 3%)); 41 | } 42 | } 43 | } 44 | //Multiple select 45 | & { 46 | .select2-selection--multiple { 47 | &:focus { 48 | border-color: lighten($color, 25%); 49 | } 50 | 51 | .select2-selection__choice { 52 | background-color: $color; 53 | border-color: darken($color, 5%); 54 | color: color-yiq($color); 55 | } 56 | 57 | .select2-selection__choice__remove { 58 | color: rgba(color-yiq($color), 0.7); 59 | 60 | &:hover { 61 | color: color-yiq($color); 62 | } 63 | } 64 | } 65 | 66 | &.select2-container--focus .select2-selection--multiple { 67 | border-color: lighten($color, 25%); 68 | } 69 | } 70 | } 71 | } 72 | } -------------------------------------------------------------------------------- /WebCore/build/scss/mixins/_custom-forms.scss: -------------------------------------------------------------------------------- 1 | // 2 | // Mixins: Custom Forms 3 | // 4 | 5 | // Custom Switch Variant 6 | @mixin custom-switch-variant($name, $color) { 7 | &.custom-switch-off-#{$name} { 8 | & .custom-control-input ~ .custom-control-label::before { 9 | background: #{$color}; 10 | border-color: darken($color, 20%); 11 | } 12 | 13 | & .custom-control-input:focus ~ .custom-control-label::before { 14 | box-shadow: 0 0 0 1px $body-bg, 0 0 0 2px rgba($color, .25); 15 | } 16 | 17 | & .custom-control-input ~ .custom-control-label::after { 18 | background: darken($color, 25%); 19 | } 20 | } 21 | 22 | &.custom-switch-on-#{$name} { 23 | & .custom-control-input:checked ~ .custom-control-label::before { 24 | background: #{$color}; 25 | border-color: darken($color, 20%); 26 | } 27 | 28 | & .custom-control-input:checked:focus ~ .custom-control-label::before { 29 | box-shadow: 0 0 0 1px $body-bg, 0 0 0 2px rgba($color, .25); 30 | } 31 | 32 | & .custom-control-input:checked ~ .custom-control-label::after { 33 | background: lighten($color, 30%); 34 | } 35 | } 36 | } 37 | 38 | // Custom Range Variant 39 | @mixin custom-range-variant($name, $color) { 40 | &.custom-range-#{$name} { 41 | &:focus { 42 | outline: none; 43 | 44 | &::-webkit-slider-thumb { 45 | box-shadow: 0 0 0 1px $body-bg, 0 0 0 2px rgba($color, .25); 46 | } 47 | 48 | &::-moz-range-thumb { 49 | box-shadow: 0 0 0 1px $body-bg, 0 0 0 2px rgba($color, .25); 50 | } 51 | 52 | &::-ms-thumb { 53 | box-shadow: 0 0 0 1px $body-bg, 0 0 0 2px rgba($color, .25); 54 | } 55 | } 56 | 57 | &::-webkit-slider-thumb { 58 | background-color: $color; 59 | 60 | &:active { 61 | background-color: lighten($color, 35%); 62 | } 63 | } 64 | 65 | &::-moz-range-thumb { 66 | background-color: $color; 67 | 68 | &:active { 69 | background-color: lighten($color, 35%); 70 | } 71 | } 72 | 73 | &::-ms-thumb { 74 | background-color: $color; 75 | 76 | &:active { 77 | background-color: lighten($color, 35%); 78 | } 79 | } 80 | } 81 | } -------------------------------------------------------------------------------- /WebCore/build/js/DirectChat.js: -------------------------------------------------------------------------------- 1 | /** 2 | * -------------------------------------------- 3 | * AdminLTE DirectChat.js 4 | * License MIT 5 | * -------------------------------------------- 6 | */ 7 | 8 | const DirectChat = (($) => { 9 | /** 10 | * Constants 11 | * ==================================================== 12 | */ 13 | 14 | const NAME = 'DirectChat' 15 | const DATA_KEY = 'lte.directchat' 16 | const EVENT_KEY = `.${DATA_KEY}` 17 | const JQUERY_NO_CONFLICT = $.fn[NAME] 18 | const DATA_API_KEY = '.data-api' 19 | 20 | const Event = { 21 | TOGGLED: `toggled{EVENT_KEY}` 22 | } 23 | 24 | const Selector = { 25 | DATA_TOGGLE: '[data-widget="chat-pane-toggle"]', 26 | DIRECT_CHAT: '.direct-chat' 27 | }; 28 | 29 | const ClassName = { 30 | DIRECT_CHAT_OPEN: 'direct-chat-contacts-open' 31 | }; 32 | 33 | /** 34 | * Class Definition 35 | * ==================================================== 36 | */ 37 | 38 | class DirectChat { 39 | constructor(element, config) { 40 | this._element = element 41 | } 42 | 43 | toggle() { 44 | $(this._element).parents(Selector.DIRECT_CHAT).first().toggleClass(ClassName.DIRECT_CHAT_OPEN); 45 | 46 | const toggledEvent = $.Event(Event.TOGGLED) 47 | $(this._element).trigger(toggledEvent) 48 | } 49 | 50 | // Static 51 | 52 | static _jQueryInterface(config) { 53 | return this.each(function () { 54 | let data = $(this).data(DATA_KEY) 55 | 56 | if (!data) { 57 | data = new DirectChat($(this)) 58 | $(this).data(DATA_KEY, data) 59 | } 60 | 61 | data[config]() 62 | }) 63 | } 64 | } 65 | 66 | /** 67 | * 68 | * Data Api implementation 69 | * ==================================================== 70 | */ 71 | 72 | $(document).on('click', Selector.DATA_TOGGLE, function (event) { 73 | if (event) event.preventDefault(); 74 | DirectChat._jQueryInterface.call($(this), 'toggle'); 75 | }); 76 | 77 | /** 78 | * jQuery API 79 | * ==================================================== 80 | */ 81 | 82 | $.fn[NAME] = DirectChat._jQueryInterface 83 | $.fn[NAME].Constructor = DirectChat 84 | $.fn[NAME].noConflict = function () { 85 | $.fn[NAME] = JQUERY_NO_CONFLICT 86 | return DirectChat._jQueryInterface 87 | } 88 | 89 | return DirectChat 90 | })(jQuery) 91 | 92 | export default DirectChat -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | ############################################################################### 2 | # Set default behavior to automatically normalize line endings. 3 | ############################################################################### 4 | * text=auto 5 | 6 | ############################################################################### 7 | # Set default behavior for command prompt diff. 8 | # 9 | # This is need for earlier builds of msysgit that does not have it on by 10 | # default for csharp files. 11 | # Note: This is only used by command line 12 | ############################################################################### 13 | #*.cs diff=csharp 14 | 15 | ############################################################################### 16 | # Set the merge driver for project and solution files 17 | # 18 | # Merging from the command prompt will add diff markers to the files if there 19 | # are conflicts (Merging from VS is not affected by the settings below, in VS 20 | # the diff markers are never inserted). Diff markers may cause the following 21 | # file extensions to fail to load in VS. An alternative would be to treat 22 | # these files as binary and thus will always conflict and require user 23 | # intervention with every merge. To do so, just uncomment the entries below 24 | ############################################################################### 25 | #*.sln merge=binary 26 | #*.csproj merge=binary 27 | #*.vbproj merge=binary 28 | #*.vcxproj merge=binary 29 | #*.vcproj merge=binary 30 | #*.dbproj merge=binary 31 | #*.fsproj merge=binary 32 | #*.lsproj merge=binary 33 | #*.wixproj merge=binary 34 | #*.modelproj merge=binary 35 | #*.sqlproj merge=binary 36 | #*.wwaproj merge=binary 37 | 38 | ############################################################################### 39 | # behavior for image files 40 | # 41 | # image files are treated as binary by default. 42 | ############################################################################### 43 | #*.jpg binary 44 | #*.png binary 45 | #*.gif binary 46 | 47 | ############################################################################### 48 | # diff behavior for common document formats 49 | # 50 | # Convert binary document formats to text before diffing them. This feature 51 | # is only available from the command line. Turn it on by uncommenting the 52 | # entries below. 53 | ############################################################################### 54 | #*.doc diff=astextplain 55 | #*.DOC diff=astextplain 56 | #*.docx diff=astextplain 57 | #*.DOCX diff=astextplain 58 | #*.dot diff=astextplain 59 | #*.DOT diff=astextplain 60 | #*.pdf diff=astextplain 61 | #*.PDF diff=astextplain 62 | #*.rtf diff=astextplain 63 | #*.RTF diff=astextplain 64 | -------------------------------------------------------------------------------- /WebCore/build/scss/_navs.scss: -------------------------------------------------------------------------------- 1 | // 2 | // Component: Nav 3 | // 4 | 5 | .nav-pills { 6 | .nav-link { 7 | color: $gray-600; 8 | 9 | &:not(.active):hover { 10 | color: theme-color('primary'); 11 | } 12 | } 13 | 14 | .nav-item { 15 | &.dropdown.show { 16 | .nav-link:hover { 17 | color: $dropdown-link-active-color; 18 | } 19 | } 20 | } 21 | } 22 | 23 | // Vertical Tabs 24 | .nav-tabs.flex-column { 25 | border-bottom: 0; 26 | border-right: $nav-tabs-border-width solid $nav-tabs-border-color; 27 | 28 | .nav-link { 29 | border-bottom-left-radius: $nav-tabs-border-radius; 30 | border-top-right-radius: 0; 31 | margin-right: -$nav-tabs-border-width; 32 | 33 | @include hover-focus { 34 | border-color: $gray-200 transparent $gray-200 $gray-200; 35 | } 36 | } 37 | 38 | .nav-link.active, 39 | .nav-item.show .nav-link { 40 | border-color: $gray-300 transparent $gray-300 $gray-300; 41 | } 42 | 43 | &.nav-tabs-right { 44 | border-left: $nav-tabs-border-width solid $nav-tabs-border-color; 45 | border-right: 0; 46 | 47 | .nav-link { 48 | border-bottom-left-radius: 0; 49 | border-bottom-right-radius: $nav-tabs-border-radius; 50 | border-top-left-radius: 0; 51 | border-top-right-radius: $nav-tabs-border-radius; 52 | margin-left: -$nav-tabs-border-width; 53 | 54 | @include hover-focus { 55 | border-color: $gray-200 $gray-200 $gray-200 transparent; 56 | } 57 | } 58 | 59 | .nav-link.active, 60 | .nav-item.show .nav-link { 61 | border-color: $gray-300 $gray-300 $gray-300 transparent; 62 | } 63 | } 64 | } 65 | 66 | .navbar-no-expand { 67 | flex-direction: row; 68 | 69 | .nav-link { 70 | padding-left: $navbar-nav-link-padding-x; 71 | padding-right: $navbar-nav-link-padding-x; 72 | } 73 | 74 | .dropdown-menu { 75 | position: absolute; 76 | } 77 | } 78 | 79 | // Color variants 80 | @each $color, $value in $theme-colors { 81 | @if $color == dark or $color == light { 82 | .navbar-#{$color} { 83 | background-color: $value; 84 | } 85 | } 86 | } 87 | 88 | @each $color, $value in $theme-colors { 89 | @if $color != dark and $color != light { 90 | .navbar-#{$color} { 91 | background-color: $value; 92 | } 93 | } 94 | } 95 | 96 | @each $color, $value in $colors { 97 | .navbar-#{$color} { 98 | background-color: $value; 99 | } 100 | } -------------------------------------------------------------------------------- /WebCore/build/scss/plugins/_fullcalendar.scss: -------------------------------------------------------------------------------- 1 | // 2 | // Plugin: Full Calendar 3 | // 4 | 5 | // Buttons 6 | .fc-button { 7 | background: $gray-100; 8 | background-image: none; 9 | border-bottom-color: #ddd; 10 | border-color: #ddd; 11 | color: $gray-700; 12 | 13 | &:hover, 14 | &:active, 15 | &.hover { 16 | background-color: #e9e9e9; 17 | } 18 | } 19 | 20 | // Calendar title 21 | .fc-header-title h2 { 22 | color: #666; 23 | font-size: 15px; 24 | line-height: 1.6em; 25 | margin-left: 10px; 26 | } 27 | 28 | .fc-header-right { 29 | padding-right: 10px; 30 | } 31 | 32 | .fc-header-left { 33 | padding-left: 10px; 34 | } 35 | 36 | // Calendar table header cells 37 | .fc-widget-header { 38 | background: #fafafa; 39 | } 40 | 41 | .fc-grid { 42 | border: 0; 43 | width: 100%; 44 | } 45 | 46 | .fc-widget-header:first-of-type, 47 | .fc-widget-content:first-of-type { 48 | border-left: 0; 49 | border-right: 0; 50 | } 51 | 52 | .fc-widget-header:last-of-type, 53 | .fc-widget-content:last-of-type { 54 | border-right: 0; 55 | } 56 | 57 | .fc-toolbar, 58 | .fc-toolbar.fc-header-toolbar { 59 | margin: 0; 60 | padding: 1rem; 61 | } 62 | 63 | @include media-breakpoint-down(xs) { 64 | .fc-toolbar { 65 | flex-direction: column; 66 | 67 | .fc-left { 68 | order: 1; 69 | margin-bottom: .5rem; 70 | } 71 | 72 | .fc-center { 73 | order: 0; 74 | margin-bottom: .375rem; 75 | } 76 | 77 | .fc-right { 78 | order: 2; 79 | } 80 | } 81 | } 82 | 83 | .fc-day-number { 84 | font-size: 20px; 85 | font-weight: 300; 86 | padding-right: 10px; 87 | } 88 | 89 | .fc-color-picker { 90 | list-style: none; 91 | margin: 0; 92 | padding: 0; 93 | 94 | > li { 95 | float: left; 96 | font-size: 30px; 97 | line-height: 30px; 98 | margin-right: 5px; 99 | 100 | .fa, 101 | .fas, 102 | .far, 103 | .fab, 104 | .glyphicon, 105 | .ion { 106 | transition: transform linear .3s; 107 | 108 | &:hover { 109 | @include rotate(30deg); 110 | } 111 | } 112 | } 113 | } 114 | 115 | #add-new-event { 116 | transition: all linear .3s; 117 | } 118 | 119 | .external-event { 120 | @include box-shadow($card-shadow); 121 | border-radius: $border-radius; 122 | cursor: move; 123 | font-weight: bold; 124 | margin-bottom: 4px; 125 | padding: 5px 10px; 126 | 127 | &:hover { 128 | @include box-shadow(inset 0 0 90px rgba(0, 0, 0, 0.2)); 129 | } 130 | } -------------------------------------------------------------------------------- /WebCore/build/scss/_buttons.scss: -------------------------------------------------------------------------------- 1 | // 2 | // Component: Button 3 | // 4 | 5 | .btn { 6 | &.disabled, 7 | &:disabled { 8 | cursor: not-allowed; 9 | } 10 | // Flat buttons 11 | &.btn-flat { 12 | @include border-radius(0); 13 | border-width: 1px; 14 | box-shadow: none; 15 | } 16 | // input file btn 17 | &.btn-file { 18 | overflow: hidden; 19 | position: relative; 20 | 21 | > input[type='file'] { 22 | background: $white; 23 | cursor: inherit; 24 | display: block; 25 | font-size: 100px; 26 | min-height: 100%; 27 | min-width: 100%; 28 | opacity: 0; 29 | outline: none; 30 | position: absolute; 31 | right: 0; 32 | text-align: right; 33 | top: 0; 34 | } 35 | } 36 | 37 | .text-sm & { 38 | font-size: $font-size-sm !important; 39 | } 40 | } 41 | 42 | // Button color variations 43 | .btn-default { 44 | background-color: $button-default-background-color; 45 | border-color: $button-default-border-color; 46 | color: $button-default-color; 47 | 48 | &:hover, 49 | &:active, 50 | &.hover { 51 | background-color: darken($button-default-background-color, 5%); 52 | color: darken($button-default-color, 10%); 53 | } 54 | } 55 | 56 | // Application buttons 57 | .btn-app { 58 | @include border-radius(3px); 59 | background-color: $button-default-background-color; 60 | border: 1px solid $button-default-border-color; 61 | color: $gray-600; 62 | font-size: 12px; 63 | height: 60px; 64 | margin: 0 0 10px 10px; 65 | min-width: 80px; 66 | padding: 15px 5px; 67 | position: relative; 68 | text-align: center; 69 | // Icons within the btn 70 | > .fa, 71 | > .fas, 72 | > .far, 73 | > .fab, 74 | > .glyphicon, 75 | > .ion { 76 | display: block; 77 | font-size: 20px; 78 | } 79 | 80 | &:hover { 81 | background: $button-default-background-color; 82 | border-color: darken($button-default-border-color, 20%); 83 | color: $button-default-color; 84 | } 85 | 86 | &:active, 87 | &:focus { 88 | @include box-shadow(inset 0 3px 5px rgba($black, 0.125)); 89 | } 90 | // The badge 91 | > .badge { 92 | font-size: 10px; 93 | font-weight: 400; 94 | position: absolute; 95 | right: -10px; 96 | top: -3px; 97 | } 98 | } 99 | 100 | // Extra Button Size 101 | 102 | .btn-xs { 103 | @include button-size($button-padding-y-xs, $button-padding-x-xs, $button-font-size-xs, $button-line-height-xs, $button-border-radius-xs); 104 | } -------------------------------------------------------------------------------- /Utils/Encryption.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Security.Cryptography; 3 | 4 | namespace AspMVCAdminLTE.Utils 5 | { 6 | public class Encryption 7 | { 8 | public static string HashString(string sourceString) 9 | { 10 | byte[] salt; 11 | byte[] buffer2; 12 | if (sourceString == null) 13 | { 14 | throw new ArgumentNullException("sourceString"); 15 | } 16 | using (Rfc2898DeriveBytes bytes = new Rfc2898DeriveBytes(sourceString, 0x10, 0x3e8)) 17 | { 18 | salt = bytes.Salt; 19 | buffer2 = bytes.GetBytes(0x20); 20 | } 21 | byte[] dst = new byte[0x31]; 22 | Buffer.BlockCopy(salt, 0, dst, 1, 0x10); 23 | Buffer.BlockCopy(buffer2, 0, dst, 0x11, 0x20); 24 | return Convert.ToBase64String(dst); 25 | } 26 | 27 | public static bool CompareHash(string hashedString, string sourceString) 28 | { 29 | byte[] buffer4; 30 | if (hashedString == null) 31 | { 32 | return false; 33 | } 34 | if (sourceString == null) 35 | { 36 | return false; 37 | //throw new ArgumentNullException("sourceString"); 38 | } 39 | byte[] src = Convert.FromBase64String(hashedString); 40 | if (src.Length != 0x31 || src[0] != 0) 41 | { 42 | return false; 43 | } 44 | byte[] dst = new byte[0x10]; 45 | Buffer.BlockCopy(src, 1, dst, 0, 0x10); 46 | byte[] buffer3 = new byte[0x20]; 47 | Buffer.BlockCopy(src, 0x11, buffer3, 0, 0x20); 48 | using (Rfc2898DeriveBytes bytes = new Rfc2898DeriveBytes(sourceString, dst, 0x3e8)) 49 | { 50 | buffer4 = bytes.GetBytes(0x20); 51 | } 52 | return ByteArraysEqual(buffer3, buffer4); 53 | } 54 | 55 | private static bool ByteArraysEqual(byte[] b1, byte[] b2) 56 | { 57 | if (b1 == b2) return true; 58 | if (b1 == null || b2 == null) return false; 59 | if (b1.Length != b2.Length) return false; 60 | for (int i = 0; i < b1.Length; i++) 61 | { 62 | if (b1[i] != b2[i]) return false; 63 | } 64 | return true; 65 | } 66 | 67 | public static string EncryptData(string textData, string Encryptionkey) 68 | { 69 | var _encyptor = new RijndaelCrypt("balendin"); 70 | return _encyptor.Encrypt(textData); 71 | } 72 | 73 | public static string DecryptData(string EncryptedText, string Encryptionkey) 74 | { 75 | var _encyptor = new RijndaelCrypt("balendin"); 76 | return _encyptor.Decrypt(EncryptedText); 77 | } 78 | } 79 | } -------------------------------------------------------------------------------- /WebCore/build/scss/mixins/_accent.scss: -------------------------------------------------------------------------------- 1 | // 2 | // Mixins: Accent 3 | // 4 | 5 | // Accent Variant 6 | @mixin accent-variant($name, $color) { 7 | .accent-#{$name} { 8 | $link-color: $color; 9 | $link-hover-color: darken($color, 15%); 10 | $pagination-active-bg: $color; 11 | $pagination-active-border-color: $color; 12 | 13 | .btn-link, 14 | a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link):not(.page-link):not(.btn) { 15 | color: $link-color; 16 | 17 | @include hover { 18 | color: $link-hover-color; 19 | } 20 | } 21 | 22 | .dropdown-item { 23 | &:active, 24 | &.active { 25 | background: $color; 26 | color: color-yiq($color); 27 | } 28 | } 29 | 30 | .custom-control-input:checked ~ .custom-control-label { 31 | &::before { 32 | background: $color; 33 | border-color: darken($color, 20%); 34 | } 35 | 36 | &::after { 37 | $newColor: color-yiq($color); 38 | background-image: str-replace($custom-checkbox-indicator-icon-checked, str-replace(#{$custom-control-indicator-checked-color}, '#', '%23'), str-replace(#{$newColor}, '#', '%23')); 39 | } 40 | } 41 | 42 | .form-control:focus:not(.is-invalid):not(.is-warning):not(.is-valid), 43 | .custom-select:focus, 44 | .custom-control-input:focus:not(:checked) ~ .custom-control-label::before, 45 | .custom-file-input:focus ~ .custom-file-label { 46 | border-color: lighten($color, 25%); 47 | } 48 | 49 | .page-item { 50 | .page-link { 51 | color: $link-color; 52 | } 53 | 54 | &.active a, 55 | &.active .page-link { 56 | background-color: $pagination-active-bg; 57 | border-color: $pagination-active-border-color; 58 | color: $pagination-active-color; 59 | } 60 | 61 | &.disabled a, 62 | &.disabled .page-link { 63 | background-color: $pagination-disabled-bg; 64 | border-color: $pagination-disabled-border-color; 65 | color: $pagination-disabled-color; 66 | } 67 | } 68 | 69 | [class*="sidebar-dark-"] { 70 | .sidebar { 71 | a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link) { 72 | color: $sidebar-dark-color; 73 | 74 | @include hover { 75 | color: $sidebar-dark-hover-color; 76 | } 77 | } 78 | } 79 | } 80 | 81 | [class*="sidebar-light-"] { 82 | .sidebar { 83 | a:not(.dropdown-item):not(.btn-app):not(.nav-link):not(.brand-link) { 84 | color: $sidebar-light-color; 85 | 86 | @include hover { 87 | color: $sidebar-light-hover-color; 88 | } 89 | } 90 | } 91 | } 92 | } 93 | } -------------------------------------------------------------------------------- /WebCore/build/js/TodoList.js: -------------------------------------------------------------------------------- 1 | /** 2 | * -------------------------------------------- 3 | * AdminLTE TodoList.js 4 | * License MIT 5 | * -------------------------------------------- 6 | */ 7 | 8 | const TodoList = (($) => { 9 | /** 10 | * Constants 11 | * ==================================================== 12 | */ 13 | 14 | const NAME = 'TodoList' 15 | const DATA_KEY = 'lte.todolist' 16 | const EVENT_KEY = `.${DATA_KEY}` 17 | const JQUERY_NO_CONFLICT = $.fn[NAME] 18 | 19 | const Selector = { 20 | DATA_TOGGLE: '[data-widget="todo-list"]' 21 | } 22 | 23 | const ClassName = { 24 | TODO_LIST_DONE: 'done' 25 | } 26 | 27 | const Default = { 28 | onCheck: function (item) { 29 | return item; 30 | }, 31 | onUnCheck: function (item) { 32 | return item; 33 | } 34 | } 35 | 36 | /** 37 | * Class Definition 38 | * ==================================================== 39 | */ 40 | 41 | class TodoList { 42 | constructor(element, config) { 43 | this._config = config 44 | this._element = element 45 | 46 | this._init() 47 | } 48 | 49 | // Public 50 | 51 | toggle(item) { 52 | item.parents('li').toggleClass(ClassName.TODO_LIST_DONE); 53 | if (!$(item).prop('checked')) { 54 | this.unCheck($(item)); 55 | return; 56 | } 57 | 58 | this.check(item); 59 | } 60 | 61 | check(item) { 62 | this._config.onCheck.call(item); 63 | } 64 | 65 | unCheck(item) { 66 | this._config.onUnCheck.call(item); 67 | } 68 | 69 | // Private 70 | 71 | _init() { 72 | var that = this 73 | $(Selector.DATA_TOGGLE).find('input:checkbox:checked').parents('li').toggleClass(ClassName.TODO_LIST_DONE) 74 | $(Selector.DATA_TOGGLE).on('change', 'input:checkbox', (event) => { 75 | that.toggle($(event.target)) 76 | }) 77 | } 78 | 79 | // Static 80 | 81 | static _jQueryInterface(config) { 82 | return this.each(function () { 83 | let data = $(this).data(DATA_KEY) 84 | const _options = $.extend({}, Default, $(this).data()) 85 | 86 | if (!data) { 87 | data = new TodoList($(this), _options) 88 | $(this).data(DATA_KEY, data) 89 | } 90 | 91 | if (config === 'init') { 92 | data[config]() 93 | } 94 | }) 95 | } 96 | } 97 | 98 | /** 99 | * Data API 100 | * ==================================================== 101 | */ 102 | 103 | $(window).on('load', () => { 104 | TodoList._jQueryInterface.call($(Selector.DATA_TOGGLE)) 105 | }) 106 | 107 | /** 108 | * jQuery API 109 | * ==================================================== 110 | */ 111 | 112 | $.fn[NAME] = TodoList._jQueryInterface 113 | $.fn[NAME].Constructor = TodoList 114 | $.fn[NAME].noConflict = function () { 115 | $.fn[NAME] = JQUERY_NO_CONFLICT 116 | return TodoList._jQueryInterface 117 | } 118 | 119 | return TodoList 120 | })(jQuery) 121 | 122 | export default TodoList -------------------------------------------------------------------------------- /WebCore/build/scss/_small-box.scss: -------------------------------------------------------------------------------- 1 | // 2 | // Component: Small Box 3 | // 4 | 5 | .small-box { 6 | @include border-radius($border-radius); 7 | @include box-shadow($card-shadow); 8 | display: block; 9 | margin-bottom: 20px; 10 | position: relative; 11 | // content wrapper 12 | > .inner { 13 | padding: 10px; 14 | } 15 | 16 | > .small-box-footer { 17 | background: rgba($black, 0.1); 18 | color: rgba($white, 0.8); 19 | display: block; 20 | padding: 3px 0; 21 | position: relative; 22 | text-align: center; 23 | text-decoration: none; 24 | z-index: 10; 25 | 26 | &:hover { 27 | background: rgba($black, 0.15); 28 | color: $white; 29 | } 30 | } 31 | 32 | h3 { 33 | @include font-size(2.2rem); 34 | font-weight: bold; 35 | margin: 0 0 10px 0; 36 | padding: 0; 37 | white-space: nowrap; 38 | } 39 | 40 | @include media-breakpoint-up(lg) { 41 | .col-xl-2 &, 42 | .col-lg-2 &, 43 | .col-md-2 & { 44 | h3 { 45 | @include font-size(1.6rem); 46 | } 47 | } 48 | 49 | .col-xl-3 &, 50 | .col-lg-3 &, 51 | .col-md-3 & { 52 | h3 { 53 | @include font-size(1.6rem); 54 | } 55 | } 56 | } 57 | 58 | @include media-breakpoint-up(xl) { 59 | .col-xl-2 &, 60 | .col-lg-2 &, 61 | .col-md-2 & { 62 | h3 { 63 | @include font-size(2.2rem); 64 | } 65 | } 66 | 67 | .col-xl-3 &, 68 | .col-lg-3 &, 69 | .col-md-3 & { 70 | h3 { 71 | @include font-size(2.2rem); 72 | } 73 | } 74 | } 75 | 76 | p { 77 | font-size: 1rem; 78 | 79 | > small { 80 | color: $gray-100; 81 | display: block; 82 | font-size: 0.9rem; 83 | margin-top: 5px; 84 | } 85 | } 86 | 87 | h3, 88 | p { 89 | z-index: 5; 90 | } 91 | // the icon 92 | .icon { 93 | color: rgba($black, 0.15); 94 | z-index: 0; 95 | 96 | > i { 97 | font-size: 90px; 98 | position: absolute; 99 | right: 15px; 100 | top: 15px; 101 | transition: all $transition-speed linear; 102 | 103 | &.fa, 104 | &.fas, 105 | &.far, 106 | &.fab, 107 | &.glyphicon, 108 | &.ion { 109 | font-size: 70px; 110 | top: 20px; 111 | } 112 | } 113 | } 114 | // Small box hover state 115 | &:hover { 116 | text-decoration: none; 117 | // Animate icons on small box hover 118 | .icon > i { 119 | font-size: 95px; 120 | 121 | &.fa, 122 | &.fas, 123 | &.far, 124 | &.fab, 125 | &.glyphicon, 126 | &.ion { 127 | font-size: 75px; 128 | } 129 | } 130 | } 131 | } 132 | 133 | @include media-breakpoint-down(sm) { 134 | // No need for icons on very small devices 135 | .small-box { 136 | text-align: center; 137 | 138 | .icon { 139 | display: none; 140 | } 141 | 142 | p { 143 | font-size: 12px; 144 | } 145 | } 146 | } -------------------------------------------------------------------------------- /WebCore/build/scss/_timeline.scss: -------------------------------------------------------------------------------- 1 | // 2 | // Component: Timeline 3 | // 4 | 5 | .timeline { 6 | margin: 0 0 45px; 7 | padding: 0; 8 | position: relative; 9 | // The line 10 | &::before { 11 | @include border-radius($border-radius); 12 | background: $gray-300; 13 | bottom: 0; 14 | content: ''; 15 | left: 31px; 16 | margin: 0; 17 | position: absolute; 18 | top: 0; 19 | width: 4px; 20 | } 21 | // Element 22 | > div { 23 | &::before, 24 | &::after { 25 | content: ""; 26 | display: table; 27 | } 28 | 29 | margin-bottom: 15px; 30 | margin-right: 10px; 31 | position: relative; 32 | // The content 33 | > .timeline-item { 34 | @include box-shadow($card-shadow); 35 | @include border-radius($border-radius); 36 | background: $white; 37 | color: $gray-700; 38 | margin-left: 60px; 39 | margin-right: 15px; 40 | margin-top: 0; 41 | padding: 0; 42 | position: relative; 43 | // The time and header 44 | > .time { 45 | color: #999; 46 | float: right; 47 | font-size: 12px; 48 | padding: 10px; 49 | } 50 | // Header 51 | > .timeline-header { 52 | border-bottom: 1px solid $card-border-color; 53 | color: $gray-700; 54 | font-size: 16px; 55 | line-height: 1.1; 56 | margin: 0; 57 | padding: 10px; 58 | // Link in header 59 | > a { 60 | font-weight: 600; 61 | } 62 | } 63 | // Item body and footer 64 | > .timeline-body, 65 | > .timeline-footer { 66 | padding: 10px; 67 | } 68 | 69 | > .timeline-body { 70 | > img { 71 | margin: 10px; 72 | } 73 | 74 | > dl, ol, ul { 75 | margin: 0; 76 | } 77 | } 78 | 79 | > .timeline-footer { 80 | > a { 81 | color: $white; 82 | } 83 | } 84 | } 85 | // The icons at line 86 | > .fa, 87 | > .fas, 88 | > .far, 89 | > .fab, 90 | > .glyphicon, 91 | > .ion { 92 | background: $gray-500; 93 | border-radius: 50%; 94 | font-size: 15px; 95 | height: 30px; 96 | left: 18px; 97 | line-height: 30px; 98 | position: absolute; 99 | text-align: center; 100 | top: 0; 101 | width: 30px; 102 | } 103 | } 104 | // Time label 105 | > .time-label { 106 | > span { 107 | @include border-radius(4px); 108 | background-color: $white; 109 | display: inline-block; 110 | font-weight: 600; 111 | padding: 5px; 112 | } 113 | } 114 | } 115 | 116 | .timeline-inverse { 117 | > div { 118 | > .timeline-item { 119 | @include box-shadow(none); 120 | background: $gray-100; 121 | border: 1px solid $gray-300; 122 | 123 | > .timeline-header { 124 | border-bottom-color: $gray-300; 125 | } 126 | } 127 | } 128 | } -------------------------------------------------------------------------------- /WebCore/build/scss/_info-box.scss: -------------------------------------------------------------------------------- 1 | // 2 | // Component: Info Box 3 | // 4 | 5 | .info-box { 6 | @include box-shadow($card-shadow); 7 | @include border-radius($border-radius); 8 | background: $white; 9 | display: flex; 10 | margin-bottom: map-get($spacers, 3); 11 | min-height: 80px; 12 | padding: .5rem; 13 | position: relative; 14 | width: 100%; 15 | 16 | .progress { 17 | background-color: rgba($black, .125); 18 | height: 2px; 19 | margin: 5px 0; 20 | 21 | .progress-bar { 22 | background-color: $white; 23 | } 24 | } 25 | 26 | .info-box-icon { 27 | @if $enable-rounded { 28 | border-radius: $border-radius; 29 | } 30 | 31 | align-items: center; 32 | display: flex; 33 | font-size: 1.875rem; 34 | justify-content: center; 35 | text-align: center; 36 | width: 70px; 37 | 38 | > img { 39 | max-width: 100%; 40 | } 41 | } 42 | 43 | .info-box-content { 44 | display: flex; 45 | flex-direction: column; 46 | justify-content: center; 47 | line-height: 120%; 48 | flex: 1; 49 | padding: 0 10px; 50 | } 51 | 52 | .info-box-number { 53 | display: block; 54 | margin-top: .25rem; 55 | font-weight: $font-weight-bold; 56 | } 57 | 58 | .progress-description, 59 | .info-box-text { 60 | display: block; 61 | overflow: hidden; 62 | text-overflow: ellipsis; 63 | white-space: nowrap; 64 | } 65 | 66 | @each $name, $color in $theme-colors { 67 | .info-box { 68 | .bg-#{$name}, 69 | .bg-gradient-#{$name} { 70 | color: color-yiq($color); 71 | 72 | .progress-bar { 73 | background-color: color-yiq($color); 74 | } 75 | } 76 | } 77 | } 78 | 79 | .info-box-more { 80 | display: block; 81 | } 82 | 83 | .progress-description { 84 | margin: 0; 85 | } 86 | 87 | @include media-breakpoint-up(md) { 88 | .col-xl-2 &, 89 | .col-lg-2 &, 90 | .col-md-2 & { 91 | .progress-description { 92 | display: none; 93 | } 94 | } 95 | 96 | .col-xl-3 &, 97 | .col-lg-3 &, 98 | .col-md-3 & { 99 | .progress-description { 100 | display: none; 101 | } 102 | } 103 | } 104 | 105 | @include media-breakpoint-up(lg) { 106 | .col-xl-2 &, 107 | .col-lg-2 &, 108 | .col-md-2 & { 109 | .progress-description { 110 | @include font-size(.75rem); 111 | display: block; 112 | } 113 | } 114 | 115 | .col-xl-3 &, 116 | .col-lg-3 &, 117 | .col-md-3 & { 118 | .progress-description { 119 | @include font-size(.75rem); 120 | display: block; 121 | } 122 | } 123 | } 124 | 125 | @include media-breakpoint-up(xl) { 126 | .col-xl-2 &, 127 | .col-lg-2 &, 128 | .col-md-2 & { 129 | .progress-description { 130 | @include font-size(1rem); 131 | display: block; 132 | } 133 | } 134 | 135 | .col-xl-3 &, 136 | .col-lg-3 &, 137 | .col-md-3 & { 138 | .progress-description { 139 | @include font-size(1rem); 140 | display: block; 141 | } 142 | } 143 | } 144 | } -------------------------------------------------------------------------------- /WebCore/build/scss/_main-header.scss: -------------------------------------------------------------------------------- 1 | // 2 | // Component: Main Header 3 | // 4 | 5 | .main-header { 6 | border-bottom: $main-header-bottom-border; 7 | z-index: $zindex-main-header; 8 | 9 | .nav-link { 10 | height: $nav-link-height; 11 | position: relative; 12 | } 13 | 14 | .text-sm &, 15 | &.text-sm { 16 | .nav-link { 17 | height: $nav-link-sm-height; 18 | padding: $nav-link-sm-padding-y $nav-link-padding-x; 19 | 20 | > .fa, 21 | > .fas, 22 | > .far, 23 | > .fab, 24 | > .glyphicon, 25 | > .ion { 26 | font-size: $font-size-sm; 27 | } 28 | } 29 | } 30 | 31 | .navbar-nav { 32 | .nav-item { 33 | margin: 0; 34 | } 35 | 36 | &[class*='-right'] { 37 | .dropdown-menu { 38 | left: auto; 39 | margin-top: -3px; 40 | right: 0; 41 | 42 | @media (max-width: breakpoint-max(xs)) { 43 | left: 0; 44 | right: auto; 45 | } 46 | } 47 | } 48 | } 49 | } 50 | 51 | // Add this class to images within a nav-link 52 | .navbar-img { 53 | height: $main-header-height / 2; 54 | width: auto; 55 | } 56 | 57 | // Navbar badge 58 | .navbar-badge { 59 | font-size: .6rem; 60 | font-weight: 300; 61 | padding: 2px 4px; 62 | position: absolute; 63 | right: 5px; 64 | top: 9px; 65 | } 66 | 67 | .btn-navbar { 68 | background-color: transparent; 69 | border-left-width: 0; 70 | } 71 | 72 | .form-control-navbar { 73 | border-right-width: 0; 74 | 75 | & + .input-group-append { 76 | margin-left: 0; 77 | } 78 | } 79 | 80 | .form-control-navbar, 81 | .btn-navbar { 82 | transition: none; 83 | } 84 | 85 | .navbar-dark { 86 | .form-control-navbar, 87 | .btn-navbar { 88 | background-color: $main-header-dark-form-control-bg; 89 | border: $main-header-dark-form-control-border; 90 | } 91 | 92 | .form-control-navbar { 93 | &::placeholder { 94 | color: $main-header-dark-placeholder-color; 95 | } 96 | 97 | + .input-group-append > .btn-navbar { 98 | color: $main-header-dark-placeholder-color; 99 | } 100 | 101 | &:focus { 102 | &, 103 | & + .input-group-append .btn-navbar { 104 | background-color: $main-header-dark-form-control-focused-bg; 105 | border: $main-header-dark-form-control-focused-border !important; 106 | color: $main-header-dark-form-control-focused-color; 107 | } 108 | } 109 | } 110 | } 111 | 112 | .navbar-light { 113 | .form-control-navbar, 114 | .btn-navbar { 115 | background-color: $main-header-light-form-control-bg; 116 | border: $main-header-light-form-control-border; 117 | } 118 | 119 | .form-control-navbar { 120 | &::placeholder { 121 | color: $main-header-light-placeholder-color; 122 | } 123 | 124 | + .input-group-append > .btn-navbar { 125 | color: $main-header-light-placeholder-color; 126 | } 127 | 128 | &:focus { 129 | &, 130 | & + .input-group-append .btn-navbar { 131 | background-color: $main-header-light-form-control-focused-bg; 132 | border: $main-header-light-form-control-focused-border !important; 133 | color: $main-header-light-form-control-focused-color; 134 | } 135 | } 136 | } 137 | } -------------------------------------------------------------------------------- /WebCore/build/js/SiteSearch.js: -------------------------------------------------------------------------------- 1 | /** 2 | * -------------------------------------------- 3 | * AdminLTE SiteSearch.js 4 | * License MIT 5 | * -------------------------------------------- 6 | */ 7 | 8 | const SiteSearch = (($) => { 9 | /** 10 | * Constants 11 | * ==================================================== 12 | */ 13 | 14 | const NAME = 'SiteSearch' 15 | const DATA_KEY = 'lte.site-search' 16 | const EVENT_KEY = `.${DATA_KEY}` 17 | const JQUERY_NO_CONFLICT = $.fn[NAME] 18 | 19 | const Event = {} 20 | 21 | const Selector = { 22 | TOGGLE_BUTTON: '[data-widget="site-search"]', 23 | SEARCH_BLOCK: '.site-search-block', 24 | SEARCH_BACKDROP: '.site-search-backdrop', 25 | SEARCH_INPUT: '.site-search-block .form-control' 26 | } 27 | 28 | const ClassName = { 29 | OPEN: 'site-search-open' 30 | } 31 | 32 | const Default = { 33 | transitionSpeed: 300 34 | } 35 | 36 | /** 37 | * Class Definition 38 | * ==================================================== 39 | */ 40 | 41 | class SiteSearch { 42 | constructor(_element, _options) { 43 | this.element = _element 44 | this.options = $.extend({}, Default, _options) 45 | } 46 | 47 | // Public 48 | 49 | open() { 50 | $(Selector.SEARCH_BLOCK).slideDown(this.options.transitionSpeed) 51 | $(Selector.SEARCH_BACKDROP).show(0) 52 | $(Selector.SEARCH_INPUT).focus() 53 | $(Selector.SEARCH_BLOCK).addClass(ClassName.OPEN) 54 | } 55 | 56 | close() { 57 | $(Selector.SEARCH_BLOCK).slideUp(this.options.transitionSpeed) 58 | $(Selector.SEARCH_BACKDROP).hide(0) 59 | $(Selector.SEARCH_BLOCK).removeClass(ClassName.OPEN) 60 | } 61 | 62 | toggle() { 63 | if ($(Selector.SEARCH_BLOCK).hasClass(ClassName.OPEN)) { 64 | this.close() 65 | } else { 66 | this.open() 67 | } 68 | } 69 | 70 | // Static 71 | 72 | static _jQueryInterface(options) { 73 | return this.each(function () { 74 | let data = $(this).data(DATA_KEY) 75 | 76 | if (!data) { 77 | data = new SiteSearch(this, options) 78 | $(this).data(DATA_KEY, data) 79 | } 80 | 81 | if (!/toggle|close/.test(options)) { 82 | throw Error(`Undefined method ${options}`) 83 | } 84 | 85 | data[options]() 86 | }) 87 | } 88 | } 89 | 90 | /** 91 | * Data API 92 | * ==================================================== 93 | */ 94 | $(document).on('click', Selector.TOGGLE_BUTTON, (event) => { 95 | event.preventDefault() 96 | 97 | let button = $(event.currentTarget) 98 | 99 | if (button.data('widget') !== 'site-search') { 100 | button = button.closest(Selector.TOGGLE_BUTTON) 101 | } 102 | 103 | SiteSearch._jQueryInterface.call(button, 'toggle') 104 | }) 105 | 106 | $(document).on('click', Selector.SEARCH_BACKDROP, (event) => { 107 | const backdrop = $(event.currentTarget) 108 | SiteSearch._jQueryInterface.call(backdrop, 'close') 109 | }) 110 | 111 | /** 112 | * jQuery API 113 | * ==================================================== 114 | */ 115 | 116 | $.fn[NAME] = SiteSearch._jQueryInterface 117 | $.fn[NAME].Constructor = SiteSearch 118 | $.fn[NAME].noConflict = function () { 119 | $.fn[NAME] = JQUERY_NO_CONFLICT 120 | return SiteSearch._jQueryInterface 121 | } 122 | 123 | return SiteSearch 124 | })(jQuery) 125 | 126 | export default SiteSearch -------------------------------------------------------------------------------- /Utils/RijndaelCrypt.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Security.Cryptography; 3 | using System.Text; 4 | 5 | namespace AspMVCAdminLTE.Utils 6 | { 7 | public class RijndaelCrypt 8 | { 9 | #region Private/Protected Member Variables 10 | 11 | /// 12 | /// Decryptor 13 | /// 14 | private readonly ICryptoTransform _decryptor; 15 | 16 | /// 17 | /// Encryptor 18 | /// 19 | private readonly ICryptoTransform _encryptor; 20 | 21 | /// 22 | /// 16-byte Private Key 23 | /// 24 | private static readonly byte[] IV = Encoding.UTF8.GetBytes("NdRgUkXp2s5v8x/A"); 25 | 26 | /// 27 | /// Public Key 28 | /// 29 | private readonly byte[] _password; 30 | 31 | /// 32 | /// Rijndael cipher algorithm 33 | /// 34 | private readonly RijndaelManaged _cipher; 35 | 36 | #endregion Private/Protected Member Variables 37 | 38 | #region Private/Protected Properties 39 | 40 | private ICryptoTransform Decryptor { get { return _decryptor; } } 41 | private ICryptoTransform Encryptor { get { return _encryptor; } } 42 | 43 | #endregion Private/Protected Properties 44 | 45 | 46 | 47 | #region Constructor 48 | 49 | /// 50 | /// Constructor 51 | /// 52 | /// Public key 53 | public RijndaelCrypt(string password) 54 | { 55 | //Encode digest 56 | var md5 = new MD5CryptoServiceProvider(); 57 | _password = md5.ComputeHash(Encoding.ASCII.GetBytes(password)); 58 | 59 | //Initialize objects 60 | _cipher = new RijndaelManaged(); 61 | _cipher.Padding = PaddingMode.Zeros; 62 | _decryptor = _cipher.CreateDecryptor(_password, IV); 63 | _encryptor = _cipher.CreateEncryptor(_password, IV); 64 | } 65 | 66 | #endregion Constructor 67 | 68 | 69 | 70 | #region Public Methods 71 | 72 | /// 73 | /// Decryptor 74 | /// 75 | /// Base64 string to be decrypted 76 | /// 77 | public string Decrypt(string text) 78 | { 79 | try 80 | { 81 | byte[] input = Convert.FromBase64String(text); 82 | 83 | var newClearData = Decryptor.TransformFinalBlock(input, 0, input.Length); 84 | return Encoding.ASCII.GetString(newClearData); 85 | } 86 | catch (ArgumentException ae) 87 | { 88 | Console.WriteLine("inputCount uses an invalid value or inputBuffer has an invalid offset length. " + ae); 89 | return null; 90 | } 91 | catch (ObjectDisposedException oe) 92 | { 93 | Console.WriteLine("The object has already been disposed." + oe); 94 | return null; 95 | } 96 | } 97 | 98 | /// 99 | /// Encryptor 100 | /// 101 | /// String to be encrypted 102 | /// 103 | public string Encrypt(string text) 104 | { 105 | try 106 | { 107 | var buffer = Encoding.ASCII.GetBytes(text); 108 | return Convert.ToBase64String(Encryptor.TransformFinalBlock(buffer, 0, buffer.Length)); 109 | } 110 | catch (ArgumentException ae) 111 | { 112 | Console.WriteLine("inputCount uses an invalid value or inputBuffer has an invalid offset length. " + ae); 113 | return null; 114 | } 115 | catch (ObjectDisposedException oe) 116 | { 117 | Console.WriteLine("The object has already been disposed." + oe); 118 | return null; 119 | } 120 | } 121 | 122 | #endregion Public Methods 123 | } 124 | } -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ![Build Status](https://github.com/mak-thevar/AdminLTEAspNetMVC/workflows/Build%20the%20project/badge.svg) 2 | [![Contributors][contributors-shield]][contributors-url] 3 | [![Issues][issues-shield]][issues-url] 4 | [![LinkedIn][linkedin-shield]][linkedin-url] 5 | 6 | # AdminLTEAspNetMVC 7 | Free admin dashboard template based on https://adminlte.io in [Asp.net MVC](https://dotnet.microsoft.com/apps/aspnet/mvc) 8 | 9 | ## Table of Contents 10 | * [Getting Started](#getting-started) 11 | * [Installation](#installation) 12 | * [Features](#features) 13 | * [Contributing](#contributing) 14 | * [Screenshots](#Screenshots) 15 | * [License](#license) 16 | * [Contact](#contact) 17 | 18 | 19 | 20 | ## Getting Started 21 | ### Prerequisites 22 | - [Nodejs](https://nodejs.org/en/download/) 23 | - [Visual Studio](https://visualstudio.microsoft.com/) 24 | 25 | 26 | ## Installation 27 | 28 | - Clone the repository 29 | ```sh 30 | git clone https://github.com/mak-thevar/AdminLTEAspNetMVC.git 31 | ``` 32 | - Open the solution file 'AspMVCAdminLTE.sln' directly in Visual Studio 33 | - If you want to connect to a database then open ```Configs/connectionStrings.config``` and add your connection string 34 | - The appSettings can be found under ```Configs/appSettings.config``` 35 | - Now Build the project, initially the project will take longer time to build because it will download all the npm packages and compile/minify the js and css respectively. 36 | 37 | 38 | 39 | ## Features 40 | - Uses [Owin](https://docs.microsoft.com/en-us/aspnet/aspnet/overview/owin-and-katana/owin-startup-class-detection) based startup class. 41 | - Web API is configured and uses [Token based authentication](https://www.c-sharpcorner.com/UploadFile/ff2f08/token-based-authentication-using-Asp-Net-web-api-owin-and-i/). 42 | - Can be easily customized to use [external authentication](https://docs.microsoft.com/en-us/aspnet/web-api/overview/security/external-authentication-services) services like Google, Facebook, etc. 43 | - [Autofac](https://autofaccn.readthedocs.io/en/latest/getting-started/) is configured as a dependency injection. 44 | - [Entity framework 6](https://docs.microsoft.com/en-us/ef/ef6/) with basic User entity and the authentication service is configured. 45 | - Follows [Repository pattern](https://deviq.com/repository-pattern/) for the database operations. 46 | - Custom HTML helpers has been added to support this specific template. Will be adding more HTML helpers in the future releases. 47 | 48 | ## Contributing 49 | 50 | Contributions are what make the open source community such an amazing place to be learn, inspire, and create. Any contributions you make are **greatly appreciated**. 51 | 52 | 1. Fork the Project 53 | 2. Create your Feature Branch (`git checkout -b feature/AmazingFeature`) 54 | 3. Commit your Changes (`git commit -m 'Add some AmazingFeature'`) 55 | 4. Push to the Branch (`git push origin feature/AmazingFeature`) 56 | 5. Open a Pull Request 57 | 58 | 59 | ## Screenshots 60 | ![AadminLTE](https://i.imgur.com/mHSXd4P.png) 61 | 62 | ![AadminLTEASP.NET](https://i.imgur.com/50ZTcKk.gif) 63 | 64 | ![LoginAPI Postman](https://i.imgur.com/uREBifI.png) 65 | 66 | 67 | 68 | ## License 69 | 70 | Distributed under the MIT License. See [`LICENSE`](https://github.com/mak-thevar/AdminLTEAspNetMVC/blob/master/LICENSE) for more information. 71 | 72 | 73 | ## Contact 74 | 75 | Name - [Muthukumar Thevar](#) - mak.thevar@outlook.com 76 | 77 | Project Link: [https://github.com/mak-thevar/AdminLTEAspNetMVC](https://github.com/mak-thevar/AdminLTEAspNetMVC) 78 | 79 | 80 | [contributors-shield]: https://img.shields.io/github/contributors/mak-thevar/AdminLTEAspNetMVC.svg?style=flat-square 81 | [contributors-url]: https://github.com/mak-thevar/AdminLTEAspNetMVC/graphs/contributors 82 | 83 | [issues-shield]: https://img.shields.io/github/issues/mak-thevar/AdminLTEAspNetMVC.svg?style=flat-square 84 | [issues-url]: https://github.com/mak-thevar/AdminLTEAspNetMVC/issues 85 | [linkedin-shield]: https://img.shields.io/badge/-LinkedIn-black.svg?style=flat-square&logo=linkedin&colorB=555 86 | [linkedin-url]: https://www.linkedin.com/in/mak11/ 87 | -------------------------------------------------------------------------------- /WebCore/build/scss/_sidebar-mini.scss: -------------------------------------------------------------------------------- 1 | // 2 | // Component: Sidebar Mini 3 | // 4 | 5 | // Logo style 6 | .logo-xs, 7 | .logo-xl { 8 | opacity: 1; 9 | position: absolute; 10 | visibility: visible; 11 | 12 | &.brand-image-xs { 13 | left: 18px; 14 | top: 12px; 15 | } 16 | 17 | &.brand-image-xl { 18 | left: 12px; 19 | top: 6px; 20 | } 21 | } 22 | 23 | .logo-xs { 24 | opacity: 0; 25 | visibility: hidden; 26 | 27 | &.brand-image-xl { 28 | left: 16px; 29 | top: 8px; 30 | } 31 | } 32 | 33 | .brand-link { 34 | &.logo-switch { 35 | &::before { 36 | content: '\00a0'; 37 | } 38 | } 39 | } 40 | 41 | // Add sidebar-mini class to the body tag to activate this feature 42 | .sidebar-mini { 43 | @include media-breakpoint-up(lg) { 44 | @include sidebar-mini-breakpoint; 45 | } 46 | } 47 | 48 | @include media-breakpoint-down(md) { 49 | .sidebar-mini.sidebar-collapse .main-sidebar { 50 | box-shadow: none !important; 51 | } 52 | } 53 | 54 | .sidebar-mini-md { 55 | @include media-breakpoint-up(md) { 56 | @include sidebar-mini-breakpoint; 57 | } 58 | } 59 | 60 | @include media-breakpoint-down(sm) { 61 | .sidebar-mini-md.sidebar-collapse .main-sidebar { 62 | box-shadow: none !important; 63 | } 64 | } 65 | 66 | @keyframes fadeIn { 67 | from { 68 | opacity: 0; 69 | } 70 | 71 | to { 72 | opacity: 1; 73 | } 74 | } 75 | 76 | @keyframes fadeOut { 77 | from { 78 | opacity: 1; 79 | } 80 | 81 | to { 82 | opacity: 0; 83 | } 84 | } 85 | 86 | .sidebar-collapse { 87 | .main-sidebar.sidebar-focused, 88 | .main-sidebar:hover { 89 | .nav-header { 90 | display: inline-block; 91 | } 92 | } 93 | 94 | .sidebar-no-expand.main-sidebar.sidebar-focused, 95 | .sidebar-no-expand.main-sidebar:hover { 96 | width: $sidebar-mini-width; 97 | 98 | .nav-header { 99 | display: none; 100 | } 101 | 102 | .brand-link { 103 | width: $sidebar-mini-width !important; 104 | } 105 | 106 | .user-panel .image { 107 | float: none !important; 108 | } 109 | 110 | .logo-xs { 111 | animation-name: fadeIn; 112 | animation-duration: $transition-speed; 113 | animation-fill-mode: both; 114 | visibility: visible; 115 | } 116 | 117 | .logo-xl { 118 | animation-name: fadeOut; 119 | animation-duration: $transition-speed; 120 | animation-fill-mode: both; 121 | visibility: hidden; 122 | } 123 | 124 | .nav-sidebar.nav-child-indent .nav-treeview { 125 | padding-left: 0; 126 | } 127 | 128 | .brand-text, 129 | .user-panel > .info, 130 | .nav-sidebar .nav-link p { 131 | margin-left: -10px; 132 | animation-name: fadeOut; 133 | animation-duration: $transition-speed; 134 | animation-fill-mode: both; 135 | visibility: hidden; 136 | width: 0; 137 | } 138 | 139 | .nav-sidebar > .nav-item .nav-icon { 140 | margin-right: 0; 141 | } 142 | } 143 | } 144 | 145 | .nav-sidebar { 146 | position: relative; 147 | 148 | &:hover { 149 | overflow: visible; 150 | } 151 | } 152 | 153 | .sidebar-form, 154 | .nav-sidebar > .nav-header { 155 | overflow: hidden; 156 | text-overflow: clip; 157 | } 158 | 159 | .nav-sidebar .nav-item > .nav-link { 160 | position: relative; 161 | 162 | > .float-right { 163 | margin-top: -7px; 164 | position: absolute; 165 | right: 10px; 166 | top: 50%; 167 | } 168 | } 169 | 170 | .sidebar .nav-link p, 171 | .main-sidebar .brand-text, 172 | .main-sidebar .logo-xs, 173 | .main-sidebar .logo-xl, 174 | .sidebar .user-panel .info { 175 | @include transition(margin-left $transition-speed linear, opacity $transition-speed ease, visibility $transition-speed ease) 176 | } -------------------------------------------------------------------------------- /WebCore/build/scss/_control-sidebar.scss: -------------------------------------------------------------------------------- 1 | // 2 | // Component: Control Sidebar 3 | // 4 | 5 | html.control-sidebar-animate { 6 | overflow-x: hidden; 7 | } 8 | 9 | .control-sidebar { 10 | bottom: $main-footer-height; 11 | position: absolute; 12 | top: $main-header-height; 13 | z-index: $zindex-control-sidebar; 14 | 15 | &, 16 | &::before { 17 | bottom: $main-footer-height; 18 | display: none; 19 | right: -$control-sidebar-width; 20 | width: $control-sidebar-width; 21 | @include transition(right $transition-speed $transition-fn, display $transition-speed $transition-fn); 22 | } 23 | 24 | &::before { 25 | content: ''; 26 | display: block; 27 | position: fixed; 28 | top: 0; 29 | z-index: -1; 30 | } 31 | } 32 | 33 | body.text-sm { 34 | .control-sidebar { 35 | bottom: $main-footer-height-sm; 36 | top: $main-header-height-sm; 37 | } 38 | } 39 | 40 | .main-header.text-sm ~ .control-sidebar { 41 | top: $main-header-height-sm; 42 | } 43 | 44 | .main-footer.text-sm ~ .control-sidebar { 45 | bottom: $main-footer-height-sm; 46 | } 47 | 48 | .control-sidebar-push-slide { 49 | .content-wrapper, 50 | .main-footer { 51 | @include transition(margin-right $transition-speed $transition-fn); 52 | } 53 | } 54 | 55 | // Control sidebar open state 56 | .control-sidebar-open { 57 | .control-sidebar { 58 | display: block; 59 | 60 | &, 61 | &::before { 62 | right: 0; 63 | } 64 | } 65 | 66 | &.control-sidebar-push, 67 | &.control-sidebar-push-slide { 68 | .content-wrapper, 69 | .main-footer { 70 | margin-right: $control-sidebar-width; 71 | } 72 | } 73 | } 74 | 75 | // Control sidebar slide over content state 76 | .control-sidebar-slide-open { 77 | .control-sidebar { 78 | display: block; 79 | 80 | &, 81 | &::before { 82 | right: 0; 83 | @include transition(right $transition-speed $transition-fn, display $transition-speed $transition-fn); 84 | } 85 | } 86 | 87 | &.control-sidebar-push, 88 | &.control-sidebar-push-slide { 89 | .content-wrapper, 90 | .main-footer { 91 | margin-right: $control-sidebar-width; 92 | } 93 | } 94 | } 95 | 96 | // Dark skin 97 | .control-sidebar-dark { 98 | &, 99 | a, 100 | .nav-link { 101 | color: $sidebar-dark-color; 102 | } 103 | // Background 104 | & { 105 | background: $sidebar-dark-bg; 106 | } 107 | 108 | a:hover { 109 | color: $sidebar-dark-hover-color; 110 | } 111 | // Headers and labels 112 | h1, 113 | h2, 114 | h3, 115 | h4, 116 | h5, 117 | h6, 118 | label { 119 | color: $sidebar-dark-hover-color; 120 | } 121 | // Tabs 122 | .nav-tabs { 123 | background-color: $sidebar-dark-hover-bg; 124 | border-bottom: 0; 125 | margin-bottom: 5px; 126 | 127 | .nav-item { 128 | margin: 0; 129 | } 130 | 131 | .nav-link { 132 | border-radius: 0; 133 | padding: 10px 20px; 134 | position: relative; 135 | text-align: center; 136 | 137 | &, 138 | &:hover, 139 | &:active, 140 | &:focus, 141 | &.active { 142 | border: 0; 143 | } 144 | 145 | &:hover, 146 | &:active, 147 | &:focus, 148 | &.active { 149 | border-bottom-color: transparent; 150 | border-left-color: transparent; 151 | border-top-color: transparent; 152 | color: $sidebar-dark-hover-color; 153 | } 154 | 155 | &.active { 156 | background-color: $sidebar-dark-bg; 157 | } 158 | } 159 | } 160 | 161 | .tab-pane { 162 | padding: 10px 15px; 163 | } 164 | } 165 | 166 | // Light skin 167 | .control-sidebar-light { 168 | color: lighten($sidebar-light-color, 10%); 169 | // Background 170 | & { 171 | background: $sidebar-light-bg; 172 | border-left: $main-header-bottom-border; 173 | } 174 | } -------------------------------------------------------------------------------- /WebCore/build/js/Dropdown.js: -------------------------------------------------------------------------------- 1 | /** 2 | * -------------------------------------------- 3 | * AdminLTE Dropdown.js 4 | * License MIT 5 | * -------------------------------------------- 6 | */ 7 | 8 | const Dropdown = (($) => { 9 | /** 10 | * Constants 11 | * ==================================================== 12 | */ 13 | 14 | const NAME = 'Dropdown' 15 | const DATA_KEY = 'lte.dropdown' 16 | const EVENT_KEY = `.${DATA_KEY}` 17 | const JQUERY_NO_CONFLICT = $.fn[NAME] 18 | 19 | const Selector = { 20 | NAVBAR: '.navbar', 21 | DROPDOWN_MENU: '.dropdown-menu', 22 | DROPDOWN_MENU_ACTIVE: '.dropdown-menu.show', 23 | DROPDOWN_TOGGLE: '[data-toggle="dropdown"]', 24 | } 25 | 26 | const ClassName = { 27 | DROPDOWN_HOVER: 'dropdown-hover', 28 | DROPDOWN_RIGHT: 'dropdown-menu-right' 29 | } 30 | 31 | const Default = { 32 | } 33 | 34 | /** 35 | * Class Definition 36 | * ==================================================== 37 | */ 38 | 39 | class Dropdown { 40 | constructor(element, config) { 41 | this._config = config 42 | this._element = element 43 | } 44 | 45 | // Public 46 | 47 | toggleSubmenu() { 48 | this._element.siblings().show().toggleClass("show") 49 | 50 | if (!this._element.next().hasClass('show')) { 51 | this._element.parents('.dropdown-menu').first().find('.show').removeClass("show").hide() 52 | } 53 | 54 | this._element.parents('li.nav-item.dropdown.show').on('hidden.bs.dropdown', function (e) { 55 | $('.dropdown-submenu .show').removeClass("show").hide() 56 | }) 57 | } 58 | 59 | fixPosition() { 60 | let elm = $(Selector.DROPDOWN_MENU_ACTIVE) 61 | 62 | if (elm.length !== 0) { 63 | if (elm.hasClass(ClassName.DROPDOWN_RIGHT)) { 64 | elm.css('left', 'inherit') 65 | elm.css('right', 0) 66 | } else { 67 | elm.css('left', 0) 68 | elm.css('right', 'inherit') 69 | } 70 | 71 | let offset = elm.offset() 72 | let width = elm.width() 73 | let windowWidth = $(window).width() 74 | let visiblePart = windowWidth - offset.left 75 | 76 | if (offset.left < 0) { 77 | elm.css('left', 'inherit') 78 | elm.css('right', (offset.left - 5)) 79 | } else { 80 | if (visiblePart < width) { 81 | elm.css('left', 'inherit') 82 | elm.css('right', 0) 83 | } 84 | } 85 | } 86 | } 87 | 88 | // Static 89 | 90 | static _jQueryInterface(config) { 91 | return this.each(function () { 92 | let data = $(this).data(DATA_KEY) 93 | const _config = $.extend({}, Default, $(this).data()) 94 | 95 | if (!data) { 96 | data = new Dropdown($(this), _config) 97 | $(this).data(DATA_KEY, data) 98 | } 99 | 100 | if (config === 'toggleSubmenu' || config == 'fixPosition') { 101 | data[config]() 102 | } 103 | }) 104 | } 105 | } 106 | 107 | /** 108 | * Data API 109 | * ==================================================== 110 | */ 111 | 112 | $(Selector.DROPDOWN_MENU + ' ' + Selector.DROPDOWN_TOGGLE).on("click", function (event) { 113 | event.preventDefault() 114 | event.stopPropagation() 115 | 116 | Dropdown._jQueryInterface.call($(this), 'toggleSubmenu') 117 | }); 118 | 119 | $(Selector.NAVBAR + ' ' + Selector.DROPDOWN_TOGGLE).on("click", function (event) { 120 | event.preventDefault() 121 | 122 | setTimeout(function () { 123 | Dropdown._jQueryInterface.call($(this), 'fixPosition') 124 | }, 1) 125 | }); 126 | 127 | /** 128 | * jQuery API 129 | * ==================================================== 130 | */ 131 | 132 | $.fn[NAME] = Dropdown._jQueryInterface 133 | $.fn[NAME].Constructor = Dropdown 134 | $.fn[NAME].noConflict = function () { 135 | $.fn[NAME] = JQUERY_NO_CONFLICT 136 | return Dropdown._jQueryInterface 137 | } 138 | 139 | return Dropdown 140 | })(jQuery) 141 | 142 | export default Dropdown -------------------------------------------------------------------------------- /WebCore/build/scss/mixins/_sidebar.scss: -------------------------------------------------------------------------------- 1 | // 2 | // Mixins: Sidebar 3 | // 4 | 5 | // Sidebar Color 6 | @mixin sidebar-color($color) { 7 | .nav-sidebar > .nav-item { 8 | & > .nav-link.active { 9 | background-color: $color; 10 | color: color-yiq($color); 11 | } 12 | } 13 | 14 | .nav-sidebar.nav-legacy > .nav-item { 15 | & > .nav-link.active { 16 | border-color: $color; 17 | } 18 | } 19 | } 20 | 21 | // Sidebar Mini Breakpoints 22 | @mixin sidebar-mini-breakpoint() { 23 | // A fix for text overflow while transitioning from sidebar mini to full sidebar 24 | .nav-sidebar, 25 | .nav-sidebar > .nav-header, 26 | .nav-sidebar .nav-link { 27 | white-space: nowrap; 28 | overflow: hidden; 29 | } 30 | // When the sidebar is collapsed... 31 | &.sidebar-collapse { 32 | .d-hidden-mini { 33 | display: none; 34 | } 35 | // Apply the new margins to the main content and footer 36 | .content-wrapper, 37 | .main-footer, 38 | .main-header { 39 | margin-left: $sidebar-mini-width !important; 40 | } 41 | // Make the sidebar headers 42 | .nav-sidebar .nav-header { 43 | display: none; 44 | } 45 | 46 | .nav-sidebar .nav-link p { 47 | width: 0; 48 | } 49 | 50 | .sidebar .user-panel > .info, 51 | .nav-sidebar .nav-link p, 52 | .brand-text { 53 | margin-left: -10px; 54 | animation-name: fadeOut; 55 | animation-duration: $transition-speed; 56 | animation-fill-mode: both; 57 | visibility: hidden; 58 | } 59 | 60 | .logo-xl { 61 | animation-name: fadeOut; 62 | animation-duration: $transition-speed; 63 | animation-fill-mode: both; 64 | visibility: hidden; 65 | } 66 | 67 | .logo-xs { 68 | display: inline-block; 69 | animation-name: fadeIn; 70 | animation-duration: $transition-speed; 71 | animation-fill-mode: both; 72 | visibility: visible; 73 | } 74 | // Modify the sidebar to shrink instead of disappearing 75 | .main-sidebar { 76 | overflow-x: hidden; 77 | 78 | &, 79 | &::before { 80 | // Don't go away! Just shrink 81 | margin-left: 0; 82 | width: $sidebar-mini-width; 83 | } 84 | 85 | .user-panel { 86 | .image { 87 | float: none; 88 | } 89 | } 90 | 91 | &:hover, 92 | &.sidebar-focused { 93 | width: $sidebar-width; 94 | 95 | .brand-link { 96 | width: $sidebar-width; 97 | } 98 | 99 | .user-panel { 100 | text-align: left; 101 | 102 | .image { 103 | float: left; 104 | } 105 | } 106 | 107 | .user-panel > .info, 108 | .nav-sidebar .nav-link p, 109 | .brand-text, 110 | .logo-xl { 111 | display: inline-block; 112 | margin-left: 0; 113 | animation-name: fadeIn; 114 | animation-duration: $transition-speed; 115 | animation-fill-mode: both; 116 | visibility: visible; 117 | } 118 | 119 | .logo-xs { 120 | animation-name: fadeOut; 121 | animation-duration: $transition-speed; 122 | animation-fill-mode: both; 123 | visibility: hidden; 124 | } 125 | 126 | .brand-image { 127 | margin-right: .5rem; 128 | } 129 | // Make the sidebar links, menus, labels, badges 130 | // and angle icons disappear 131 | .sidebar-form, 132 | .user-panel > .info { 133 | display: block !important; 134 | -webkit-transform: translateZ(0); 135 | } 136 | 137 | .nav-sidebar > .nav-item > .nav-link > span { 138 | display: inline-block !important; 139 | } 140 | } 141 | } 142 | // Make an element visible only when sidebar mini is active 143 | .visible-sidebar-mini { 144 | display: block !important; 145 | } 146 | 147 | &.layout-fixed { 148 | .main-sidebar:hover { 149 | .brand-link { 150 | width: $sidebar-width; 151 | } 152 | } 153 | 154 | .brand-link { 155 | width: $sidebar-mini-width; 156 | } 157 | } 158 | } 159 | } -------------------------------------------------------------------------------- /WebCore/build/scss/_direct-chat.scss: -------------------------------------------------------------------------------- 1 | // 2 | // Component: Direct Chat 3 | // 4 | 5 | .direct-chat { 6 | .card-body { 7 | overflow-x: hidden; 8 | padding: 0; 9 | position: relative; 10 | } 11 | 12 | &.chat-pane-open { 13 | .direct-chat-contacts { 14 | @include translate(0, 0); 15 | } 16 | } 17 | 18 | &.timestamp-light { 19 | .direct-chat-timestamp { 20 | color: lighten(color-yiq($yiq-text-light), 10%); 21 | } 22 | } 23 | 24 | &.timestamp-dark { 25 | .direct-chat-timestamp { 26 | color: darken(color-yiq($yiq-text-dark), 20%); 27 | } 28 | } 29 | } 30 | 31 | .direct-chat-messages { 32 | @include translate(0, 0); 33 | height: 250px; 34 | overflow: auto; 35 | padding: 10px; 36 | } 37 | 38 | .direct-chat-msg, 39 | .direct-chat-text { 40 | display: block; 41 | } 42 | 43 | .direct-chat-msg { 44 | @include clearfix; 45 | margin-bottom: 10px; 46 | } 47 | 48 | .direct-chat-messages, 49 | .direct-chat-contacts { 50 | transition: transform .5s ease-in-out; 51 | } 52 | 53 | .direct-chat-text { 54 | @if $enable-rounded { 55 | @include border-radius($border-radius-lg); 56 | } 57 | 58 | background: $direct-chat-default-msg-bg; 59 | border: 1px solid $direct-chat-default-msg-border-color; 60 | color: $direct-chat-default-font-color; 61 | margin: 5px 0 0 50px; 62 | padding: 5px 10px; 63 | position: relative; 64 | //Create the arrow 65 | &::after, 66 | &::before { 67 | border: solid transparent; 68 | border-right-color: $direct-chat-default-msg-border-color; 69 | content: ' '; 70 | height: 0; 71 | pointer-events: none; 72 | position: absolute; 73 | right: 100%; 74 | top: 15px; 75 | width: 0; 76 | } 77 | 78 | &::after { 79 | border-width: 5px; 80 | margin-top: -5px; 81 | } 82 | 83 | &::before { 84 | border-width: 6px; 85 | margin-top: -6px; 86 | } 87 | 88 | .right & { 89 | margin-left: 0; 90 | margin-right: 50px; 91 | 92 | &::after, 93 | &::before { 94 | border-left-color: $direct-chat-default-msg-border-color; 95 | border-right-color: transparent; 96 | left: 100%; 97 | right: auto; 98 | } 99 | } 100 | } 101 | 102 | .direct-chat-img { 103 | @include border-radius(50%); 104 | float: left; 105 | height: 40px; 106 | width: 40px; 107 | 108 | .right & { 109 | float: right; 110 | } 111 | } 112 | 113 | .direct-chat-infos { 114 | display: block; 115 | font-size: $font-size-sm; 116 | margin-bottom: 2px; 117 | } 118 | 119 | .direct-chat-name { 120 | font-weight: 600; 121 | } 122 | 123 | .direct-chat-timestamp { 124 | color: darken($gray-500, 25%); 125 | } 126 | 127 | //Direct chat contacts pane 128 | .direct-chat-contacts-open { 129 | .direct-chat-contacts { 130 | @include translate(0, 0); 131 | } 132 | } 133 | 134 | .direct-chat-contacts { 135 | @include translate(101%, 0); 136 | background: $dark; 137 | bottom: 0; 138 | color: $white; 139 | height: 250px; 140 | overflow: auto; 141 | position: absolute; 142 | top: 0; 143 | width: 100%; 144 | } 145 | 146 | .direct-chat-contacts-light { 147 | background: $light; 148 | 149 | .contacts-list-name { 150 | color: $gray-700; 151 | } 152 | 153 | .contacts-list-date { 154 | color: $gray-600; 155 | } 156 | 157 | .contacts-list-msg { 158 | color: darken($gray-600, 10%); 159 | } 160 | } 161 | 162 | //Contacts list -- for displaying contacts in direct chat contacts pane 163 | .contacts-list { 164 | @include list-unstyled; 165 | 166 | > li { 167 | @include clearfix; 168 | border-bottom: 1px solid rgba($black, 0.2); 169 | margin: 0; 170 | padding: 10px; 171 | 172 | &:last-of-type { 173 | border-bottom: 0; 174 | } 175 | } 176 | } 177 | 178 | .contacts-list-img { 179 | @include border-radius(50%); 180 | float: left; 181 | width: 40px; 182 | } 183 | 184 | .contacts-list-info { 185 | color: $white; 186 | margin-left: 45px; 187 | } 188 | 189 | .contacts-list-name, 190 | .contacts-list-status { 191 | display: block; 192 | } 193 | 194 | .contacts-list-name { 195 | font-weight: 600; 196 | } 197 | 198 | .contacts-list-status { 199 | font-size: $font-size-sm; 200 | } 201 | 202 | .contacts-list-date { 203 | color: $gray-400; 204 | font-weight: normal; 205 | } 206 | 207 | .contacts-list-msg { 208 | color: darken($gray-400, 10%); 209 | } 210 | 211 | // Color variants 212 | @each $name, $color in $theme-colors { 213 | .direct-chat-#{$name} { 214 | @include direct-chat-variant($color); 215 | } 216 | } 217 | 218 | @each $name, $color in $colors { 219 | .direct-chat-#{$name} { 220 | @include direct-chat-variant($color); 221 | } 222 | } -------------------------------------------------------------------------------- /Web.config: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | -------------------------------------------------------------------------------- /Views/Login/ForgetPassword.cshtml: -------------------------------------------------------------------------------- 1 | @{ 2 | Layout = null; 3 | } 4 | 5 | 6 | 7 | 8 | 9 | 10 | Invitee Admin | Log in 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | @if (ViewBag.Message != null) 90 | { 91 | 92 | } 93 | 122 | 123 | -------------------------------------------------------------------------------- /WebCore/build/js/CardRefresh.js: -------------------------------------------------------------------------------- 1 | /** 2 | * -------------------------------------------- 3 | * AdminLTE CardRefresh.js 4 | * License MIT 5 | * -------------------------------------------- 6 | */ 7 | 8 | const CardRefresh = (($) => { 9 | /** 10 | * Constants 11 | * ==================================================== 12 | */ 13 | 14 | const NAME = 'CardRefresh' 15 | const DATA_KEY = 'lte.cardrefresh' 16 | const EVENT_KEY = `.${DATA_KEY}` 17 | const JQUERY_NO_CONFLICT = $.fn[NAME] 18 | 19 | const Event = { 20 | LOADED: `loaded${EVENT_KEY}`, 21 | OVERLAY_ADDED: `overlay.added${EVENT_KEY}`, 22 | OVERLAY_REMOVED: `overlay.removed${EVENT_KEY}`, 23 | } 24 | 25 | const ClassName = { 26 | CARD: 'card', 27 | } 28 | 29 | const Selector = { 30 | CARD: `.${ClassName.CARD}`, 31 | DATA_REFRESH: '[data-card-widget="card-refresh"]', 32 | } 33 | 34 | const Default = { 35 | source: '', 36 | sourceSelector: '', 37 | params: {}, 38 | trigger: Selector.DATA_REFRESH, 39 | content: '.card-body', 40 | loadInContent: true, 41 | loadOnInit: true, 42 | responseType: '', 43 | overlayTemplate: '
', 44 | onLoadStart: function () { 45 | }, 46 | onLoadDone: function (response) { 47 | return response; 48 | } 49 | } 50 | 51 | class CardRefresh { 52 | constructor(element, settings) { 53 | this._element = element 54 | this._parent = element.parents(Selector.CARD).first() 55 | this._settings = $.extend({}, Default, settings) 56 | this._overlay = $(this._settings.overlayTemplate) 57 | 58 | if (element.hasClass(ClassName.CARD)) { 59 | this._parent = element 60 | } 61 | 62 | if (this._settings.source === '') { 63 | throw new Error('Source url was not defined. Please specify a url in your CardRefresh source option.'); 64 | } 65 | } 66 | 67 | load() { 68 | this._addOverlay() 69 | this._settings.onLoadStart.call($(this)) 70 | 71 | $.get(this._settings.source, this._settings.params, function (response) { 72 | if (this._settings.loadInContent) { 73 | if (this._settings.sourceSelector != '') { 74 | response = $(response).find(this._settings.sourceSelector).html() 75 | } 76 | 77 | this._parent.find(this._settings.content).html(response) 78 | } 79 | 80 | this._settings.onLoadDone.call($(this), response) 81 | this._removeOverlay(); 82 | }.bind(this), this._settings.responseType !== '' && this._settings.responseType) 83 | 84 | const loadedEvent = $.Event(Event.LOADED) 85 | $(this._element).trigger(loadedEvent) 86 | } 87 | 88 | _addOverlay() { 89 | this._parent.append(this._overlay) 90 | 91 | const overlayAddedEvent = $.Event(Event.OVERLAY_ADDED) 92 | $(this._element).trigger(overlayAddedEvent) 93 | }; 94 | 95 | _removeOverlay() { 96 | this._parent.find(this._overlay).remove() 97 | 98 | const overlayRemovedEvent = $.Event(Event.OVERLAY_REMOVED) 99 | $(this._element).trigger(overlayRemovedEvent) 100 | }; 101 | 102 | // Private 103 | 104 | _init(card) { 105 | $(this).find(this._settings.trigger).on('click', () => { 106 | this.load() 107 | }) 108 | 109 | if (this._settings.loadOnInit) { 110 | this.load() 111 | } 112 | } 113 | 114 | // Static 115 | 116 | static _jQueryInterface(config) { 117 | let data = $(this).data(DATA_KEY) 118 | const _options = $.extend({}, Default, $(this).data()) 119 | 120 | if (!data) { 121 | data = new CardRefresh($(this), _options) 122 | $(this).data(DATA_KEY, typeof config === 'string' ? data : config) 123 | } 124 | 125 | if (typeof config === 'string' && config.match(/load/)) { 126 | data[config]() 127 | } else { 128 | data._init($(this)) 129 | } 130 | } 131 | } 132 | 133 | /** 134 | * Data API 135 | * ==================================================== 136 | */ 137 | 138 | $(document).on('click', Selector.DATA_REFRESH, function (event) { 139 | if (event) { 140 | event.preventDefault() 141 | } 142 | 143 | CardRefresh._jQueryInterface.call($(this), 'load') 144 | }) 145 | 146 | $(document).ready(function () { 147 | $(Selector.DATA_REFRESH).each(function () { 148 | CardRefresh._jQueryInterface.call($(this)) 149 | }) 150 | }) 151 | 152 | /** 153 | * jQuery API 154 | * ==================================================== 155 | */ 156 | 157 | $.fn[NAME] = CardRefresh._jQueryInterface 158 | $.fn[NAME].Constructor = CardRefresh 159 | $.fn[NAME].noConflict = function () { 160 | $.fn[NAME] = JQUERY_NO_CONFLICT 161 | return CardRefresh._jQueryInterface 162 | } 163 | 164 | return CardRefresh 165 | })(jQuery) 166 | 167 | export default CardRefresh -------------------------------------------------------------------------------- /WebCore/build/scss/plugins/_bootstrap-switch.scss: -------------------------------------------------------------------------------- 1 | /** 2 | * bootstrap-switch - Turn checkboxes and radio buttons into toggle switches. 3 | * 4 | * @version v3.4 (MODDED) 5 | * @homepage https://bttstrp.github.io/bootstrap-switch 6 | * @author Mattia Larentis (http://larentis.eu) 7 | * @license MIT 8 | */ 9 | 10 | $bootstrap-switch-border-radius: $btn-border-radius; 11 | $bootstrap-switch-handle-border-radius: .1rem; 12 | 13 | .bootstrap-switch { 14 | border: $input-border-width solid $input-border-color; 15 | border-radius: $bootstrap-switch-border-radius; 16 | cursor: pointer; 17 | direction: ltr; 18 | display: inline-block; 19 | line-height: .5rem; 20 | overflow: hidden; 21 | position: relative; 22 | text-align: left; 23 | transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; 24 | user-select: none; 25 | vertical-align: middle; 26 | z-index: 0; 27 | 28 | .bootstrap-switch-container { 29 | border-radius: $bootstrap-switch-border-radius; 30 | display: inline-block; 31 | top: 0; 32 | transform: translate3d(0, 0, 0); 33 | } 34 | 35 | &:focus-within { 36 | box-shadow: $input-btn-focus-box-shadow; 37 | } 38 | 39 | .bootstrap-switch-handle-on, 40 | .bootstrap-switch-handle-off, 41 | .bootstrap-switch-label { 42 | box-sizing: border-box; 43 | cursor: pointer; 44 | display: table-cell; 45 | font-size: 1rem; 46 | font-weight: 500; 47 | line-height: 1.2rem; 48 | padding: .25rem .5rem; 49 | vertical-align: middle; 50 | } 51 | 52 | .bootstrap-switch-handle-on, 53 | .bootstrap-switch-handle-off { 54 | text-align: center; 55 | z-index: 1; 56 | 57 | &.bootstrap-switch-default { 58 | background: $gray-200; 59 | color: color-yiq($gray-200); 60 | } 61 | 62 | @each $name, $color in $theme-colors { 63 | &.bootstrap-switch-#{$name} { 64 | background: $color; 65 | color: color-yiq($color); 66 | } 67 | } 68 | 69 | @each $name, $color in $colors { 70 | &.bootstrap-switch-#{$name} { 71 | background: $color; 72 | color: color-yiq($color); 73 | } 74 | } 75 | } 76 | 77 | .bootstrap-switch-handle-on { 78 | border-bottom-left-radius: $bootstrap-switch-handle-border-radius; 79 | border-top-left-radius: $bootstrap-switch-handle-border-radius; 80 | } 81 | 82 | .bootstrap-switch-handle-off { 83 | border-bottom-right-radius: $bootstrap-switch-handle-border-radius; 84 | border-top-right-radius: $bootstrap-switch-handle-border-radius; 85 | } 86 | 87 | input[type='radio'], 88 | input[type='checkbox'] { 89 | filter: alpha(opacity=0); 90 | left: 0; 91 | margin: 0; 92 | opacity: 0; 93 | position: absolute; 94 | top: 0; 95 | visibility: hidden; 96 | z-index: -1; 97 | } 98 | 99 | &.bootstrap-switch-mini { 100 | .bootstrap-switch-handle-on, 101 | .bootstrap-switch-handle-off, 102 | .bootstrap-switch-label { 103 | font-size: .875rem; 104 | line-height: 1.5; 105 | padding: .1rem .3rem; 106 | } 107 | } 108 | 109 | &.bootstrap-switch-small { 110 | .bootstrap-switch-handle-on, 111 | .bootstrap-switch-handle-off, 112 | .bootstrap-switch-label { 113 | font-size: .875rem; 114 | line-height: 1.5; 115 | padding: .2rem .4rem; 116 | } 117 | } 118 | 119 | &.bootstrap-switch-large { 120 | .bootstrap-switch-handle-on, 121 | .bootstrap-switch-handle-off, 122 | .bootstrap-switch-label { 123 | font-size: 1.25rem; 124 | line-height: 1.3333333rem; 125 | padding: .3rem .5rem; 126 | } 127 | } 128 | 129 | &.bootstrap-switch-disabled, 130 | &.bootstrap-switch-readonly, 131 | &.bootstrap-switch-indeterminate { 132 | cursor: default; 133 | 134 | .bootstrap-switch-handle-on, 135 | .bootstrap-switch-handle-off, 136 | .bootstrap-switch-label { 137 | cursor: default; 138 | filter: alpha(opacity=50); 139 | opacity: .5; 140 | } 141 | } 142 | 143 | &.bootstrap-switch-animate .bootstrap-switch-container { 144 | transition: margin-left .5s; 145 | } 146 | 147 | &.bootstrap-switch-inverse { 148 | .bootstrap-switch-handle-on { 149 | border-radius: 0 $bootstrap-switch-handle-border-radius $bootstrap-switch-handle-border-radius 0; 150 | } 151 | 152 | .bootstrap-switch-handle-off { 153 | border-radius: $bootstrap-switch-handle-border-radius 0 0 $bootstrap-switch-handle-border-radius; 154 | } 155 | } 156 | // &.bootstrap-switch-focused { 157 | // border-color: $input-btn-focus-color; 158 | // box-shadow: $input-btn-focus-box-shadow; 159 | // outline: 0; 160 | // } 161 | &.bootstrap-switch-on .bootstrap-switch-label, 162 | &.bootstrap-switch-inverse.bootstrap-switch-off .bootstrap-switch-label { 163 | border-bottom-right-radius: $bootstrap-switch-handle-border-radius; 164 | border-top-right-radius: $bootstrap-switch-handle-border-radius; 165 | } 166 | 167 | &.bootstrap-switch-off .bootstrap-switch-label, 168 | &.bootstrap-switch-inverse.bootstrap-switch-on .bootstrap-switch-label { 169 | border-bottom-left-radius: $bootstrap-switch-handle-border-radius; 170 | border-top-left-radius: $bootstrap-switch-handle-border-radius; 171 | } 172 | } -------------------------------------------------------------------------------- /WebCore/build/scss/plugins/_pace.scss: -------------------------------------------------------------------------------- 1 | // 2 | // Plugin: Pace 3 | // 4 | 5 | .pace { 6 | z-index: $zindex-main-sidebar + 10; 7 | 8 | .pace-progress { 9 | z-index: $zindex-main-sidebar + 11; 10 | } 11 | 12 | .pace-activity { 13 | z-index: $zindex-main-sidebar + 12; 14 | } 15 | } 16 | 17 | // Mixin 18 | @mixin pace-variant($name, $color) { 19 | .pace-#{$name} { 20 | .pace { 21 | .pace-progress { 22 | background: $color; 23 | } 24 | } 25 | } 26 | 27 | .pace-barber-shop-#{$name} { 28 | .pace { 29 | background: color-yiq($color); 30 | 31 | .pace-progress { 32 | background: $color; 33 | } 34 | 35 | .pace-activity { 36 | background-image: linear-gradient(45deg, rgba(color-yiq($color), 0.2) 25%, transparent 25%, transparent 50%, rgba(color-yiq($color), 0.2) 50%, rgba(color-yiq($color), 0.2) 75%, transparent 75%, transparent); 37 | } 38 | } 39 | } 40 | 41 | .pace-big-counter-#{$name} { 42 | .pace { 43 | .pace-progress::after { 44 | color: rgba($color, .19999999999999996); 45 | } 46 | } 47 | } 48 | 49 | .pace-bounce-#{$name} { 50 | .pace { 51 | .pace-activity { 52 | background: $color; 53 | } 54 | } 55 | } 56 | 57 | .pace-center-atom-#{$name} { 58 | .pace-progress { 59 | height: 100px; 60 | width: 80px; 61 | 62 | &::before { 63 | background: $color; 64 | color: color-yiq($color); 65 | font-size: .8rem; 66 | line-height: .7rem; 67 | padding-top: 17%; 68 | } 69 | } 70 | 71 | .pace-activity { 72 | border-color: $color; 73 | 74 | &::after, 75 | &::before { 76 | border-color: $color; 77 | } 78 | } 79 | } 80 | 81 | .pace-center-circle-#{$name} { 82 | .pace { 83 | .pace-progress { 84 | background: rgba($color, .8); 85 | color: color-yiq($color); 86 | } 87 | } 88 | } 89 | 90 | .pace-center-radar-#{$name} { 91 | .pace { 92 | .pace-activity { 93 | border-color: $color transparent transparent; 94 | } 95 | 96 | .pace-activity::before { 97 | border-color: $color transparent transparent; 98 | } 99 | } 100 | } 101 | 102 | .pace-center-simple-#{$name} { 103 | .pace { 104 | background: color-yiq($color); 105 | border-color: $color; 106 | 107 | .pace-progress { 108 | background: $color; 109 | } 110 | } 111 | } 112 | 113 | .pace-material-#{$name} { 114 | .pace { 115 | color: $color; 116 | } 117 | } 118 | 119 | .pace-corner-indicator-#{$name} { 120 | .pace { 121 | .pace-activity { 122 | background: $color; 123 | } 124 | 125 | .pace-activity::after, 126 | .pace-activity::before { 127 | border: 5px solid color-yiq($color); 128 | } 129 | 130 | .pace-activity::before { 131 | border-right-color: rgba($color, .2); 132 | border-left-color: rgba($color, .2); 133 | } 134 | 135 | .pace-activity::after { 136 | border-top-color: rgba($color, .2); 137 | border-bottom-color: rgba($color, .2); 138 | } 139 | } 140 | } 141 | 142 | .pace-fill-left-#{$name} { 143 | .pace { 144 | .pace-progress { 145 | background-color: rgba($color, 0.19999999999999996); 146 | } 147 | } 148 | } 149 | 150 | .pace-flash-#{$name} { 151 | .pace { 152 | .pace-progress { 153 | background: $color; 154 | } 155 | 156 | .pace-progress-inner { 157 | box-shadow: 0 0 10px $color, 0 0 5px $color; 158 | } 159 | 160 | .pace-activity { 161 | border-top-color: $color; 162 | border-left-color: $color; 163 | } 164 | } 165 | } 166 | 167 | .pace-loading-bar-#{$name} { 168 | .pace { 169 | .pace-progress { 170 | background: $color; 171 | color: $color; 172 | box-shadow: 120px 0 color-yiq($color), 240px 0 color-yiq($color); 173 | } 174 | 175 | .pace-activity { 176 | box-shadow: inset 0 0 0 2px $color, inset 0 0 0 7px color-yiq($color); 177 | } 178 | } 179 | } 180 | 181 | .pace-mac-osx-#{$name} { 182 | .pace { 183 | .pace-progress { 184 | background-color: $color; 185 | box-shadow: inset -1px 0 $color, inset 0 -1px $color, inset 0 2px rgba(color-yiq($color), 0.5), inset 0 6px rgba(color-yiq($color), .3); 186 | } 187 | 188 | .pace-activity { 189 | background-image: radial-gradient(rgba(color-yiq($color), .65) 0%, rgba(color-yiq($color), .15) 100%); 190 | height: 12px; 191 | } 192 | } 193 | } 194 | 195 | .pace-progress-color-#{$name} { 196 | .pace-progress { 197 | color: $color; 198 | } 199 | } 200 | } 201 | 202 | @each $name, $color in $theme-colors { 203 | @include pace-variant($name, $color); 204 | } 205 | 206 | @each $name, $color in $colors { 207 | @include pace-variant($name, $color); 208 | } --------------------------------------------------------------------------------