diff --git a/.cr/Settings.xml b/.cr/Settings.xml deleted file mode 100644 index 57ec49e..0000000 --- a/.cr/Settings.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - - Main - - - Main - - - - - \ No newline at end of file diff --git a/.gitignore b/.gitignore index c05890f..62bce6c 100644 --- a/.gitignore +++ b/.gitignore @@ -240,6 +240,9 @@ _Pvt_Extensions # FAKE - F# Make .fake/ +#coderush +.cr/ + **/wwwroot/js/ src/AlpineSkiHouse.Web/bower_components/ diff --git a/src/AlpineSkiHouse.Web/Areas/Admin/Controllers/HomeController.cs b/src/AlpineSkiHouse.Web/Areas/Admin/Controllers/HomeController.cs new file mode 100644 index 0000000..271ed8e --- /dev/null +++ b/src/AlpineSkiHouse.Web/Areas/Admin/Controllers/HomeController.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Mvc; + +namespace AlpineSkiHouse.Web.Areas.Admin.Controllers +{ + [Area("Admin")] + public class HomeController : Controller + { + public IActionResult Index() + { + return View(); + } + } +} \ No newline at end of file diff --git a/src/AlpineSkiHouse.Web/Areas/Admin/Controllers/UsersController.cs b/src/AlpineSkiHouse.Web/Areas/Admin/Controllers/UsersController.cs new file mode 100644 index 0000000..2a469f5 --- /dev/null +++ b/src/AlpineSkiHouse.Web/Areas/Admin/Controllers/UsersController.cs @@ -0,0 +1,53 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Identity; +using AlpineSkiHouse.Models; +using AlpineSkiHouse.Web.Areas.Admin.Models; + +namespace AlpineSkiHouse.Web.Areas.Admin.Controllers +{ + [Produces("application/json")] + [Route("Admin/api/Users")] + [Authorize] + public class UsersController : Controller + { + UserManager _userManager; + public UsersController(UserManager userManager) + { + _userManager = userManager; + } + + [HttpGet] + public IEnumerable Index() + { + return _userManager.Users.Select(x => new User + { + Id = x.Id, + FirstName = x.FirstName, + LastName = x.LastName, + LockoutEnabled = x.LockoutEnabled + }); + } + + [HttpPut] + [Route("Lock/{userId}")] + public async Task Lockout(Guid userId) + { + var user = _userManager.Users.Where(x => x.Id == userId.ToString()).Single(); + await _userManager.SetLockoutEnabledAsync(user, true); + } + + [HttpPut] + [Route("Unlock/{userId}")] + public async Task Unlock(Guid userId) + { + var user = _userManager.Users.Where(x => x.Id == userId.ToString()).Single(); + await _userManager.SetLockoutEnabledAsync(user, false); + } + } +} \ No newline at end of file diff --git a/src/AlpineSkiHouse.Web/Areas/Admin/Models/User.cs b/src/AlpineSkiHouse.Web/Areas/Admin/Models/User.cs new file mode 100644 index 0000000..a21a740 --- /dev/null +++ b/src/AlpineSkiHouse.Web/Areas/Admin/Models/User.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; + +namespace AlpineSkiHouse.Web.Areas.Admin.Models +{ + public class User + { + public string Id { get; set; } + public string FirstName { get; set; } + public string LastName { get; set; } + public bool LockoutEnabled { get; set; } + } +} diff --git a/src/AlpineSkiHouse.Web/Areas/Admin/Views/Home/Index.cshtml b/src/AlpineSkiHouse.Web/Areas/Admin/Views/Home/Index.cshtml new file mode 100644 index 0000000..5aa85eb --- /dev/null +++ b/src/AlpineSkiHouse.Web/Areas/Admin/Views/Home/Index.cshtml @@ -0,0 +1,11 @@ +@* + For more information on enabling MVC for empty projects, visit http://go.microsoft.com/fwlink/?LinkID=397860 +*@ +@{ +} + +
+ + \ No newline at end of file diff --git a/src/AlpineSkiHouse.Web/Areas/Admin/Views/Shared/_Layout.cshtml b/src/AlpineSkiHouse.Web/Areas/Admin/Views/Shared/_Layout.cshtml new file mode 100644 index 0000000..a763320 --- /dev/null +++ b/src/AlpineSkiHouse.Web/Areas/Admin/Views/Shared/_Layout.cshtml @@ -0,0 +1,70 @@ +@using Microsoft.AspNetCore.Mvc.Localization + + + + + + + + + @ViewData["Title"] + + + + + + + + + + + + + + + +
+ @RenderBody() +
+
+

