├── .gitignore ├── Directory.Build.props ├── LICENSE ├── README.md ├── THIRD-PARTY-NOTICES.md ├── docs ├── 00-get-started.md ├── 01-components-and-layout.md ├── 02-customize-a-pizza.md ├── 03-show-order-status.md ├── 04-refactor-state-management.md ├── 05-checkout-with-validation.md ├── 06-authentication-and-authorization.md ├── 07-javascript-interop.md ├── 08-templated-components.md ├── 09-progressive-web-app.md └── 10-publish-and-deploy.md ├── global.json ├── notes ├── outline.md └── speaker-notes.md ├── save-points ├── 00-get-started │ ├── BlazingPizza.Client │ │ ├── App.razor │ │ ├── BlazingPizza.Client.csproj │ │ ├── Pages │ │ │ └── Index.razor │ │ ├── Program.cs │ │ ├── Shared │ │ │ └── MainLayout.razor │ │ ├── _Imports.razor │ │ └── wwwroot │ │ │ ├── css │ │ │ ├── bootstrap │ │ │ │ ├── bootstrap.min.css │ │ │ │ └── bootstrap.min.css.map │ │ │ ├── font │ │ │ │ ├── quicksand-v8-latin-300.woff │ │ │ │ ├── quicksand-v8-latin-300.woff2 │ │ │ │ ├── quicksand-v8-latin-500.woff │ │ │ │ ├── quicksand-v8-latin-500.woff2 │ │ │ │ ├── quicksand-v8-latin-700.woff │ │ │ │ ├── quicksand-v8-latin-700.woff2 │ │ │ │ ├── quicksand-v8-latin-regular.woff │ │ │ │ ├── quicksand-v8-latin-regular.woff2 │ │ │ │ └── quicksand.css │ │ │ └── site.css │ │ │ ├── img │ │ │ ├── bike.svg │ │ │ ├── icon-512.png │ │ │ ├── logo.svg │ │ │ ├── pizza-slice.svg │ │ │ ├── pizzas │ │ │ │ ├── bacon.jpg │ │ │ │ ├── brit.jpg │ │ │ │ ├── cheese.jpg │ │ │ │ ├── margherita.jpg │ │ │ │ ├── meaty.jpg │ │ │ │ ├── mushroom.jpg │ │ │ │ ├── pepperoni.jpg │ │ │ │ └── salad.jpg │ │ │ └── user.svg │ │ │ └── index.html │ ├── BlazingPizza.ComponentsLibrary │ │ ├── BlazingPizza.ComponentsLibrary.csproj │ │ ├── LocalStorage.cs │ │ ├── Map │ │ │ └── Map.razor │ │ ├── _Imports.razor │ │ └── wwwroot │ │ │ ├── deliveryMap.js │ │ │ ├── leaflet │ │ │ ├── images │ │ │ │ ├── layers-2x.png │ │ │ │ ├── layers.png │ │ │ │ ├── marker-icon-2x.png │ │ │ │ ├── marker-icon.png │ │ │ │ └── marker-shadow.png │ │ │ ├── leaflet.css │ │ │ └── leaflet.js │ │ │ ├── localStorage.js │ │ │ └── pushNotifications.js │ ├── BlazingPizza.Server │ │ ├── Areas │ │ │ └── Identity │ │ │ │ └── Pages │ │ │ │ ├── Shared │ │ │ │ └── _LoginPartial.cshtml │ │ │ │ └── _Layout.cshtml │ │ ├── BlazingPizza.Server.csproj │ │ ├── NotificationsController.cs │ │ ├── OidcConfigurationController.cs │ │ ├── OrdersController.cs │ │ ├── PizzaStoreContext.cs │ │ ├── PizzaStoreUser.cs │ │ ├── PizzasController.cs │ │ ├── Program.cs │ │ ├── Properties │ │ │ └── launchSettings.json │ │ ├── SeedData.cs │ │ ├── SpecialsController.cs │ │ ├── Startup.cs │ │ ├── ToppingsController.cs │ │ ├── appsettings.Development.json │ │ └── appsettings.json │ ├── BlazingPizza.Shared │ │ ├── Address.cs │ │ ├── BlazingPizza.Shared.csproj │ │ ├── LatLong.cs │ │ ├── Maps │ │ │ ├── Marker.cs │ │ │ └── Point.cs │ │ ├── NotificationSubscription.cs │ │ ├── Order.cs │ │ ├── OrderWithStatus.cs │ │ ├── Pizza.cs │ │ ├── PizzaSpecial.cs │ │ ├── PizzaTopping.cs │ │ ├── Services │ │ │ ├── IPizzaApi.cs │ │ │ └── PizzaApi.cs │ │ ├── Topping.cs │ │ └── UserInfo.cs │ ├── BlazingPizza.Tests │ │ ├── BlazingPizza.Tests.csproj │ │ ├── FakePizzaApi.cs │ │ ├── Helpers │ │ │ ├── PizzaApiExtensions.cs │ │ │ └── TestContextExtensions.cs │ │ ├── LoadingForeverPizzaApi.cs │ │ └── _Imports.razor │ └── BlazingPizza.sln ├── 01-Components-and-layout │ ├── BlazingPizza.Client │ │ ├── App.razor │ │ ├── BlazingPizza.Client.csproj │ │ ├── Pages │ │ │ └── Index.razor │ │ ├── Program.cs │ │ ├── Shared │ │ │ └── MainLayout.razor │ │ ├── _Imports.razor │ │ └── wwwroot │ │ │ ├── css │ │ │ ├── bootstrap │ │ │ │ ├── bootstrap.min.css │ │ │ │ └── bootstrap.min.css.map │ │ │ ├── font │ │ │ │ ├── quicksand-v8-latin-300.woff │ │ │ │ ├── quicksand-v8-latin-300.woff2 │ │ │ │ ├── quicksand-v8-latin-500.woff │ │ │ │ ├── quicksand-v8-latin-500.woff2 │ │ │ │ ├── quicksand-v8-latin-700.woff │ │ │ │ ├── quicksand-v8-latin-700.woff2 │ │ │ │ ├── quicksand-v8-latin-regular.woff │ │ │ │ ├── quicksand-v8-latin-regular.woff2 │ │ │ │ └── quicksand.css │ │ │ └── site.css │ │ │ ├── img │ │ │ ├── bike.svg │ │ │ ├── icon-512.png │ │ │ ├── logo.svg │ │ │ ├── pizza-slice.svg │ │ │ ├── pizzas │ │ │ │ ├── bacon.jpg │ │ │ │ ├── brit.jpg │ │ │ │ ├── cheese.jpg │ │ │ │ ├── margherita.jpg │ │ │ │ ├── meaty.jpg │ │ │ │ ├── mushroom.jpg │ │ │ │ ├── pepperoni.jpg │ │ │ │ └── salad.jpg │ │ │ └── user.svg │ │ │ └── index.html │ ├── BlazingPizza.ComponentsLibrary │ │ ├── BlazingPizza.ComponentsLibrary.csproj │ │ ├── LocalStorage.cs │ │ ├── Map │ │ │ ├── Map.razor │ │ │ ├── Marker.cs │ │ │ └── Point.cs │ │ ├── PizzaCard.razor │ │ ├── _Imports.razor │ │ └── wwwroot │ │ │ ├── deliveryMap.js │ │ │ ├── leaflet │ │ │ ├── images │ │ │ │ ├── layers-2x.png │ │ │ │ ├── layers.png │ │ │ │ ├── marker-icon-2x.png │ │ │ │ ├── marker-icon.png │ │ │ │ └── marker-shadow.png │ │ │ ├── leaflet.css │ │ │ └── leaflet.js │ │ │ ├── localStorage.js │ │ │ └── pushNotifications.js │ ├── BlazingPizza.Server │ │ ├── Areas │ │ │ └── Identity │ │ │ │ └── Pages │ │ │ │ ├── Shared │ │ │ │ └── _LoginPartial.cshtml │ │ │ │ └── _Layout.cshtml │ │ ├── BlazingPizza.Server.csproj │ │ ├── NotificationsController.cs │ │ ├── OidcConfigurationController.cs │ │ ├── OrdersController.cs │ │ ├── PizzaStoreContext.cs │ │ ├── PizzaStoreUser.cs │ │ ├── PizzasController.cs │ │ ├── Program.cs │ │ ├── Properties │ │ │ └── launchSettings.json │ │ ├── SeedData.cs │ │ ├── SpecialsController.cs │ │ ├── Startup.cs │ │ ├── ToppingsController.cs │ │ ├── appsettings.Development.json │ │ └── appsettings.json │ ├── BlazingPizza.Shared │ │ ├── Address.cs │ │ ├── BlazingPizza.Shared.csproj │ │ ├── LatLong.cs │ │ ├── Maps │ │ │ ├── Marker.cs │ │ │ └── Point.cs │ │ ├── NotificationSubscription.cs │ │ ├── Order.cs │ │ ├── OrderWithStatus.cs │ │ ├── Pizza.cs │ │ ├── PizzaSpecial.cs │ │ ├── PizzaTopping.cs │ │ ├── Services │ │ │ ├── IPizzaApi.cs │ │ │ └── PizzaApi.cs │ │ ├── Topping.cs │ │ └── UserInfo.cs │ ├── BlazingPizza.Tests │ │ ├── BlazingPizza.Tests.csproj │ │ ├── Client │ │ │ └── Pages │ │ │ │ └── IndexTests.razor │ │ ├── ComponentLibrary │ │ │ └── PizzaCardTests.razor │ │ ├── FakePizzaApi.cs │ │ ├── Helpers │ │ │ ├── PizzaApiExtensions.cs │ │ │ └── TestContextExtensions.cs │ │ ├── LoadingForeverPizzaApi.cs │ │ └── _Imports.razor │ └── BlazingPizza.sln ├── 02-customize-a-pizza │ ├── BlazingPizza.Client │ │ ├── App.razor │ │ ├── BlazingPizza.Client.csproj │ │ ├── Pages │ │ │ ├── Index.razor │ │ │ └── Index.razor.cs │ │ ├── Program.cs │ │ ├── Shared │ │ │ └── MainLayout.razor │ │ ├── _Imports.razor │ │ └── wwwroot │ │ │ ├── css │ │ │ ├── bootstrap │ │ │ │ ├── bootstrap.min.css │ │ │ │ └── bootstrap.min.css.map │ │ │ ├── font │ │ │ │ ├── quicksand-v8-latin-300.woff │ │ │ │ ├── quicksand-v8-latin-300.woff2 │ │ │ │ ├── quicksand-v8-latin-500.woff │ │ │ │ ├── quicksand-v8-latin-500.woff2 │ │ │ │ ├── quicksand-v8-latin-700.woff │ │ │ │ ├── quicksand-v8-latin-700.woff2 │ │ │ │ ├── quicksand-v8-latin-regular.woff │ │ │ │ ├── quicksand-v8-latin-regular.woff2 │ │ │ │ └── quicksand.css │ │ │ └── site.css │ │ │ ├── img │ │ │ ├── bike.svg │ │ │ ├── icon-512.png │ │ │ ├── logo.svg │ │ │ ├── pizza-slice.svg │ │ │ ├── pizzas │ │ │ │ ├── bacon.jpg │ │ │ │ ├── brit.jpg │ │ │ │ ├── cheese.jpg │ │ │ │ ├── margherita.jpg │ │ │ │ ├── meaty.jpg │ │ │ │ ├── mushroom.jpg │ │ │ │ ├── pepperoni.jpg │ │ │ │ └── salad.jpg │ │ │ └── user.svg │ │ │ └── index.html │ ├── BlazingPizza.ComponentsLibrary │ │ ├── BlazingPizza.ComponentsLibrary.csproj │ │ ├── ConfigurePizzaDialog.razor │ │ ├── ConfigurePizzaDialog.razor.cs │ │ ├── ConfiguredPizzaItem.razor │ │ ├── LocalStorage.cs │ │ ├── Map │ │ │ └── Map.razor │ │ ├── OrderInformation.razor │ │ ├── PizzaCard.razor │ │ ├── _Imports.razor │ │ └── wwwroot │ │ │ ├── deliveryMap.js │ │ │ ├── leaflet │ │ │ ├── images │ │ │ │ ├── layers-2x.png │ │ │ │ ├── layers.png │ │ │ │ ├── marker-icon-2x.png │ │ │ │ ├── marker-icon.png │ │ │ │ └── marker-shadow.png │ │ │ ├── leaflet.css │ │ │ └── leaflet.js │ │ │ ├── localStorage.js │ │ │ └── pushNotifications.js │ ├── BlazingPizza.Server │ │ ├── Areas │ │ │ └── Identity │ │ │ │ └── Pages │ │ │ │ ├── Shared │ │ │ │ └── _LoginPartial.cshtml │ │ │ │ └── _Layout.cshtml │ │ ├── BlazingPizza.Server.csproj │ │ ├── NotificationsController.cs │ │ ├── OidcConfigurationController.cs │ │ ├── OrdersController.cs │ │ ├── PizzaStoreContext.cs │ │ ├── PizzaStoreUser.cs │ │ ├── PizzasController.cs │ │ ├── Program.cs │ │ ├── Properties │ │ │ └── launchSettings.json │ │ ├── SeedData.cs │ │ ├── SpecialsController.cs │ │ ├── Startup.cs │ │ ├── ToppingsController.cs │ │ ├── appsettings.Development.json │ │ └── appsettings.json │ ├── BlazingPizza.Shared │ │ ├── Address.cs │ │ ├── BlazingPizza.Shared.csproj │ │ ├── LatLong.cs │ │ ├── Maps │ │ │ ├── Marker.cs │ │ │ └── Point.cs │ │ ├── NotificationSubscription.cs │ │ ├── Order.cs │ │ ├── OrderWithStatus.cs │ │ ├── Pizza.cs │ │ ├── PizzaSpecial.cs │ │ ├── PizzaTopping.cs │ │ ├── Services │ │ │ ├── IPizzaApi.cs │ │ │ └── PizzaApi.cs │ │ ├── Topping.cs │ │ └── UserInfo.cs │ ├── BlazingPizza.Tests │ │ ├── BlazingPizza.Tests.csproj │ │ ├── Client │ │ │ └── Pages │ │ │ │ └── IndexTests.razor │ │ ├── ComponentLibrary │ │ │ ├── ConfigurePizzaDialogTests.razor │ │ │ ├── ConfiguredPizzaItemTests.razor │ │ │ ├── OrderInformationTests.razor │ │ │ └── PizzaCardTests.razor │ │ ├── FakePizzaApi.cs │ │ ├── Helpers │ │ │ ├── PizzaApiExtensions.cs │ │ │ └── TestContextExtensions.cs │ │ ├── LoadingForeverPizzaApi.cs │ │ └── _Imports.razor │ └── BlazingPizza.sln ├── 03-show-order-status │ ├── BlazingPizza.Client │ │ ├── App.razor │ │ ├── BlazingPizza.Client.csproj │ │ ├── Pages │ │ │ ├── Index.razor │ │ │ ├── Index.razor.cs │ │ │ ├── MyOrders.razor │ │ │ ├── OrderDetails.razor │ │ │ └── OrderDetails.razor.cs │ │ ├── Program.cs │ │ ├── Shared │ │ │ └── MainLayout.razor │ │ ├── _Imports.razor │ │ └── wwwroot │ │ │ ├── css │ │ │ ├── bootstrap │ │ │ │ ├── bootstrap.min.css │ │ │ │ └── bootstrap.min.css.map │ │ │ ├── font │ │ │ │ ├── quicksand-v8-latin-300.woff │ │ │ │ ├── quicksand-v8-latin-300.woff2 │ │ │ │ ├── quicksand-v8-latin-500.woff │ │ │ │ ├── quicksand-v8-latin-500.woff2 │ │ │ │ ├── quicksand-v8-latin-700.woff │ │ │ │ ├── quicksand-v8-latin-700.woff2 │ │ │ │ ├── quicksand-v8-latin-regular.woff │ │ │ │ ├── quicksand-v8-latin-regular.woff2 │ │ │ │ └── quicksand.css │ │ │ └── site.css │ │ │ ├── img │ │ │ ├── bike.svg │ │ │ ├── icon-512.png │ │ │ ├── logo.svg │ │ │ ├── pizza-slice.svg │ │ │ ├── pizzas │ │ │ │ ├── bacon.jpg │ │ │ │ ├── brit.jpg │ │ │ │ ├── cheese.jpg │ │ │ │ ├── margherita.jpg │ │ │ │ ├── meaty.jpg │ │ │ │ ├── mushroom.jpg │ │ │ │ ├── pepperoni.jpg │ │ │ │ └── salad.jpg │ │ │ └── user.svg │ │ │ └── index.html │ ├── BlazingPizza.ComponentsLibrary │ │ ├── BlazingPizza.ComponentsLibrary.csproj │ │ ├── ConfigurePizzaDialog.razor │ │ ├── ConfigurePizzaDialog.razor.cs │ │ ├── ConfiguredPizzaItem.razor │ │ ├── LocalStorage.cs │ │ ├── Map │ │ │ └── Map.razor │ │ ├── OrderInformation.razor │ │ ├── OrderReview.razor │ │ ├── OrdersTable.razor │ │ ├── PizzaCard.razor │ │ ├── _Imports.razor │ │ └── wwwroot │ │ │ ├── deliveryMap.js │ │ │ ├── leaflet │ │ │ ├── images │ │ │ │ ├── layers-2x.png │ │ │ │ ├── layers.png │ │ │ │ ├── marker-icon-2x.png │ │ │ │ ├── marker-icon.png │ │ │ │ └── marker-shadow.png │ │ │ ├── leaflet.css │ │ │ └── leaflet.js │ │ │ ├── localStorage.js │ │ │ └── pushNotifications.js │ ├── BlazingPizza.Server │ │ ├── Areas │ │ │ └── Identity │ │ │ │ └── Pages │ │ │ │ ├── Shared │ │ │ │ └── _LoginPartial.cshtml │ │ │ │ └── _Layout.cshtml │ │ ├── BlazingPizza.Server.csproj │ │ ├── NotificationsController.cs │ │ ├── OidcConfigurationController.cs │ │ ├── OrdersController.cs │ │ ├── PizzaStoreContext.cs │ │ ├── PizzaStoreUser.cs │ │ ├── PizzasController.cs │ │ ├── Program.cs │ │ ├── Properties │ │ │ └── launchSettings.json │ │ ├── SeedData.cs │ │ ├── SpecialsController.cs │ │ ├── Startup.cs │ │ ├── ToppingsController.cs │ │ ├── appsettings.Development.json │ │ └── appsettings.json │ ├── BlazingPizza.Shared │ │ ├── Address.cs │ │ ├── BlazingPizza.Shared.csproj │ │ ├── LatLong.cs │ │ ├── Maps │ │ │ ├── Marker.cs │ │ │ └── Point.cs │ │ ├── NotificationSubscription.cs │ │ ├── Order.cs │ │ ├── OrderWithStatus.cs │ │ ├── Pizza.cs │ │ ├── PizzaSpecial.cs │ │ ├── PizzaTopping.cs │ │ ├── Services │ │ │ ├── IPizzaApi.cs │ │ │ └── PizzaApi.cs │ │ ├── Topping.cs │ │ └── UserInfo.cs │ ├── BlazingPizza.Tests │ │ ├── BlazingPizza.Tests.csproj │ │ ├── Client │ │ │ ├── Pages │ │ │ │ ├── IndexTests.razor │ │ │ │ ├── MyOrdersTests.razor │ │ │ │ └── OrderDetailsTests.razor │ │ │ └── Shared │ │ │ │ └── MainLayoutTests.razor │ │ ├── ComponentLibrary │ │ │ ├── ConfigurePizzaDialogTests.razor │ │ │ ├── ConfiguredPizzaItemTests.razor │ │ │ ├── OrderInformationTests.razor │ │ │ ├── OrderReviewTests.razor │ │ │ ├── OrdersTableTests.razor │ │ │ └── PizzaCardTests.razor │ │ ├── FakePizzaApi.cs │ │ ├── Helpers │ │ │ ├── PizzaApiExtensions.cs │ │ │ └── TestContextExtensions.cs │ │ ├── LoadingForeverPizzaApi.cs │ │ └── _Imports.razor │ └── BlazingPizza.sln ├── 04-refactor-state-management │ ├── BlazingPizza.Client │ │ ├── App.razor │ │ ├── BlazingPizza.Client.csproj │ │ ├── OrderState.cs │ │ ├── Pages │ │ │ ├── Index.razor │ │ │ ├── Index.razor.cs │ │ │ ├── MyOrders.razor │ │ │ ├── OrderDetails.razor │ │ │ └── OrderDetails.razor.cs │ │ ├── Program.cs │ │ ├── Shared │ │ │ └── MainLayout.razor │ │ ├── _Imports.razor │ │ └── wwwroot │ │ │ ├── css │ │ │ ├── bootstrap │ │ │ │ ├── bootstrap.min.css │ │ │ │ └── bootstrap.min.css.map │ │ │ ├── font │ │ │ │ ├── quicksand-v8-latin-300.woff │ │ │ │ ├── quicksand-v8-latin-300.woff2 │ │ │ │ ├── quicksand-v8-latin-500.woff │ │ │ │ ├── quicksand-v8-latin-500.woff2 │ │ │ │ ├── quicksand-v8-latin-700.woff │ │ │ │ ├── quicksand-v8-latin-700.woff2 │ │ │ │ ├── quicksand-v8-latin-regular.woff │ │ │ │ ├── quicksand-v8-latin-regular.woff2 │ │ │ │ └── quicksand.css │ │ │ └── site.css │ │ │ ├── img │ │ │ ├── bike.svg │ │ │ ├── icon-512.png │ │ │ ├── logo.svg │ │ │ ├── pizza-slice.svg │ │ │ ├── pizzas │ │ │ │ ├── bacon.jpg │ │ │ │ ├── brit.jpg │ │ │ │ ├── cheese.jpg │ │ │ │ ├── margherita.jpg │ │ │ │ ├── meaty.jpg │ │ │ │ ├── mushroom.jpg │ │ │ │ ├── pepperoni.jpg │ │ │ │ └── salad.jpg │ │ │ └── user.svg │ │ │ └── index.html │ ├── BlazingPizza.ComponentsLibrary │ │ ├── BlazingPizza.ComponentsLibrary.csproj │ │ ├── ConfigurePizzaDialog.razor │ │ ├── ConfigurePizzaDialog.razor.cs │ │ ├── ConfiguredPizzaItem.razor │ │ ├── LocalStorage.cs │ │ ├── Map │ │ │ └── Map.razor │ │ ├── OrderInformation.razor │ │ ├── OrderReview.razor │ │ ├── OrdersTable.razor │ │ ├── PizzaCard.razor │ │ ├── _Imports.razor │ │ └── wwwroot │ │ │ ├── deliveryMap.js │ │ │ ├── leaflet │ │ │ ├── images │ │ │ │ ├── layers-2x.png │ │ │ │ ├── layers.png │ │ │ │ ├── marker-icon-2x.png │ │ │ │ ├── marker-icon.png │ │ │ │ └── marker-shadow.png │ │ │ ├── leaflet.css │ │ │ └── leaflet.js │ │ │ ├── localStorage.js │ │ │ └── pushNotifications.js │ ├── BlazingPizza.Server │ │ ├── Areas │ │ │ └── Identity │ │ │ │ └── Pages │ │ │ │ ├── Shared │ │ │ │ └── _LoginPartial.cshtml │ │ │ │ └── _Layout.cshtml │ │ ├── BlazingPizza.Server.csproj │ │ ├── NotificationsController.cs │ │ ├── OidcConfigurationController.cs │ │ ├── OrdersController.cs │ │ ├── PizzaStoreContext.cs │ │ ├── PizzaStoreUser.cs │ │ ├── PizzasController.cs │ │ ├── Program.cs │ │ ├── Properties │ │ │ └── launchSettings.json │ │ ├── SeedData.cs │ │ ├── SpecialsController.cs │ │ ├── Startup.cs │ │ ├── ToppingsController.cs │ │ ├── appsettings.Development.json │ │ └── appsettings.json │ ├── BlazingPizza.Shared │ │ ├── Address.cs │ │ ├── BlazingPizza.Shared.csproj │ │ ├── LatLong.cs │ │ ├── Maps │ │ │ ├── Marker.cs │ │ │ └── Point.cs │ │ ├── NotificationSubscription.cs │ │ ├── Order.cs │ │ ├── OrderWithStatus.cs │ │ ├── Pizza.cs │ │ ├── PizzaSpecial.cs │ │ ├── PizzaTopping.cs │ │ ├── Services │ │ │ ├── IPizzaApi.cs │ │ │ └── PizzaApi.cs │ │ ├── Topping.cs │ │ └── UserInfo.cs │ ├── BlazingPizza.Tests │ │ ├── BlazingPizza.Tests.csproj │ │ ├── Client │ │ │ ├── Pages │ │ │ │ ├── IndexTests.razor │ │ │ │ ├── MyOrdersTests.razor │ │ │ │ └── OrderDetailsTests.razor │ │ │ └── Shared │ │ │ │ └── MainLayoutTests.razor │ │ ├── ComponentLibrary │ │ │ ├── ConfigurePizzaDialogTests.razor │ │ │ ├── ConfiguredPizzaItemTests.razor │ │ │ ├── OrderInformationTests.razor │ │ │ ├── OrderReviewTests.razor │ │ │ ├── OrdersTableTests.razor │ │ │ └── PizzaCardTests.razor │ │ ├── FakePizzaApi.cs │ │ ├── Helpers │ │ │ ├── PizzaApiExtensions.cs │ │ │ └── TestContextExtensions.cs │ │ ├── LoadingForeverPizzaApi.cs │ │ └── _Imports.razor │ └── BlazingPizza.sln ├── 05-checkout-with-validation │ ├── BlazingPizza.Client │ │ ├── App.razor │ │ ├── BlazingPizza.Client.csproj │ │ ├── OrderState.cs │ │ ├── Pages │ │ │ ├── Checkout.razor │ │ │ ├── Checkout.razor.cs │ │ │ ├── Index.razor │ │ │ ├── Index.razor.cs │ │ │ ├── MyOrders.razor │ │ │ ├── OrderDetails.razor │ │ │ └── OrderDetails.razor.cs │ │ ├── Program.cs │ │ ├── Shared │ │ │ └── MainLayout.razor │ │ ├── _Imports.razor │ │ └── wwwroot │ │ │ ├── css │ │ │ ├── bootstrap │ │ │ │ ├── bootstrap.min.css │ │ │ │ └── bootstrap.min.css.map │ │ │ ├── font │ │ │ │ ├── quicksand-v8-latin-300.woff │ │ │ │ ├── quicksand-v8-latin-300.woff2 │ │ │ │ ├── quicksand-v8-latin-500.woff │ │ │ │ ├── quicksand-v8-latin-500.woff2 │ │ │ │ ├── quicksand-v8-latin-700.woff │ │ │ │ ├── quicksand-v8-latin-700.woff2 │ │ │ │ ├── quicksand-v8-latin-regular.woff │ │ │ │ ├── quicksand-v8-latin-regular.woff2 │ │ │ │ └── quicksand.css │ │ │ └── site.css │ │ │ ├── img │ │ │ ├── bike.svg │ │ │ ├── icon-512.png │ │ │ ├── logo.svg │ │ │ ├── pizza-slice.svg │ │ │ ├── pizzas │ │ │ │ ├── bacon.jpg │ │ │ │ ├── brit.jpg │ │ │ │ ├── cheese.jpg │ │ │ │ ├── margherita.jpg │ │ │ │ ├── meaty.jpg │ │ │ │ ├── mushroom.jpg │ │ │ │ ├── pepperoni.jpg │ │ │ │ └── salad.jpg │ │ │ └── user.svg │ │ │ └── index.html │ ├── BlazingPizza.ComponentsLibrary │ │ ├── AddressEditor.razor │ │ ├── BlazingPizza.ComponentsLibrary.csproj │ │ ├── ConfigurePizzaDialog.razor │ │ ├── ConfigurePizzaDialog.razor.cs │ │ ├── ConfiguredPizzaItem.razor │ │ ├── LocalStorage.cs │ │ ├── Map │ │ │ └── Map.razor │ │ ├── OrderInformation.razor │ │ ├── OrderReview.razor │ │ ├── OrdersTable.razor │ │ ├── PizzaCard.razor │ │ ├── _Imports.razor │ │ └── wwwroot │ │ │ ├── deliveryMap.js │ │ │ ├── leaflet │ │ │ ├── images │ │ │ │ ├── layers-2x.png │ │ │ │ ├── layers.png │ │ │ │ ├── marker-icon-2x.png │ │ │ │ ├── marker-icon.png │ │ │ │ └── marker-shadow.png │ │ │ ├── leaflet.css │ │ │ └── leaflet.js │ │ │ ├── localStorage.js │ │ │ └── pushNotifications.js │ ├── BlazingPizza.Server │ │ ├── Areas │ │ │ └── Identity │ │ │ │ └── Pages │ │ │ │ ├── Shared │ │ │ │ └── _LoginPartial.cshtml │ │ │ │ └── _Layout.cshtml │ │ ├── BlazingPizza.Server.csproj │ │ ├── NotificationsController.cs │ │ ├── OidcConfigurationController.cs │ │ ├── OrdersController.cs │ │ ├── PizzaStoreContext.cs │ │ ├── PizzaStoreUser.cs │ │ ├── PizzasController.cs │ │ ├── Program.cs │ │ ├── Properties │ │ │ └── launchSettings.json │ │ ├── SeedData.cs │ │ ├── SpecialsController.cs │ │ ├── Startup.cs │ │ ├── ToppingsController.cs │ │ ├── appsettings.Development.json │ │ └── appsettings.json │ ├── BlazingPizza.Shared │ │ ├── Address.cs │ │ ├── BlazingPizza.Shared.csproj │ │ ├── LatLong.cs │ │ ├── Maps │ │ │ ├── Marker.cs │ │ │ └── Point.cs │ │ ├── NotificationSubscription.cs │ │ ├── Order.cs │ │ ├── OrderWithStatus.cs │ │ ├── Pizza.cs │ │ ├── PizzaSpecial.cs │ │ ├── PizzaTopping.cs │ │ ├── Services │ │ │ ├── IPizzaApi.cs │ │ │ └── PizzaApi.cs │ │ ├── Topping.cs │ │ └── UserInfo.cs │ ├── BlazingPizza.Tests │ │ ├── BlazingPizza.Tests.csproj │ │ ├── Client │ │ │ ├── Pages │ │ │ │ ├── CheckoutTests.razor │ │ │ │ ├── IndexTests.razor │ │ │ │ ├── MyOrdersTests.razor │ │ │ │ └── OrderDetailsTests.razor │ │ │ └── Shared │ │ │ │ └── MainLayoutTests.razor │ │ ├── ComponentLibrary │ │ │ ├── AddressEditorTests.razor │ │ │ ├── ConfigurePizzaDialogTests.razor │ │ │ ├── ConfiguredPizzaItemTests.razor │ │ │ ├── OrderInformationTests.razor │ │ │ ├── OrderReviewTests.razor │ │ │ ├── OrdersTableTests.razor │ │ │ └── PizzaCardTests.razor │ │ ├── FakePizzaApi.cs │ │ ├── Helpers │ │ │ ├── PizzaApiExtensions.cs │ │ │ └── TestContextExtensions.cs │ │ ├── LoadingForeverPizzaApi.cs │ │ └── _Imports.razor │ └── BlazingPizza.sln ├── 06-authentication-and-authorization │ ├── BlazingPizza.Client │ │ ├── App.razor │ │ ├── BlazingPizza.Client.csproj │ │ ├── OrderState.cs │ │ ├── Pages │ │ │ ├── Authentication.razor │ │ │ ├── Checkout.razor │ │ │ ├── Checkout.razor.cs │ │ │ ├── Index.razor │ │ │ ├── Index.razor.cs │ │ │ ├── MyOrders.razor │ │ │ ├── OrderDetails.razor │ │ │ └── OrderDetails.razor.cs │ │ ├── PizzaAuthenticationState.cs │ │ ├── Program.cs │ │ ├── Shared │ │ │ ├── ConfigurableAuthenticationView.cs │ │ │ ├── LoginDisplay.razor │ │ │ ├── MainLayout.razor │ │ │ └── RedirectToLogin.razor │ │ ├── _Imports.razor │ │ └── wwwroot │ │ │ ├── css │ │ │ ├── bootstrap │ │ │ │ ├── bootstrap.min.css │ │ │ │ └── bootstrap.min.css.map │ │ │ ├── font │ │ │ │ ├── quicksand-v8-latin-300.woff │ │ │ │ ├── quicksand-v8-latin-300.woff2 │ │ │ │ ├── quicksand-v8-latin-500.woff │ │ │ │ ├── quicksand-v8-latin-500.woff2 │ │ │ │ ├── quicksand-v8-latin-700.woff │ │ │ │ ├── quicksand-v8-latin-700.woff2 │ │ │ │ ├── quicksand-v8-latin-regular.woff │ │ │ │ ├── quicksand-v8-latin-regular.woff2 │ │ │ │ └── quicksand.css │ │ │ └── site.css │ │ │ ├── img │ │ │ ├── bike.svg │ │ │ ├── icon-512.png │ │ │ ├── logo.svg │ │ │ ├── pizza-slice.svg │ │ │ ├── pizzas │ │ │ │ ├── bacon.jpg │ │ │ │ ├── brit.jpg │ │ │ │ ├── cheese.jpg │ │ │ │ ├── margherita.jpg │ │ │ │ ├── meaty.jpg │ │ │ │ ├── mushroom.jpg │ │ │ │ ├── pepperoni.jpg │ │ │ │ └── salad.jpg │ │ │ └── user.svg │ │ │ └── index.html │ ├── BlazingPizza.ComponentsLibrary │ │ ├── AddressEditor.razor │ │ ├── BlazingPizza.ComponentsLibrary.csproj │ │ ├── ConfigurePizzaDialog.razor │ │ ├── ConfigurePizzaDialog.razor.cs │ │ ├── ConfiguredPizzaItem.razor │ │ ├── LocalStorage.cs │ │ ├── Map │ │ │ └── Map.razor │ │ ├── OrderInformation.razor │ │ ├── OrderReview.razor │ │ ├── OrdersTable.razor │ │ ├── PizzaCard.razor │ │ ├── _Imports.razor │ │ └── wwwroot │ │ │ ├── deliveryMap.js │ │ │ ├── leaflet │ │ │ ├── images │ │ │ │ ├── layers-2x.png │ │ │ │ ├── layers.png │ │ │ │ ├── marker-icon-2x.png │ │ │ │ ├── marker-icon.png │ │ │ │ └── marker-shadow.png │ │ │ ├── leaflet.css │ │ │ └── leaflet.js │ │ │ ├── localStorage.js │ │ │ └── pushNotifications.js │ ├── BlazingPizza.Server │ │ ├── Areas │ │ │ └── Identity │ │ │ │ └── Pages │ │ │ │ ├── Shared │ │ │ │ └── _LoginPartial.cshtml │ │ │ │ └── _Layout.cshtml │ │ ├── BlazingPizza.Server.csproj │ │ ├── NotificationsController.cs │ │ ├── OidcConfigurationController.cs │ │ ├── OrdersController.cs │ │ ├── PizzaStoreContext.cs │ │ ├── PizzaStoreUser.cs │ │ ├── PizzasController.cs │ │ ├── Program.cs │ │ ├── Properties │ │ │ └── launchSettings.json │ │ ├── SeedData.cs │ │ ├── SpecialsController.cs │ │ ├── Startup.cs │ │ ├── ToppingsController.cs │ │ ├── appsettings.Development.json │ │ └── appsettings.json │ ├── BlazingPizza.Shared │ │ ├── Address.cs │ │ ├── BlazingPizza.Shared.csproj │ │ ├── LatLong.cs │ │ ├── Maps │ │ │ ├── Marker.cs │ │ │ └── Point.cs │ │ ├── NotificationSubscription.cs │ │ ├── Order.cs │ │ ├── OrderWithStatus.cs │ │ ├── Pizza.cs │ │ ├── PizzaSpecial.cs │ │ ├── PizzaTopping.cs │ │ ├── Services │ │ │ ├── AuthenticationViewComponentTypeProvider.cs │ │ │ ├── IAuthenticationViewComponentTypeProvider.cs │ │ │ ├── IPizzaApi.cs │ │ │ └── PizzaApi.cs │ │ ├── Topping.cs │ │ └── UserInfo.cs │ ├── BlazingPizza.Tests │ │ ├── BlazingPizza.Tests.csproj │ │ ├── Client │ │ │ ├── AppTests.razor │ │ │ ├── Pages │ │ │ │ ├── CheckoutTests.razor │ │ │ │ ├── IndexTests.razor │ │ │ │ ├── MyOrdersTests.razor │ │ │ │ └── OrderDetailsTests.razor │ │ │ └── Shared │ │ │ │ ├── LoginDisplayTests.razor │ │ │ │ └── MainLayoutTests.razor │ │ ├── ComponentLibrary │ │ │ ├── AddressEditorTests.razor │ │ │ ├── ConfigurePizzaDialogTests.razor │ │ │ ├── ConfiguredPizzaItemTests.razor │ │ │ ├── OrderInformationTests.razor │ │ │ ├── OrderReviewTests.razor │ │ │ ├── OrdersTableTests.razor │ │ │ └── PizzaCardTests.razor │ │ ├── Helpers │ │ │ ├── PizzaApiExtensions.cs │ │ │ ├── TestAuthenticationViewComponent.razor │ │ │ └── TestContextExtensions.cs │ │ ├── PROGRESS.MD │ │ ├── TestDoubles │ │ │ ├── DummyNavigationInterception.cs │ │ │ ├── DummyRemoteAuthenticationService.cs │ │ │ ├── FakePizzaApi.cs │ │ │ ├── LoadingForeverPizzaApi.cs │ │ │ └── MissingAccessTokenPizzaApi.cs │ │ └── _Imports.razor │ └── BlazingPizza.sln ├── 07-javascript-interop │ ├── BlazingPizza.Client │ │ ├── App.razor │ │ ├── BlazingPizza.Client.csproj │ │ ├── OrderState.cs │ │ ├── Pages │ │ │ ├── Authentication.razor │ │ │ ├── Checkout.razor │ │ │ ├── Checkout.razor.cs │ │ │ ├── Index.razor │ │ │ ├── Index.razor.cs │ │ │ ├── MyOrders.razor │ │ │ ├── OrderDetails.razor │ │ │ └── OrderDetails.razor.cs │ │ ├── PizzaAuthenticationState.cs │ │ ├── Program.cs │ │ ├── Shared │ │ │ ├── ConfigurableAuthenticationView.cs │ │ │ ├── LoginDisplay.razor │ │ │ ├── MainLayout.razor │ │ │ └── RedirectToLogin.razor │ │ ├── _Imports.razor │ │ └── wwwroot │ │ │ ├── css │ │ │ ├── bootstrap │ │ │ │ ├── bootstrap.min.css │ │ │ │ └── bootstrap.min.css.map │ │ │ ├── font │ │ │ │ ├── quicksand-v8-latin-300.woff │ │ │ │ ├── quicksand-v8-latin-300.woff2 │ │ │ │ ├── quicksand-v8-latin-500.woff │ │ │ │ ├── quicksand-v8-latin-500.woff2 │ │ │ │ ├── quicksand-v8-latin-700.woff │ │ │ │ ├── quicksand-v8-latin-700.woff2 │ │ │ │ ├── quicksand-v8-latin-regular.woff │ │ │ │ ├── quicksand-v8-latin-regular.woff2 │ │ │ │ └── quicksand.css │ │ │ └── site.css │ │ │ ├── img │ │ │ ├── bike.svg │ │ │ ├── icon-512.png │ │ │ ├── logo.svg │ │ │ ├── pizza-slice.svg │ │ │ ├── pizzas │ │ │ │ ├── bacon.jpg │ │ │ │ ├── brit.jpg │ │ │ │ ├── cheese.jpg │ │ │ │ ├── margherita.jpg │ │ │ │ ├── meaty.jpg │ │ │ │ ├── mushroom.jpg │ │ │ │ ├── pepperoni.jpg │ │ │ │ └── salad.jpg │ │ │ └── user.svg │ │ │ └── index.html │ ├── BlazingPizza.ComponentsLibrary │ │ ├── AddressEditor.razor │ │ ├── BlazingPizza.ComponentsLibrary.csproj │ │ ├── ConfigurePizzaDialog.razor │ │ ├── ConfigurePizzaDialog.razor.cs │ │ ├── ConfiguredPizzaItem.razor │ │ ├── JSRuntimeExtensions.cs │ │ ├── LocalStorage.cs │ │ ├── Map │ │ │ └── Map.razor │ │ ├── OrderInformation.razor │ │ ├── OrderReview.razor │ │ ├── OrdersTable.razor │ │ ├── PizzaCard.razor │ │ ├── _Imports.razor │ │ └── wwwroot │ │ │ ├── deliveryMap.js │ │ │ ├── leaflet │ │ │ ├── images │ │ │ │ ├── layers-2x.png │ │ │ │ ├── layers.png │ │ │ │ ├── marker-icon-2x.png │ │ │ │ ├── marker-icon.png │ │ │ │ └── marker-shadow.png │ │ │ ├── leaflet.css │ │ │ └── leaflet.js │ │ │ ├── localStorage.js │ │ │ └── pushNotifications.js │ ├── BlazingPizza.Server │ │ ├── Areas │ │ │ └── Identity │ │ │ │ └── Pages │ │ │ │ ├── Shared │ │ │ │ └── _LoginPartial.cshtml │ │ │ │ └── _Layout.cshtml │ │ ├── BlazingPizza.Server.csproj │ │ ├── NotificationsController.cs │ │ ├── OidcConfigurationController.cs │ │ ├── OrdersController.cs │ │ ├── PizzaStoreContext.cs │ │ ├── PizzaStoreUser.cs │ │ ├── PizzasController.cs │ │ ├── Program.cs │ │ ├── Properties │ │ │ └── launchSettings.json │ │ ├── SeedData.cs │ │ ├── SpecialsController.cs │ │ ├── Startup.cs │ │ ├── ToppingsController.cs │ │ ├── appsettings.Development.json │ │ └── appsettings.json │ ├── BlazingPizza.Shared │ │ ├── Address.cs │ │ ├── BlazingPizza.Shared.csproj │ │ ├── LatLong.cs │ │ ├── Maps │ │ │ ├── Marker.cs │ │ │ └── Point.cs │ │ ├── NotificationSubscription.cs │ │ ├── Order.cs │ │ ├── OrderWithStatus.cs │ │ ├── Pizza.cs │ │ ├── PizzaSpecial.cs │ │ ├── PizzaTopping.cs │ │ ├── Services │ │ │ ├── AuthenticationViewComponentTypeProvider.cs │ │ │ ├── IAuthenticationViewComponentTypeProvider.cs │ │ │ ├── IPizzaApi.cs │ │ │ └── PizzaApi.cs │ │ ├── Topping.cs │ │ └── UserInfo.cs │ ├── BlazingPizza.Tests │ │ ├── BlazingPizza.Tests.csproj │ │ ├── Client │ │ │ ├── AppTests.razor │ │ │ ├── Pages │ │ │ │ ├── CheckoutTests.razor │ │ │ │ ├── IndexTests.razor │ │ │ │ ├── MyOrdersTests.razor │ │ │ │ └── OrderDetailsTests.razor │ │ │ └── Shared │ │ │ │ ├── LoginDisplayTests.razor │ │ │ │ └── MainLayoutTests.razor │ │ ├── ComponentLibrary │ │ │ ├── AddressEditorTests.razor │ │ │ ├── ConfigurePizzaDialogTests.razor │ │ │ ├── ConfiguredPizzaItemTests.razor │ │ │ ├── Maps │ │ │ │ └── MapTests.razor │ │ │ ├── OrderInformationTests.razor │ │ │ ├── OrderReviewTests.razor │ │ │ ├── OrdersTableTests.razor │ │ │ └── PizzaCardTests.razor │ │ ├── Helpers │ │ │ ├── PizzaApiExtensions.cs │ │ │ ├── TestAuthenticationViewComponent.razor │ │ │ └── TestContextExtensions.cs │ │ ├── PROGRESS.MD │ │ ├── TestDoubles │ │ │ ├── DummyNavigationInterception.cs │ │ │ ├── DummyRemoteAuthenticationService.cs │ │ │ ├── FakePizzaApi.cs │ │ │ ├── LoadingForeverPizzaApi.cs │ │ │ └── MissingAccessTokenPizzaApi.cs │ │ └── _Imports.razor │ └── BlazingPizza.sln ├── 08-templated-components │ ├── BlazingComponents │ │ ├── BlazingComponents.csproj │ │ ├── TemplatedDialog.razor │ │ ├── TemplatedList.razor │ │ └── _Imports.razor │ ├── BlazingPizza.Client │ │ ├── App.razor │ │ ├── BlazingPizza.Client.csproj │ │ ├── OrderState.cs │ │ ├── Pages │ │ │ ├── Authentication.razor │ │ │ ├── Checkout.razor │ │ │ ├── Checkout.razor.cs │ │ │ ├── Index.razor │ │ │ ├── Index.razor.cs │ │ │ ├── MyOrders.razor │ │ │ ├── OrderDetails.razor │ │ │ └── OrderDetails.razor.cs │ │ ├── PizzaAuthenticationState.cs │ │ ├── Program.cs │ │ ├── Shared │ │ │ ├── ConfigurableAuthenticationView.cs │ │ │ ├── LoginDisplay.razor │ │ │ ├── MainLayout.razor │ │ │ └── RedirectToLogin.razor │ │ ├── _Imports.razor │ │ └── wwwroot │ │ │ ├── css │ │ │ ├── bootstrap │ │ │ │ ├── bootstrap.min.css │ │ │ │ └── bootstrap.min.css.map │ │ │ ├── font │ │ │ │ ├── quicksand-v8-latin-300.woff │ │ │ │ ├── quicksand-v8-latin-300.woff2 │ │ │ │ ├── quicksand-v8-latin-500.woff │ │ │ │ ├── quicksand-v8-latin-500.woff2 │ │ │ │ ├── quicksand-v8-latin-700.woff │ │ │ │ ├── quicksand-v8-latin-700.woff2 │ │ │ │ ├── quicksand-v8-latin-regular.woff │ │ │ │ ├── quicksand-v8-latin-regular.woff2 │ │ │ │ └── quicksand.css │ │ │ └── site.css │ │ │ ├── img │ │ │ ├── bike.svg │ │ │ ├── icon-512.png │ │ │ ├── logo.svg │ │ │ ├── pizza-slice.svg │ │ │ ├── pizzas │ │ │ │ ├── bacon.jpg │ │ │ │ ├── brit.jpg │ │ │ │ ├── cheese.jpg │ │ │ │ ├── margherita.jpg │ │ │ │ ├── meaty.jpg │ │ │ │ ├── mushroom.jpg │ │ │ │ ├── pepperoni.jpg │ │ │ │ └── salad.jpg │ │ │ └── user.svg │ │ │ └── index.html │ ├── BlazingPizza.ComponentsLibrary │ │ ├── AddressEditor.razor │ │ ├── BlazingPizza.ComponentsLibrary.csproj │ │ ├── ConfigurePizzaDialog.razor │ │ ├── ConfigurePizzaDialog.razor.cs │ │ ├── ConfiguredPizzaItem.razor │ │ ├── JSRuntimeExtensions.cs │ │ ├── LocalStorage.cs │ │ ├── Map │ │ │ └── Map.razor │ │ ├── OrderInformation.razor │ │ ├── OrderItem.razor │ │ ├── OrderReview.razor │ │ ├── PizzaCard.razor │ │ ├── _Imports.razor │ │ └── wwwroot │ │ │ ├── deliveryMap.js │ │ │ ├── leaflet │ │ │ ├── images │ │ │ │ ├── layers-2x.png │ │ │ │ ├── layers.png │ │ │ │ ├── marker-icon-2x.png │ │ │ │ ├── marker-icon.png │ │ │ │ └── marker-shadow.png │ │ │ ├── leaflet.css │ │ │ └── leaflet.js │ │ │ ├── localStorage.js │ │ │ └── pushNotifications.js │ ├── BlazingPizza.Server │ │ ├── Areas │ │ │ └── Identity │ │ │ │ └── Pages │ │ │ │ ├── Shared │ │ │ │ └── _LoginPartial.cshtml │ │ │ │ └── _Layout.cshtml │ │ ├── BlazingPizza.Server.csproj │ │ ├── NotificationsController.cs │ │ ├── OidcConfigurationController.cs │ │ ├── OrdersController.cs │ │ ├── PizzaStoreContext.cs │ │ ├── PizzaStoreUser.cs │ │ ├── PizzasController.cs │ │ ├── Program.cs │ │ ├── Properties │ │ │ └── launchSettings.json │ │ ├── SeedData.cs │ │ ├── SpecialsController.cs │ │ ├── Startup.cs │ │ ├── ToppingsController.cs │ │ ├── appsettings.Development.json │ │ └── appsettings.json │ ├── BlazingPizza.Shared │ │ ├── Address.cs │ │ ├── BlazingPizza.Shared.csproj │ │ ├── LatLong.cs │ │ ├── Maps │ │ │ ├── Marker.cs │ │ │ └── Point.cs │ │ ├── NotificationSubscription.cs │ │ ├── Order.cs │ │ ├── OrderWithStatus.cs │ │ ├── Pizza.cs │ │ ├── PizzaSpecial.cs │ │ ├── PizzaTopping.cs │ │ ├── Services │ │ │ ├── AuthenticationViewComponentTypeProvider.cs │ │ │ ├── IAuthenticationViewComponentTypeProvider.cs │ │ │ ├── IPizzaApi.cs │ │ │ └── PizzaApi.cs │ │ ├── Topping.cs │ │ └── UserInfo.cs │ ├── BlazingPizza.Tests │ │ ├── BlazingComponents │ │ │ ├── TemplatedDialogTests.razor │ │ │ └── TemplatedListTests.razor │ │ ├── BlazingPizza.Tests.csproj │ │ ├── Client │ │ │ ├── AppTests.razor │ │ │ ├── Pages │ │ │ │ ├── CheckoutTests.razor │ │ │ │ ├── IndexTests.razor │ │ │ │ ├── MyOrdersTests.razor │ │ │ │ └── OrderDetailsTests.razor │ │ │ └── Shared │ │ │ │ ├── LoginDisplayTests.razor │ │ │ │ └── MainLayoutTests.razor │ │ ├── ComponentLibrary │ │ │ ├── AddressEditorTests.razor │ │ │ ├── ConfigurePizzaDialogTests.razor │ │ │ ├── ConfiguredPizzaItemTests.razor │ │ │ ├── Maps │ │ │ │ └── MapTests.razor │ │ │ ├── OrderInformationTests.razor │ │ │ ├── OrderItemTests.razor │ │ │ ├── OrderReviewTests.razor │ │ │ └── PizzaCardTests.razor │ │ ├── Helpers │ │ │ ├── PizzaApiExtensions.cs │ │ │ ├── TestAuthenticationViewComponent.razor │ │ │ └── TestContextExtensions.cs │ │ ├── TestDoubles │ │ │ ├── DummyNavigationInterception.cs │ │ │ ├── DummyRemoteAuthenticationService.cs │ │ │ ├── FakePizzaApi.cs │ │ │ ├── LoadingForeverPizzaApi.cs │ │ │ └── MissingAccessTokenPizzaApi.cs │ │ └── _Imports.razor │ └── BlazingPizza.sln └── 09-progressive-web-app │ ├── BlazingComponents │ ├── BlazingComponents.csproj │ ├── TemplatedDialog.razor │ ├── TemplatedList.razor │ └── _Imports.razor │ ├── BlazingPizza.Client │ ├── App.razor │ ├── BlazingPizza.Client.csproj │ ├── OrderState.cs │ ├── Pages │ │ ├── Authentication.razor │ │ ├── Checkout.razor │ │ ├── Checkout.razor.cs │ │ ├── Index.razor │ │ ├── Index.razor.cs │ │ ├── MyOrders.razor │ │ ├── OrderDetails.razor │ │ └── OrderDetails.razor.cs │ ├── PizzaAuthenticationState.cs │ ├── Program.cs │ ├── Shared │ │ ├── ConfigurableAuthenticationView.cs │ │ ├── LoginDisplay.razor │ │ ├── MainLayout.razor │ │ └── RedirectToLogin.razor │ ├── _Imports.razor │ └── wwwroot │ │ ├── css │ │ ├── bootstrap │ │ │ ├── bootstrap.min.css │ │ │ └── bootstrap.min.css.map │ │ ├── font │ │ │ ├── quicksand-v8-latin-300.woff │ │ │ ├── quicksand-v8-latin-300.woff2 │ │ │ ├── quicksand-v8-latin-500.woff │ │ │ ├── quicksand-v8-latin-500.woff2 │ │ │ ├── quicksand-v8-latin-700.woff │ │ │ ├── quicksand-v8-latin-700.woff2 │ │ │ ├── quicksand-v8-latin-regular.woff │ │ │ ├── quicksand-v8-latin-regular.woff2 │ │ │ └── quicksand.css │ │ └── site.css │ │ ├── img │ │ ├── bike.svg │ │ ├── icon-512.png │ │ ├── logo.svg │ │ ├── pizza-slice.svg │ │ ├── pizzas │ │ │ ├── bacon.jpg │ │ │ ├── brit.jpg │ │ │ ├── cheese.jpg │ │ │ ├── margherita.jpg │ │ │ ├── meaty.jpg │ │ │ ├── mushroom.jpg │ │ │ ├── pepperoni.jpg │ │ │ └── salad.jpg │ │ └── user.svg │ │ ├── index.html │ │ ├── manifest.json │ │ └── service-worker.js │ ├── BlazingPizza.ComponentsLibrary │ ├── AddressEditor.razor │ ├── BlazingPizza.ComponentsLibrary.csproj │ ├── ConfigurePizzaDialog.razor │ ├── ConfigurePizzaDialog.razor.cs │ ├── ConfiguredPizzaItem.razor │ ├── JSRuntimeExtensions.cs │ ├── LocalStorage.cs │ ├── Map │ │ └── Map.razor │ ├── OrderInformation.razor │ ├── OrderItem.razor │ ├── OrderReview.razor │ ├── PizzaCard.razor │ ├── _Imports.razor │ └── wwwroot │ │ ├── deliveryMap.js │ │ ├── leaflet │ │ ├── images │ │ │ ├── layers-2x.png │ │ │ ├── layers.png │ │ │ ├── marker-icon-2x.png │ │ │ ├── marker-icon.png │ │ │ └── marker-shadow.png │ │ ├── leaflet.css │ │ └── leaflet.js │ │ ├── localStorage.js │ │ └── pushNotifications.js │ ├── BlazingPizza.Server │ ├── Areas │ │ └── Identity │ │ │ └── Pages │ │ │ ├── Shared │ │ │ └── _LoginPartial.cshtml │ │ │ └── _Layout.cshtml │ ├── BlazingPizza.Server.csproj │ ├── NotificationsController.cs │ ├── OidcConfigurationController.cs │ ├── OrdersController.cs │ ├── PizzaStoreContext.cs │ ├── PizzaStoreUser.cs │ ├── PizzasController.cs │ ├── Program.cs │ ├── Properties │ │ └── launchSettings.json │ ├── SeedData.cs │ ├── SpecialsController.cs │ ├── Startup.cs │ ├── ToppingsController.cs │ ├── appsettings.Development.json │ └── appsettings.json │ ├── BlazingPizza.Shared │ ├── Address.cs │ ├── BlazingPizza.Shared.csproj │ ├── LatLong.cs │ ├── Maps │ │ ├── Marker.cs │ │ └── Point.cs │ ├── NotificationSubscription.cs │ ├── Order.cs │ ├── OrderWithStatus.cs │ ├── Pizza.cs │ ├── PizzaSpecial.cs │ ├── PizzaTopping.cs │ ├── Services │ │ ├── AuthenticationViewComponentTypeProvider.cs │ │ ├── IAuthenticationViewComponentTypeProvider.cs │ │ ├── IPizzaApi.cs │ │ └── PizzaApi.cs │ ├── Topping.cs │ └── UserInfo.cs │ ├── BlazingPizza.Tests │ ├── BlazingComponents │ │ ├── TemplatedDialogTests.razor │ │ └── TemplatedListTests.razor │ ├── BlazingPizza.Tests.csproj │ ├── Client │ │ ├── AppTests.razor │ │ ├── Pages │ │ │ ├── CheckoutTests.razor │ │ │ ├── IndexTests.razor │ │ │ ├── MyOrdersTests.razor │ │ │ └── OrderDetailsTests.razor │ │ └── Shared │ │ │ ├── LoginDisplayTests.razor │ │ │ └── MainLayoutTests.razor │ ├── ComponentLibrary │ │ ├── AddressEditorTests.razor │ │ ├── ConfigurePizzaDialogTests.razor │ │ ├── ConfiguredPizzaItemTests.razor │ │ ├── Maps │ │ │ └── MapTests.razor │ │ ├── OrderInformationTests.razor │ │ ├── OrderItemTests.razor │ │ ├── OrderReviewTests.razor │ │ └── PizzaCardTests.razor │ ├── Helpers │ │ ├── PizzaApiExtensions.cs │ │ ├── TestAuthenticationViewComponent.razor │ │ └── TestContextExtensions.cs │ ├── TestDoubles │ │ ├── DummyNavigationInterception.cs │ │ ├── DummyRemoteAuthenticationService.cs │ │ ├── FakePizzaApi.cs │ │ ├── LoadingForeverPizzaApi.cs │ │ └── MissingAccessTokenPizzaApi.cs │ └── _Imports.razor │ └── BlazingPizza.sln ├── src ├── BlazingComponents │ ├── BlazingComponents.csproj │ ├── TemplatedDialog.razor │ ├── TemplatedList.razor │ └── _Imports.razor ├── BlazingPizza.Client │ ├── App.razor │ ├── BlazingPizza.Client.csproj │ ├── OrderState.cs │ ├── Pages │ │ ├── Authentication.razor │ │ ├── Checkout.razor │ │ ├── Checkout.razor.cs │ │ ├── Index.razor │ │ ├── Index.razor.cs │ │ ├── MyOrders.razor │ │ ├── OrderDetails.razor │ │ └── OrderDetails.razor.cs │ ├── PizzaAuthenticationState.cs │ ├── Program.cs │ ├── Shared │ │ ├── ConfigurableAuthenticationView.cs │ │ ├── LoginDisplay.razor │ │ ├── MainLayout.razor │ │ └── RedirectToLogin.razor │ ├── _Imports.razor │ └── wwwroot │ │ ├── css │ │ ├── bootstrap │ │ │ ├── bootstrap.min.css │ │ │ └── bootstrap.min.css.map │ │ ├── font │ │ │ ├── quicksand-v8-latin-300.woff │ │ │ ├── quicksand-v8-latin-300.woff2 │ │ │ ├── quicksand-v8-latin-500.woff │ │ │ ├── quicksand-v8-latin-500.woff2 │ │ │ ├── quicksand-v8-latin-700.woff │ │ │ ├── quicksand-v8-latin-700.woff2 │ │ │ ├── quicksand-v8-latin-regular.woff │ │ │ ├── quicksand-v8-latin-regular.woff2 │ │ │ └── quicksand.css │ │ └── site.css │ │ ├── img │ │ ├── bike.svg │ │ ├── icon-512.png │ │ ├── logo.svg │ │ ├── pizza-slice.svg │ │ ├── pizzas │ │ │ ├── bacon.jpg │ │ │ ├── brit.jpg │ │ │ ├── cheese.jpg │ │ │ ├── margherita.jpg │ │ │ ├── meaty.jpg │ │ │ ├── mushroom.jpg │ │ │ ├── pepperoni.jpg │ │ │ └── salad.jpg │ │ └── user.svg │ │ ├── index.html │ │ ├── manifest.json │ │ └── service-worker.js ├── BlazingPizza.ComponentsLibrary │ ├── AddressEditor.razor │ ├── BlazingPizza.ComponentsLibrary.csproj │ ├── ConfigurePizzaDialog.razor │ ├── ConfigurePizzaDialog.razor.cs │ ├── ConfiguredPizzaItem.razor │ ├── JSRuntimeExtensions.cs │ ├── LocalStorage.cs │ ├── Map │ │ └── Map.razor │ ├── OrderInformation.razor │ ├── OrderItem.razor │ ├── OrderReview.razor │ ├── PizzaCard.razor │ ├── _Imports.razor │ └── wwwroot │ │ ├── deliveryMap.js │ │ ├── leaflet │ │ ├── images │ │ │ ├── layers-2x.png │ │ │ ├── layers.png │ │ │ ├── marker-icon-2x.png │ │ │ ├── marker-icon.png │ │ │ └── marker-shadow.png │ │ ├── leaflet.css │ │ └── leaflet.js │ │ ├── localStorage.js │ │ └── pushNotifications.js ├── BlazingPizza.Server │ ├── Areas │ │ └── Identity │ │ │ └── Pages │ │ │ ├── Shared │ │ │ └── _LoginPartial.cshtml │ │ │ └── _Layout.cshtml │ ├── BlazingPizza.Server.csproj │ ├── NotificationsController.cs │ ├── OidcConfigurationController.cs │ ├── OrdersController.cs │ ├── PizzaStoreContext.cs │ ├── PizzaStoreUser.cs │ ├── PizzasController.cs │ ├── Program.cs │ ├── Properties │ │ └── launchSettings.json │ ├── SeedData.cs │ ├── SpecialsController.cs │ ├── Startup.cs │ ├── ToppingsController.cs │ ├── appsettings.Development.json │ └── appsettings.json ├── BlazingPizza.Shared │ ├── Address.cs │ ├── BlazingPizza.Shared.csproj │ ├── LatLong.cs │ ├── Maps │ │ ├── Marker.cs │ │ └── Point.cs │ ├── NotificationSubscription.cs │ ├── Order.cs │ ├── OrderWithStatus.cs │ ├── Pizza.cs │ ├── PizzaSpecial.cs │ ├── PizzaTopping.cs │ ├── Services │ │ ├── AuthenticationViewComponentTypeProvider.cs │ │ ├── IAuthenticationViewComponentTypeProvider.cs │ │ ├── IPizzaApi.cs │ │ └── PizzaApi.cs │ ├── Topping.cs │ └── UserInfo.cs ├── BlazingPizza.Tests │ ├── BlazingComponents │ │ ├── TemplatedDialogTests.razor │ │ └── TemplatedListTests.razor │ ├── BlazingPizza.Tests.csproj │ ├── Client │ │ ├── AppTests.razor │ │ ├── Pages │ │ │ ├── CheckoutTests.razor │ │ │ ├── IndexTests.razor │ │ │ ├── MyOrdersTests.razor │ │ │ └── OrderDetailsTests.razor │ │ └── Shared │ │ │ ├── LoginDisplayTests.razor │ │ │ └── MainLayoutTests.razor │ ├── ComponentLibrary │ │ ├── AddressEditorTests.razor │ │ ├── ConfigurePizzaDialogTests.razor │ │ ├── ConfiguredPizzaItemTests.razor │ │ ├── Maps │ │ │ └── MapTests.razor │ │ ├── OrderInformationTests.razor │ │ ├── OrderItemTests.razor │ │ ├── OrderReviewTests.razor │ │ └── PizzaCardTests.razor │ ├── Helpers │ │ ├── PizzaApiExtensions.cs │ │ ├── TestAuthenticationViewComponent.razor │ │ └── TestContextExtensions.cs │ ├── TestDoubles │ │ ├── DummyNavigationInterception.cs │ │ ├── DummyRemoteAuthenticationService.cs │ │ ├── FakePizzaApi.cs │ │ ├── LoadingForeverPizzaApi.cs │ │ └── MissingAccessTokenPizzaApi.cs │ └── _Imports.razor ├── BlazingPizza.sln └── nuget.config └── ui-mockup.pptx /Directory.Build.props: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6.0.6 4 | 6.0.0 5 | 6.0.6 6 | 6.0.6 7 | 6.0.0 8 | 9 | 10 | net6.0 11 | 10.0 12 | 13 | 14 | -------------------------------------------------------------------------------- /docs/00-get-started.md: -------------------------------------------------------------------------------- 1 | # Get started 2 | 3 | In this session, you'll setup your machine for Blazor development and build your first Blazor app. 4 | 5 | ## Setup 6 | 7 | To get started with Blazor, follow the instructions on https://aka.ms/blazor-getting-started. 8 | 9 | ## Build your first app 10 | 11 | Once you have your first Blazor app running, try [building your first Blazor app](https://docs.microsoft.com/aspnet/core/tutorials/build-your-first-blazor-app). 12 | 13 | Next up - [Components and layout](01-components-and-layout.md) 14 | -------------------------------------------------------------------------------- /global.json: -------------------------------------------------------------------------------- 1 | { 2 | "sdk": { 3 | "rollForward": "latestMajor", 4 | "allowPrerelease": false 5 | } 6 | } -------------------------------------------------------------------------------- /save-points/00-get-started/BlazingPizza.Client/App.razor: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | 7 |
Sorry, there's nothing at this address.
8 |
9 |
10 |
11 | -------------------------------------------------------------------------------- /save-points/00-get-started/BlazingPizza.Client/Pages/Index.razor: -------------------------------------------------------------------------------- 1 | @page "/" 2 | 3 |

