├── .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 |
6 | @if (specials is not null)
7 | {
8 | @foreach (var special in specials)
9 | {
10 |
11 | }
12 | }
13 |
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 |
5 |
6 |
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 | OnClick.InvokeAsync(Special)" style="background-image: url('@Special.ImageUrl')">
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 |
5 |
6 |
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 | OnClick.InvokeAsync(Special)" style="background-image: url('@Special.ImageUrl')">
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 |
5 |
6 |
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 | OnClick.InvokeAsync(Special)" style="background-image: url('@Special.ImageUrl')">
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 |
5 |
6 |
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 | OnClick.InvokeAsync(Special)" style="background-image: url('@Special.ImageUrl')">
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 |
5 |
6 |
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 | OnClick.InvokeAsync(Special)" style="background-image: url('@Special.ImageUrl')">
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 | OnClick.InvokeAsync(Special)" style="background-image: url('@Special.ImageUrl')">
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 | OnClick.InvokeAsync(Special)" style="background-image: url('@Special.ImageUrl')">
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 | OnClick.InvokeAsync(Special)" style="background-image: url('@Special.ImageUrl')">
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 | OnClick.InvokeAsync(Special)" style="background-image: url('@Special.ImageUrl')">
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 | OnClick.InvokeAsync(Special)" style="background-image: url('@Special.ImageUrl')">
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
--------------------------------------------------------------------------------