+ @await Html.PartialAsync("_CurrentLanguage") © @DateTime.Now.Year.ToString() - AlpineSkiHouse + | Developer Information +

+
+
+ + + + + + + + + + + + + + + @RenderSection("scripts", required: false) + + diff --git a/src/AlpineSkiHouse.Web/Areas/Admin/Views/_ViewImports.cshtml b/src/AlpineSkiHouse.Web/Areas/Admin/Views/_ViewImports.cshtml new file mode 100644 index 0000000..1535868 --- /dev/null +++ b/src/AlpineSkiHouse.Web/Areas/Admin/Views/_ViewImports.cshtml @@ -0,0 +1,9 @@ +@using AlpineSkiHouse +@using AlpineSkiHouse.Web +@using AlpineSkiHouse.Models +@using AlpineSkiHouse.Web.Models.AccountViewModels +@using AlpineSkiHouse.Models.ManageViewModels +@using Microsoft.AspNetCore.Identity +@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers +@addTagHelper *, AlpineSkiHouse.Web +@inject Microsoft.ApplicationInsights.Extensibility.TelemetryConfiguration TelemetryConfiguration diff --git a/src/AlpineSkiHouse.Web/Areas/Admin/Views/_ViewStart.cshtml b/src/AlpineSkiHouse.Web/Areas/Admin/Views/_ViewStart.cshtml new file mode 100644 index 0000000..a5f1004 --- /dev/null +++ b/src/AlpineSkiHouse.Web/Areas/Admin/Views/_ViewStart.cshtml @@ -0,0 +1,3 @@ +@{ + Layout = "_Layout"; +} diff --git a/src/AlpineSkiHouse.Web/Scripts/Pages/Admin/userList.js b/src/AlpineSkiHouse.Web/Scripts/Pages/Admin/userList.js new file mode 100644 index 0000000..79f6098 --- /dev/null +++ b/src/AlpineSkiHouse.Web/Scripts/Pages/Admin/userList.js @@ -0,0 +1,88 @@ +System.register(['react', 'react-dom'], function(exports_1, context_1) { + "use strict"; + var __moduleName = context_1 && context_1.id; + var __extends = (this && this.__extends) || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; + var react_1, react_dom_1; + var LockoutControl, UserRow, App; + return { + setters:[ + function (react_1_1) { + react_1 = react_1_1; + }, + function (react_dom_1_1) { + react_dom_1 = react_dom_1_1; + }], + execute: function() { + LockoutControl = (function (_super) { + __extends(LockoutControl, _super); + function LockoutControl() { + _super.apply(this, arguments); + } + LockoutControl.prototype.render = function () { + var _this = this; + if (this.props.lockoutEnabled === null) { + return react_1["default"].createElement("td", null, + "Locked out ", + react_1["default"].createElement("button", {onClick: function (e) { return _this.unlock(e); }}, "Unlock")); + } + else { + return react_1["default"].createElement("td", null, + "Not locked out ", + react_1["default"].createElement("button", {onClick: function (e) { return _this.lockout(e); }}, "Lockout")); + } + }; + LockoutControl.prototype.lockout = function (event) { + fetch("/Admin/api/Users/Lock/" + this.props.user.id, { method: "PUT", credentials: "include" }); + }; + LockoutControl.prototype.unlock = function (event) { + fetch("/Admin/api/Users/Unlock/" + this.props.user.id, { method: "PUT", credentials: "include" }); + }; + return LockoutControl; + }(react_1.Component)); + UserRow = (function (_super) { + __extends(UserRow, _super); + function UserRow() { + _super.apply(this, arguments); + } + UserRow.prototype.render = function () { + return react_1["default"].createElement("tr", {key: this.props.user.Id}, + react_1["default"].createElement("td", null, this.props.user.id), + react_1["default"].createElement("td", null, this.props.user.firstName), + react_1["default"].createElement("td", null, this.props.user.lastName), + react_1["default"].createElement(LockoutControl, {user: this.props.user})); + }; + return UserRow; + }(react_1.Component)); + App = (function (_super) { + __extends(App, _super); + function App() { + var _this = this; + _super.call(this); + this.state = { users: [] }; + fetch("/Admin/api/Users", { credentials: "include" }).then(function (r) { return r.json(); }).then(function (users) { return _this.setState({ users: users }); }); + } + App.prototype.render = function () { + return (react_1["default"].createElement("div", null, + react_1["default"].createElement("h1", null, "Admin Portal"), + react_1["default"].createElement("table", null, + react_1["default"].createElement("thead", null, + react_1["default"].createElement("tr", null, + react_1["default"].createElement("th", null, "ID"), + react_1["default"].createElement("th", null, "First Name"), + react_1["default"].createElement("th", null, "Last Name"), + react_1["default"].createElement("th", null, "Lockout Expiry")) + ), + react_1["default"].createElement("tbody", null, this.state.users.map(function (item) { + return react_1["default"].createElement(UserRow, {user: item, key: item.id}); + }))))); + }; + return App; + }(react_1.Component)); + react_dom_1.render(react_1["default"].createElement(App, null), document.getElementById('app')); + } + } +}); diff --git a/src/AlpineSkiHouse.Web/Scripts/Pages/Admin/userList.tsx b/src/AlpineSkiHouse.Web/Scripts/Pages/Admin/userList.tsx new file mode 100644 index 0000000..3738d7a --- /dev/null +++ b/src/AlpineSkiHouse.Web/Scripts/Pages/Admin/userList.tsx @@ -0,0 +1,97 @@ +// A '.tsx' file enables JSX support in the TypeScript compiler, +// for more information see the following page on the TypeScript wiki: +// https://github.com/Microsoft/TypeScript/wiki/JSX + +/// + +import React, { Component } from 'react'; +import { render } from 'react-dom'; + +declare var fetch: any; + +class LockoutControl extends Component{ + render() { + if (this.props.user.lockoutEnabled) { + return + + Locked out + + + + + + } + else { + return + + Not locked out + + + + + + } + } + lockout(event) { + fetch("/Admin/api/Users/Lock/" + this.props.user.id, { method: "PUT", credentials: "include" }) + .then(() => this.props.onInvalidate()); + } + unlock(event) { + fetch("/Admin/api/Users/Unlock/" + this.props.user.id, { method: "PUT", credentials: "include" }) + .then(() => this.props.onInvalidate()); + + } +} + +class UserRow extends Component{ + render() { + return + {this.props.user.id} + {this.props.user.firstName} + {this.props.user.lastName} + this.props.onInvalidate()}/> + + } +} + +class App extends Component { + constructor() { + super(); + this.state = { users: [] }; + this.getUsers(); + } + getUsers() { + fetch("/Admin/api/Users", { credentials: "include" }) + .then((r) => r.json()) + .then((users) => this.setState({ users: users })); + } + render() { + return ( +
+