Blazing Pizzas

4 | -------------------------------------------------------------------------------- /save-points/00-get-started/BlazingPizza.Client/Shared/MainLayout.razor: -------------------------------------------------------------------------------- 1 | @inherits LayoutComponentBase 2 | 3 |
4 | @Body 5 |
6 | -------------------------------------------------------------------------------- /save-points/00-get-started/BlazingPizza.Client/wwwroot/css/font/quicksand-v8-latin-300.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/00-get-started/BlazingPizza.Client/wwwroot/css/font/quicksand-v8-latin-300.woff -------------------------------------------------------------------------------- /save-points/00-get-started/BlazingPizza.Client/wwwroot/css/font/quicksand-v8-latin-300.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/00-get-started/BlazingPizza.Client/wwwroot/css/font/quicksand-v8-latin-300.woff2 -------------------------------------------------------------------------------- /save-points/00-get-started/BlazingPizza.Client/wwwroot/css/font/quicksand-v8-latin-500.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/00-get-started/BlazingPizza.Client/wwwroot/css/font/quicksand-v8-latin-500.woff -------------------------------------------------------------------------------- /save-points/00-get-started/BlazingPizza.Client/wwwroot/css/font/quicksand-v8-latin-500.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/00-get-started/BlazingPizza.Client/wwwroot/css/font/quicksand-v8-latin-500.woff2 -------------------------------------------------------------------------------- /save-points/00-get-started/BlazingPizza.Client/wwwroot/css/font/quicksand-v8-latin-700.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/00-get-started/BlazingPizza.Client/wwwroot/css/font/quicksand-v8-latin-700.woff -------------------------------------------------------------------------------- /save-points/00-get-started/BlazingPizza.Client/wwwroot/css/font/quicksand-v8-latin-700.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/00-get-started/BlazingPizza.Client/wwwroot/css/font/quicksand-v8-latin-700.woff2 -------------------------------------------------------------------------------- /save-points/00-get-started/BlazingPizza.Client/wwwroot/css/font/quicksand-v8-latin-regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/00-get-started/BlazingPizza.Client/wwwroot/css/font/quicksand-v8-latin-regular.woff -------------------------------------------------------------------------------- /save-points/00-get-started/BlazingPizza.Client/wwwroot/css/font/quicksand-v8-latin-regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/00-get-started/BlazingPizza.Client/wwwroot/css/font/quicksand-v8-latin-regular.woff2 -------------------------------------------------------------------------------- /save-points/00-get-started/BlazingPizza.Client/wwwroot/img/icon-512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/00-get-started/BlazingPizza.Client/wwwroot/img/icon-512.png -------------------------------------------------------------------------------- /save-points/00-get-started/BlazingPizza.Client/wwwroot/img/pizzas/bacon.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/00-get-started/BlazingPizza.Client/wwwroot/img/pizzas/bacon.jpg -------------------------------------------------------------------------------- /save-points/00-get-started/BlazingPizza.Client/wwwroot/img/pizzas/brit.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/00-get-started/BlazingPizza.Client/wwwroot/img/pizzas/brit.jpg -------------------------------------------------------------------------------- /save-points/00-get-started/BlazingPizza.Client/wwwroot/img/pizzas/cheese.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/00-get-started/BlazingPizza.Client/wwwroot/img/pizzas/cheese.jpg -------------------------------------------------------------------------------- /save-points/00-get-started/BlazingPizza.Client/wwwroot/img/pizzas/margherita.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/00-get-started/BlazingPizza.Client/wwwroot/img/pizzas/margherita.jpg -------------------------------------------------------------------------------- /save-points/00-get-started/BlazingPizza.Client/wwwroot/img/pizzas/meaty.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/00-get-started/BlazingPizza.Client/wwwroot/img/pizzas/meaty.jpg -------------------------------------------------------------------------------- /save-points/00-get-started/BlazingPizza.Client/wwwroot/img/pizzas/mushroom.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/00-get-started/BlazingPizza.Client/wwwroot/img/pizzas/mushroom.jpg -------------------------------------------------------------------------------- /save-points/00-get-started/BlazingPizza.Client/wwwroot/img/pizzas/pepperoni.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/00-get-started/BlazingPizza.Client/wwwroot/img/pizzas/pepperoni.jpg -------------------------------------------------------------------------------- /save-points/00-get-started/BlazingPizza.Client/wwwroot/img/pizzas/salad.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/00-get-started/BlazingPizza.Client/wwwroot/img/pizzas/salad.jpg -------------------------------------------------------------------------------- /save-points/00-get-started/BlazingPizza.ComponentsLibrary/_Imports.razor: -------------------------------------------------------------------------------- 1 | @using Microsoft.AspNetCore.Authorization 2 | @using Microsoft.AspNetCore.Components.Forms 3 | @using Microsoft.AspNetCore.Components.Routing 4 | @using Microsoft.AspNetCore.Components.Web 5 | @using Microsoft.JSInterop 6 | @using BlazingPizza 7 | @using BlazingPizza.ComponentsLibrary 8 | @using BlazingPizza.Maps -------------------------------------------------------------------------------- /save-points/00-get-started/BlazingPizza.ComponentsLibrary/wwwroot/leaflet/images/layers-2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/00-get-started/BlazingPizza.ComponentsLibrary/wwwroot/leaflet/images/layers-2x.png -------------------------------------------------------------------------------- /save-points/00-get-started/BlazingPizza.ComponentsLibrary/wwwroot/leaflet/images/layers.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/00-get-started/BlazingPizza.ComponentsLibrary/wwwroot/leaflet/images/layers.png -------------------------------------------------------------------------------- /save-points/00-get-started/BlazingPizza.ComponentsLibrary/wwwroot/leaflet/images/marker-icon-2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/00-get-started/BlazingPizza.ComponentsLibrary/wwwroot/leaflet/images/marker-icon-2x.png -------------------------------------------------------------------------------- /save-points/00-get-started/BlazingPizza.ComponentsLibrary/wwwroot/leaflet/images/marker-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/00-get-started/BlazingPizza.ComponentsLibrary/wwwroot/leaflet/images/marker-icon.png -------------------------------------------------------------------------------- /save-points/00-get-started/BlazingPizza.ComponentsLibrary/wwwroot/leaflet/images/marker-shadow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/00-get-started/BlazingPizza.ComponentsLibrary/wwwroot/leaflet/images/marker-shadow.png -------------------------------------------------------------------------------- /save-points/00-get-started/BlazingPizza.ComponentsLibrary/wwwroot/localStorage.js: -------------------------------------------------------------------------------- 1 | (function () { 2 | window.blazorLocalStorage = { 3 | get: key => key in localStorage ? JSON.parse(localStorage[key]) : null, 4 | set: (key, value) => { localStorage[key] = JSON.stringify(value); }, 5 | delete: key => { delete localStorage[key]; } 6 | }; 7 | })(); 8 | -------------------------------------------------------------------------------- /save-points/00-get-started/BlazingPizza.Server/PizzaStoreUser.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.AspNetCore.Identity; 2 | 3 | namespace BlazingPizza.Server 4 | { 5 | public class PizzaStoreUser : IdentityUser 6 | { 7 | } 8 | } -------------------------------------------------------------------------------- /save-points/00-get-started/BlazingPizza.Server/PizzasController.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.AspNetCore.Mvc; 2 | 3 | namespace BlazingPizza.Server 4 | { 5 | [Route("pizzas")] 6 | [ApiController] 7 | public class PizzasController : Controller 8 | { 9 | private readonly PizzaStoreContext _db; 10 | 11 | public PizzasController(PizzaStoreContext db) 12 | { 13 | _db = db; 14 | } 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /save-points/00-get-started/BlazingPizza.Server/appsettings.Development.json: -------------------------------------------------------------------------------- 1 | { 2 | "Logging": { 3 | "LogLevel": { 4 | "Default": "Debug", 5 | "System": "Information", 6 | "Microsoft": "Information" 7 | } 8 | }, 9 | "IdentityServer": { 10 | "Key": { 11 | "Type": "Development" 12 | } 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /save-points/00-get-started/BlazingPizza.Server/appsettings.json: -------------------------------------------------------------------------------- 1 | { 2 | "Logging": { 3 | "LogLevel": { 4 | "Default": "Warning" 5 | } 6 | }, 7 | "IdentityServer": { 8 | "Clients": { 9 | "BlazingPizza.Client": { 10 | "Profile": "IdentityServerSPA" 11 | } 12 | } 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /save-points/00-get-started/BlazingPizza.Shared/Address.cs: -------------------------------------------------------------------------------- 1 | using System.ComponentModel.DataAnnotations; 2 | 3 | namespace BlazingPizza 4 | { 5 | public class Address 6 | { 7 | public int Id { get; set; } 8 | 9 | public string Name { get; set; } 10 | 11 | public string Line1 { get; set; } 12 | 13 | public string Line2 { get; set; } 14 | 15 | public string City { get; set; } 16 | 17 | public string Region { get; set; } 18 | 19 | public string PostalCode { get; set; } 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /save-points/00-get-started/BlazingPizza.Shared/BlazingPizza.Shared.csproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | net6.0 5 | BlazingPizza 6 | 9.0 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /save-points/00-get-started/BlazingPizza.Shared/Maps/Marker.cs: -------------------------------------------------------------------------------- 1 | namespace BlazingPizza.Maps 2 | { 3 | public class Marker 4 | { 5 | public string Description { get; set; } 6 | 7 | public double X { get; set; } 8 | 9 | public double Y { get; set; } 10 | 11 | public bool ShowPopup { get; set; } 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /save-points/00-get-started/BlazingPizza.Shared/Maps/Point.cs: -------------------------------------------------------------------------------- 1 | namespace BlazingPizza.Maps 2 | { 3 | public class Point 4 | { 5 | public double X { get; set; } 6 | 7 | public double Y { get; set; } 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /save-points/00-get-started/BlazingPizza.Shared/NotificationSubscription.cs: -------------------------------------------------------------------------------- 1 | using System.ComponentModel.DataAnnotations; 2 | 3 | namespace BlazingPizza 4 | { 5 | public class NotificationSubscription 6 | { 7 | public int NotificationSubscriptionId { get; set; } 8 | 9 | public string UserId { get; set; } 10 | 11 | public string Url { get; set; } 12 | 13 | public string P256dh { get; set; } 14 | 15 | public string Auth { get; set; } 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /save-points/00-get-started/BlazingPizza.Shared/PizzaSpecial.cs: -------------------------------------------------------------------------------- 1 | namespace BlazingPizza 2 | { 3 | /// 4 | /// Represents a pre-configured template for a pizza a user can order 5 | /// 6 | public class PizzaSpecial 7 | { 8 | public int Id { get; set; } 9 | 10 | public string Name { get; set; } 11 | 12 | public decimal BasePrice { get; set; } 13 | 14 | public string Description { get; set; } 15 | 16 | public string ImageUrl { get; set; } 17 | 18 | public string GetFormattedBasePrice() => BasePrice.ToString("0.00"); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /save-points/00-get-started/BlazingPizza.Shared/PizzaTopping.cs: -------------------------------------------------------------------------------- 1 | namespace BlazingPizza 2 | { 3 | public class PizzaTopping 4 | { 5 | public Topping Topping { get; set; } 6 | 7 | public int ToppingId { get; set; } 8 | 9 | public int PizzaId { get; set; } 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /save-points/00-get-started/BlazingPizza.Shared/Topping.cs: -------------------------------------------------------------------------------- 1 | namespace BlazingPizza 2 | { 3 | public class Topping 4 | { 5 | public int Id { get; set; } 6 | 7 | public string Name { get; set; } 8 | 9 | public decimal Price { get; set; } 10 | 11 | public string GetFormattedPrice() => Price.ToString("0.00"); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /save-points/00-get-started/BlazingPizza.Shared/UserInfo.cs: -------------------------------------------------------------------------------- 1 | namespace BlazingPizza 2 | { 3 | public class UserInfo 4 | { 5 | public bool IsAuthenticated { get; set; } 6 | 7 | public string Name { get; set; } 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /save-points/01-Components-and-layout/BlazingPizza.Client/App.razor: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | 7 |
Sorry, there's nothing at this address.
8 |
9 |
10 |
11 | -------------------------------------------------------------------------------- /save-points/01-Components-and-layout/BlazingPizza.Client/Pages/Index.razor: -------------------------------------------------------------------------------- 1 | @page "/" 2 | @inject IPizzaApi Api 3 | 4 |
5 | 14 |
15 | 16 | @code { 17 | IReadOnlyList specials; 18 | 19 | protected override async Task OnInitializedAsync() 20 | { 21 | specials = await Api.GetPizzaSpecialsAsync(); 22 | } 23 | } -------------------------------------------------------------------------------- /save-points/01-Components-and-layout/BlazingPizza.Client/Shared/MainLayout.razor: -------------------------------------------------------------------------------- 1 | @inherits LayoutComponentBase 2 | 3 |
4 | 7 | 8 | 9 | 10 |
Get Pizza
11 |
12 |
13 | 14 |
15 | @Body 16 |
-------------------------------------------------------------------------------- /save-points/01-Components-and-layout/BlazingPizza.Client/wwwroot/css/font/quicksand-v8-latin-300.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/01-Components-and-layout/BlazingPizza.Client/wwwroot/css/font/quicksand-v8-latin-300.woff -------------------------------------------------------------------------------- /save-points/01-Components-and-layout/BlazingPizza.Client/wwwroot/css/font/quicksand-v8-latin-300.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/01-Components-and-layout/BlazingPizza.Client/wwwroot/css/font/quicksand-v8-latin-300.woff2 -------------------------------------------------------------------------------- /save-points/01-Components-and-layout/BlazingPizza.Client/wwwroot/css/font/quicksand-v8-latin-500.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/01-Components-and-layout/BlazingPizza.Client/wwwroot/css/font/quicksand-v8-latin-500.woff -------------------------------------------------------------------------------- /save-points/01-Components-and-layout/BlazingPizza.Client/wwwroot/css/font/quicksand-v8-latin-500.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/01-Components-and-layout/BlazingPizza.Client/wwwroot/css/font/quicksand-v8-latin-500.woff2 -------------------------------------------------------------------------------- /save-points/01-Components-and-layout/BlazingPizza.Client/wwwroot/css/font/quicksand-v8-latin-700.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/01-Components-and-layout/BlazingPizza.Client/wwwroot/css/font/quicksand-v8-latin-700.woff -------------------------------------------------------------------------------- /save-points/01-Components-and-layout/BlazingPizza.Client/wwwroot/css/font/quicksand-v8-latin-700.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/01-Components-and-layout/BlazingPizza.Client/wwwroot/css/font/quicksand-v8-latin-700.woff2 -------------------------------------------------------------------------------- /save-points/01-Components-and-layout/BlazingPizza.Client/wwwroot/css/font/quicksand-v8-latin-regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/01-Components-and-layout/BlazingPizza.Client/wwwroot/css/font/quicksand-v8-latin-regular.woff -------------------------------------------------------------------------------- /save-points/01-Components-and-layout/BlazingPizza.Client/wwwroot/css/font/quicksand-v8-latin-regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/01-Components-and-layout/BlazingPizza.Client/wwwroot/css/font/quicksand-v8-latin-regular.woff2 -------------------------------------------------------------------------------- /save-points/01-Components-and-layout/BlazingPizza.Client/wwwroot/img/icon-512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/01-Components-and-layout/BlazingPizza.Client/wwwroot/img/icon-512.png -------------------------------------------------------------------------------- /save-points/01-Components-and-layout/BlazingPizza.Client/wwwroot/img/pizzas/bacon.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/01-Components-and-layout/BlazingPizza.Client/wwwroot/img/pizzas/bacon.jpg -------------------------------------------------------------------------------- /save-points/01-Components-and-layout/BlazingPizza.Client/wwwroot/img/pizzas/brit.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/01-Components-and-layout/BlazingPizza.Client/wwwroot/img/pizzas/brit.jpg -------------------------------------------------------------------------------- /save-points/01-Components-and-layout/BlazingPizza.Client/wwwroot/img/pizzas/cheese.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/01-Components-and-layout/BlazingPizza.Client/wwwroot/img/pizzas/cheese.jpg -------------------------------------------------------------------------------- /save-points/01-Components-and-layout/BlazingPizza.Client/wwwroot/img/pizzas/margherita.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/01-Components-and-layout/BlazingPizza.Client/wwwroot/img/pizzas/margherita.jpg -------------------------------------------------------------------------------- /save-points/01-Components-and-layout/BlazingPizza.Client/wwwroot/img/pizzas/meaty.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/01-Components-and-layout/BlazingPizza.Client/wwwroot/img/pizzas/meaty.jpg -------------------------------------------------------------------------------- /save-points/01-Components-and-layout/BlazingPizza.Client/wwwroot/img/pizzas/mushroom.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/01-Components-and-layout/BlazingPizza.Client/wwwroot/img/pizzas/mushroom.jpg -------------------------------------------------------------------------------- /save-points/01-Components-and-layout/BlazingPizza.Client/wwwroot/img/pizzas/pepperoni.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/01-Components-and-layout/BlazingPizza.Client/wwwroot/img/pizzas/pepperoni.jpg -------------------------------------------------------------------------------- /save-points/01-Components-and-layout/BlazingPizza.Client/wwwroot/img/pizzas/salad.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/01-Components-and-layout/BlazingPizza.Client/wwwroot/img/pizzas/salad.jpg -------------------------------------------------------------------------------- /save-points/01-Components-and-layout/BlazingPizza.ComponentsLibrary/Map/Marker.cs: -------------------------------------------------------------------------------- 1 | namespace BlazingPizza.ComponentsLibrary.Map 2 | { 3 | public class Marker 4 | { 5 | public string Description { get; set; } 6 | 7 | public double X { get; set; } 8 | 9 | public double Y { get; set; } 10 | 11 | public bool ShowPopup { get; set; } 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /save-points/01-Components-and-layout/BlazingPizza.ComponentsLibrary/Map/Point.cs: -------------------------------------------------------------------------------- 1 | namespace BlazingPizza.ComponentsLibrary.Map 2 | { 3 | public class Point 4 | { 5 | public double X { get; set; } 6 | 7 | public double Y { get; set; } 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /save-points/01-Components-and-layout/BlazingPizza.ComponentsLibrary/PizzaCard.razor: -------------------------------------------------------------------------------- 1 | 
  • 2 |
    3 | @Special.Name 4 | @Special.Description 5 | @Special.GetFormattedBasePrice() 6 |
    7 |
  • 8 | 9 | @code { 10 | [Parameter] public PizzaSpecial Special { get; set; } 11 | [Parameter] public EventCallback OnClick { get; set; } 12 | } -------------------------------------------------------------------------------- /save-points/01-Components-and-layout/BlazingPizza.ComponentsLibrary/_Imports.razor: -------------------------------------------------------------------------------- 1 | @using Microsoft.AspNetCore.Authorization 2 | @using Microsoft.AspNetCore.Components.Forms 3 | @using Microsoft.AspNetCore.Components.Routing 4 | @using Microsoft.AspNetCore.Components.Web 5 | @using Microsoft.JSInterop 6 | @using BlazingPizza 7 | @using BlazingPizza.ComponentsLibrary 8 | @using BlazingPizza.Maps -------------------------------------------------------------------------------- /save-points/01-Components-and-layout/BlazingPizza.ComponentsLibrary/wwwroot/leaflet/images/layers-2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/01-Components-and-layout/BlazingPizza.ComponentsLibrary/wwwroot/leaflet/images/layers-2x.png -------------------------------------------------------------------------------- /save-points/01-Components-and-layout/BlazingPizza.ComponentsLibrary/wwwroot/leaflet/images/layers.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/01-Components-and-layout/BlazingPizza.ComponentsLibrary/wwwroot/leaflet/images/layers.png -------------------------------------------------------------------------------- /save-points/01-Components-and-layout/BlazingPizza.ComponentsLibrary/wwwroot/leaflet/images/marker-icon-2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/01-Components-and-layout/BlazingPizza.ComponentsLibrary/wwwroot/leaflet/images/marker-icon-2x.png -------------------------------------------------------------------------------- /save-points/01-Components-and-layout/BlazingPizza.ComponentsLibrary/wwwroot/leaflet/images/marker-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/01-Components-and-layout/BlazingPizza.ComponentsLibrary/wwwroot/leaflet/images/marker-icon.png -------------------------------------------------------------------------------- /save-points/01-Components-and-layout/BlazingPizza.ComponentsLibrary/wwwroot/leaflet/images/marker-shadow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/01-Components-and-layout/BlazingPizza.ComponentsLibrary/wwwroot/leaflet/images/marker-shadow.png -------------------------------------------------------------------------------- /save-points/01-Components-and-layout/BlazingPizza.ComponentsLibrary/wwwroot/localStorage.js: -------------------------------------------------------------------------------- 1 | (function () { 2 | window.blazorLocalStorage = { 3 | get: key => key in localStorage ? JSON.parse(localStorage[key]) : null, 4 | set: (key, value) => { localStorage[key] = JSON.stringify(value); }, 5 | delete: key => { delete localStorage[key]; } 6 | }; 7 | })(); 8 | -------------------------------------------------------------------------------- /save-points/01-Components-and-layout/BlazingPizza.Server/PizzaStoreUser.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.AspNetCore.Identity; 2 | 3 | namespace BlazingPizza.Server 4 | { 5 | public class PizzaStoreUser : IdentityUser 6 | { 7 | } 8 | } -------------------------------------------------------------------------------- /save-points/01-Components-and-layout/BlazingPizza.Server/PizzasController.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.AspNetCore.Mvc; 2 | 3 | namespace BlazingPizza.Server 4 | { 5 | [Route("pizzas")] 6 | [ApiController] 7 | public class PizzasController : Controller 8 | { 9 | private readonly PizzaStoreContext _db; 10 | 11 | public PizzasController(PizzaStoreContext db) 12 | { 13 | _db = db; 14 | } 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /save-points/01-Components-and-layout/BlazingPizza.Server/appsettings.Development.json: -------------------------------------------------------------------------------- 1 | { 2 | "Logging": { 3 | "LogLevel": { 4 | "Default": "Debug", 5 | "System": "Information", 6 | "Microsoft": "Information" 7 | } 8 | }, 9 | "IdentityServer": { 10 | "Key": { 11 | "Type": "Development" 12 | } 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /save-points/01-Components-and-layout/BlazingPizza.Server/appsettings.json: -------------------------------------------------------------------------------- 1 | { 2 | "Logging": { 3 | "LogLevel": { 4 | "Default": "Warning" 5 | } 6 | }, 7 | "IdentityServer": { 8 | "Clients": { 9 | "BlazingPizza.Client": { 10 | "Profile": "IdentityServerSPA" 11 | } 12 | } 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /save-points/01-Components-and-layout/BlazingPizza.Shared/Address.cs: -------------------------------------------------------------------------------- 1 | using System.ComponentModel.DataAnnotations; 2 | 3 | namespace BlazingPizza 4 | { 5 | public class Address 6 | { 7 | public int Id { get; set; } 8 | 9 | public string Name { get; set; } 10 | 11 | public string Line1 { get; set; } 12 | 13 | public string Line2 { get; set; } 14 | 15 | public string City { get; set; } 16 | 17 | public string Region { get; set; } 18 | 19 | public string PostalCode { get; set; } 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /save-points/01-Components-and-layout/BlazingPizza.Shared/BlazingPizza.Shared.csproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | net6.0 5 | BlazingPizza 6 | 9.0 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /save-points/01-Components-and-layout/BlazingPizza.Shared/Maps/Marker.cs: -------------------------------------------------------------------------------- 1 | namespace BlazingPizza.Maps 2 | { 3 | public class Marker 4 | { 5 | public string Description { get; set; } 6 | 7 | public double X { get; set; } 8 | 9 | public double Y { get; set; } 10 | 11 | public bool ShowPopup { get; set; } 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /save-points/01-Components-and-layout/BlazingPizza.Shared/Maps/Point.cs: -------------------------------------------------------------------------------- 1 | namespace BlazingPizza.Maps 2 | { 3 | public class Point 4 | { 5 | public double X { get; set; } 6 | 7 | public double Y { get; set; } 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /save-points/01-Components-and-layout/BlazingPizza.Shared/NotificationSubscription.cs: -------------------------------------------------------------------------------- 1 | using System.ComponentModel.DataAnnotations; 2 | 3 | namespace BlazingPizza 4 | { 5 | public class NotificationSubscription 6 | { 7 | public int NotificationSubscriptionId { get; set; } 8 | 9 | public string UserId { get; set; } 10 | 11 | public string Url { get; set; } 12 | 13 | public string P256dh { get; set; } 14 | 15 | public string Auth { get; set; } 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /save-points/01-Components-and-layout/BlazingPizza.Shared/PizzaSpecial.cs: -------------------------------------------------------------------------------- 1 | namespace BlazingPizza 2 | { 3 | /// 4 | /// Represents a pre-configured template for a pizza a user can order 5 | /// 6 | public class PizzaSpecial 7 | { 8 | public int Id { get; set; } 9 | 10 | public string Name { get; set; } 11 | 12 | public decimal BasePrice { get; set; } 13 | 14 | public string Description { get; set; } 15 | 16 | public string ImageUrl { get; set; } 17 | 18 | public string GetFormattedBasePrice() => BasePrice.ToString("0.00"); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /save-points/01-Components-and-layout/BlazingPizza.Shared/PizzaTopping.cs: -------------------------------------------------------------------------------- 1 | namespace BlazingPizza 2 | { 3 | public class PizzaTopping 4 | { 5 | public Topping Topping { get; set; } 6 | 7 | public int ToppingId { get; set; } 8 | 9 | public int PizzaId { get; set; } 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /save-points/01-Components-and-layout/BlazingPizza.Shared/Topping.cs: -------------------------------------------------------------------------------- 1 | namespace BlazingPizza 2 | { 3 | public class Topping 4 | { 5 | public int Id { get; set; } 6 | 7 | public string Name { get; set; } 8 | 9 | public decimal Price { get; set; } 10 | 11 | public string GetFormattedPrice() => Price.ToString("0.00"); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /save-points/01-Components-and-layout/BlazingPizza.Shared/UserInfo.cs: -------------------------------------------------------------------------------- 1 | namespace BlazingPizza 2 | { 3 | public class UserInfo 4 | { 5 | public bool IsAuthenticated { get; set; } 6 | 7 | public string Name { get; set; } 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /save-points/02-customize-a-pizza/BlazingPizza.Client/App.razor: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | 7 |
    Sorry, there's nothing at this address.
    8 |
    9 |
    10 |
    11 | -------------------------------------------------------------------------------- /save-points/02-customize-a-pizza/BlazingPizza.Client/Shared/MainLayout.razor: -------------------------------------------------------------------------------- 1 | @inherits LayoutComponentBase 2 | 3 |
    4 | 7 | 8 | 9 | 10 |
    Get Pizza
    11 |
    12 |
    13 | 14 |
    15 | @Body 16 |
    -------------------------------------------------------------------------------- /save-points/02-customize-a-pizza/BlazingPizza.Client/wwwroot/css/font/quicksand-v8-latin-300.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/02-customize-a-pizza/BlazingPizza.Client/wwwroot/css/font/quicksand-v8-latin-300.woff -------------------------------------------------------------------------------- /save-points/02-customize-a-pizza/BlazingPizza.Client/wwwroot/css/font/quicksand-v8-latin-300.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/02-customize-a-pizza/BlazingPizza.Client/wwwroot/css/font/quicksand-v8-latin-300.woff2 -------------------------------------------------------------------------------- /save-points/02-customize-a-pizza/BlazingPizza.Client/wwwroot/css/font/quicksand-v8-latin-500.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/02-customize-a-pizza/BlazingPizza.Client/wwwroot/css/font/quicksand-v8-latin-500.woff -------------------------------------------------------------------------------- /save-points/02-customize-a-pizza/BlazingPizza.Client/wwwroot/css/font/quicksand-v8-latin-500.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/02-customize-a-pizza/BlazingPizza.Client/wwwroot/css/font/quicksand-v8-latin-500.woff2 -------------------------------------------------------------------------------- /save-points/02-customize-a-pizza/BlazingPizza.Client/wwwroot/css/font/quicksand-v8-latin-700.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/02-customize-a-pizza/BlazingPizza.Client/wwwroot/css/font/quicksand-v8-latin-700.woff -------------------------------------------------------------------------------- /save-points/02-customize-a-pizza/BlazingPizza.Client/wwwroot/css/font/quicksand-v8-latin-700.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/02-customize-a-pizza/BlazingPizza.Client/wwwroot/css/font/quicksand-v8-latin-700.woff2 -------------------------------------------------------------------------------- /save-points/02-customize-a-pizza/BlazingPizza.Client/wwwroot/css/font/quicksand-v8-latin-regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/02-customize-a-pizza/BlazingPizza.Client/wwwroot/css/font/quicksand-v8-latin-regular.woff -------------------------------------------------------------------------------- /save-points/02-customize-a-pizza/BlazingPizza.Client/wwwroot/css/font/quicksand-v8-latin-regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/02-customize-a-pizza/BlazingPizza.Client/wwwroot/css/font/quicksand-v8-latin-regular.woff2 -------------------------------------------------------------------------------- /save-points/02-customize-a-pizza/BlazingPizza.Client/wwwroot/img/icon-512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/02-customize-a-pizza/BlazingPizza.Client/wwwroot/img/icon-512.png -------------------------------------------------------------------------------- /save-points/02-customize-a-pizza/BlazingPizza.Client/wwwroot/img/pizzas/bacon.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/02-customize-a-pizza/BlazingPizza.Client/wwwroot/img/pizzas/bacon.jpg -------------------------------------------------------------------------------- /save-points/02-customize-a-pizza/BlazingPizza.Client/wwwroot/img/pizzas/brit.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/02-customize-a-pizza/BlazingPizza.Client/wwwroot/img/pizzas/brit.jpg -------------------------------------------------------------------------------- /save-points/02-customize-a-pizza/BlazingPizza.Client/wwwroot/img/pizzas/cheese.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/02-customize-a-pizza/BlazingPizza.Client/wwwroot/img/pizzas/cheese.jpg -------------------------------------------------------------------------------- /save-points/02-customize-a-pizza/BlazingPizza.Client/wwwroot/img/pizzas/margherita.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/02-customize-a-pizza/BlazingPizza.Client/wwwroot/img/pizzas/margherita.jpg -------------------------------------------------------------------------------- /save-points/02-customize-a-pizza/BlazingPizza.Client/wwwroot/img/pizzas/meaty.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/02-customize-a-pizza/BlazingPizza.Client/wwwroot/img/pizzas/meaty.jpg -------------------------------------------------------------------------------- /save-points/02-customize-a-pizza/BlazingPizza.Client/wwwroot/img/pizzas/mushroom.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/02-customize-a-pizza/BlazingPizza.Client/wwwroot/img/pizzas/mushroom.jpg -------------------------------------------------------------------------------- /save-points/02-customize-a-pizza/BlazingPizza.Client/wwwroot/img/pizzas/pepperoni.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/02-customize-a-pizza/BlazingPizza.Client/wwwroot/img/pizzas/pepperoni.jpg -------------------------------------------------------------------------------- /save-points/02-customize-a-pizza/BlazingPizza.Client/wwwroot/img/pizzas/salad.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/02-customize-a-pizza/BlazingPizza.Client/wwwroot/img/pizzas/salad.jpg -------------------------------------------------------------------------------- /save-points/02-customize-a-pizza/BlazingPizza.ComponentsLibrary/ConfiguredPizzaItem.razor: -------------------------------------------------------------------------------- 1 | 
    2 | x 3 |
    @(Pizza.Size)" @Pizza.Special.Name
    4 |
      5 | @foreach (var topping in Pizza.Toppings) 6 | { 7 |
    • + @topping.Topping.Name
    • 8 | } 9 |
    10 |
    11 | @Pizza.GetFormattedTotalPrice() 12 |
    13 |
    14 | 15 | @code { 16 | [Parameter] public Pizza Pizza { get; set; } 17 | [Parameter] public EventCallback OnRemoved { get; set; } 18 | } -------------------------------------------------------------------------------- /save-points/02-customize-a-pizza/BlazingPizza.ComponentsLibrary/PizzaCard.razor: -------------------------------------------------------------------------------- 1 | 
  • 2 |
    3 | @Special.Name 4 | @Special.Description 5 | @Special.GetFormattedBasePrice() 6 |
    7 |
  • 8 | 9 | @code { 10 | [Parameter] public PizzaSpecial Special { get; set; } 11 | [Parameter] public EventCallback OnClick { get; set; } 12 | } -------------------------------------------------------------------------------- /save-points/02-customize-a-pizza/BlazingPizza.ComponentsLibrary/_Imports.razor: -------------------------------------------------------------------------------- 1 | @using Microsoft.AspNetCore.Authorization 2 | @using Microsoft.AspNetCore.Components.Forms 3 | @using Microsoft.AspNetCore.Components.Routing 4 | @using Microsoft.AspNetCore.Components.Web 5 | @using Microsoft.JSInterop 6 | @using BlazingPizza 7 | @using BlazingPizza.ComponentsLibrary 8 | @using BlazingPizza.Maps 9 | -------------------------------------------------------------------------------- /save-points/02-customize-a-pizza/BlazingPizza.ComponentsLibrary/wwwroot/leaflet/images/layers-2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/02-customize-a-pizza/BlazingPizza.ComponentsLibrary/wwwroot/leaflet/images/layers-2x.png -------------------------------------------------------------------------------- /save-points/02-customize-a-pizza/BlazingPizza.ComponentsLibrary/wwwroot/leaflet/images/layers.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/02-customize-a-pizza/BlazingPizza.ComponentsLibrary/wwwroot/leaflet/images/layers.png -------------------------------------------------------------------------------- /save-points/02-customize-a-pizza/BlazingPizza.ComponentsLibrary/wwwroot/leaflet/images/marker-icon-2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/02-customize-a-pizza/BlazingPizza.ComponentsLibrary/wwwroot/leaflet/images/marker-icon-2x.png -------------------------------------------------------------------------------- /save-points/02-customize-a-pizza/BlazingPizza.ComponentsLibrary/wwwroot/leaflet/images/marker-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/02-customize-a-pizza/BlazingPizza.ComponentsLibrary/wwwroot/leaflet/images/marker-icon.png -------------------------------------------------------------------------------- /save-points/02-customize-a-pizza/BlazingPizza.ComponentsLibrary/wwwroot/leaflet/images/marker-shadow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/02-customize-a-pizza/BlazingPizza.ComponentsLibrary/wwwroot/leaflet/images/marker-shadow.png -------------------------------------------------------------------------------- /save-points/02-customize-a-pizza/BlazingPizza.ComponentsLibrary/wwwroot/localStorage.js: -------------------------------------------------------------------------------- 1 | (function () { 2 | window.blazorLocalStorage = { 3 | get: key => key in localStorage ? JSON.parse(localStorage[key]) : null, 4 | set: (key, value) => { localStorage[key] = JSON.stringify(value); }, 5 | delete: key => { delete localStorage[key]; } 6 | }; 7 | })(); 8 | -------------------------------------------------------------------------------- /save-points/02-customize-a-pizza/BlazingPizza.Server/PizzaStoreUser.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.AspNetCore.Identity; 2 | 3 | namespace BlazingPizza.Server 4 | { 5 | public class PizzaStoreUser : IdentityUser 6 | { 7 | } 8 | } -------------------------------------------------------------------------------- /save-points/02-customize-a-pizza/BlazingPizza.Server/PizzasController.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.AspNetCore.Mvc; 2 | 3 | namespace BlazingPizza.Server 4 | { 5 | [Route("pizzas")] 6 | [ApiController] 7 | public class PizzasController : Controller 8 | { 9 | private readonly PizzaStoreContext _db; 10 | 11 | public PizzasController(PizzaStoreContext db) 12 | { 13 | _db = db; 14 | } 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /save-points/02-customize-a-pizza/BlazingPizza.Server/appsettings.Development.json: -------------------------------------------------------------------------------- 1 | { 2 | "Logging": { 3 | "LogLevel": { 4 | "Default": "Debug", 5 | "System": "Information", 6 | "Microsoft": "Information" 7 | } 8 | }, 9 | "IdentityServer": { 10 | "Key": { 11 | "Type": "Development" 12 | } 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /save-points/02-customize-a-pizza/BlazingPizza.Server/appsettings.json: -------------------------------------------------------------------------------- 1 | { 2 | "Logging": { 3 | "LogLevel": { 4 | "Default": "Warning" 5 | } 6 | }, 7 | "IdentityServer": { 8 | "Clients": { 9 | "BlazingPizza.Client": { 10 | "Profile": "IdentityServerSPA" 11 | } 12 | } 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /save-points/02-customize-a-pizza/BlazingPizza.Shared/Address.cs: -------------------------------------------------------------------------------- 1 | using System.ComponentModel.DataAnnotations; 2 | 3 | namespace BlazingPizza 4 | { 5 | public class Address 6 | { 7 | public int Id { get; set; } 8 | 9 | public string Name { get; set; } 10 | 11 | public string Line1 { get; set; } 12 | 13 | public string Line2 { get; set; } 14 | 15 | public string City { get; set; } 16 | 17 | public string Region { get; set; } 18 | 19 | public string PostalCode { get; set; } 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /save-points/02-customize-a-pizza/BlazingPizza.Shared/BlazingPizza.Shared.csproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | net6.0 5 | BlazingPizza 6 | 9.0 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /save-points/02-customize-a-pizza/BlazingPizza.Shared/Maps/Marker.cs: -------------------------------------------------------------------------------- 1 | namespace BlazingPizza.Maps 2 | { 3 | public class Marker 4 | { 5 | public string Description { get; set; } 6 | 7 | public double X { get; set; } 8 | 9 | public double Y { get; set; } 10 | 11 | public bool ShowPopup { get; set; } 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /save-points/02-customize-a-pizza/BlazingPizza.Shared/Maps/Point.cs: -------------------------------------------------------------------------------- 1 | namespace BlazingPizza.Maps 2 | { 3 | public class Point 4 | { 5 | public double X { get; set; } 6 | 7 | public double Y { get; set; } 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /save-points/02-customize-a-pizza/BlazingPizza.Shared/NotificationSubscription.cs: -------------------------------------------------------------------------------- 1 | using System.ComponentModel.DataAnnotations; 2 | 3 | namespace BlazingPizza 4 | { 5 | public class NotificationSubscription 6 | { 7 | public int NotificationSubscriptionId { get; set; } 8 | 9 | public string UserId { get; set; } 10 | 11 | public string Url { get; set; } 12 | 13 | public string P256dh { get; set; } 14 | 15 | public string Auth { get; set; } 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /save-points/02-customize-a-pizza/BlazingPizza.Shared/PizzaSpecial.cs: -------------------------------------------------------------------------------- 1 | namespace BlazingPizza 2 | { 3 | /// 4 | /// Represents a pre-configured template for a pizza a user can order 5 | /// 6 | public class PizzaSpecial 7 | { 8 | public int Id { get; set; } 9 | 10 | public string Name { get; set; } 11 | 12 | public decimal BasePrice { get; set; } 13 | 14 | public string Description { get; set; } 15 | 16 | public string ImageUrl { get; set; } 17 | 18 | public string GetFormattedBasePrice() => BasePrice.ToString("0.00"); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /save-points/02-customize-a-pizza/BlazingPizza.Shared/PizzaTopping.cs: -------------------------------------------------------------------------------- 1 | namespace BlazingPizza 2 | { 3 | public class PizzaTopping 4 | { 5 | public Topping Topping { get; set; } 6 | 7 | public int ToppingId { get; set; } 8 | 9 | public int PizzaId { get; set; } 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /save-points/02-customize-a-pizza/BlazingPizza.Shared/Topping.cs: -------------------------------------------------------------------------------- 1 | namespace BlazingPizza 2 | { 3 | public class Topping 4 | { 5 | public int Id { get; set; } 6 | 7 | public string Name { get; set; } 8 | 9 | public decimal Price { get; set; } 10 | 11 | public string GetFormattedPrice() => Price.ToString("0.00"); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /save-points/02-customize-a-pizza/BlazingPizza.Shared/UserInfo.cs: -------------------------------------------------------------------------------- 1 | namespace BlazingPizza 2 | { 3 | public class UserInfo 4 | { 5 | public bool IsAuthenticated { get; set; } 6 | 7 | public string Name { get; set; } 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /save-points/03-show-order-status/BlazingPizza.Client/App.razor: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | 7 |
    Sorry, there's nothing at this address.
    8 |
    9 |
    10 |
    11 | -------------------------------------------------------------------------------- /save-points/03-show-order-status/BlazingPizza.Client/Shared/MainLayout.razor: -------------------------------------------------------------------------------- 1 | @inherits LayoutComponentBase 2 | 3 |
    4 | 7 | 8 | 9 | 10 |
    Get Pizza
    11 |
    12 | 13 | 14 |
    My Orders
    15 |
    16 |
    17 | 18 |
    19 | @Body 20 |
    -------------------------------------------------------------------------------- /save-points/03-show-order-status/BlazingPizza.Client/wwwroot/css/font/quicksand-v8-latin-300.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/03-show-order-status/BlazingPizza.Client/wwwroot/css/font/quicksand-v8-latin-300.woff -------------------------------------------------------------------------------- /save-points/03-show-order-status/BlazingPizza.Client/wwwroot/css/font/quicksand-v8-latin-300.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/03-show-order-status/BlazingPizza.Client/wwwroot/css/font/quicksand-v8-latin-300.woff2 -------------------------------------------------------------------------------- /save-points/03-show-order-status/BlazingPizza.Client/wwwroot/css/font/quicksand-v8-latin-500.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/03-show-order-status/BlazingPizza.Client/wwwroot/css/font/quicksand-v8-latin-500.woff -------------------------------------------------------------------------------- /save-points/03-show-order-status/BlazingPizza.Client/wwwroot/css/font/quicksand-v8-latin-500.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/03-show-order-status/BlazingPizza.Client/wwwroot/css/font/quicksand-v8-latin-500.woff2 -------------------------------------------------------------------------------- /save-points/03-show-order-status/BlazingPizza.Client/wwwroot/css/font/quicksand-v8-latin-700.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/03-show-order-status/BlazingPizza.Client/wwwroot/css/font/quicksand-v8-latin-700.woff -------------------------------------------------------------------------------- /save-points/03-show-order-status/BlazingPizza.Client/wwwroot/css/font/quicksand-v8-latin-700.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/03-show-order-status/BlazingPizza.Client/wwwroot/css/font/quicksand-v8-latin-700.woff2 -------------------------------------------------------------------------------- /save-points/03-show-order-status/BlazingPizza.Client/wwwroot/css/font/quicksand-v8-latin-regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/03-show-order-status/BlazingPizza.Client/wwwroot/css/font/quicksand-v8-latin-regular.woff -------------------------------------------------------------------------------- /save-points/03-show-order-status/BlazingPizza.Client/wwwroot/css/font/quicksand-v8-latin-regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/03-show-order-status/BlazingPizza.Client/wwwroot/css/font/quicksand-v8-latin-regular.woff2 -------------------------------------------------------------------------------- /save-points/03-show-order-status/BlazingPizza.Client/wwwroot/img/icon-512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/03-show-order-status/BlazingPizza.Client/wwwroot/img/icon-512.png -------------------------------------------------------------------------------- /save-points/03-show-order-status/BlazingPizza.Client/wwwroot/img/pizzas/bacon.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/03-show-order-status/BlazingPizza.Client/wwwroot/img/pizzas/bacon.jpg -------------------------------------------------------------------------------- /save-points/03-show-order-status/BlazingPizza.Client/wwwroot/img/pizzas/brit.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/03-show-order-status/BlazingPizza.Client/wwwroot/img/pizzas/brit.jpg -------------------------------------------------------------------------------- /save-points/03-show-order-status/BlazingPizza.Client/wwwroot/img/pizzas/cheese.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/03-show-order-status/BlazingPizza.Client/wwwroot/img/pizzas/cheese.jpg -------------------------------------------------------------------------------- /save-points/03-show-order-status/BlazingPizza.Client/wwwroot/img/pizzas/margherita.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/03-show-order-status/BlazingPizza.Client/wwwroot/img/pizzas/margherita.jpg -------------------------------------------------------------------------------- /save-points/03-show-order-status/BlazingPizza.Client/wwwroot/img/pizzas/meaty.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/03-show-order-status/BlazingPizza.Client/wwwroot/img/pizzas/meaty.jpg -------------------------------------------------------------------------------- /save-points/03-show-order-status/BlazingPizza.Client/wwwroot/img/pizzas/mushroom.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/03-show-order-status/BlazingPizza.Client/wwwroot/img/pizzas/mushroom.jpg -------------------------------------------------------------------------------- /save-points/03-show-order-status/BlazingPizza.Client/wwwroot/img/pizzas/pepperoni.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/03-show-order-status/BlazingPizza.Client/wwwroot/img/pizzas/pepperoni.jpg -------------------------------------------------------------------------------- /save-points/03-show-order-status/BlazingPizza.Client/wwwroot/img/pizzas/salad.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/03-show-order-status/BlazingPizza.Client/wwwroot/img/pizzas/salad.jpg -------------------------------------------------------------------------------- /save-points/03-show-order-status/BlazingPizza.ComponentsLibrary/ConfiguredPizzaItem.razor: -------------------------------------------------------------------------------- 1 | 
    2 | x 3 |
    @(Pizza.Size)" @Pizza.Special.Name
    4 |
      5 | @foreach (var topping in Pizza.Toppings) 6 | { 7 |
    • + @topping.Topping.Name
    • 8 | } 9 |
    10 |
    11 | @Pizza.GetFormattedTotalPrice() 12 |
    13 |
    14 | 15 | @code { 16 | [Parameter] public Pizza Pizza { get; set; } 17 | [Parameter] public EventCallback OnRemoved { get; set; } 18 | } -------------------------------------------------------------------------------- /save-points/03-show-order-status/BlazingPizza.ComponentsLibrary/PizzaCard.razor: -------------------------------------------------------------------------------- 1 | 
  • 2 |
    3 | @Special.Name 4 | @Special.Description 5 | @Special.GetFormattedBasePrice() 6 |
    7 |
  • 8 | 9 | @code { 10 | [Parameter] public PizzaSpecial Special { get; set; } 11 | [Parameter] public EventCallback OnClick { get; set; } 12 | } -------------------------------------------------------------------------------- /save-points/03-show-order-status/BlazingPizza.ComponentsLibrary/_Imports.razor: -------------------------------------------------------------------------------- 1 | @using Microsoft.AspNetCore.Authorization 2 | @using Microsoft.AspNetCore.Components.Forms 3 | @using Microsoft.AspNetCore.Components.Routing 4 | @using Microsoft.AspNetCore.Components.Web 5 | @using Microsoft.JSInterop 6 | @using BlazingPizza 7 | @using BlazingPizza.ComponentsLibrary 8 | @using BlazingPizza.Maps -------------------------------------------------------------------------------- /save-points/03-show-order-status/BlazingPizza.ComponentsLibrary/wwwroot/leaflet/images/layers-2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/03-show-order-status/BlazingPizza.ComponentsLibrary/wwwroot/leaflet/images/layers-2x.png -------------------------------------------------------------------------------- /save-points/03-show-order-status/BlazingPizza.ComponentsLibrary/wwwroot/leaflet/images/layers.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/03-show-order-status/BlazingPizza.ComponentsLibrary/wwwroot/leaflet/images/layers.png -------------------------------------------------------------------------------- /save-points/03-show-order-status/BlazingPizza.ComponentsLibrary/wwwroot/leaflet/images/marker-icon-2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/03-show-order-status/BlazingPizza.ComponentsLibrary/wwwroot/leaflet/images/marker-icon-2x.png -------------------------------------------------------------------------------- /save-points/03-show-order-status/BlazingPizza.ComponentsLibrary/wwwroot/leaflet/images/marker-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/03-show-order-status/BlazingPizza.ComponentsLibrary/wwwroot/leaflet/images/marker-icon.png -------------------------------------------------------------------------------- /save-points/03-show-order-status/BlazingPizza.ComponentsLibrary/wwwroot/leaflet/images/marker-shadow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/03-show-order-status/BlazingPizza.ComponentsLibrary/wwwroot/leaflet/images/marker-shadow.png -------------------------------------------------------------------------------- /save-points/03-show-order-status/BlazingPizza.ComponentsLibrary/wwwroot/localStorage.js: -------------------------------------------------------------------------------- 1 | (function () { 2 | window.blazorLocalStorage = { 3 | get: key => key in localStorage ? JSON.parse(localStorage[key]) : null, 4 | set: (key, value) => { localStorage[key] = JSON.stringify(value); }, 5 | delete: key => { delete localStorage[key]; } 6 | }; 7 | })(); 8 | -------------------------------------------------------------------------------- /save-points/03-show-order-status/BlazingPizza.Server/PizzaStoreUser.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.AspNetCore.Identity; 2 | 3 | namespace BlazingPizza.Server 4 | { 5 | public class PizzaStoreUser : IdentityUser 6 | { 7 | } 8 | } -------------------------------------------------------------------------------- /save-points/03-show-order-status/BlazingPizza.Server/PizzasController.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.AspNetCore.Mvc; 2 | 3 | namespace BlazingPizza.Server 4 | { 5 | [Route("pizzas")] 6 | [ApiController] 7 | public class PizzasController : Controller 8 | { 9 | private readonly PizzaStoreContext _db; 10 | 11 | public PizzasController(PizzaStoreContext db) 12 | { 13 | _db = db; 14 | } 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /save-points/03-show-order-status/BlazingPizza.Server/appsettings.Development.json: -------------------------------------------------------------------------------- 1 | { 2 | "Logging": { 3 | "LogLevel": { 4 | "Default": "Debug", 5 | "System": "Information", 6 | "Microsoft": "Information" 7 | } 8 | }, 9 | "IdentityServer": { 10 | "Key": { 11 | "Type": "Development" 12 | } 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /save-points/03-show-order-status/BlazingPizza.Server/appsettings.json: -------------------------------------------------------------------------------- 1 | { 2 | "Logging": { 3 | "LogLevel": { 4 | "Default": "Warning" 5 | } 6 | }, 7 | "IdentityServer": { 8 | "Clients": { 9 | "BlazingPizza.Client": { 10 | "Profile": "IdentityServerSPA" 11 | } 12 | } 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /save-points/03-show-order-status/BlazingPizza.Shared/Address.cs: -------------------------------------------------------------------------------- 1 | using System.ComponentModel.DataAnnotations; 2 | 3 | namespace BlazingPizza 4 | { 5 | public class Address 6 | { 7 | public int Id { get; set; } 8 | 9 | public string Name { get; set; } 10 | 11 | public string Line1 { get; set; } 12 | 13 | public string Line2 { get; set; } 14 | 15 | public string City { get; set; } 16 | 17 | public string Region { get; set; } 18 | 19 | public string PostalCode { get; set; } 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /save-points/03-show-order-status/BlazingPizza.Shared/BlazingPizza.Shared.csproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | net6.0 5 | BlazingPizza 6 | 9.0 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /save-points/03-show-order-status/BlazingPizza.Shared/Maps/Marker.cs: -------------------------------------------------------------------------------- 1 | namespace BlazingPizza.Maps 2 | { 3 | public class Marker 4 | { 5 | public string Description { get; set; } 6 | 7 | public double X { get; set; } 8 | 9 | public double Y { get; set; } 10 | 11 | public bool ShowPopup { get; set; } 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /save-points/03-show-order-status/BlazingPizza.Shared/Maps/Point.cs: -------------------------------------------------------------------------------- 1 | namespace BlazingPizza.Maps 2 | { 3 | public class Point 4 | { 5 | public double X { get; set; } 6 | 7 | public double Y { get; set; } 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /save-points/03-show-order-status/BlazingPizza.Shared/NotificationSubscription.cs: -------------------------------------------------------------------------------- 1 | using System.ComponentModel.DataAnnotations; 2 | 3 | namespace BlazingPizza 4 | { 5 | public class NotificationSubscription 6 | { 7 | public int NotificationSubscriptionId { get; set; } 8 | 9 | public string UserId { get; set; } 10 | 11 | public string Url { get; set; } 12 | 13 | public string P256dh { get; set; } 14 | 15 | public string Auth { get; set; } 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /save-points/03-show-order-status/BlazingPizza.Shared/PizzaSpecial.cs: -------------------------------------------------------------------------------- 1 | namespace BlazingPizza 2 | { 3 | /// 4 | /// Represents a pre-configured template for a pizza a user can order 5 | /// 6 | public class PizzaSpecial 7 | { 8 | public int Id { get; set; } 9 | 10 | public string Name { get; set; } 11 | 12 | public decimal BasePrice { get; set; } 13 | 14 | public string Description { get; set; } 15 | 16 | public string ImageUrl { get; set; } 17 | 18 | public string GetFormattedBasePrice() => BasePrice.ToString("0.00"); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /save-points/03-show-order-status/BlazingPizza.Shared/PizzaTopping.cs: -------------------------------------------------------------------------------- 1 | namespace BlazingPizza 2 | { 3 | public class PizzaTopping 4 | { 5 | public Topping Topping { get; set; } 6 | 7 | public int ToppingId { get; set; } 8 | 9 | public int PizzaId { get; set; } 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /save-points/03-show-order-status/BlazingPizza.Shared/Topping.cs: -------------------------------------------------------------------------------- 1 | namespace BlazingPizza 2 | { 3 | public class Topping 4 | { 5 | public int Id { get; set; } 6 | 7 | public string Name { get; set; } 8 | 9 | public decimal Price { get; set; } 10 | 11 | public string GetFormattedPrice() => Price.ToString("0.00"); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /save-points/03-show-order-status/BlazingPizza.Shared/UserInfo.cs: -------------------------------------------------------------------------------- 1 | namespace BlazingPizza 2 | { 3 | public class UserInfo 4 | { 5 | public bool IsAuthenticated { get; set; } 6 | 7 | public string Name { get; set; } 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /save-points/03-show-order-status/BlazingPizza.Tests/ComponentLibrary/OrderReviewTests.razor: -------------------------------------------------------------------------------- 1 | @inherits TestContext 2 | @code 3 | { 4 | [Theory, AutoData] 5 | public void OrderView_Lists_All_Toppings_In_Per_Pizza(Order order) 6 | { 7 | var totalTopping = order.Pizzas.SelectMany(x=>x.Toppings).Count(); 8 | var cut = Render(@); 9 | 10 | var toppings = cut.FindAll("ul li"); 11 | 12 | toppings.Should().HaveCount(totalTopping); 13 | } 14 | } -------------------------------------------------------------------------------- /save-points/04-refactor-state-management/BlazingPizza.Client/App.razor: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | 7 |
    Sorry, there's nothing at this address.
    8 |
    9 |
    10 |
    11 | -------------------------------------------------------------------------------- /save-points/04-refactor-state-management/BlazingPizza.Client/Shared/MainLayout.razor: -------------------------------------------------------------------------------- 1 | @inherits LayoutComponentBase 2 | 3 |
    4 | 7 | 8 | 9 | 10 |
    Get Pizza
    11 |
    12 | 13 | 14 |
    My Orders
    15 |
    16 |
    17 | 18 |
    19 | @Body 20 |
    -------------------------------------------------------------------------------- /save-points/04-refactor-state-management/BlazingPizza.Client/wwwroot/css/font/quicksand-v8-latin-300.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/04-refactor-state-management/BlazingPizza.Client/wwwroot/css/font/quicksand-v8-latin-300.woff -------------------------------------------------------------------------------- /save-points/04-refactor-state-management/BlazingPizza.Client/wwwroot/css/font/quicksand-v8-latin-300.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/04-refactor-state-management/BlazingPizza.Client/wwwroot/css/font/quicksand-v8-latin-300.woff2 -------------------------------------------------------------------------------- /save-points/04-refactor-state-management/BlazingPizza.Client/wwwroot/css/font/quicksand-v8-latin-500.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/04-refactor-state-management/BlazingPizza.Client/wwwroot/css/font/quicksand-v8-latin-500.woff -------------------------------------------------------------------------------- /save-points/04-refactor-state-management/BlazingPizza.Client/wwwroot/css/font/quicksand-v8-latin-500.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/04-refactor-state-management/BlazingPizza.Client/wwwroot/css/font/quicksand-v8-latin-500.woff2 -------------------------------------------------------------------------------- /save-points/04-refactor-state-management/BlazingPizza.Client/wwwroot/css/font/quicksand-v8-latin-700.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/04-refactor-state-management/BlazingPizza.Client/wwwroot/css/font/quicksand-v8-latin-700.woff -------------------------------------------------------------------------------- /save-points/04-refactor-state-management/BlazingPizza.Client/wwwroot/css/font/quicksand-v8-latin-700.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/04-refactor-state-management/BlazingPizza.Client/wwwroot/css/font/quicksand-v8-latin-700.woff2 -------------------------------------------------------------------------------- /save-points/04-refactor-state-management/BlazingPizza.Client/wwwroot/css/font/quicksand-v8-latin-regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/04-refactor-state-management/BlazingPizza.Client/wwwroot/css/font/quicksand-v8-latin-regular.woff -------------------------------------------------------------------------------- /save-points/04-refactor-state-management/BlazingPizza.Client/wwwroot/css/font/quicksand-v8-latin-regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/04-refactor-state-management/BlazingPizza.Client/wwwroot/css/font/quicksand-v8-latin-regular.woff2 -------------------------------------------------------------------------------- /save-points/04-refactor-state-management/BlazingPizza.Client/wwwroot/img/icon-512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/04-refactor-state-management/BlazingPizza.Client/wwwroot/img/icon-512.png -------------------------------------------------------------------------------- /save-points/04-refactor-state-management/BlazingPizza.Client/wwwroot/img/pizzas/bacon.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/04-refactor-state-management/BlazingPizza.Client/wwwroot/img/pizzas/bacon.jpg -------------------------------------------------------------------------------- /save-points/04-refactor-state-management/BlazingPizza.Client/wwwroot/img/pizzas/brit.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/04-refactor-state-management/BlazingPizza.Client/wwwroot/img/pizzas/brit.jpg -------------------------------------------------------------------------------- /save-points/04-refactor-state-management/BlazingPizza.Client/wwwroot/img/pizzas/cheese.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/04-refactor-state-management/BlazingPizza.Client/wwwroot/img/pizzas/cheese.jpg -------------------------------------------------------------------------------- /save-points/04-refactor-state-management/BlazingPizza.Client/wwwroot/img/pizzas/margherita.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/04-refactor-state-management/BlazingPizza.Client/wwwroot/img/pizzas/margherita.jpg -------------------------------------------------------------------------------- /save-points/04-refactor-state-management/BlazingPizza.Client/wwwroot/img/pizzas/meaty.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/04-refactor-state-management/BlazingPizza.Client/wwwroot/img/pizzas/meaty.jpg -------------------------------------------------------------------------------- /save-points/04-refactor-state-management/BlazingPizza.Client/wwwroot/img/pizzas/mushroom.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/04-refactor-state-management/BlazingPizza.Client/wwwroot/img/pizzas/mushroom.jpg -------------------------------------------------------------------------------- /save-points/04-refactor-state-management/BlazingPizza.Client/wwwroot/img/pizzas/pepperoni.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/04-refactor-state-management/BlazingPizza.Client/wwwroot/img/pizzas/pepperoni.jpg -------------------------------------------------------------------------------- /save-points/04-refactor-state-management/BlazingPizza.Client/wwwroot/img/pizzas/salad.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/04-refactor-state-management/BlazingPizza.Client/wwwroot/img/pizzas/salad.jpg -------------------------------------------------------------------------------- /save-points/04-refactor-state-management/BlazingPizza.ComponentsLibrary/PizzaCard.razor: -------------------------------------------------------------------------------- 1 | 
  • 2 |
    3 | @Special.Name 4 | @Special.Description 5 | @Special.GetFormattedBasePrice() 6 |
    7 |
  • 8 | 9 | @code { 10 | [Parameter] public PizzaSpecial Special { get; set; } 11 | [Parameter] public EventCallback OnClick { get; set; } 12 | } -------------------------------------------------------------------------------- /save-points/04-refactor-state-management/BlazingPizza.ComponentsLibrary/_Imports.razor: -------------------------------------------------------------------------------- 1 | @using Microsoft.AspNetCore.Authorization 2 | @using Microsoft.AspNetCore.Components.Forms 3 | @using Microsoft.AspNetCore.Components.Routing 4 | @using Microsoft.AspNetCore.Components.Web 5 | @using Microsoft.JSInterop 6 | @using BlazingPizza 7 | @using BlazingPizza.ComponentsLibrary 8 | @using BlazingPizza.Maps -------------------------------------------------------------------------------- /save-points/04-refactor-state-management/BlazingPizza.ComponentsLibrary/wwwroot/leaflet/images/layers-2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/04-refactor-state-management/BlazingPizza.ComponentsLibrary/wwwroot/leaflet/images/layers-2x.png -------------------------------------------------------------------------------- /save-points/04-refactor-state-management/BlazingPizza.ComponentsLibrary/wwwroot/leaflet/images/layers.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/04-refactor-state-management/BlazingPizza.ComponentsLibrary/wwwroot/leaflet/images/layers.png -------------------------------------------------------------------------------- /save-points/04-refactor-state-management/BlazingPizza.ComponentsLibrary/wwwroot/leaflet/images/marker-icon-2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/04-refactor-state-management/BlazingPizza.ComponentsLibrary/wwwroot/leaflet/images/marker-icon-2x.png -------------------------------------------------------------------------------- /save-points/04-refactor-state-management/BlazingPizza.ComponentsLibrary/wwwroot/leaflet/images/marker-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/04-refactor-state-management/BlazingPizza.ComponentsLibrary/wwwroot/leaflet/images/marker-icon.png -------------------------------------------------------------------------------- /save-points/04-refactor-state-management/BlazingPizza.ComponentsLibrary/wwwroot/leaflet/images/marker-shadow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/04-refactor-state-management/BlazingPizza.ComponentsLibrary/wwwroot/leaflet/images/marker-shadow.png -------------------------------------------------------------------------------- /save-points/04-refactor-state-management/BlazingPizza.ComponentsLibrary/wwwroot/localStorage.js: -------------------------------------------------------------------------------- 1 | (function () { 2 | window.blazorLocalStorage = { 3 | get: key => key in localStorage ? JSON.parse(localStorage[key]) : null, 4 | set: (key, value) => { localStorage[key] = JSON.stringify(value); }, 5 | delete: key => { delete localStorage[key]; } 6 | }; 7 | })(); 8 | -------------------------------------------------------------------------------- /save-points/04-refactor-state-management/BlazingPizza.Server/PizzaStoreUser.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.AspNetCore.Identity; 2 | 3 | namespace BlazingPizza.Server 4 | { 5 | public class PizzaStoreUser : IdentityUser 6 | { 7 | } 8 | } -------------------------------------------------------------------------------- /save-points/04-refactor-state-management/BlazingPizza.Server/PizzasController.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.AspNetCore.Mvc; 2 | 3 | namespace BlazingPizza.Server 4 | { 5 | [Route("pizzas")] 6 | [ApiController] 7 | public class PizzasController : Controller 8 | { 9 | private readonly PizzaStoreContext _db; 10 | 11 | public PizzasController(PizzaStoreContext db) 12 | { 13 | _db = db; 14 | } 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /save-points/04-refactor-state-management/BlazingPizza.Server/appsettings.Development.json: -------------------------------------------------------------------------------- 1 | { 2 | "Logging": { 3 | "LogLevel": { 4 | "Default": "Debug", 5 | "System": "Information", 6 | "Microsoft": "Information" 7 | } 8 | }, 9 | "IdentityServer": { 10 | "Key": { 11 | "Type": "Development" 12 | } 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /save-points/04-refactor-state-management/BlazingPizza.Server/appsettings.json: -------------------------------------------------------------------------------- 1 | { 2 | "Logging": { 3 | "LogLevel": { 4 | "Default": "Warning" 5 | } 6 | }, 7 | "IdentityServer": { 8 | "Clients": { 9 | "BlazingPizza.Client": { 10 | "Profile": "IdentityServerSPA" 11 | } 12 | } 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /save-points/04-refactor-state-management/BlazingPizza.Shared/Address.cs: -------------------------------------------------------------------------------- 1 | using System.ComponentModel.DataAnnotations; 2 | 3 | namespace BlazingPizza 4 | { 5 | public class Address 6 | { 7 | public int Id { get; set; } 8 | 9 | public string Name { get; set; } 10 | 11 | public string Line1 { get; set; } 12 | 13 | public string Line2 { get; set; } 14 | 15 | public string City { get; set; } 16 | 17 | public string Region { get; set; } 18 | 19 | public string PostalCode { get; set; } 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /save-points/04-refactor-state-management/BlazingPizza.Shared/BlazingPizza.Shared.csproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | net6.0 5 | BlazingPizza 6 | 9.0 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /save-points/04-refactor-state-management/BlazingPizza.Shared/Maps/Marker.cs: -------------------------------------------------------------------------------- 1 | namespace BlazingPizza.Maps 2 | { 3 | public class Marker 4 | { 5 | public string Description { get; set; } 6 | 7 | public double X { get; set; } 8 | 9 | public double Y { get; set; } 10 | 11 | public bool ShowPopup { get; set; } 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /save-points/04-refactor-state-management/BlazingPizza.Shared/Maps/Point.cs: -------------------------------------------------------------------------------- 1 | namespace BlazingPizza.Maps 2 | { 3 | public class Point 4 | { 5 | public double X { get; set; } 6 | 7 | public double Y { get; set; } 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /save-points/04-refactor-state-management/BlazingPizza.Shared/NotificationSubscription.cs: -------------------------------------------------------------------------------- 1 | using System.ComponentModel.DataAnnotations; 2 | 3 | namespace BlazingPizza 4 | { 5 | public class NotificationSubscription 6 | { 7 | public int NotificationSubscriptionId { get; set; } 8 | 9 | public string UserId { get; set; } 10 | 11 | public string Url { get; set; } 12 | 13 | public string P256dh { get; set; } 14 | 15 | public string Auth { get; set; } 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /save-points/04-refactor-state-management/BlazingPizza.Shared/PizzaSpecial.cs: -------------------------------------------------------------------------------- 1 | namespace BlazingPizza 2 | { 3 | /// 4 | /// Represents a pre-configured template for a pizza a user can order 5 | /// 6 | public class PizzaSpecial 7 | { 8 | public int Id { get; set; } 9 | 10 | public string Name { get; set; } 11 | 12 | public decimal BasePrice { get; set; } 13 | 14 | public string Description { get; set; } 15 | 16 | public string ImageUrl { get; set; } 17 | 18 | public string GetFormattedBasePrice() => BasePrice.ToString("0.00"); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /save-points/04-refactor-state-management/BlazingPizza.Shared/PizzaTopping.cs: -------------------------------------------------------------------------------- 1 | namespace BlazingPizza 2 | { 3 | public class PizzaTopping 4 | { 5 | public Topping Topping { get; set; } 6 | 7 | public int ToppingId { get; set; } 8 | 9 | public int PizzaId { get; set; } 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /save-points/04-refactor-state-management/BlazingPizza.Shared/Topping.cs: -------------------------------------------------------------------------------- 1 | namespace BlazingPizza 2 | { 3 | public class Topping 4 | { 5 | public int Id { get; set; } 6 | 7 | public string Name { get; set; } 8 | 9 | public decimal Price { get; set; } 10 | 11 | public string GetFormattedPrice() => Price.ToString("0.00"); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /save-points/04-refactor-state-management/BlazingPizza.Shared/UserInfo.cs: -------------------------------------------------------------------------------- 1 | namespace BlazingPizza 2 | { 3 | public class UserInfo 4 | { 5 | public bool IsAuthenticated { get; set; } 6 | 7 | public string Name { get; set; } 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /save-points/04-refactor-state-management/BlazingPizza.Tests/ComponentLibrary/OrderReviewTests.razor: -------------------------------------------------------------------------------- 1 | @inherits TestContext 2 | @code 3 | { 4 | [Theory, AutoData] 5 | public void OrderView_Lists_All_Toppings_In_Per_Pizza(Order order) 6 | { 7 | var totalTopping = order.Pizzas.SelectMany(x=>x.Toppings).Count(); 8 | var cut = Render(@); 9 | 10 | var toppings = cut.FindAll("ul li"); 11 | 12 | toppings.Should().HaveCount(totalTopping); 13 | } 14 | } -------------------------------------------------------------------------------- /save-points/05-checkout-with-validation/BlazingPizza.Client/App.razor: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | 7 |
    Sorry, there's nothing at this address.
    8 |
    9 |
    10 |
    11 | -------------------------------------------------------------------------------- /save-points/05-checkout-with-validation/BlazingPizza.Client/Shared/MainLayout.razor: -------------------------------------------------------------------------------- 1 | @inherits LayoutComponentBase 2 | 3 |
    4 | 7 | 8 | 9 | 10 |
    Get Pizza
    11 |
    12 | 13 | 14 |
    My Orders
    15 |
    16 |
    17 | 18 |
    19 | @Body 20 |
    -------------------------------------------------------------------------------- /save-points/05-checkout-with-validation/BlazingPizza.Client/wwwroot/css/font/quicksand-v8-latin-300.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/05-checkout-with-validation/BlazingPizza.Client/wwwroot/css/font/quicksand-v8-latin-300.woff -------------------------------------------------------------------------------- /save-points/05-checkout-with-validation/BlazingPizza.Client/wwwroot/css/font/quicksand-v8-latin-300.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/05-checkout-with-validation/BlazingPizza.Client/wwwroot/css/font/quicksand-v8-latin-300.woff2 -------------------------------------------------------------------------------- /save-points/05-checkout-with-validation/BlazingPizza.Client/wwwroot/css/font/quicksand-v8-latin-500.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/05-checkout-with-validation/BlazingPizza.Client/wwwroot/css/font/quicksand-v8-latin-500.woff -------------------------------------------------------------------------------- /save-points/05-checkout-with-validation/BlazingPizza.Client/wwwroot/css/font/quicksand-v8-latin-500.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/05-checkout-with-validation/BlazingPizza.Client/wwwroot/css/font/quicksand-v8-latin-500.woff2 -------------------------------------------------------------------------------- /save-points/05-checkout-with-validation/BlazingPizza.Client/wwwroot/css/font/quicksand-v8-latin-700.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/05-checkout-with-validation/BlazingPizza.Client/wwwroot/css/font/quicksand-v8-latin-700.woff -------------------------------------------------------------------------------- /save-points/05-checkout-with-validation/BlazingPizza.Client/wwwroot/css/font/quicksand-v8-latin-700.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/05-checkout-with-validation/BlazingPizza.Client/wwwroot/css/font/quicksand-v8-latin-700.woff2 -------------------------------------------------------------------------------- /save-points/05-checkout-with-validation/BlazingPizza.Client/wwwroot/css/font/quicksand-v8-latin-regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/05-checkout-with-validation/BlazingPizza.Client/wwwroot/css/font/quicksand-v8-latin-regular.woff -------------------------------------------------------------------------------- /save-points/05-checkout-with-validation/BlazingPizza.Client/wwwroot/css/font/quicksand-v8-latin-regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/05-checkout-with-validation/BlazingPizza.Client/wwwroot/css/font/quicksand-v8-latin-regular.woff2 -------------------------------------------------------------------------------- /save-points/05-checkout-with-validation/BlazingPizza.Client/wwwroot/img/icon-512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/05-checkout-with-validation/BlazingPizza.Client/wwwroot/img/icon-512.png -------------------------------------------------------------------------------- /save-points/05-checkout-with-validation/BlazingPizza.Client/wwwroot/img/pizzas/bacon.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/05-checkout-with-validation/BlazingPizza.Client/wwwroot/img/pizzas/bacon.jpg -------------------------------------------------------------------------------- /save-points/05-checkout-with-validation/BlazingPizza.Client/wwwroot/img/pizzas/brit.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/05-checkout-with-validation/BlazingPizza.Client/wwwroot/img/pizzas/brit.jpg -------------------------------------------------------------------------------- /save-points/05-checkout-with-validation/BlazingPizza.Client/wwwroot/img/pizzas/cheese.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/05-checkout-with-validation/BlazingPizza.Client/wwwroot/img/pizzas/cheese.jpg -------------------------------------------------------------------------------- /save-points/05-checkout-with-validation/BlazingPizza.Client/wwwroot/img/pizzas/margherita.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/05-checkout-with-validation/BlazingPizza.Client/wwwroot/img/pizzas/margherita.jpg -------------------------------------------------------------------------------- /save-points/05-checkout-with-validation/BlazingPizza.Client/wwwroot/img/pizzas/meaty.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/05-checkout-with-validation/BlazingPizza.Client/wwwroot/img/pizzas/meaty.jpg -------------------------------------------------------------------------------- /save-points/05-checkout-with-validation/BlazingPizza.Client/wwwroot/img/pizzas/mushroom.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/05-checkout-with-validation/BlazingPizza.Client/wwwroot/img/pizzas/mushroom.jpg -------------------------------------------------------------------------------- /save-points/05-checkout-with-validation/BlazingPizza.Client/wwwroot/img/pizzas/pepperoni.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/05-checkout-with-validation/BlazingPizza.Client/wwwroot/img/pizzas/pepperoni.jpg -------------------------------------------------------------------------------- /save-points/05-checkout-with-validation/BlazingPizza.Client/wwwroot/img/pizzas/salad.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/05-checkout-with-validation/BlazingPizza.Client/wwwroot/img/pizzas/salad.jpg -------------------------------------------------------------------------------- /save-points/05-checkout-with-validation/BlazingPizza.ComponentsLibrary/PizzaCard.razor: -------------------------------------------------------------------------------- 1 | 
  • 2 |
    3 | @Special.Name 4 | @Special.Description 5 | @Special.GetFormattedBasePrice() 6 |
    7 |
  • 8 | 9 | @code { 10 | [Parameter] public PizzaSpecial Special { get; set; } 11 | [Parameter] public EventCallback OnClick { get; set; } 12 | } -------------------------------------------------------------------------------- /save-points/05-checkout-with-validation/BlazingPizza.ComponentsLibrary/_Imports.razor: -------------------------------------------------------------------------------- 1 | @using Microsoft.AspNetCore.Authorization 2 | @using Microsoft.AspNetCore.Components.Forms 3 | @using Microsoft.AspNetCore.Components.Routing 4 | @using Microsoft.AspNetCore.Components.Web 5 | @using Microsoft.JSInterop 6 | @using BlazingPizza 7 | @using BlazingPizza.ComponentsLibrary 8 | @using BlazingPizza.Maps -------------------------------------------------------------------------------- /save-points/05-checkout-with-validation/BlazingPizza.ComponentsLibrary/wwwroot/leaflet/images/layers-2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/05-checkout-with-validation/BlazingPizza.ComponentsLibrary/wwwroot/leaflet/images/layers-2x.png -------------------------------------------------------------------------------- /save-points/05-checkout-with-validation/BlazingPizza.ComponentsLibrary/wwwroot/leaflet/images/layers.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/05-checkout-with-validation/BlazingPizza.ComponentsLibrary/wwwroot/leaflet/images/layers.png -------------------------------------------------------------------------------- /save-points/05-checkout-with-validation/BlazingPizza.ComponentsLibrary/wwwroot/leaflet/images/marker-icon-2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/05-checkout-with-validation/BlazingPizza.ComponentsLibrary/wwwroot/leaflet/images/marker-icon-2x.png -------------------------------------------------------------------------------- /save-points/05-checkout-with-validation/BlazingPizza.ComponentsLibrary/wwwroot/leaflet/images/marker-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/05-checkout-with-validation/BlazingPizza.ComponentsLibrary/wwwroot/leaflet/images/marker-icon.png -------------------------------------------------------------------------------- /save-points/05-checkout-with-validation/BlazingPizza.ComponentsLibrary/wwwroot/leaflet/images/marker-shadow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/05-checkout-with-validation/BlazingPizza.ComponentsLibrary/wwwroot/leaflet/images/marker-shadow.png -------------------------------------------------------------------------------- /save-points/05-checkout-with-validation/BlazingPizza.ComponentsLibrary/wwwroot/localStorage.js: -------------------------------------------------------------------------------- 1 | (function () { 2 | window.blazorLocalStorage = { 3 | get: key => key in localStorage ? JSON.parse(localStorage[key]) : null, 4 | set: (key, value) => { localStorage[key] = JSON.stringify(value); }, 5 | delete: key => { delete localStorage[key]; } 6 | }; 7 | })(); 8 | -------------------------------------------------------------------------------- /save-points/05-checkout-with-validation/BlazingPizza.Server/PizzaStoreUser.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.AspNetCore.Identity; 2 | 3 | namespace BlazingPizza.Server 4 | { 5 | public class PizzaStoreUser : IdentityUser 6 | { 7 | } 8 | } -------------------------------------------------------------------------------- /save-points/05-checkout-with-validation/BlazingPizza.Server/PizzasController.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.AspNetCore.Mvc; 2 | 3 | namespace BlazingPizza.Server 4 | { 5 | [Route("pizzas")] 6 | [ApiController] 7 | public class PizzasController : Controller 8 | { 9 | private readonly PizzaStoreContext _db; 10 | 11 | public PizzasController(PizzaStoreContext db) 12 | { 13 | _db = db; 14 | } 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /save-points/05-checkout-with-validation/BlazingPizza.Server/appsettings.Development.json: -------------------------------------------------------------------------------- 1 | { 2 | "Logging": { 3 | "LogLevel": { 4 | "Default": "Debug", 5 | "System": "Information", 6 | "Microsoft": "Information" 7 | } 8 | }, 9 | "IdentityServer": { 10 | "Key": { 11 | "Type": "Development" 12 | } 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /save-points/05-checkout-with-validation/BlazingPizza.Server/appsettings.json: -------------------------------------------------------------------------------- 1 | { 2 | "Logging": { 3 | "LogLevel": { 4 | "Default": "Warning" 5 | } 6 | }, 7 | "IdentityServer": { 8 | "Clients": { 9 | "BlazingPizza.Client": { 10 | "Profile": "IdentityServerSPA" 11 | } 12 | } 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /save-points/05-checkout-with-validation/BlazingPizza.Shared/BlazingPizza.Shared.csproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | net6.0 5 | BlazingPizza 6 | 9.0 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /save-points/05-checkout-with-validation/BlazingPizza.Shared/Maps/Marker.cs: -------------------------------------------------------------------------------- 1 | namespace BlazingPizza.Maps 2 | { 3 | public class Marker 4 | { 5 | public string Description { get; set; } 6 | 7 | public double X { get; set; } 8 | 9 | public double Y { get; set; } 10 | 11 | public bool ShowPopup { get; set; } 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /save-points/05-checkout-with-validation/BlazingPizza.Shared/Maps/Point.cs: -------------------------------------------------------------------------------- 1 | namespace BlazingPizza.Maps 2 | { 3 | public class Point 4 | { 5 | public double X { get; set; } 6 | 7 | public double Y { get; set; } 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /save-points/05-checkout-with-validation/BlazingPizza.Shared/NotificationSubscription.cs: -------------------------------------------------------------------------------- 1 | using System.ComponentModel.DataAnnotations; 2 | 3 | namespace BlazingPizza 4 | { 5 | public class NotificationSubscription 6 | { 7 | public int NotificationSubscriptionId { get; set; } 8 | 9 | public string UserId { get; set; } 10 | 11 | public string Url { get; set; } 12 | 13 | public string P256dh { get; set; } 14 | 15 | public string Auth { get; set; } 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /save-points/05-checkout-with-validation/BlazingPizza.Shared/PizzaSpecial.cs: -------------------------------------------------------------------------------- 1 | namespace BlazingPizza 2 | { 3 | /// 4 | /// Represents a pre-configured template for a pizza a user can order 5 | /// 6 | public class PizzaSpecial 7 | { 8 | public int Id { get; set; } 9 | 10 | public string Name { get; set; } 11 | 12 | public decimal BasePrice { get; set; } 13 | 14 | public string Description { get; set; } 15 | 16 | public string ImageUrl { get; set; } 17 | 18 | public string GetFormattedBasePrice() => BasePrice.ToString("0.00"); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /save-points/05-checkout-with-validation/BlazingPizza.Shared/PizzaTopping.cs: -------------------------------------------------------------------------------- 1 | namespace BlazingPizza 2 | { 3 | public class PizzaTopping 4 | { 5 | public Topping Topping { get; set; } 6 | 7 | public int ToppingId { get; set; } 8 | 9 | public int PizzaId { get; set; } 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /save-points/05-checkout-with-validation/BlazingPizza.Shared/Topping.cs: -------------------------------------------------------------------------------- 1 | namespace BlazingPizza 2 | { 3 | public class Topping 4 | { 5 | public int Id { get; set; } 6 | 7 | public string Name { get; set; } 8 | 9 | public decimal Price { get; set; } 10 | 11 | public string GetFormattedPrice() => Price.ToString("0.00"); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /save-points/05-checkout-with-validation/BlazingPizza.Shared/UserInfo.cs: -------------------------------------------------------------------------------- 1 | namespace BlazingPizza 2 | { 3 | public class UserInfo 4 | { 5 | public bool IsAuthenticated { get; set; } 6 | 7 | public string Name { get; set; } 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /save-points/05-checkout-with-validation/BlazingPizza.Tests/ComponentLibrary/OrderReviewTests.razor: -------------------------------------------------------------------------------- 1 | @inherits TestContext 2 | @code 3 | { 4 | [Theory, AutoData] 5 | public void OrderView_Lists_All_Toppings_In_Per_Pizza(Order order) 6 | { 7 | var totalTopping = order.Pizzas.SelectMany(x=>x.Toppings).Count(); 8 | var cut = Render(@); 9 | 10 | var toppings = cut.FindAll("ul li"); 11 | 12 | toppings.Should().HaveCount(totalTopping); 13 | } 14 | } -------------------------------------------------------------------------------- /save-points/06-authentication-and-authorization/BlazingPizza.Client/PizzaAuthenticationState.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.AspNetCore.Components.WebAssembly.Authentication; 2 | 3 | namespace BlazingPizza.Client 4 | { 5 | public class PizzaAuthenticationState : RemoteAuthenticationState 6 | { 7 | public Order Order { get; set; } 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /save-points/06-authentication-and-authorization/BlazingPizza.Client/Shared/RedirectToLogin.razor: -------------------------------------------------------------------------------- 1 | @inject NavigationManager Navigation 2 | @code { 3 | protected override void OnInitialized() 4 | { 5 | Navigation.NavigateTo($"authentication/login?returnUrl={Navigation.Uri}"); 6 | } 7 | } -------------------------------------------------------------------------------- /save-points/06-authentication-and-authorization/BlazingPizza.Client/wwwroot/css/font/quicksand-v8-latin-300.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/06-authentication-and-authorization/BlazingPizza.Client/wwwroot/css/font/quicksand-v8-latin-300.woff -------------------------------------------------------------------------------- /save-points/06-authentication-and-authorization/BlazingPizza.Client/wwwroot/css/font/quicksand-v8-latin-300.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/06-authentication-and-authorization/BlazingPizza.Client/wwwroot/css/font/quicksand-v8-latin-300.woff2 -------------------------------------------------------------------------------- /save-points/06-authentication-and-authorization/BlazingPizza.Client/wwwroot/css/font/quicksand-v8-latin-500.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/06-authentication-and-authorization/BlazingPizza.Client/wwwroot/css/font/quicksand-v8-latin-500.woff -------------------------------------------------------------------------------- /save-points/06-authentication-and-authorization/BlazingPizza.Client/wwwroot/css/font/quicksand-v8-latin-500.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/06-authentication-and-authorization/BlazingPizza.Client/wwwroot/css/font/quicksand-v8-latin-500.woff2 -------------------------------------------------------------------------------- /save-points/06-authentication-and-authorization/BlazingPizza.Client/wwwroot/css/font/quicksand-v8-latin-700.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/06-authentication-and-authorization/BlazingPizza.Client/wwwroot/css/font/quicksand-v8-latin-700.woff -------------------------------------------------------------------------------- /save-points/06-authentication-and-authorization/BlazingPizza.Client/wwwroot/css/font/quicksand-v8-latin-700.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/06-authentication-and-authorization/BlazingPizza.Client/wwwroot/css/font/quicksand-v8-latin-700.woff2 -------------------------------------------------------------------------------- /save-points/06-authentication-and-authorization/BlazingPizza.Client/wwwroot/css/font/quicksand-v8-latin-regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/06-authentication-and-authorization/BlazingPizza.Client/wwwroot/css/font/quicksand-v8-latin-regular.woff -------------------------------------------------------------------------------- /save-points/06-authentication-and-authorization/BlazingPizza.Client/wwwroot/css/font/quicksand-v8-latin-regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/06-authentication-and-authorization/BlazingPizza.Client/wwwroot/css/font/quicksand-v8-latin-regular.woff2 -------------------------------------------------------------------------------- /save-points/06-authentication-and-authorization/BlazingPizza.Client/wwwroot/img/icon-512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/06-authentication-and-authorization/BlazingPizza.Client/wwwroot/img/icon-512.png -------------------------------------------------------------------------------- /save-points/06-authentication-and-authorization/BlazingPizza.Client/wwwroot/img/pizzas/bacon.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/06-authentication-and-authorization/BlazingPizza.Client/wwwroot/img/pizzas/bacon.jpg -------------------------------------------------------------------------------- /save-points/06-authentication-and-authorization/BlazingPizza.Client/wwwroot/img/pizzas/brit.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/06-authentication-and-authorization/BlazingPizza.Client/wwwroot/img/pizzas/brit.jpg -------------------------------------------------------------------------------- /save-points/06-authentication-and-authorization/BlazingPizza.Client/wwwroot/img/pizzas/cheese.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/06-authentication-and-authorization/BlazingPizza.Client/wwwroot/img/pizzas/cheese.jpg -------------------------------------------------------------------------------- /save-points/06-authentication-and-authorization/BlazingPizza.Client/wwwroot/img/pizzas/margherita.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/06-authentication-and-authorization/BlazingPizza.Client/wwwroot/img/pizzas/margherita.jpg -------------------------------------------------------------------------------- /save-points/06-authentication-and-authorization/BlazingPizza.Client/wwwroot/img/pizzas/meaty.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/06-authentication-and-authorization/BlazingPizza.Client/wwwroot/img/pizzas/meaty.jpg -------------------------------------------------------------------------------- /save-points/06-authentication-and-authorization/BlazingPizza.Client/wwwroot/img/pizzas/mushroom.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/06-authentication-and-authorization/BlazingPizza.Client/wwwroot/img/pizzas/mushroom.jpg -------------------------------------------------------------------------------- /save-points/06-authentication-and-authorization/BlazingPizza.Client/wwwroot/img/pizzas/pepperoni.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/06-authentication-and-authorization/BlazingPizza.Client/wwwroot/img/pizzas/pepperoni.jpg -------------------------------------------------------------------------------- /save-points/06-authentication-and-authorization/BlazingPizza.Client/wwwroot/img/pizzas/salad.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/06-authentication-and-authorization/BlazingPizza.Client/wwwroot/img/pizzas/salad.jpg -------------------------------------------------------------------------------- /save-points/06-authentication-and-authorization/BlazingPizza.ComponentsLibrary/PizzaCard.razor: -------------------------------------------------------------------------------- 1 | 
  • 2 |
    3 | @Special.Name 4 | @Special.Description 5 | @Special.GetFormattedBasePrice() 6 |
    7 |
  • 8 | 9 | @code { 10 | [Parameter] public PizzaSpecial Special { get; set; } 11 | [Parameter] public EventCallback OnClick { get; set; } 12 | } -------------------------------------------------------------------------------- /save-points/06-authentication-and-authorization/BlazingPizza.ComponentsLibrary/_Imports.razor: -------------------------------------------------------------------------------- 1 | @using Microsoft.AspNetCore.Authorization 2 | @using Microsoft.AspNetCore.Components.Forms 3 | @using Microsoft.AspNetCore.Components.Routing 4 | @using Microsoft.AspNetCore.Components.Web 5 | @using Microsoft.JSInterop 6 | @using BlazingPizza 7 | @using BlazingPizza.ComponentsLibrary 8 | @using BlazingPizza.Maps -------------------------------------------------------------------------------- /save-points/06-authentication-and-authorization/BlazingPizza.ComponentsLibrary/wwwroot/leaflet/images/layers-2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/06-authentication-and-authorization/BlazingPizza.ComponentsLibrary/wwwroot/leaflet/images/layers-2x.png -------------------------------------------------------------------------------- /save-points/06-authentication-and-authorization/BlazingPizza.ComponentsLibrary/wwwroot/leaflet/images/layers.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/06-authentication-and-authorization/BlazingPizza.ComponentsLibrary/wwwroot/leaflet/images/layers.png -------------------------------------------------------------------------------- /save-points/06-authentication-and-authorization/BlazingPizza.ComponentsLibrary/wwwroot/leaflet/images/marker-icon-2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/06-authentication-and-authorization/BlazingPizza.ComponentsLibrary/wwwroot/leaflet/images/marker-icon-2x.png -------------------------------------------------------------------------------- /save-points/06-authentication-and-authorization/BlazingPizza.ComponentsLibrary/wwwroot/leaflet/images/marker-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/06-authentication-and-authorization/BlazingPizza.ComponentsLibrary/wwwroot/leaflet/images/marker-icon.png -------------------------------------------------------------------------------- /save-points/06-authentication-and-authorization/BlazingPizza.ComponentsLibrary/wwwroot/leaflet/images/marker-shadow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/06-authentication-and-authorization/BlazingPizza.ComponentsLibrary/wwwroot/leaflet/images/marker-shadow.png -------------------------------------------------------------------------------- /save-points/06-authentication-and-authorization/BlazingPizza.ComponentsLibrary/wwwroot/localStorage.js: -------------------------------------------------------------------------------- 1 | (function () { 2 | window.blazorLocalStorage = { 3 | get: key => key in localStorage ? JSON.parse(localStorage[key]) : null, 4 | set: (key, value) => { localStorage[key] = JSON.stringify(value); }, 5 | delete: key => { delete localStorage[key]; } 6 | }; 7 | })(); 8 | -------------------------------------------------------------------------------- /save-points/06-authentication-and-authorization/BlazingPizza.Server/PizzaStoreUser.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.AspNetCore.Identity; 2 | 3 | namespace BlazingPizza.Server 4 | { 5 | public class PizzaStoreUser : IdentityUser 6 | { 7 | } 8 | } -------------------------------------------------------------------------------- /save-points/06-authentication-and-authorization/BlazingPizza.Server/PizzasController.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.AspNetCore.Mvc; 2 | 3 | namespace BlazingPizza.Server 4 | { 5 | [Route("pizzas")] 6 | [ApiController] 7 | public class PizzasController : Controller 8 | { 9 | private readonly PizzaStoreContext _db; 10 | 11 | public PizzasController(PizzaStoreContext db) 12 | { 13 | _db = db; 14 | } 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /save-points/06-authentication-and-authorization/BlazingPizza.Server/appsettings.Development.json: -------------------------------------------------------------------------------- 1 | { 2 | "Logging": { 3 | "LogLevel": { 4 | "Default": "Debug", 5 | "System": "Information", 6 | "Microsoft": "Information" 7 | } 8 | }, 9 | "IdentityServer": { 10 | "Key": { 11 | "Type": "Development" 12 | } 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /save-points/06-authentication-and-authorization/BlazingPizza.Server/appsettings.json: -------------------------------------------------------------------------------- 1 | { 2 | "Logging": { 3 | "LogLevel": { 4 | "Default": "Warning" 5 | } 6 | }, 7 | "IdentityServer": { 8 | "Clients": { 9 | "BlazingPizza.Client": { 10 | "Profile": "IdentityServerSPA" 11 | } 12 | } 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /save-points/06-authentication-and-authorization/BlazingPizza.Shared/BlazingPizza.Shared.csproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | net6.0 5 | BlazingPizza 6 | 9.0 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /save-points/06-authentication-and-authorization/BlazingPizza.Shared/Maps/Marker.cs: -------------------------------------------------------------------------------- 1 | namespace BlazingPizza.Maps 2 | { 3 | public class Marker 4 | { 5 | public string Description { get; set; } 6 | 7 | public double X { get; set; } 8 | 9 | public double Y { get; set; } 10 | 11 | public bool ShowPopup { get; set; } 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /save-points/06-authentication-and-authorization/BlazingPizza.Shared/Maps/Point.cs: -------------------------------------------------------------------------------- 1 | namespace BlazingPizza.Maps 2 | { 3 | public class Point 4 | { 5 | public double X { get; set; } 6 | 7 | public double Y { get; set; } 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /save-points/06-authentication-and-authorization/BlazingPizza.Shared/NotificationSubscription.cs: -------------------------------------------------------------------------------- 1 | using System.ComponentModel.DataAnnotations; 2 | 3 | namespace BlazingPizza 4 | { 5 | public class NotificationSubscription 6 | { 7 | public int NotificationSubscriptionId { get; set; } 8 | 9 | public string UserId { get; set; } 10 | 11 | public string Url { get; set; } 12 | 13 | public string P256dh { get; set; } 14 | 15 | public string Auth { get; set; } 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /save-points/06-authentication-and-authorization/BlazingPizza.Shared/PizzaTopping.cs: -------------------------------------------------------------------------------- 1 | namespace BlazingPizza 2 | { 3 | public class PizzaTopping 4 | { 5 | public Topping Topping { get; set; } 6 | 7 | public int ToppingId { get; set; } 8 | 9 | public int PizzaId { get; set; } 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /save-points/06-authentication-and-authorization/BlazingPizza.Shared/Services/IAuthenticationViewComponentTypeProvider.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.IO; 4 | using System.Linq; 5 | using System.Text; 6 | using System.Threading.Tasks; 7 | 8 | namespace BlazingPizza.Services 9 | { 10 | public interface IAuthenticationViewComponentTypeProvider 11 | { 12 | public Type GetAuthenticationViewComponentType(); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /save-points/06-authentication-and-authorization/BlazingPizza.Shared/Topping.cs: -------------------------------------------------------------------------------- 1 | namespace BlazingPizza 2 | { 3 | public class Topping 4 | { 5 | public int Id { get; set; } 6 | 7 | public string Name { get; set; } 8 | 9 | public decimal Price { get; set; } 10 | 11 | public string GetFormattedPrice() => Price.ToString("0.00"); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /save-points/06-authentication-and-authorization/BlazingPizza.Shared/UserInfo.cs: -------------------------------------------------------------------------------- 1 | namespace BlazingPizza 2 | { 3 | public class UserInfo 4 | { 5 | public bool IsAuthenticated { get; set; } 6 | 7 | public string Name { get; set; } 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /save-points/06-authentication-and-authorization/BlazingPizza.Tests/ComponentLibrary/OrderReviewTests.razor: -------------------------------------------------------------------------------- 1 | @inherits TestContext 2 | @code 3 | { 4 | [Theory, AutoData] 5 | public void OrderView_Lists_All_Toppings_In_Per_Pizza(Order order) 6 | { 7 | var totalTopping = order.Pizzas.SelectMany(x=>x.Toppings).Count(); 8 | var cut = Render(@); 9 | 10 | var toppings = cut.FindAll("ul li"); 11 | 12 | toppings.Should().HaveCount(totalTopping); 13 | } 14 | } -------------------------------------------------------------------------------- /save-points/06-authentication-and-authorization/BlazingPizza.Tests/Helpers/TestAuthenticationViewComponent.razor: -------------------------------------------------------------------------------- 1 | @Action 2 | @code{ 3 | [Parameter] public string Action { get; set; } 4 | 5 | [Parameter] public PizzaAuthenticationState AuthenticationState { get; set; } 6 | 7 | [Parameter] public EventCallback OnLogInSucceeded { get; set; } 8 | } -------------------------------------------------------------------------------- /save-points/06-authentication-and-authorization/BlazingPizza.Tests/PROGRESS.MD: -------------------------------------------------------------------------------- 1 |  -------------------------------------------------------------------------------- /save-points/06-authentication-and-authorization/BlazingPizza.Tests/TestDoubles/DummyNavigationInterception.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Text; 5 | using System.Threading.Tasks; 6 | using Microsoft.AspNetCore.Components.Routing; 7 | 8 | namespace BlazingPizza.TestDoubles 9 | { 10 | public class DummyNavigationInterception : INavigationInterception 11 | { 12 | public Task EnableNavigationInterceptionAsync() 13 | { 14 | return Task.CompletedTask; 15 | } 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /save-points/07-javascript-interop/BlazingPizza.Client/PizzaAuthenticationState.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.AspNetCore.Components.WebAssembly.Authentication; 2 | 3 | namespace BlazingPizza.Client 4 | { 5 | public class PizzaAuthenticationState : RemoteAuthenticationState 6 | { 7 | public Order Order { get; set; } 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /save-points/07-javascript-interop/BlazingPizza.Client/Shared/RedirectToLogin.razor: -------------------------------------------------------------------------------- 1 | @inject NavigationManager Navigation 2 | @code { 3 | protected override void OnInitialized() 4 | { 5 | Navigation.NavigateTo($"authentication/login?returnUrl={Navigation.Uri}"); 6 | } 7 | } -------------------------------------------------------------------------------- /save-points/07-javascript-interop/BlazingPizza.Client/wwwroot/css/font/quicksand-v8-latin-300.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/07-javascript-interop/BlazingPizza.Client/wwwroot/css/font/quicksand-v8-latin-300.woff -------------------------------------------------------------------------------- /save-points/07-javascript-interop/BlazingPizza.Client/wwwroot/css/font/quicksand-v8-latin-300.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/07-javascript-interop/BlazingPizza.Client/wwwroot/css/font/quicksand-v8-latin-300.woff2 -------------------------------------------------------------------------------- /save-points/07-javascript-interop/BlazingPizza.Client/wwwroot/css/font/quicksand-v8-latin-500.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/07-javascript-interop/BlazingPizza.Client/wwwroot/css/font/quicksand-v8-latin-500.woff -------------------------------------------------------------------------------- /save-points/07-javascript-interop/BlazingPizza.Client/wwwroot/css/font/quicksand-v8-latin-500.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/07-javascript-interop/BlazingPizza.Client/wwwroot/css/font/quicksand-v8-latin-500.woff2 -------------------------------------------------------------------------------- /save-points/07-javascript-interop/BlazingPizza.Client/wwwroot/css/font/quicksand-v8-latin-700.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/07-javascript-interop/BlazingPizza.Client/wwwroot/css/font/quicksand-v8-latin-700.woff -------------------------------------------------------------------------------- /save-points/07-javascript-interop/BlazingPizza.Client/wwwroot/css/font/quicksand-v8-latin-700.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/07-javascript-interop/BlazingPizza.Client/wwwroot/css/font/quicksand-v8-latin-700.woff2 -------------------------------------------------------------------------------- /save-points/07-javascript-interop/BlazingPizza.Client/wwwroot/css/font/quicksand-v8-latin-regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/07-javascript-interop/BlazingPizza.Client/wwwroot/css/font/quicksand-v8-latin-regular.woff -------------------------------------------------------------------------------- /save-points/07-javascript-interop/BlazingPizza.Client/wwwroot/css/font/quicksand-v8-latin-regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/07-javascript-interop/BlazingPizza.Client/wwwroot/css/font/quicksand-v8-latin-regular.woff2 -------------------------------------------------------------------------------- /save-points/07-javascript-interop/BlazingPizza.Client/wwwroot/img/icon-512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/07-javascript-interop/BlazingPizza.Client/wwwroot/img/icon-512.png -------------------------------------------------------------------------------- /save-points/07-javascript-interop/BlazingPizza.Client/wwwroot/img/pizzas/bacon.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/07-javascript-interop/BlazingPizza.Client/wwwroot/img/pizzas/bacon.jpg -------------------------------------------------------------------------------- /save-points/07-javascript-interop/BlazingPizza.Client/wwwroot/img/pizzas/brit.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/07-javascript-interop/BlazingPizza.Client/wwwroot/img/pizzas/brit.jpg -------------------------------------------------------------------------------- /save-points/07-javascript-interop/BlazingPizza.Client/wwwroot/img/pizzas/cheese.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/07-javascript-interop/BlazingPizza.Client/wwwroot/img/pizzas/cheese.jpg -------------------------------------------------------------------------------- /save-points/07-javascript-interop/BlazingPizza.Client/wwwroot/img/pizzas/margherita.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/07-javascript-interop/BlazingPizza.Client/wwwroot/img/pizzas/margherita.jpg -------------------------------------------------------------------------------- /save-points/07-javascript-interop/BlazingPizza.Client/wwwroot/img/pizzas/meaty.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/07-javascript-interop/BlazingPizza.Client/wwwroot/img/pizzas/meaty.jpg -------------------------------------------------------------------------------- /save-points/07-javascript-interop/BlazingPizza.Client/wwwroot/img/pizzas/mushroom.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/07-javascript-interop/BlazingPizza.Client/wwwroot/img/pizzas/mushroom.jpg -------------------------------------------------------------------------------- /save-points/07-javascript-interop/BlazingPizza.Client/wwwroot/img/pizzas/pepperoni.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/07-javascript-interop/BlazingPizza.Client/wwwroot/img/pizzas/pepperoni.jpg -------------------------------------------------------------------------------- /save-points/07-javascript-interop/BlazingPizza.Client/wwwroot/img/pizzas/salad.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/07-javascript-interop/BlazingPizza.Client/wwwroot/img/pizzas/salad.jpg -------------------------------------------------------------------------------- /save-points/07-javascript-interop/BlazingPizza.ComponentsLibrary/JSRuntimeExtensions.cs: -------------------------------------------------------------------------------- 1 | using System.Threading.Tasks; 2 | using Microsoft.JSInterop; 3 | 4 | namespace BlazingPizza.ComponentsLibrary 5 | { 6 | public static class JSRuntimeExtensions 7 | { 8 | public static ValueTask Confirm(this IJSRuntime jsRuntime, string message) 9 | => jsRuntime.InvokeAsync("confirm", message); 10 | } 11 | } -------------------------------------------------------------------------------- /save-points/07-javascript-interop/BlazingPizza.ComponentsLibrary/PizzaCard.razor: -------------------------------------------------------------------------------- 1 | 
  • 2 |
    3 | @Special.Name 4 | @Special.Description 5 | @Special.GetFormattedBasePrice() 6 |
    7 |
  • 8 | 9 | @code { 10 | [Parameter] public PizzaSpecial Special { get; set; } 11 | [Parameter] public EventCallback OnClick { get; set; } 12 | } -------------------------------------------------------------------------------- /save-points/07-javascript-interop/BlazingPizza.ComponentsLibrary/_Imports.razor: -------------------------------------------------------------------------------- 1 | @using Microsoft.AspNetCore.Authorization 2 | @using Microsoft.AspNetCore.Components.Forms 3 | @using Microsoft.AspNetCore.Components.Routing 4 | @using Microsoft.AspNetCore.Components.Web 5 | @using Microsoft.JSInterop 6 | @using BlazingPizza 7 | @using BlazingPizza.ComponentsLibrary 8 | @using BlazingPizza.Maps -------------------------------------------------------------------------------- /save-points/07-javascript-interop/BlazingPizza.ComponentsLibrary/wwwroot/leaflet/images/layers-2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/07-javascript-interop/BlazingPizza.ComponentsLibrary/wwwroot/leaflet/images/layers-2x.png -------------------------------------------------------------------------------- /save-points/07-javascript-interop/BlazingPizza.ComponentsLibrary/wwwroot/leaflet/images/layers.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/07-javascript-interop/BlazingPizza.ComponentsLibrary/wwwroot/leaflet/images/layers.png -------------------------------------------------------------------------------- /save-points/07-javascript-interop/BlazingPizza.ComponentsLibrary/wwwroot/leaflet/images/marker-icon-2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/07-javascript-interop/BlazingPizza.ComponentsLibrary/wwwroot/leaflet/images/marker-icon-2x.png -------------------------------------------------------------------------------- /save-points/07-javascript-interop/BlazingPizza.ComponentsLibrary/wwwroot/leaflet/images/marker-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/07-javascript-interop/BlazingPizza.ComponentsLibrary/wwwroot/leaflet/images/marker-icon.png -------------------------------------------------------------------------------- /save-points/07-javascript-interop/BlazingPizza.ComponentsLibrary/wwwroot/leaflet/images/marker-shadow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/07-javascript-interop/BlazingPizza.ComponentsLibrary/wwwroot/leaflet/images/marker-shadow.png -------------------------------------------------------------------------------- /save-points/07-javascript-interop/BlazingPizza.ComponentsLibrary/wwwroot/localStorage.js: -------------------------------------------------------------------------------- 1 | (function () { 2 | window.blazorLocalStorage = { 3 | get: key => key in localStorage ? JSON.parse(localStorage[key]) : null, 4 | set: (key, value) => { localStorage[key] = JSON.stringify(value); }, 5 | delete: key => { delete localStorage[key]; } 6 | }; 7 | })(); 8 | -------------------------------------------------------------------------------- /save-points/07-javascript-interop/BlazingPizza.Server/PizzaStoreUser.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.AspNetCore.Identity; 2 | 3 | namespace BlazingPizza.Server 4 | { 5 | public class PizzaStoreUser : IdentityUser 6 | { 7 | } 8 | } -------------------------------------------------------------------------------- /save-points/07-javascript-interop/BlazingPizza.Server/PizzasController.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.AspNetCore.Mvc; 2 | 3 | namespace BlazingPizza.Server 4 | { 5 | [Route("pizzas")] 6 | [ApiController] 7 | public class PizzasController : Controller 8 | { 9 | private readonly PizzaStoreContext _db; 10 | 11 | public PizzasController(PizzaStoreContext db) 12 | { 13 | _db = db; 14 | } 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /save-points/07-javascript-interop/BlazingPizza.Server/appsettings.Development.json: -------------------------------------------------------------------------------- 1 | { 2 | "Logging": { 3 | "LogLevel": { 4 | "Default": "Debug", 5 | "System": "Information", 6 | "Microsoft": "Information" 7 | } 8 | }, 9 | "IdentityServer": { 10 | "Key": { 11 | "Type": "Development" 12 | } 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /save-points/07-javascript-interop/BlazingPizza.Server/appsettings.json: -------------------------------------------------------------------------------- 1 | { 2 | "Logging": { 3 | "LogLevel": { 4 | "Default": "Warning" 5 | } 6 | }, 7 | "IdentityServer": { 8 | "Clients": { 9 | "BlazingPizza.Client": { 10 | "Profile": "IdentityServerSPA" 11 | } 12 | } 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /save-points/07-javascript-interop/BlazingPizza.Shared/BlazingPizza.Shared.csproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | net6.0 5 | BlazingPizza 6 | 9.0 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /save-points/07-javascript-interop/BlazingPizza.Shared/Maps/Marker.cs: -------------------------------------------------------------------------------- 1 | namespace BlazingPizza.Maps 2 | { 3 | public class Marker 4 | { 5 | public string Description { get; set; } 6 | 7 | public double X { get; set; } 8 | 9 | public double Y { get; set; } 10 | 11 | public bool ShowPopup { get; set; } 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /save-points/07-javascript-interop/BlazingPizza.Shared/Maps/Point.cs: -------------------------------------------------------------------------------- 1 | namespace BlazingPizza.Maps 2 | { 3 | public class Point 4 | { 5 | public double X { get; set; } 6 | 7 | public double Y { get; set; } 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /save-points/07-javascript-interop/BlazingPizza.Shared/NotificationSubscription.cs: -------------------------------------------------------------------------------- 1 | using System.ComponentModel.DataAnnotations; 2 | 3 | namespace BlazingPizza 4 | { 5 | public class NotificationSubscription 6 | { 7 | public int NotificationSubscriptionId { get; set; } 8 | 9 | public string UserId { get; set; } 10 | 11 | public string Url { get; set; } 12 | 13 | public string P256dh { get; set; } 14 | 15 | public string Auth { get; set; } 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /save-points/07-javascript-interop/BlazingPizza.Shared/PizzaSpecial.cs: -------------------------------------------------------------------------------- 1 | namespace BlazingPizza 2 | { 3 | /// 4 | /// Represents a pre-configured template for a pizza a user can order 5 | /// 6 | public class PizzaSpecial 7 | { 8 | public int Id { get; set; } 9 | 10 | public string Name { get; set; } 11 | 12 | public decimal BasePrice { get; set; } 13 | 14 | public string Description { get; set; } 15 | 16 | public string ImageUrl { get; set; } 17 | 18 | public string GetFormattedBasePrice() => BasePrice.ToString("0.00"); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /save-points/07-javascript-interop/BlazingPizza.Shared/PizzaTopping.cs: -------------------------------------------------------------------------------- 1 | namespace BlazingPizza 2 | { 3 | public class PizzaTopping 4 | { 5 | public Topping Topping { get; set; } 6 | 7 | public int ToppingId { get; set; } 8 | 9 | public int PizzaId { get; set; } 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /save-points/07-javascript-interop/BlazingPizza.Shared/Services/IAuthenticationViewComponentTypeProvider.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.IO; 4 | using System.Linq; 5 | using System.Text; 6 | using System.Threading.Tasks; 7 | 8 | namespace BlazingPizza.Services 9 | { 10 | public interface IAuthenticationViewComponentTypeProvider 11 | { 12 | public Type GetAuthenticationViewComponentType(); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /save-points/07-javascript-interop/BlazingPizza.Shared/Topping.cs: -------------------------------------------------------------------------------- 1 | namespace BlazingPizza 2 | { 3 | public class Topping 4 | { 5 | public int Id { get; set; } 6 | 7 | public string Name { get; set; } 8 | 9 | public decimal Price { get; set; } 10 | 11 | public string GetFormattedPrice() => Price.ToString("0.00"); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /save-points/07-javascript-interop/BlazingPizza.Shared/UserInfo.cs: -------------------------------------------------------------------------------- 1 | namespace BlazingPizza 2 | { 3 | public class UserInfo 4 | { 5 | public bool IsAuthenticated { get; set; } 6 | 7 | public string Name { get; set; } 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /save-points/07-javascript-interop/BlazingPizza.Tests/ComponentLibrary/OrderReviewTests.razor: -------------------------------------------------------------------------------- 1 | @inherits TestContext 2 | @code 3 | { 4 | [Theory, AutoData] 5 | public void OrderView_Lists_All_Toppings_In_Per_Pizza(Order order) 6 | { 7 | var totalTopping = order.Pizzas.SelectMany(x=>x.Toppings).Count(); 8 | var cut = Render(@); 9 | 10 | var toppings = cut.FindAll("ul li"); 11 | 12 | toppings.Should().HaveCount(totalTopping); 13 | } 14 | } -------------------------------------------------------------------------------- /save-points/07-javascript-interop/BlazingPizza.Tests/Helpers/TestAuthenticationViewComponent.razor: -------------------------------------------------------------------------------- 1 | @Action 2 | @code{ 3 | [Parameter] public string Action { get; set; } 4 | 5 | [Parameter] public PizzaAuthenticationState AuthenticationState { get; set; } 6 | 7 | [Parameter] public EventCallback OnLogInSucceeded { get; set; } 8 | } -------------------------------------------------------------------------------- /save-points/07-javascript-interop/BlazingPizza.Tests/PROGRESS.MD: -------------------------------------------------------------------------------- 1 |  -------------------------------------------------------------------------------- /save-points/07-javascript-interop/BlazingPizza.Tests/TestDoubles/DummyNavigationInterception.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Text; 5 | using System.Threading.Tasks; 6 | using Microsoft.AspNetCore.Components.Routing; 7 | 8 | namespace BlazingPizza.TestDoubles 9 | { 10 | public class DummyNavigationInterception : INavigationInterception 11 | { 12 | public Task EnableNavigationInterceptionAsync() 13 | { 14 | return Task.CompletedTask; 15 | } 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /save-points/08-templated-components/BlazingComponents/TemplatedDialog.razor: -------------------------------------------------------------------------------- 1 | @if (Show) 2 | { 3 |
    4 |
    5 | @ChildContent 6 |
    7 |
    8 | } 9 | 10 | @code { 11 | [Parameter] public RenderFragment ChildContent { get; set; } 12 | [Parameter] public bool Show { get; set; } 13 | } -------------------------------------------------------------------------------- /save-points/08-templated-components/BlazingComponents/_Imports.razor: -------------------------------------------------------------------------------- 1 | @using Microsoft.AspNetCore.Components.Web 2 | -------------------------------------------------------------------------------- /save-points/08-templated-components/BlazingPizza.Client/PizzaAuthenticationState.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.AspNetCore.Components.WebAssembly.Authentication; 2 | 3 | namespace BlazingPizza.Client 4 | { 5 | public class PizzaAuthenticationState : RemoteAuthenticationState 6 | { 7 | public Order Order { get; set; } 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /save-points/08-templated-components/BlazingPizza.Client/Shared/RedirectToLogin.razor: -------------------------------------------------------------------------------- 1 | @inject NavigationManager Navigation 2 | @code { 3 | protected override void OnInitialized() 4 | { 5 | Navigation.NavigateTo($"authentication/login?returnUrl={Navigation.Uri}"); 6 | } 7 | } -------------------------------------------------------------------------------- /save-points/08-templated-components/BlazingPizza.Client/wwwroot/css/font/quicksand-v8-latin-300.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/08-templated-components/BlazingPizza.Client/wwwroot/css/font/quicksand-v8-latin-300.woff -------------------------------------------------------------------------------- /save-points/08-templated-components/BlazingPizza.Client/wwwroot/css/font/quicksand-v8-latin-300.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/08-templated-components/BlazingPizza.Client/wwwroot/css/font/quicksand-v8-latin-300.woff2 -------------------------------------------------------------------------------- /save-points/08-templated-components/BlazingPizza.Client/wwwroot/css/font/quicksand-v8-latin-500.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/08-templated-components/BlazingPizza.Client/wwwroot/css/font/quicksand-v8-latin-500.woff -------------------------------------------------------------------------------- /save-points/08-templated-components/BlazingPizza.Client/wwwroot/css/font/quicksand-v8-latin-500.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/08-templated-components/BlazingPizza.Client/wwwroot/css/font/quicksand-v8-latin-500.woff2 -------------------------------------------------------------------------------- /save-points/08-templated-components/BlazingPizza.Client/wwwroot/css/font/quicksand-v8-latin-700.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/08-templated-components/BlazingPizza.Client/wwwroot/css/font/quicksand-v8-latin-700.woff -------------------------------------------------------------------------------- /save-points/08-templated-components/BlazingPizza.Client/wwwroot/css/font/quicksand-v8-latin-700.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/08-templated-components/BlazingPizza.Client/wwwroot/css/font/quicksand-v8-latin-700.woff2 -------------------------------------------------------------------------------- /save-points/08-templated-components/BlazingPizza.Client/wwwroot/css/font/quicksand-v8-latin-regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/08-templated-components/BlazingPizza.Client/wwwroot/css/font/quicksand-v8-latin-regular.woff -------------------------------------------------------------------------------- /save-points/08-templated-components/BlazingPizza.Client/wwwroot/css/font/quicksand-v8-latin-regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/08-templated-components/BlazingPizza.Client/wwwroot/css/font/quicksand-v8-latin-regular.woff2 -------------------------------------------------------------------------------- /save-points/08-templated-components/BlazingPizza.Client/wwwroot/img/icon-512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/08-templated-components/BlazingPizza.Client/wwwroot/img/icon-512.png -------------------------------------------------------------------------------- /save-points/08-templated-components/BlazingPizza.Client/wwwroot/img/pizzas/bacon.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/08-templated-components/BlazingPizza.Client/wwwroot/img/pizzas/bacon.jpg -------------------------------------------------------------------------------- /save-points/08-templated-components/BlazingPizza.Client/wwwroot/img/pizzas/brit.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/08-templated-components/BlazingPizza.Client/wwwroot/img/pizzas/brit.jpg -------------------------------------------------------------------------------- /save-points/08-templated-components/BlazingPizza.Client/wwwroot/img/pizzas/cheese.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/08-templated-components/BlazingPizza.Client/wwwroot/img/pizzas/cheese.jpg -------------------------------------------------------------------------------- /save-points/08-templated-components/BlazingPizza.Client/wwwroot/img/pizzas/margherita.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/08-templated-components/BlazingPizza.Client/wwwroot/img/pizzas/margherita.jpg -------------------------------------------------------------------------------- /save-points/08-templated-components/BlazingPizza.Client/wwwroot/img/pizzas/meaty.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/08-templated-components/BlazingPizza.Client/wwwroot/img/pizzas/meaty.jpg -------------------------------------------------------------------------------- /save-points/08-templated-components/BlazingPizza.Client/wwwroot/img/pizzas/mushroom.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/08-templated-components/BlazingPizza.Client/wwwroot/img/pizzas/mushroom.jpg -------------------------------------------------------------------------------- /save-points/08-templated-components/BlazingPizza.Client/wwwroot/img/pizzas/pepperoni.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/08-templated-components/BlazingPizza.Client/wwwroot/img/pizzas/pepperoni.jpg -------------------------------------------------------------------------------- /save-points/08-templated-components/BlazingPizza.Client/wwwroot/img/pizzas/salad.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/08-templated-components/BlazingPizza.Client/wwwroot/img/pizzas/salad.jpg -------------------------------------------------------------------------------- /save-points/08-templated-components/BlazingPizza.ComponentsLibrary/JSRuntimeExtensions.cs: -------------------------------------------------------------------------------- 1 | using System.Threading.Tasks; 2 | using Microsoft.JSInterop; 3 | 4 | namespace BlazingPizza.ComponentsLibrary 5 | { 6 | public static class JSRuntimeExtensions 7 | { 8 | public static ValueTask Confirm(this IJSRuntime jsRuntime, string message) 9 | => jsRuntime.InvokeAsync("confirm", message); 10 | } 11 | } -------------------------------------------------------------------------------- /save-points/08-templated-components/BlazingPizza.ComponentsLibrary/PizzaCard.razor: -------------------------------------------------------------------------------- 1 | 
  • 2 |
    3 | @Special.Name 4 | @Special.Description 5 | @Special.GetFormattedBasePrice() 6 |
    7 |
  • 8 | 9 | @code { 10 | [Parameter] public PizzaSpecial Special { get; set; } 11 | [Parameter] public EventCallback OnClick { get; set; } 12 | } -------------------------------------------------------------------------------- /save-points/08-templated-components/BlazingPizza.ComponentsLibrary/_Imports.razor: -------------------------------------------------------------------------------- 1 | @using Microsoft.AspNetCore.Authorization 2 | @using Microsoft.AspNetCore.Components.Forms 3 | @using Microsoft.AspNetCore.Components.Routing 4 | @using Microsoft.AspNetCore.Components.Web 5 | @using Microsoft.JSInterop 6 | @using BlazingPizza 7 | @using BlazingPizza.ComponentsLibrary 8 | @using BlazingPizza.Maps -------------------------------------------------------------------------------- /save-points/08-templated-components/BlazingPizza.ComponentsLibrary/wwwroot/leaflet/images/layers-2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/08-templated-components/BlazingPizza.ComponentsLibrary/wwwroot/leaflet/images/layers-2x.png -------------------------------------------------------------------------------- /save-points/08-templated-components/BlazingPizza.ComponentsLibrary/wwwroot/leaflet/images/layers.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/08-templated-components/BlazingPizza.ComponentsLibrary/wwwroot/leaflet/images/layers.png -------------------------------------------------------------------------------- /save-points/08-templated-components/BlazingPizza.ComponentsLibrary/wwwroot/leaflet/images/marker-icon-2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/08-templated-components/BlazingPizza.ComponentsLibrary/wwwroot/leaflet/images/marker-icon-2x.png -------------------------------------------------------------------------------- /save-points/08-templated-components/BlazingPizza.ComponentsLibrary/wwwroot/leaflet/images/marker-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/08-templated-components/BlazingPizza.ComponentsLibrary/wwwroot/leaflet/images/marker-icon.png -------------------------------------------------------------------------------- /save-points/08-templated-components/BlazingPizza.ComponentsLibrary/wwwroot/leaflet/images/marker-shadow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/08-templated-components/BlazingPizza.ComponentsLibrary/wwwroot/leaflet/images/marker-shadow.png -------------------------------------------------------------------------------- /save-points/08-templated-components/BlazingPizza.ComponentsLibrary/wwwroot/localStorage.js: -------------------------------------------------------------------------------- 1 | (function () { 2 | window.blazorLocalStorage = { 3 | get: key => key in localStorage ? JSON.parse(localStorage[key]) : null, 4 | set: (key, value) => { localStorage[key] = JSON.stringify(value); }, 5 | delete: key => { delete localStorage[key]; } 6 | }; 7 | })(); 8 | -------------------------------------------------------------------------------- /save-points/08-templated-components/BlazingPizza.Server/PizzaStoreUser.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.AspNetCore.Identity; 2 | 3 | namespace BlazingPizza.Server 4 | { 5 | public class PizzaStoreUser : IdentityUser 6 | { 7 | } 8 | } -------------------------------------------------------------------------------- /save-points/08-templated-components/BlazingPizza.Server/PizzasController.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.AspNetCore.Mvc; 2 | 3 | namespace BlazingPizza.Server 4 | { 5 | [Route("pizzas")] 6 | [ApiController] 7 | public class PizzasController : Controller 8 | { 9 | private readonly PizzaStoreContext _db; 10 | 11 | public PizzasController(PizzaStoreContext db) 12 | { 13 | _db = db; 14 | } 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /save-points/08-templated-components/BlazingPizza.Server/appsettings.Development.json: -------------------------------------------------------------------------------- 1 | { 2 | "Logging": { 3 | "LogLevel": { 4 | "Default": "Debug", 5 | "System": "Information", 6 | "Microsoft": "Information" 7 | } 8 | }, 9 | "IdentityServer": { 10 | "Key": { 11 | "Type": "Development" 12 | } 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /save-points/08-templated-components/BlazingPizza.Server/appsettings.json: -------------------------------------------------------------------------------- 1 | { 2 | "Logging": { 3 | "LogLevel": { 4 | "Default": "Warning" 5 | } 6 | }, 7 | "IdentityServer": { 8 | "Clients": { 9 | "BlazingPizza.Client": { 10 | "Profile": "IdentityServerSPA" 11 | } 12 | } 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /save-points/08-templated-components/BlazingPizza.Shared/BlazingPizza.Shared.csproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | net6.0 5 | BlazingPizza 6 | 9.0 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /save-points/08-templated-components/BlazingPizza.Shared/Maps/Marker.cs: -------------------------------------------------------------------------------- 1 | namespace BlazingPizza.Maps 2 | { 3 | public class Marker 4 | { 5 | public string Description { get; set; } 6 | 7 | public double X { get; set; } 8 | 9 | public double Y { get; set; } 10 | 11 | public bool ShowPopup { get; set; } 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /save-points/08-templated-components/BlazingPizza.Shared/Maps/Point.cs: -------------------------------------------------------------------------------- 1 | namespace BlazingPizza.Maps 2 | { 3 | public class Point 4 | { 5 | public double X { get; set; } 6 | 7 | public double Y { get; set; } 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /save-points/08-templated-components/BlazingPizza.Shared/NotificationSubscription.cs: -------------------------------------------------------------------------------- 1 | using System.ComponentModel.DataAnnotations; 2 | 3 | namespace BlazingPizza 4 | { 5 | public class NotificationSubscription 6 | { 7 | public int NotificationSubscriptionId { get; set; } 8 | 9 | public string UserId { get; set; } 10 | 11 | public string Url { get; set; } 12 | 13 | public string P256dh { get; set; } 14 | 15 | public string Auth { get; set; } 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /save-points/08-templated-components/BlazingPizza.Shared/PizzaSpecial.cs: -------------------------------------------------------------------------------- 1 | namespace BlazingPizza 2 | { 3 | /// 4 | /// Represents a pre-configured template for a pizza a user can order 5 | /// 6 | public class PizzaSpecial 7 | { 8 | public int Id { get; set; } 9 | 10 | public string Name { get; set; } 11 | 12 | public decimal BasePrice { get; set; } 13 | 14 | public string Description { get; set; } 15 | 16 | public string ImageUrl { get; set; } 17 | 18 | public string GetFormattedBasePrice() => BasePrice.ToString("0.00"); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /save-points/08-templated-components/BlazingPizza.Shared/PizzaTopping.cs: -------------------------------------------------------------------------------- 1 | namespace BlazingPizza 2 | { 3 | public class PizzaTopping 4 | { 5 | public Topping Topping { get; set; } 6 | 7 | public int ToppingId { get; set; } 8 | 9 | public int PizzaId { get; set; } 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /save-points/08-templated-components/BlazingPizza.Shared/Services/IAuthenticationViewComponentTypeProvider.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.IO; 4 | using System.Linq; 5 | using System.Text; 6 | using System.Threading.Tasks; 7 | 8 | namespace BlazingPizza.Services 9 | { 10 | public interface IAuthenticationViewComponentTypeProvider 11 | { 12 | public Type GetAuthenticationViewComponentType(); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /save-points/08-templated-components/BlazingPizza.Shared/Topping.cs: -------------------------------------------------------------------------------- 1 | namespace BlazingPizza 2 | { 3 | public class Topping 4 | { 5 | public int Id { get; set; } 6 | 7 | public string Name { get; set; } 8 | 9 | public decimal Price { get; set; } 10 | 11 | public string GetFormattedPrice() => Price.ToString("0.00"); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /save-points/08-templated-components/BlazingPizza.Shared/UserInfo.cs: -------------------------------------------------------------------------------- 1 | namespace BlazingPizza 2 | { 3 | public class UserInfo 4 | { 5 | public bool IsAuthenticated { get; set; } 6 | 7 | public string Name { get; set; } 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /save-points/08-templated-components/BlazingPizza.Tests/ComponentLibrary/OrderReviewTests.razor: -------------------------------------------------------------------------------- 1 | @inherits TestContext 2 | @code 3 | { 4 | [Theory, AutoData] 5 | public void OrderView_Lists_All_Toppings_In_Per_Pizza(Order order) 6 | { 7 | var totalTopping = order.Pizzas.SelectMany(x=>x.Toppings).Count(); 8 | var cut = Render(@); 9 | 10 | var toppings = cut.FindAll("ul li"); 11 | 12 | toppings.Should().HaveCount(totalTopping); 13 | } 14 | } -------------------------------------------------------------------------------- /save-points/08-templated-components/BlazingPizza.Tests/Helpers/TestAuthenticationViewComponent.razor: -------------------------------------------------------------------------------- 1 | @Action 2 | @code{ 3 | [Parameter] public string Action { get; set; } 4 | 5 | [Parameter] public PizzaAuthenticationState AuthenticationState { get; set; } 6 | 7 | [Parameter] public EventCallback OnLogInSucceeded { get; set; } 8 | } -------------------------------------------------------------------------------- /save-points/08-templated-components/BlazingPizza.Tests/TestDoubles/DummyNavigationInterception.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Text; 5 | using System.Threading.Tasks; 6 | using Microsoft.AspNetCore.Components.Routing; 7 | 8 | namespace BlazingPizza.TestDoubles 9 | { 10 | public class DummyNavigationInterception : INavigationInterception 11 | { 12 | public Task EnableNavigationInterceptionAsync() 13 | { 14 | return Task.CompletedTask; 15 | } 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /save-points/09-progressive-web-app/BlazingComponents/TemplatedDialog.razor: -------------------------------------------------------------------------------- 1 | @if (Show) 2 | { 3 |
    4 |
    5 | @ChildContent 6 |
    7 |
    8 | } 9 | 10 | @code { 11 | [Parameter] public RenderFragment ChildContent { get; set; } 12 | [Parameter] public bool Show { get; set; } 13 | } -------------------------------------------------------------------------------- /save-points/09-progressive-web-app/BlazingComponents/_Imports.razor: -------------------------------------------------------------------------------- 1 | @using Microsoft.AspNetCore.Components.Web 2 | -------------------------------------------------------------------------------- /save-points/09-progressive-web-app/BlazingPizza.Client/PizzaAuthenticationState.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.AspNetCore.Components.WebAssembly.Authentication; 2 | 3 | namespace BlazingPizza.Client 4 | { 5 | public class PizzaAuthenticationState : RemoteAuthenticationState 6 | { 7 | public Order Order { get; set; } 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /save-points/09-progressive-web-app/BlazingPizza.Client/Shared/RedirectToLogin.razor: -------------------------------------------------------------------------------- 1 | @inject NavigationManager Navigation 2 | @code { 3 | protected override void OnInitialized() 4 | { 5 | Navigation.NavigateTo($"authentication/login?returnUrl={Navigation.Uri}"); 6 | } 7 | } -------------------------------------------------------------------------------- /save-points/09-progressive-web-app/BlazingPizza.Client/wwwroot/css/font/quicksand-v8-latin-300.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/09-progressive-web-app/BlazingPizza.Client/wwwroot/css/font/quicksand-v8-latin-300.woff -------------------------------------------------------------------------------- /save-points/09-progressive-web-app/BlazingPizza.Client/wwwroot/css/font/quicksand-v8-latin-300.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/09-progressive-web-app/BlazingPizza.Client/wwwroot/css/font/quicksand-v8-latin-300.woff2 -------------------------------------------------------------------------------- /save-points/09-progressive-web-app/BlazingPizza.Client/wwwroot/css/font/quicksand-v8-latin-500.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/09-progressive-web-app/BlazingPizza.Client/wwwroot/css/font/quicksand-v8-latin-500.woff -------------------------------------------------------------------------------- /save-points/09-progressive-web-app/BlazingPizza.Client/wwwroot/css/font/quicksand-v8-latin-500.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/09-progressive-web-app/BlazingPizza.Client/wwwroot/css/font/quicksand-v8-latin-500.woff2 -------------------------------------------------------------------------------- /save-points/09-progressive-web-app/BlazingPizza.Client/wwwroot/css/font/quicksand-v8-latin-700.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/09-progressive-web-app/BlazingPizza.Client/wwwroot/css/font/quicksand-v8-latin-700.woff -------------------------------------------------------------------------------- /save-points/09-progressive-web-app/BlazingPizza.Client/wwwroot/css/font/quicksand-v8-latin-700.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/09-progressive-web-app/BlazingPizza.Client/wwwroot/css/font/quicksand-v8-latin-700.woff2 -------------------------------------------------------------------------------- /save-points/09-progressive-web-app/BlazingPizza.Client/wwwroot/css/font/quicksand-v8-latin-regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/09-progressive-web-app/BlazingPizza.Client/wwwroot/css/font/quicksand-v8-latin-regular.woff -------------------------------------------------------------------------------- /save-points/09-progressive-web-app/BlazingPizza.Client/wwwroot/css/font/quicksand-v8-latin-regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/09-progressive-web-app/BlazingPizza.Client/wwwroot/css/font/quicksand-v8-latin-regular.woff2 -------------------------------------------------------------------------------- /save-points/09-progressive-web-app/BlazingPizza.Client/wwwroot/img/icon-512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/09-progressive-web-app/BlazingPizza.Client/wwwroot/img/icon-512.png -------------------------------------------------------------------------------- /save-points/09-progressive-web-app/BlazingPizza.Client/wwwroot/img/pizzas/bacon.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/09-progressive-web-app/BlazingPizza.Client/wwwroot/img/pizzas/bacon.jpg -------------------------------------------------------------------------------- /save-points/09-progressive-web-app/BlazingPizza.Client/wwwroot/img/pizzas/brit.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/09-progressive-web-app/BlazingPizza.Client/wwwroot/img/pizzas/brit.jpg -------------------------------------------------------------------------------- /save-points/09-progressive-web-app/BlazingPizza.Client/wwwroot/img/pizzas/cheese.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/09-progressive-web-app/BlazingPizza.Client/wwwroot/img/pizzas/cheese.jpg -------------------------------------------------------------------------------- /save-points/09-progressive-web-app/BlazingPizza.Client/wwwroot/img/pizzas/margherita.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/09-progressive-web-app/BlazingPizza.Client/wwwroot/img/pizzas/margherita.jpg -------------------------------------------------------------------------------- /save-points/09-progressive-web-app/BlazingPizza.Client/wwwroot/img/pizzas/meaty.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/09-progressive-web-app/BlazingPizza.Client/wwwroot/img/pizzas/meaty.jpg -------------------------------------------------------------------------------- /save-points/09-progressive-web-app/BlazingPizza.Client/wwwroot/img/pizzas/mushroom.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/09-progressive-web-app/BlazingPizza.Client/wwwroot/img/pizzas/mushroom.jpg -------------------------------------------------------------------------------- /save-points/09-progressive-web-app/BlazingPizza.Client/wwwroot/img/pizzas/pepperoni.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/09-progressive-web-app/BlazingPizza.Client/wwwroot/img/pizzas/pepperoni.jpg -------------------------------------------------------------------------------- /save-points/09-progressive-web-app/BlazingPizza.Client/wwwroot/img/pizzas/salad.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/09-progressive-web-app/BlazingPizza.Client/wwwroot/img/pizzas/salad.jpg -------------------------------------------------------------------------------- /save-points/09-progressive-web-app/BlazingPizza.Client/wwwroot/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "short_name": "Blazing Pizza", 3 | "name": "Blazing Pizza", 4 | "icons": [ 5 | { 6 | "src": "img/icon-512.png", 7 | "type": "image/png", 8 | "sizes": "512x512" 9 | } 10 | ], 11 | "start_url": "/", 12 | "background_color": "#860000", 13 | "display": "standalone", 14 | "scope": "/", 15 | "theme_color": "#860000" 16 | } -------------------------------------------------------------------------------- /save-points/09-progressive-web-app/BlazingPizza.ComponentsLibrary/JSRuntimeExtensions.cs: -------------------------------------------------------------------------------- 1 | using System.Threading.Tasks; 2 | using Microsoft.JSInterop; 3 | 4 | namespace BlazingPizza.ComponentsLibrary 5 | { 6 | public static class JSRuntimeExtensions 7 | { 8 | public static ValueTask Confirm(this IJSRuntime jsRuntime, string message) 9 | => jsRuntime.InvokeAsync("confirm", message); 10 | } 11 | } -------------------------------------------------------------------------------- /save-points/09-progressive-web-app/BlazingPizza.ComponentsLibrary/PizzaCard.razor: -------------------------------------------------------------------------------- 1 | 
  • 2 |
    3 | @Special.Name 4 | @Special.Description 5 | @Special.GetFormattedBasePrice() 6 |
    7 |
  • 8 | 9 | @code { 10 | [Parameter] public PizzaSpecial Special { get; set; } 11 | [Parameter] public EventCallback OnClick { get; set; } 12 | } -------------------------------------------------------------------------------- /save-points/09-progressive-web-app/BlazingPizza.ComponentsLibrary/_Imports.razor: -------------------------------------------------------------------------------- 1 | @using Microsoft.AspNetCore.Authorization 2 | @using Microsoft.AspNetCore.Components.Forms 3 | @using Microsoft.AspNetCore.Components.Routing 4 | @using Microsoft.AspNetCore.Components.Web 5 | @using Microsoft.JSInterop 6 | @using BlazingPizza 7 | @using BlazingPizza.ComponentsLibrary 8 | @using BlazingPizza.Maps -------------------------------------------------------------------------------- /save-points/09-progressive-web-app/BlazingPizza.ComponentsLibrary/wwwroot/leaflet/images/layers-2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/09-progressive-web-app/BlazingPizza.ComponentsLibrary/wwwroot/leaflet/images/layers-2x.png -------------------------------------------------------------------------------- /save-points/09-progressive-web-app/BlazingPizza.ComponentsLibrary/wwwroot/leaflet/images/layers.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/09-progressive-web-app/BlazingPizza.ComponentsLibrary/wwwroot/leaflet/images/layers.png -------------------------------------------------------------------------------- /save-points/09-progressive-web-app/BlazingPizza.ComponentsLibrary/wwwroot/leaflet/images/marker-icon-2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/09-progressive-web-app/BlazingPizza.ComponentsLibrary/wwwroot/leaflet/images/marker-icon-2x.png -------------------------------------------------------------------------------- /save-points/09-progressive-web-app/BlazingPizza.ComponentsLibrary/wwwroot/leaflet/images/marker-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/09-progressive-web-app/BlazingPizza.ComponentsLibrary/wwwroot/leaflet/images/marker-icon.png -------------------------------------------------------------------------------- /save-points/09-progressive-web-app/BlazingPizza.ComponentsLibrary/wwwroot/leaflet/images/marker-shadow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/save-points/09-progressive-web-app/BlazingPizza.ComponentsLibrary/wwwroot/leaflet/images/marker-shadow.png -------------------------------------------------------------------------------- /save-points/09-progressive-web-app/BlazingPizza.ComponentsLibrary/wwwroot/localStorage.js: -------------------------------------------------------------------------------- 1 | (function () { 2 | window.blazorLocalStorage = { 3 | get: key => key in localStorage ? JSON.parse(localStorage[key]) : null, 4 | set: (key, value) => { localStorage[key] = JSON.stringify(value); }, 5 | delete: key => { delete localStorage[key]; } 6 | }; 7 | })(); 8 | -------------------------------------------------------------------------------- /save-points/09-progressive-web-app/BlazingPizza.Server/PizzaStoreUser.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.AspNetCore.Identity; 2 | 3 | namespace BlazingPizza.Server 4 | { 5 | public class PizzaStoreUser : IdentityUser 6 | { 7 | } 8 | } -------------------------------------------------------------------------------- /save-points/09-progressive-web-app/BlazingPizza.Server/PizzasController.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.AspNetCore.Mvc; 2 | 3 | namespace BlazingPizza.Server 4 | { 5 | [Route("pizzas")] 6 | [ApiController] 7 | public class PizzasController : Controller 8 | { 9 | private readonly PizzaStoreContext _db; 10 | 11 | public PizzasController(PizzaStoreContext db) 12 | { 13 | _db = db; 14 | } 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /save-points/09-progressive-web-app/BlazingPizza.Server/appsettings.Development.json: -------------------------------------------------------------------------------- 1 | { 2 | "Logging": { 3 | "LogLevel": { 4 | "Default": "Debug", 5 | "System": "Information", 6 | "Microsoft": "Information" 7 | } 8 | }, 9 | "IdentityServer": { 10 | "Key": { 11 | "Type": "Development" 12 | } 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /save-points/09-progressive-web-app/BlazingPizza.Server/appsettings.json: -------------------------------------------------------------------------------- 1 | { 2 | "Logging": { 3 | "LogLevel": { 4 | "Default": "Warning" 5 | } 6 | }, 7 | "IdentityServer": { 8 | "Clients": { 9 | "BlazingPizza.Client": { 10 | "Profile": "IdentityServerSPA" 11 | } 12 | } 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /save-points/09-progressive-web-app/BlazingPizza.Shared/BlazingPizza.Shared.csproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | net6.0 5 | BlazingPizza 6 | 9.0 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /save-points/09-progressive-web-app/BlazingPizza.Shared/Maps/Marker.cs: -------------------------------------------------------------------------------- 1 | namespace BlazingPizza.Maps 2 | { 3 | public class Marker 4 | { 5 | public string Description { get; set; } 6 | 7 | public double X { get; set; } 8 | 9 | public double Y { get; set; } 10 | 11 | public bool ShowPopup { get; set; } 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /save-points/09-progressive-web-app/BlazingPizza.Shared/Maps/Point.cs: -------------------------------------------------------------------------------- 1 | namespace BlazingPizza.Maps 2 | { 3 | public class Point 4 | { 5 | public double X { get; set; } 6 | 7 | public double Y { get; set; } 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /save-points/09-progressive-web-app/BlazingPizza.Shared/NotificationSubscription.cs: -------------------------------------------------------------------------------- 1 | namespace BlazingPizza 2 | { 3 | public class NotificationSubscription 4 | { 5 | public int NotificationSubscriptionId { get; set; } 6 | 7 | public string UserId { get; set; } 8 | 9 | public string Url { get; set; } 10 | 11 | public string P256dh { get; set; } 12 | 13 | public string Auth { get; set; } 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /save-points/09-progressive-web-app/BlazingPizza.Shared/PizzaSpecial.cs: -------------------------------------------------------------------------------- 1 | namespace BlazingPizza 2 | { 3 | /// 4 | /// Represents a pre-configured template for a pizza a user can order 5 | /// 6 | public class PizzaSpecial 7 | { 8 | public int Id { get; set; } 9 | 10 | public string Name { get; set; } 11 | 12 | public decimal BasePrice { get; set; } 13 | 14 | public string Description { get; set; } 15 | 16 | public string ImageUrl { get; set; } 17 | 18 | public string GetFormattedBasePrice() => BasePrice.ToString("0.00"); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /save-points/09-progressive-web-app/BlazingPizza.Shared/PizzaTopping.cs: -------------------------------------------------------------------------------- 1 | namespace BlazingPizza 2 | { 3 | public class PizzaTopping 4 | { 5 | public Topping Topping { get; set; } 6 | 7 | public int ToppingId { get; set; } 8 | 9 | public int PizzaId { get; set; } 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /save-points/09-progressive-web-app/BlazingPizza.Shared/Services/IAuthenticationViewComponentTypeProvider.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.IO; 4 | using System.Linq; 5 | using System.Text; 6 | using System.Threading.Tasks; 7 | 8 | namespace BlazingPizza.Services 9 | { 10 | public interface IAuthenticationViewComponentTypeProvider 11 | { 12 | public Type GetAuthenticationViewComponentType(); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /save-points/09-progressive-web-app/BlazingPizza.Shared/Topping.cs: -------------------------------------------------------------------------------- 1 | namespace BlazingPizza 2 | { 3 | public class Topping 4 | { 5 | public int Id { get; set; } 6 | 7 | public string Name { get; set; } 8 | 9 | public decimal Price { get; set; } 10 | 11 | public string GetFormattedPrice() => Price.ToString("0.00"); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /save-points/09-progressive-web-app/BlazingPizza.Shared/UserInfo.cs: -------------------------------------------------------------------------------- 1 | namespace BlazingPizza 2 | { 3 | public class UserInfo 4 | { 5 | public bool IsAuthenticated { get; set; } 6 | 7 | public string Name { get; set; } 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /save-points/09-progressive-web-app/BlazingPizza.Tests/ComponentLibrary/OrderReviewTests.razor: -------------------------------------------------------------------------------- 1 | @inherits TestContext 2 | @code 3 | { 4 | [Theory, AutoData] 5 | public void OrderView_Lists_All_Toppings_In_Per_Pizza(Order order) 6 | { 7 | var totalTopping = order.Pizzas.SelectMany(x=>x.Toppings).Count(); 8 | var cut = Render(@); 9 | 10 | var toppings = cut.FindAll("ul li"); 11 | 12 | toppings.Should().HaveCount(totalTopping); 13 | } 14 | } -------------------------------------------------------------------------------- /save-points/09-progressive-web-app/BlazingPizza.Tests/Helpers/TestAuthenticationViewComponent.razor: -------------------------------------------------------------------------------- 1 | @Action 2 | @code{ 3 | [Parameter] public string Action { get; set; } 4 | 5 | [Parameter] public PizzaAuthenticationState AuthenticationState { get; set; } 6 | 7 | [Parameter] public EventCallback OnLogInSucceeded { get; set; } 8 | } -------------------------------------------------------------------------------- /save-points/09-progressive-web-app/BlazingPizza.Tests/TestDoubles/DummyNavigationInterception.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Text; 5 | using System.Threading.Tasks; 6 | using Microsoft.AspNetCore.Components.Routing; 7 | 8 | namespace BlazingPizza.TestDoubles 9 | { 10 | public class DummyNavigationInterception : INavigationInterception 11 | { 12 | public Task EnableNavigationInterceptionAsync() 13 | { 14 | return Task.CompletedTask; 15 | } 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/BlazingComponents/TemplatedDialog.razor: -------------------------------------------------------------------------------- 1 | @if (Show) 2 | { 3 |
    4 |
    5 | @ChildContent 6 |
    7 |
    8 | } 9 | 10 | @code { 11 | [Parameter] public RenderFragment ChildContent { get; set; } 12 | [Parameter] public bool Show { get; set; } 13 | } -------------------------------------------------------------------------------- /src/BlazingComponents/_Imports.razor: -------------------------------------------------------------------------------- 1 | @using Microsoft.AspNetCore.Components.Web 2 | -------------------------------------------------------------------------------- /src/BlazingPizza.Client/PizzaAuthenticationState.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.AspNetCore.Components.WebAssembly.Authentication; 2 | 3 | namespace BlazingPizza.Client 4 | { 5 | public class PizzaAuthenticationState : RemoteAuthenticationState 6 | { 7 | public Order Order { get; set; } 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /src/BlazingPizza.Client/Shared/RedirectToLogin.razor: -------------------------------------------------------------------------------- 1 | @inject NavigationManager Navigation 2 | @code { 3 | protected override void OnInitialized() 4 | { 5 | Navigation.NavigateTo($"authentication/login?returnUrl={Navigation.Uri}"); 6 | } 7 | } -------------------------------------------------------------------------------- /src/BlazingPizza.Client/wwwroot/css/font/quicksand-v8-latin-300.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/src/BlazingPizza.Client/wwwroot/css/font/quicksand-v8-latin-300.woff -------------------------------------------------------------------------------- /src/BlazingPizza.Client/wwwroot/css/font/quicksand-v8-latin-300.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/src/BlazingPizza.Client/wwwroot/css/font/quicksand-v8-latin-300.woff2 -------------------------------------------------------------------------------- /src/BlazingPizza.Client/wwwroot/css/font/quicksand-v8-latin-500.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/src/BlazingPizza.Client/wwwroot/css/font/quicksand-v8-latin-500.woff -------------------------------------------------------------------------------- /src/BlazingPizza.Client/wwwroot/css/font/quicksand-v8-latin-500.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/src/BlazingPizza.Client/wwwroot/css/font/quicksand-v8-latin-500.woff2 -------------------------------------------------------------------------------- /src/BlazingPizza.Client/wwwroot/css/font/quicksand-v8-latin-700.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/src/BlazingPizza.Client/wwwroot/css/font/quicksand-v8-latin-700.woff -------------------------------------------------------------------------------- /src/BlazingPizza.Client/wwwroot/css/font/quicksand-v8-latin-700.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/src/BlazingPizza.Client/wwwroot/css/font/quicksand-v8-latin-700.woff2 -------------------------------------------------------------------------------- /src/BlazingPizza.Client/wwwroot/css/font/quicksand-v8-latin-regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/src/BlazingPizza.Client/wwwroot/css/font/quicksand-v8-latin-regular.woff -------------------------------------------------------------------------------- /src/BlazingPizza.Client/wwwroot/css/font/quicksand-v8-latin-regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/src/BlazingPizza.Client/wwwroot/css/font/quicksand-v8-latin-regular.woff2 -------------------------------------------------------------------------------- /src/BlazingPizza.Client/wwwroot/img/icon-512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/src/BlazingPizza.Client/wwwroot/img/icon-512.png -------------------------------------------------------------------------------- /src/BlazingPizza.Client/wwwroot/img/pizzas/bacon.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/src/BlazingPizza.Client/wwwroot/img/pizzas/bacon.jpg -------------------------------------------------------------------------------- /src/BlazingPizza.Client/wwwroot/img/pizzas/brit.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/src/BlazingPizza.Client/wwwroot/img/pizzas/brit.jpg -------------------------------------------------------------------------------- /src/BlazingPizza.Client/wwwroot/img/pizzas/cheese.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/src/BlazingPizza.Client/wwwroot/img/pizzas/cheese.jpg -------------------------------------------------------------------------------- /src/BlazingPizza.Client/wwwroot/img/pizzas/margherita.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/src/BlazingPizza.Client/wwwroot/img/pizzas/margherita.jpg -------------------------------------------------------------------------------- /src/BlazingPizza.Client/wwwroot/img/pizzas/meaty.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/src/BlazingPizza.Client/wwwroot/img/pizzas/meaty.jpg -------------------------------------------------------------------------------- /src/BlazingPizza.Client/wwwroot/img/pizzas/mushroom.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/src/BlazingPizza.Client/wwwroot/img/pizzas/mushroom.jpg -------------------------------------------------------------------------------- /src/BlazingPizza.Client/wwwroot/img/pizzas/pepperoni.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/src/BlazingPizza.Client/wwwroot/img/pizzas/pepperoni.jpg -------------------------------------------------------------------------------- /src/BlazingPizza.Client/wwwroot/img/pizzas/salad.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/src/BlazingPizza.Client/wwwroot/img/pizzas/salad.jpg -------------------------------------------------------------------------------- /src/BlazingPizza.Client/wwwroot/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "short_name": "Blazing Pizza", 3 | "name": "Blazing Pizza", 4 | "icons": [ 5 | { 6 | "src": "img/icon-512.png", 7 | "type": "image/png", 8 | "sizes": "512x512" 9 | } 10 | ], 11 | "start_url": "/", 12 | "background_color": "#860000", 13 | "display": "standalone", 14 | "scope": "/", 15 | "theme_color": "#860000" 16 | } -------------------------------------------------------------------------------- /src/BlazingPizza.ComponentsLibrary/ConfiguredPizzaItem.razor: -------------------------------------------------------------------------------- 1 | 
    2 | x 3 |
    @(Pizza.Size)" @Pizza.Special.Name
    4 |
      5 | @foreach (var topping in Pizza.Toppings) 6 | { 7 |
    • + @topping.Topping.Name
    • 8 | } 9 |
    10 |
    11 | @Pizza.GetFormattedTotalPrice() 12 |
    13 |
    14 | 15 | @code { 16 | [Parameter] public Pizza Pizza { get; set; } 17 | [Parameter] public EventCallback OnRemoved { get; set; } 18 | } -------------------------------------------------------------------------------- /src/BlazingPizza.ComponentsLibrary/JSRuntimeExtensions.cs: -------------------------------------------------------------------------------- 1 | using System.Threading.Tasks; 2 | using Microsoft.JSInterop; 3 | 4 | namespace BlazingPizza.ComponentsLibrary 5 | { 6 | public static class JSRuntimeExtensions 7 | { 8 | public static ValueTask Confirm(this IJSRuntime jsRuntime, string message) 9 | => jsRuntime.InvokeAsync("confirm", message); 10 | } 11 | } -------------------------------------------------------------------------------- /src/BlazingPizza.ComponentsLibrary/OrderItem.razor: -------------------------------------------------------------------------------- 1 | 
    2 |
    @Item.Order.CreatedTime.ToLongDateString()
    3 | Items: 4 | @Item.Order.Pizzas.Count(); 5 | Total price: 6 | £@Item.Order.GetFormattedTotalPrice() 7 |
    8 |
    9 | Status: @Item.StatusText 10 |
    11 | 16 | @code { 17 | [Parameter] public OrderWithStatus Item { get; set; } 18 | } -------------------------------------------------------------------------------- /src/BlazingPizza.ComponentsLibrary/PizzaCard.razor: -------------------------------------------------------------------------------- 1 | 
  • 2 |
    3 | @Special.Name 4 | @Special.Description 5 | @Special.GetFormattedBasePrice() 6 |
    7 |
  • 8 | 9 | @code { 10 | [Parameter] public PizzaSpecial Special { get; set; } 11 | [Parameter] public EventCallback OnClick { get; set; } 12 | } -------------------------------------------------------------------------------- /src/BlazingPizza.ComponentsLibrary/_Imports.razor: -------------------------------------------------------------------------------- 1 | @using Microsoft.AspNetCore.Authorization 2 | @using Microsoft.AspNetCore.Components.Forms 3 | @using Microsoft.AspNetCore.Components.Routing 4 | @using Microsoft.AspNetCore.Components.Web 5 | @using Microsoft.JSInterop 6 | @using BlazingPizza 7 | @using BlazingPizza.ComponentsLibrary 8 | @using BlazingPizza.Maps -------------------------------------------------------------------------------- /src/BlazingPizza.ComponentsLibrary/wwwroot/leaflet/images/layers-2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/src/BlazingPizza.ComponentsLibrary/wwwroot/leaflet/images/layers-2x.png -------------------------------------------------------------------------------- /src/BlazingPizza.ComponentsLibrary/wwwroot/leaflet/images/layers.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/src/BlazingPizza.ComponentsLibrary/wwwroot/leaflet/images/layers.png -------------------------------------------------------------------------------- /src/BlazingPizza.ComponentsLibrary/wwwroot/leaflet/images/marker-icon-2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/src/BlazingPizza.ComponentsLibrary/wwwroot/leaflet/images/marker-icon-2x.png -------------------------------------------------------------------------------- /src/BlazingPizza.ComponentsLibrary/wwwroot/leaflet/images/marker-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/src/BlazingPizza.ComponentsLibrary/wwwroot/leaflet/images/marker-icon.png -------------------------------------------------------------------------------- /src/BlazingPizza.ComponentsLibrary/wwwroot/leaflet/images/marker-shadow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/src/BlazingPizza.ComponentsLibrary/wwwroot/leaflet/images/marker-shadow.png -------------------------------------------------------------------------------- /src/BlazingPizza.ComponentsLibrary/wwwroot/localStorage.js: -------------------------------------------------------------------------------- 1 | (function () { 2 | window.blazorLocalStorage = { 3 | get: key => key in localStorage ? JSON.parse(localStorage[key]) : null, 4 | set: (key, value) => { localStorage[key] = JSON.stringify(value); }, 5 | delete: key => { delete localStorage[key]; } 6 | }; 7 | })(); 8 | -------------------------------------------------------------------------------- /src/BlazingPizza.Server/PizzaStoreUser.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.AspNetCore.Identity; 2 | 3 | namespace BlazingPizza.Server 4 | { 5 | public class PizzaStoreUser : IdentityUser 6 | { 7 | } 8 | } -------------------------------------------------------------------------------- /src/BlazingPizza.Server/PizzasController.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.AspNetCore.Mvc; 2 | 3 | namespace BlazingPizza.Server 4 | { 5 | [Route("pizzas")] 6 | [ApiController] 7 | public class PizzasController : Controller 8 | { 9 | private readonly PizzaStoreContext _db; 10 | 11 | public PizzasController(PizzaStoreContext db) 12 | { 13 | _db = db; 14 | } 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /src/BlazingPizza.Server/appsettings.Development.json: -------------------------------------------------------------------------------- 1 | { 2 | "Logging": { 3 | "LogLevel": { 4 | "Default": "Debug", 5 | "System": "Information", 6 | "Microsoft": "Information" 7 | } 8 | }, 9 | "IdentityServer": { 10 | "Key": { 11 | "Type": "Development" 12 | } 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /src/BlazingPizza.Server/appsettings.json: -------------------------------------------------------------------------------- 1 | { 2 | "Logging": { 3 | "LogLevel": { 4 | "Default": "Warning" 5 | } 6 | }, 7 | "IdentityServer": { 8 | "Clients": { 9 | "BlazingPizza.Client": { 10 | "Profile": "IdentityServerSPA" 11 | } 12 | } 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /src/BlazingPizza.Shared/BlazingPizza.Shared.csproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | net6.0 5 | BlazingPizza 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /src/BlazingPizza.Shared/Maps/Marker.cs: -------------------------------------------------------------------------------- 1 | namespace BlazingPizza.Maps 2 | { 3 | public class Marker 4 | { 5 | public string Description { get; set; } 6 | 7 | public double X { get; set; } 8 | 9 | public double Y { get; set; } 10 | 11 | public bool ShowPopup { get; set; } 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/BlazingPizza.Shared/Maps/Point.cs: -------------------------------------------------------------------------------- 1 | namespace BlazingPizza.Maps 2 | { 3 | public class Point 4 | { 5 | public double X { get; set; } 6 | 7 | public double Y { get; set; } 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /src/BlazingPizza.Shared/NotificationSubscription.cs: -------------------------------------------------------------------------------- 1 | namespace BlazingPizza 2 | { 3 | public class NotificationSubscription 4 | { 5 | public int NotificationSubscriptionId { get; set; } 6 | 7 | public string UserId { get; set; } 8 | 9 | public string Url { get; set; } 10 | 11 | public string P256dh { get; set; } 12 | 13 | public string Auth { get; set; } 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /src/BlazingPizza.Shared/PizzaSpecial.cs: -------------------------------------------------------------------------------- 1 | namespace BlazingPizza 2 | { 3 | /// 4 | /// Represents a pre-configured template for a pizza a user can order 5 | /// 6 | public class PizzaSpecial 7 | { 8 | public int Id { get; set; } 9 | 10 | public string Name { get; set; } 11 | 12 | public decimal BasePrice { get; set; } 13 | 14 | public string Description { get; set; } 15 | 16 | public string ImageUrl { get; set; } 17 | 18 | public string GetFormattedBasePrice() => BasePrice.ToString("0.00"); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/BlazingPizza.Shared/PizzaTopping.cs: -------------------------------------------------------------------------------- 1 | namespace BlazingPizza 2 | { 3 | public class PizzaTopping 4 | { 5 | public Topping Topping { get; set; } 6 | 7 | public int ToppingId { get; set; } 8 | 9 | public int PizzaId { get; set; } 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /src/BlazingPizza.Shared/Services/IAuthenticationViewComponentTypeProvider.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.IO; 4 | using System.Linq; 5 | using System.Text; 6 | using System.Threading.Tasks; 7 | 8 | namespace BlazingPizza.Services 9 | { 10 | public interface IAuthenticationViewComponentTypeProvider 11 | { 12 | public Type GetAuthenticationViewComponentType(); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /src/BlazingPizza.Shared/Topping.cs: -------------------------------------------------------------------------------- 1 | namespace BlazingPizza 2 | { 3 | public class Topping 4 | { 5 | public int Id { get; set; } 6 | 7 | public string Name { get; set; } 8 | 9 | public decimal Price { get; set; } 10 | 11 | public string GetFormattedPrice() => Price.ToString("0.00"); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/BlazingPizza.Shared/UserInfo.cs: -------------------------------------------------------------------------------- 1 | namespace BlazingPizza 2 | { 3 | public class UserInfo 4 | { 5 | public bool IsAuthenticated { get; set; } 6 | 7 | public string Name { get; set; } 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /src/BlazingPizza.Tests/ComponentLibrary/OrderReviewTests.razor: -------------------------------------------------------------------------------- 1 | @inherits TestContext 2 | @code 3 | { 4 | [Theory, AutoData] 5 | public void OrderView_Lists_All_Toppings_In_Per_Pizza(Order order) 6 | { 7 | var totalTopping = order.Pizzas.SelectMany(x=>x.Toppings).Count(); 8 | var cut = Render(@); 9 | 10 | var toppings = cut.FindAll("ul li"); 11 | 12 | toppings.Should().HaveCount(totalTopping); 13 | } 14 | } -------------------------------------------------------------------------------- /src/BlazingPizza.Tests/Helpers/TestAuthenticationViewComponent.razor: -------------------------------------------------------------------------------- 1 | @Action 2 | @code{ 3 | [Parameter] public string Action { get; set; } 4 | 5 | [Parameter] public PizzaAuthenticationState AuthenticationState { get; set; } 6 | 7 | [Parameter] public EventCallback OnLogInSucceeded { get; set; } 8 | } -------------------------------------------------------------------------------- /src/BlazingPizza.Tests/TestDoubles/DummyNavigationInterception.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Text; 5 | using System.Threading.Tasks; 6 | using Microsoft.AspNetCore.Components.Routing; 7 | 8 | namespace BlazingPizza.TestDoubles 9 | { 10 | public class DummyNavigationInterception : INavigationInterception 11 | { 12 | public Task EnableNavigationInterceptionAsync() 13 | { 14 | return Task.CompletedTask; 15 | } 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/nuget.config: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /ui-mockup.pptx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egil/blazor-workshop/6a25d37399cbc15eba03654ae97864bd57a6c43b/ui-mockup.pptx --------------------------------------------------------------------------------