Admin Portal

+ + + + + + + + + + + {this.state.users.map((item) => { + return this.getUsers()} />; + })} + +
IDFirst NameLast NameIs Locked
+
+ ); + } +} + + +render( + , + document.getElementById('app') +); + diff --git a/src/AlpineSkiHouse.Web/Scripts/jspmconfig.js b/src/AlpineSkiHouse.Web/Scripts/jspmconfig.js index 1222297..f93a9f0 100644 --- a/src/AlpineSkiHouse.Web/Scripts/jspmconfig.js +++ b/src/AlpineSkiHouse.Web/Scripts/jspmconfig.js @@ -21,6 +21,8 @@ System.config({ "jquery": "npm:jquery@3.1.1", "jquery-validation": "github:jzaefferer/jquery-validation@1.15.1", "jquery-validation-unobtrusive": "github:aspnet/jquery-validation-unobtrusive@3.2.6", + "react": "npm:react@15.4.1", + "react-dom": "npm:react-dom@15.4.1", "twbs/bootstrap": "github:twbs/bootstrap@4.0.0-alpha", "github:aspnet/jquery-validation-unobtrusive@3.2.6": { "jquery-validation": "github:jzaefferer/jquery-validation@1.15.1" @@ -31,24 +33,57 @@ System.config({ "github:jspm/nodelibs-buffer@0.1.0": { "buffer": "npm:buffer@3.6.0" }, + "github:jspm/nodelibs-domain@0.1.0": { + "domain-browser": "npm:domain-browser@1.1.7" + }, + "github:jspm/nodelibs-events@0.1.1": { + "events": "npm:events@1.0.2" + }, + "github:jspm/nodelibs-http@1.7.1": { + "Base64": "npm:Base64@0.2.1", + "events": "github:jspm/nodelibs-events@0.1.1", + "inherits": "npm:inherits@2.0.1", + "stream": "github:jspm/nodelibs-stream@0.1.0", + "url": "github:jspm/nodelibs-url@0.1.0", + "util": "github:jspm/nodelibs-util@0.1.0" + }, + "github:jspm/nodelibs-https@0.1.0": { + "https-browserify": "npm:https-browserify@0.0.0" + }, "github:jspm/nodelibs-path@0.1.0": { "path-browserify": "npm:path-browserify@0.0.0" }, "github:jspm/nodelibs-process@0.1.2": { "process": "npm:process@0.11.9" }, + "github:jspm/nodelibs-stream@0.1.0": { + "stream-browserify": "npm:stream-browserify@1.0.0" + }, + "github:jspm/nodelibs-string_decoder@0.1.0": { + "string_decoder": "npm:string_decoder@0.10.31" + }, + "github:jspm/nodelibs-url@0.1.0": { + "url": "npm:url@0.10.3" + }, "github:jspm/nodelibs-util@0.1.0": { "util": "npm:util@0.10.3" }, "github:jspm/nodelibs-vm@0.1.0": { "vm-browserify": "npm:vm-browserify@0.0.4" }, + "github:jspm/nodelibs-zlib@0.1.0": { + "browserify-zlib": "npm:browserify-zlib@0.1.4" + }, "github:jzaefferer/jquery-validation@1.15.1": { "jquery": "npm:jquery@3.1.1" }, "github:twbs/bootstrap@4.0.0-alpha": { "jquery": "github:components/jquery@3.1.1" }, + "npm:asap@2.0.5": { + "domain": "github:jspm/nodelibs-domain@0.1.0", + "process": "github:jspm/nodelibs-process@0.1.2" + }, "npm:assert@1.4.1": { "assert": "github:jspm/nodelibs-assert@0.1.0", "buffer": "github:jspm/nodelibs-buffer@0.1.0", @@ -58,11 +93,22 @@ System.config({ "npm:babel-runtime@5.8.38": { "process": "github:jspm/nodelibs-process@0.1.2" }, + "npm:browserify-zlib@0.1.4": { + "assert": "github:jspm/nodelibs-assert@0.1.0", + "buffer": "github:jspm/nodelibs-buffer@0.1.0", + "pako": "npm:pako@0.2.9", + "process": "github:jspm/nodelibs-process@0.1.2", + "readable-stream": "npm:readable-stream@2.2.2", + "util": "github:jspm/nodelibs-util@0.1.0" + }, + "npm:buffer-shims@1.0.0": { + "buffer": "github:jspm/nodelibs-buffer@0.1.0" + }, "npm:buffer@3.6.0": { "base64-js": "npm:base64-js@0.0.8", "child_process": "github:jspm/nodelibs-child_process@0.1.0", "fs": "github:jspm/nodelibs-fs@0.1.2", - "ieee754": "npm:ieee754@1.1.6", + "ieee754": "npm:ieee754@1.1.8", "isarray": "npm:isarray@1.0.0", "process": "github:jspm/nodelibs-process@0.1.2" }, @@ -72,17 +118,137 @@ System.config({ "process": "github:jspm/nodelibs-process@0.1.2", "systemjs-json": "github:systemjs/plugin-json@0.1.2" }, + "npm:core-util-is@1.0.2": { + "buffer": "github:jspm/nodelibs-buffer@0.1.0" + }, + "npm:domain-browser@1.1.7": { + "events": "github:jspm/nodelibs-events@0.1.1" + }, + "npm:encoding@0.1.12": { + "buffer": "github:jspm/nodelibs-buffer@0.1.0", + "iconv-lite": "npm:iconv-lite@0.4.15" + }, + "npm:fbjs@0.8.6": { + "core-js": "npm:core-js@1.2.7", + "isomorphic-fetch": "npm:isomorphic-fetch@2.2.1", + "loose-envify": "npm:loose-envify@1.3.0", + "object-assign": "npm:object-assign@4.1.0", + "process": "github:jspm/nodelibs-process@0.1.2", + "promise": "npm:promise@7.1.1", + "ua-parser-js": "npm:ua-parser-js@0.7.12" + }, + "npm:https-browserify@0.0.0": { + "http": "github:jspm/nodelibs-http@1.7.1" + }, + "npm:iconv-lite@0.4.15": { + "buffer": "github:jspm/nodelibs-buffer@0.1.0", + "process": "github:jspm/nodelibs-process@0.1.2", + "stream": "github:jspm/nodelibs-stream@0.1.0", + "string_decoder": "github:jspm/nodelibs-string_decoder@0.1.0", + "systemjs-json": "github:systemjs/plugin-json@0.1.2" + }, "npm:inherits@2.0.1": { "util": "github:jspm/nodelibs-util@0.1.0" }, + "npm:isomorphic-fetch@2.2.1": { + "node-fetch": "npm:node-fetch@1.6.3", + "whatwg-fetch": "npm:whatwg-fetch@2.0.1" + }, + "npm:loose-envify@1.3.0": { + "fs": "github:jspm/nodelibs-fs@0.1.2", + "js-tokens": "npm:js-tokens@2.0.0", + "process": "github:jspm/nodelibs-process@0.1.2", + "stream": "github:jspm/nodelibs-stream@0.1.0", + "util": "github:jspm/nodelibs-util@0.1.0" + }, + "npm:node-fetch@1.6.3": { + "buffer": "github:jspm/nodelibs-buffer@0.1.0", + "encoding": "npm:encoding@0.1.12", + "http": "github:jspm/nodelibs-http@1.7.1", + "https": "github:jspm/nodelibs-https@0.1.0", + "is-stream": "npm:is-stream@1.1.0", + "stream": "github:jspm/nodelibs-stream@0.1.0", + "url": "github:jspm/nodelibs-url@0.1.0", + "util": "github:jspm/nodelibs-util@0.1.0", + "zlib": "github:jspm/nodelibs-zlib@0.1.0" + }, + "npm:pako@0.2.9": { + "buffer": "github:jspm/nodelibs-buffer@0.1.0", + "process": "github:jspm/nodelibs-process@0.1.2" + }, "npm:path-browserify@0.0.0": { "process": "github:jspm/nodelibs-process@0.1.2" }, + "npm:process-nextick-args@1.0.7": { + "process": "github:jspm/nodelibs-process@0.1.2" + }, "npm:process@0.11.9": { "assert": "github:jspm/nodelibs-assert@0.1.0", "fs": "github:jspm/nodelibs-fs@0.1.2", "vm": "github:jspm/nodelibs-vm@0.1.0" }, + "npm:promise@7.1.1": { + "asap": "npm:asap@2.0.5", + "fs": "github:jspm/nodelibs-fs@0.1.2" + }, + "npm:punycode@1.3.2": { + "process": "github:jspm/nodelibs-process@0.1.2" + }, + "npm:react-dom@15.4.1": { + "fbjs": "npm:fbjs@0.8.6", + "loose-envify": "npm:loose-envify@1.3.0", + "object-assign": "npm:object-assign@4.1.0", + "process": "github:jspm/nodelibs-process@0.1.2", + "react": "npm:react@15.4.1" + }, + "npm:react@15.4.1": { + "fbjs": "npm:fbjs@0.8.6", + "loose-envify": "npm:loose-envify@1.3.0", + "object-assign": "npm:object-assign@4.1.0", + "process": "github:jspm/nodelibs-process@0.1.2" + }, + "npm:readable-stream@1.1.14": { + "buffer": "github:jspm/nodelibs-buffer@0.1.0", + "core-util-is": "npm:core-util-is@1.0.2", + "events": "github:jspm/nodelibs-events@0.1.1", + "inherits": "npm:inherits@2.0.1", + "isarray": "npm:isarray@0.0.1", + "process": "github:jspm/nodelibs-process@0.1.2", + "stream-browserify": "npm:stream-browserify@1.0.0", + "string_decoder": "npm:string_decoder@0.10.31" + }, + "npm:readable-stream@2.2.2": { + "buffer": "github:jspm/nodelibs-buffer@0.1.0", + "buffer-shims": "npm:buffer-shims@1.0.0", + "core-util-is": "npm:core-util-is@1.0.2", + "events": "github:jspm/nodelibs-events@0.1.1", + "inherits": "npm:inherits@2.0.1", + "isarray": "npm:isarray@1.0.0", + "process": "github:jspm/nodelibs-process@0.1.2", + "process-nextick-args": "npm:process-nextick-args@1.0.7", + "string_decoder": "npm:string_decoder@0.10.31", + "util-deprecate": "npm:util-deprecate@1.0.2" + }, + "npm:stream-browserify@1.0.0": { + "events": "github:jspm/nodelibs-events@0.1.1", + "inherits": "npm:inherits@2.0.1", + "readable-stream": "npm:readable-stream@1.1.14" + }, + "npm:string_decoder@0.10.31": { + "buffer": "github:jspm/nodelibs-buffer@0.1.0" + }, + "npm:ua-parser-js@0.7.12": { + "systemjs-json": "github:systemjs/plugin-json@0.1.2" + }, + "npm:url@0.10.3": { + "assert": "github:jspm/nodelibs-assert@0.1.0", + "punycode": "npm:punycode@1.3.2", + "querystring": "npm:querystring@0.2.0", + "util": "github:jspm/nodelibs-util@0.1.0" + }, + "npm:util-deprecate@1.0.2": { + "util": "github:jspm/nodelibs-util@0.1.0" + }, "npm:util@0.10.3": { "inherits": "npm:inherits@2.0.1", "process": "github:jspm/nodelibs-process@0.1.2" diff --git a/src/AlpineSkiHouse.Web/Scripts/tsconfig.json b/src/AlpineSkiHouse.Web/Scripts/tsconfig.json index 5e36a65..911fa44 100644 --- a/src/AlpineSkiHouse.Web/Scripts/tsconfig.json +++ b/src/AlpineSkiHouse.Web/Scripts/tsconfig.json @@ -1,10 +1,16 @@ { "compilerOptions": { "module": "system", - "noImplicitAny": true, + "noImplicitAny": false, "removeComments": true, - "preserveConstEnums": true + "preserveConstEnums": true, + "jsx": "react", + "moduleResolution": "node", + "typeRoots": [ + "../node_modules/@types" + ] } + } \ No newline at end of file diff --git a/src/AlpineSkiHouse.Web/Startup.cs b/src/AlpineSkiHouse.Web/Startup.cs index 8adee62..431f15a 100644 --- a/src/AlpineSkiHouse.Web/Startup.cs +++ b/src/AlpineSkiHouse.Web/Startup.cs @@ -187,6 +187,10 @@ public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerF app.UseMvc(routes => { + routes.MapRoute(name: "areaRoute", + template: "{area:exists}/{controller=Home}/{action=Index}"); + + routes.MapRoute( name: "default", template: "{controller=Home}/{action=Index}/{id?}"); diff --git a/src/AlpineSkiHouse.Web/Views/Shared/_Layout.cshtml b/src/AlpineSkiHouse.Web/Views/Shared/_Layout.cshtml index 30bf416..940aa3c 100644 --- a/src/AlpineSkiHouse.Web/Views/Shared/_Layout.cshtml +++ b/src/AlpineSkiHouse.Web/Views/Shared/_Layout.cshtml @@ -57,12 +57,11 @@ asp-fallback-src="~/lib/jquery/dist/jquery.min.js" asp-fallback-test="window.jQuery"> - + -