From 3252de5cb026d6ab85e3da1bf4e3468d2a5d976b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?F=C3=A9lix=20Mielcarek?= Date: Wed, 23 Nov 2022 17:23:19 +0100 Subject: [PATCH] https://codefirst.iut.uca.fr/documentation/julien.riboulet/docusaurus/Blazor/razor-component/complex-component-main/#concept-cascadingvalue--cascadingparameter --- .../BlazorApp/DesignTimeBuild/.dtbcache.v2 | Bin 141056 -> 142304 bytes Sources/BlazorApp/.vs/BlazorApp/v17/.suo | Bin 70144 -> 128000 bytes .../BlazorApp/BlazorApp/Components/Card.razor | 6 + .../BlazorApp/Components/Card.razor.cs | 16 +++ .../BlazorApp/Components/Crafting.razor | 50 +++++++ .../BlazorApp/Components/Crafting.razor.cs | 80 ++++++++++++ .../BlazorApp/Components/Crafting.razor.css | 19 +++ .../BlazorApp/Components/Crafting.razor.js | 16 +++ .../BlazorApp/Components/CraftingAction.cs | 11 ++ .../BlazorApp/Components/CraftingItem.razor | 13 ++ .../Components/CraftingItem.razor.cs | 64 +++++++++ .../Components/CraftingItem.razor.css | 6 + .../BlazorApp/Components/CraftingRecipe.cs | 10 ++ .../BlazorApp/Components/ShowItems.razor | 11 ++ .../BlazorApp/Components/ShowItems.razor.cs | 13 ++ .../Components/TestRenderFragment.razor | 8 ++ .../Controllers/CultureControllers.cs | 31 +++++ Sources/BlazorApp/BlazorApp/Models/Cake.cs | 8 ++ Sources/BlazorApp/BlazorApp/Pages/Index.razor | 41 ++++++ .../BlazorApp/BlazorApp/Pages/Index.razor.cs | 35 +++++ Sources/BlazorApp/BlazorApp/Pages/List.razor | 2 +- .../BlazorApp/BlazorApp/Pages/List.razor.cs | 3 + Sources/BlazorApp/BlazorApp/Pages/Pets1.razor | 29 +++++ Sources/BlazorApp/BlazorApp/Pages/Pets2.razor | 29 +++++ Sources/BlazorApp/BlazorApp/Pages/Pets3.razor | 29 +++++ Sources/BlazorApp/BlazorApp/Pages/Pets4.razor | 29 +++++ Sources/BlazorApp/BlazorApp/Program.cs | 32 +++++ .../Ressources/Pages.List.fr-FR.resx | 123 ++++++++++++++++++ .../BlazorApp/Ressources/Pages.List.resx | 123 ++++++++++++++++++ .../BlazorApp/Shared/CultureSelector.razor | 43 ++++++ .../BlazorApp/Shared/MainLayout.razor | 3 + .../BlazorApp/Shared/TableTemplate.razor | 28 ++++ ....GeneratedMSBuildEditorConfig.editorconfig | 44 +++++++ .../obj/staticwebassets.pack.sentinel | 1 + 34 files changed, 955 insertions(+), 1 deletion(-) create mode 100644 Sources/BlazorApp/BlazorApp/Components/Card.razor create mode 100644 Sources/BlazorApp/BlazorApp/Components/Card.razor.cs create mode 100644 Sources/BlazorApp/BlazorApp/Components/Crafting.razor create mode 100644 Sources/BlazorApp/BlazorApp/Components/Crafting.razor.cs create mode 100644 Sources/BlazorApp/BlazorApp/Components/Crafting.razor.css create mode 100644 Sources/BlazorApp/BlazorApp/Components/Crafting.razor.js create mode 100644 Sources/BlazorApp/BlazorApp/Components/CraftingAction.cs create mode 100644 Sources/BlazorApp/BlazorApp/Components/CraftingItem.razor create mode 100644 Sources/BlazorApp/BlazorApp/Components/CraftingItem.razor.cs create mode 100644 Sources/BlazorApp/BlazorApp/Components/CraftingItem.razor.css create mode 100644 Sources/BlazorApp/BlazorApp/Components/CraftingRecipe.cs create mode 100644 Sources/BlazorApp/BlazorApp/Components/ShowItems.razor create mode 100644 Sources/BlazorApp/BlazorApp/Components/ShowItems.razor.cs create mode 100644 Sources/BlazorApp/BlazorApp/Components/TestRenderFragment.razor create mode 100644 Sources/BlazorApp/BlazorApp/Controllers/CultureControllers.cs create mode 100644 Sources/BlazorApp/BlazorApp/Models/Cake.cs create mode 100644 Sources/BlazorApp/BlazorApp/Pages/Index.razor.cs create mode 100644 Sources/BlazorApp/BlazorApp/Pages/Pets1.razor create mode 100644 Sources/BlazorApp/BlazorApp/Pages/Pets2.razor create mode 100644 Sources/BlazorApp/BlazorApp/Pages/Pets3.razor create mode 100644 Sources/BlazorApp/BlazorApp/Pages/Pets4.razor create mode 100644 Sources/BlazorApp/BlazorApp/Ressources/Pages.List.fr-FR.resx create mode 100644 Sources/BlazorApp/BlazorApp/Ressources/Pages.List.resx create mode 100644 Sources/BlazorApp/BlazorApp/Shared/CultureSelector.razor create mode 100644 Sources/BlazorApp/BlazorApp/Shared/TableTemplate.razor diff --git a/Sources/BlazorApp/.vs/BlazorApp/DesignTimeBuild/.dtbcache.v2 b/Sources/BlazorApp/.vs/BlazorApp/DesignTimeBuild/.dtbcache.v2 index b255ca1a77cfd6b465dafe287f3839dc52dd93f2..94dff13f6de7bd1dc989423783f539c9430d14ff 100644 GIT binary patch delta 14233 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 mWD#wOW@ht@oYt*w&uY~&t5rsJzrM{{W@Kk) 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 Ikt0X`57#!B-T(jq diff --git a/Sources/BlazorApp/.vs/BlazorApp/v17/.suo b/Sources/BlazorApp/.vs/BlazorApp/v17/.suo index 372aa252718f674b9ab13f113f763a8b3ecbf3a9..dea143e86a3667aa605de2d1f09f111dce480425 100644 GIT binary patch literal 128000 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%0DquAu)>TQoj;`)3p0 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 LY5)Ie+5i6^rx$ka delta 6631 zcmc&&3sjWH75?wCtheY^wC$eejC0n38n%eE-bc zdEJ?N=bM?eeLleUoP3uKkJhR}10=~`k|Y`7W=BT{MG_FATa4cV+>Md4QG;|9^3e4+ z&cjTSJ8_L{Hooc;5C6h;S&ovLboi27{URG!nV=1>zg=>AXR4|UxG(cDBpi0VR zhtP+DAA&rnCW%tqi;Ch%f`$<2k;y3@Lf{c12zL{>?lg)M2!jd32ss2Ehsy?097kAA z;2E(F!wJEJQG_4@*BeUljgF3}4pz91Fp|Ix!YJkn-Vn3f7^F%h;Q+$u-NvD+a8C^- zWz^}EF%a${WDr7j8%M{?qeL#j+Xu%BDZjXzY&;gICctWZR5c-n%PmyK<5y5ThF~RB z5gsP|jPMH@O}UN|wFLY(%=4Hhzv;}-elkyRck{4L9NcE=Z5}q8g23h(NQfY?c|r-d zG7tB}ChBdTD3bLy53d3TGLI{ebtZQ%WpDFLqz<^&{hpZ9UTdlQWUcXivKDnel1%Gc zNQpZ$n!nd*tXivI0ARqv@D!fpyVTcN!uy2Ngfj$|d+`C~KO}tAO^&94xvIaD;3^C8 z4`6rUDjjjBe1W%f&&p%4U7Lf32d3lti8GbFh1uUa z$;LODa&o*L?4l%xHDm|a1JhMfGKqPHofYAaSQS_U=dqo>=ddcM#{V5EZzXW}p^JyL z2}1+C#`4A(ouCV2Q!vBu{JaGmhf|Xv-$;^1apP!ar}2cl2<*wR1ZFQSf$QriMrXpx z=zA$KhcK6rO~@gz-*)dD=Oq48$X#7`=1#~hw zggdUU8URfdGW#5ZoJZ+l0fmVq^Mi2hoNT$edmpd>+vhBh^V!kaFU-fPxj9NEFP~0% zexVKnmY859RxPQ45!k-uJzrq$dyM1D9FXg{K7N24&uk9HnucxIQ6Jgt+yeM%co3f0 z9%rx4lxw`*I`XR<;ky#FWhUdq%rw}7t21XcJ2QQTl$*>Ym3diKbLm`8qRlu#kvJ(< zSDn$6B5SpzgKH(Mt9PJnWt50I2qPW(OHOE=o~}@VlE!0l_e}AgQ2cpxHH^mgXxddw zWm#Q?$rW_S`=l$obQJZ)PFnL3yfZgY zJ&re0yos=xz-ArMVmt!7ElCK*Ak@zqG9o!8Ha@93qoAbHtaF7p{(3%+87odgQ?|^$ zPmlV&&ZhlvyRk)NHiY4evnJ!;?p47$TCEHbu?PI{`HXQ8k1I15iyR~Pa@H?CHr_qx z4z7k{i^4EEBW8G_Zi=^nHIG?XX|9-8QNE(M#M~4s>s-xd{Uvbdi{;QKKg1Sej@Y#o z{Bi88asCN3;Y9b?8(d>sj0&GLlL;edX+9`uo0;`;b;4Ki*XG+O zZN7LU{9yg5H)|-Zh}pLjzgX}WmQxc6ZI5V}@uUMSAIvHyp zeR4xaX`HuxC_ejCpiiD;v2V^rqEuQQjSF<#VeXblT-Gqq2P8nBEvZUgDh{aIo(vXy zi2)6oX=p1+chS&4O5RtwZjpT5@~EQF4E&68Uvn#JS5vnEU#Xjp8_R;lXRQ!|qjrX1 zluU!cbrbA$!Lb&pKq`{VQl*qfDHHv)QU#^fO63$!l?v&amPZ%MO36F~Yqtb>=rzp$ zMREq-CNxXHf-UTB^kwDknpfR-h_O`cU7$j@D6^X=0&T$t*OS1nQ<@)Ya70_8LC*JM zcia5c5vWv8qoq=!L7j?cX}Nmy{U>`CsY*#>6V0RquQr4^CT&{;bR=xUKh;O!_9q|a zMaPfp18{WxMcHW?!p>CQ?7aDUZuanQ?wmYjvY~J8+}(w{yEeP?)}~cu+sG^X*`0Ts zBw|{7;>Y(owAHQuiGAomuhU$M&o(Ubb@?Y|)C>HgAwqUmh6N3eL5aBb76jn}GBrtI z75Y8(YdDPg4UfBv!mzM$VN{tko!%1cXB-}(O_M^8gfz*;D=rzTkEQT61ml}hL5(LH zXV{x<{>*WFha5o=>a8$rfVQx5D!ni=ECx_6~z^$1=iy7G7*^s@o-37%YmYh+f_LyRxg2F-%|zE zFKgkz?K*MQcwNMgCh99NncTzf!Im#qb!Nr4Dj3{*{yuWaK(ZQqrs2Lm`N(>gkGyW* zxs}*qFfoE|D8IIuuQPRIs;(aznbHBYEL|7~eH)_{_X-EYhqtqOpM7UI?r9z_gB7^@8v~}!8zrZeip3qxvA2?mH!YCv zR)bGIeyte#!}&r`lQsRNuXT(zMG%~R6>eyHo`b& z1y`_07CMG!N+onOJF4&A2oTW*FTe(XR&nxeXc1QrfI@8C4=;<)K80<<_7d2d4niMU z2wL%Ec#UrUo$*k=7{2#rhW@bQ?YEPhBoJ6 z&;q>2`fnBbH( + @CardHeader(Item) + @CardBody(Item) + @CardFooter + \ No newline at end of file diff --git a/Sources/BlazorApp/BlazorApp/Components/Card.razor.cs b/Sources/BlazorApp/BlazorApp/Components/Card.razor.cs new file mode 100644 index 0000000..de0e02c --- /dev/null +++ b/Sources/BlazorApp/BlazorApp/Components/Card.razor.cs @@ -0,0 +1,16 @@ +using Microsoft.AspNetCore.Components; +namespace BlazorApp.Components; +public partial class Card +{ + [Parameter] + public RenderFragment CardBody { get; set; } + + [Parameter] + public RenderFragment CardFooter { get; set; } + + [Parameter] + public RenderFragment CardHeader { get; set; } + + [Parameter] + public TItem Item { get; set; } +} \ No newline at end of file diff --git a/Sources/BlazorApp/BlazorApp/Components/Crafting.razor b/Sources/BlazorApp/BlazorApp/Components/Crafting.razor new file mode 100644 index 0000000..65c9b93 --- /dev/null +++ b/Sources/BlazorApp/BlazorApp/Components/Crafting.razor @@ -0,0 +1,50 @@ + +
+
+
+ +
Available items:
+
+
+ + @foreach (var item in Items) + { + + } +
+
+ +
+ +
+
Recipe
+ +
+ +
+ + + + + + + + + +
+
+ +
Result
+
+ +
+
+ +
+
Actions
+
+
+
+
+
+
\ No newline at end of file diff --git a/Sources/BlazorApp/BlazorApp/Components/Crafting.razor.cs b/Sources/BlazorApp/BlazorApp/Components/Crafting.razor.cs new file mode 100644 index 0000000..085096f --- /dev/null +++ b/Sources/BlazorApp/BlazorApp/Components/Crafting.razor.cs @@ -0,0 +1,80 @@ +using BlazorApp.Models; +using Microsoft.AspNetCore.Components; +using Microsoft.JSInterop; +using System.Collections.ObjectModel; +using System.Collections.Specialized; + +namespace BlazorApp.Components +{ + public partial class Crafting + { + private Item _recipeResult; + + public Crafting() + { + Actions = new ObservableCollection(); + Actions.CollectionChanged += OnActionsCollectionChanged; + this.RecipeItems = new List { null, null, null, null, null, null, null, null, null }; + } + + public ObservableCollection Actions { get; set; } + public Item CurrentDragItem { get; set; } + + [Parameter] + public List Items { get; set; } + + public List RecipeItems { get; set; } + + public Item RecipeResult + { + get => this._recipeResult; + set + { + if (this._recipeResult == value) + { + return; + } + + this._recipeResult = value; + this.StateHasChanged(); + } + } + + [Parameter] + public List Recipes { get; set; } + + /// + /// Gets or sets the java script runtime. + /// + [Inject] + internal IJSRuntime JavaScriptRuntime { get; set; } + + public void CheckRecipe() + { + RecipeResult = null; + + // Get the current model + var currentModel = string.Join("|", this.RecipeItems.Select(s => s != null ? s.Name : string.Empty)); + + this.Actions.Add(new CraftingAction { Action = $"Items : {currentModel}" }); + + foreach (var craftingRecipe in Recipes) + { + // Get the recipe model + var recipeModel = string.Join("|", craftingRecipe.Have.SelectMany(s => s)); + + this.Actions.Add(new CraftingAction { Action = $"Recipe model : {recipeModel}" }); + + if (currentModel == recipeModel) + { + RecipeResult = craftingRecipe.Give; + } + } + } + + private void OnActionsCollectionChanged(object? sender, NotifyCollectionChangedEventArgs e) + { + JavaScriptRuntime.InvokeVoidAsync("Crafting.AddActions", e.NewItems); + } + } +} diff --git a/Sources/BlazorApp/BlazorApp/Components/Crafting.razor.css b/Sources/BlazorApp/BlazorApp/Components/Crafting.razor.css new file mode 100644 index 0000000..2a388f2 --- /dev/null +++ b/Sources/BlazorApp/BlazorApp/Components/Crafting.razor.css @@ -0,0 +1,19 @@ +.css-grid { + grid-template-columns: repeat(4,minmax(0,1fr)); + gap: 10px; + display: grid; + width: 286px; +} + +.css-recipe { + grid-template-columns: repeat(3,minmax(0,1fr)); + gap: 10px; + display: grid; + width: 212px; +} + +.actions { + border: 1px solid black; + height: 250px; + overflow: scroll; +} diff --git a/Sources/BlazorApp/BlazorApp/Components/Crafting.razor.js b/Sources/BlazorApp/BlazorApp/Components/Crafting.razor.js new file mode 100644 index 0000000..8fdb58e --- /dev/null +++ b/Sources/BlazorApp/BlazorApp/Components/Crafting.razor.js @@ -0,0 +1,16 @@ +window.Crafting = +{ + AddActions: function (data) { + + data.forEach(element => { + var div = document.createElement('div'); + div.innerHTML = 'Action: ' + element.action + ' - Index: ' + element.index; + + if (element.item) { + div.innerHTML += ' - Item Name: ' + element.item.name; + } + + document.getElementById('actions').appendChild(div); + }); + } +} \ No newline at end of file diff --git a/Sources/BlazorApp/BlazorApp/Components/CraftingAction.cs b/Sources/BlazorApp/BlazorApp/Components/CraftingAction.cs new file mode 100644 index 0000000..45393c9 --- /dev/null +++ b/Sources/BlazorApp/BlazorApp/Components/CraftingAction.cs @@ -0,0 +1,11 @@ +using BlazorApp.Models; + +namespace BlazorApp.Components +{ + public class CraftingAction + { + public string Action { get; set; } + public int Index { get; set; } + public Item Item { get; set; } + } +} diff --git a/Sources/BlazorApp/BlazorApp/Components/CraftingItem.razor b/Sources/BlazorApp/BlazorApp/Components/CraftingItem.razor new file mode 100644 index 0000000..e64e6cd --- /dev/null +++ b/Sources/BlazorApp/BlazorApp/Components/CraftingItem.razor @@ -0,0 +1,13 @@ +
+ + @if (Item != null) + { + @Item.DisplayName + } +
\ No newline at end of file diff --git a/Sources/BlazorApp/BlazorApp/Components/CraftingItem.razor.cs b/Sources/BlazorApp/BlazorApp/Components/CraftingItem.razor.cs new file mode 100644 index 0000000..5035244 --- /dev/null +++ b/Sources/BlazorApp/BlazorApp/Components/CraftingItem.razor.cs @@ -0,0 +1,64 @@ +using BlazorApp.Models; +using Blazorise; +using Microsoft.AspNetCore.Components; + +namespace BlazorApp.Components +{ + public partial class CraftingItem + { + [Parameter] + public int Index { get; set; } + + [Parameter] + public Item Item { get; set; } + + [Parameter] + public bool NoDrop { get; set; } + + [CascadingParameter] + public Crafting Parent { get; set; } + + internal void OnDragEnter() + { + if (NoDrop) + { + return; + } + + Parent.Actions.Add(new CraftingAction { Action = "Drag Enter", Item = this.Item, Index = this.Index }); + } + + internal void OnDragLeave() + { + if (NoDrop) + { + return; + } + + Parent.Actions.Add(new CraftingAction { Action = "Drag Leave", Item = this.Item, Index = this.Index }); + } + + internal void OnDrop() + { + if (NoDrop) + { + return; + } + + this.Item = Parent.CurrentDragItem; + Parent.RecipeItems[this.Index] = this.Item; + + Parent.Actions.Add(new CraftingAction { Action = "Drop", Item = this.Item, Index = this.Index }); + + // Check recipe + Parent.CheckRecipe(); + } + + private void OnDragStart() + { + Parent.CurrentDragItem = this.Item; + + Parent.Actions.Add(new CraftingAction { Action = "Drag Start", Item = this.Item, Index = this.Index }); + } + } +} diff --git a/Sources/BlazorApp/BlazorApp/Components/CraftingItem.razor.css b/Sources/BlazorApp/BlazorApp/Components/CraftingItem.razor.css new file mode 100644 index 0000000..b2d4521 --- /dev/null +++ b/Sources/BlazorApp/BlazorApp/Components/CraftingItem.razor.css @@ -0,0 +1,6 @@ +.item { + width: 64px; + height: 64px; + border: 1px solid; + overflow: hidden; +} diff --git a/Sources/BlazorApp/BlazorApp/Components/CraftingRecipe.cs b/Sources/BlazorApp/BlazorApp/Components/CraftingRecipe.cs new file mode 100644 index 0000000..7cbe8a4 --- /dev/null +++ b/Sources/BlazorApp/BlazorApp/Components/CraftingRecipe.cs @@ -0,0 +1,10 @@ +using BlazorApp.Models; + +namespace BlazorApp.Components +{ + public class CraftingRecipe + { + public Item Give { get; set; } + public List> Have { get; set; } + } +} diff --git a/Sources/BlazorApp/BlazorApp/Components/ShowItems.razor b/Sources/BlazorApp/BlazorApp/Components/ShowItems.razor new file mode 100644 index 0000000..e8fccfd --- /dev/null +++ b/Sources/BlazorApp/BlazorApp/Components/ShowItems.razor @@ -0,0 +1,11 @@ +@typeparam TItem + +
+ @if ((Items?.Count ?? 0) != 0) + { + @foreach (var item in Items) + { + @ShowTemplate(item); + } + } +
\ No newline at end of file diff --git a/Sources/BlazorApp/BlazorApp/Components/ShowItems.razor.cs b/Sources/BlazorApp/BlazorApp/Components/ShowItems.razor.cs new file mode 100644 index 0000000..75587b0 --- /dev/null +++ b/Sources/BlazorApp/BlazorApp/Components/ShowItems.razor.cs @@ -0,0 +1,13 @@ +using Microsoft.AspNetCore.Components; + +namespace BlazorApp.Components +{ + public partial class ShowItems + { + [Parameter] + public List Items { get; set; } + + [Parameter] + public RenderFragment ShowTemplate { get; set; } + } +} diff --git a/Sources/BlazorApp/BlazorApp/Components/TestRenderFragment.razor b/Sources/BlazorApp/BlazorApp/Components/TestRenderFragment.razor new file mode 100644 index 0000000..176ee34 --- /dev/null +++ b/Sources/BlazorApp/BlazorApp/Components/TestRenderFragment.razor @@ -0,0 +1,8 @@ +

TestRenderFragment

+ +@code { + [Parameter] + public RenderFragment ChildContent { get; set; } +} + +@ChildContent \ No newline at end of file diff --git a/Sources/BlazorApp/BlazorApp/Controllers/CultureControllers.cs b/Sources/BlazorApp/BlazorApp/Controllers/CultureControllers.cs new file mode 100644 index 0000000..328c28e --- /dev/null +++ b/Sources/BlazorApp/BlazorApp/Controllers/CultureControllers.cs @@ -0,0 +1,31 @@ +using Microsoft.AspNetCore.Localization; +using Microsoft.AspNetCore.Mvc; + +/// +/// The culture controller. +/// +[Route("[controller]/[action]")] +public class CultureController : Controller +{ + /// + /// Sets the culture. + /// + /// The culture. + /// The redirect URI. + /// + /// The action result. + /// + public IActionResult SetCulture(string culture, string redirectUri) + { + if (culture != null) + { + // Define a cookie with the selected culture + this.HttpContext.Response.Cookies.Append( + CookieRequestCultureProvider.DefaultCookieName, + CookieRequestCultureProvider.MakeCookieValue( + new RequestCulture(culture))); + } + + return this.LocalRedirect(redirectUri); + } +} \ No newline at end of file diff --git a/Sources/BlazorApp/BlazorApp/Models/Cake.cs b/Sources/BlazorApp/BlazorApp/Models/Cake.cs new file mode 100644 index 0000000..5593683 --- /dev/null +++ b/Sources/BlazorApp/BlazorApp/Models/Cake.cs @@ -0,0 +1,8 @@ +namespace BlazorApp.Models; + +public class Cake +{ + public int Id { get; set; } + public string Name { get; set; } + public decimal Cost { get; set; } +} \ No newline at end of file diff --git a/Sources/BlazorApp/BlazorApp/Pages/Index.razor b/Sources/BlazorApp/BlazorApp/Pages/Index.razor index 6085c4a..16aaf67 100644 --- a/Sources/BlazorApp/BlazorApp/Pages/Index.razor +++ b/Sources/BlazorApp/BlazorApp/Pages/Index.razor @@ -1,4 +1,6 @@ @page "/" +@using System.Globalization +@using BlazorApp.Components Index @@ -7,3 +9,42 @@ Welcome to your new app. + +

+ CurrentCulture: @CultureInfo.CurrentCulture +

+ + + +
+ Cake Token Number - @headContext.Id +
+
+ +
+
@bodyContext.Name
+
$ @bodyContext.Cost
+
+
+
+ + + +
+
+ Cake Token Id - @CakeContext.Id +
+
+
@CakeContext.Name
+

Price $@CakeContext.Cost

+
+ +
+
+
+ + +
Content of my TestRenderFragment
+
\ No newline at end of file diff --git a/Sources/BlazorApp/BlazorApp/Pages/Index.razor.cs b/Sources/BlazorApp/BlazorApp/Pages/Index.razor.cs new file mode 100644 index 0000000..22c3121 --- /dev/null +++ b/Sources/BlazorApp/BlazorApp/Pages/Index.razor.cs @@ -0,0 +1,35 @@ +namespace BlazorApp.Pages; +using BlazorApp.Models; + +public partial class Index +{ + private Cake CakeItem = new Cake + { + Id = 1, + Name = "Black Forest", + Cost = 50 + }; + + public List Cakes { get; set; } + + protected override Task OnAfterRenderAsync(bool firstRender) + { + LoadCakes(); + StateHasChanged(); + return base.OnAfterRenderAsync(firstRender); + } + + public void LoadCakes() + { + Cakes = new List + { + // items hidden for display purpose + new Cake + { + Id = 1, + Name = "Red Velvet", + Cost = 60 + }, + }; + } +} \ No newline at end of file diff --git a/Sources/BlazorApp/BlazorApp/Pages/List.razor b/Sources/BlazorApp/BlazorApp/Pages/List.razor index 26dd94a..f58987f 100644 --- a/Sources/BlazorApp/BlazorApp/Pages/List.razor +++ b/Sources/BlazorApp/BlazorApp/Pages/List.razor @@ -1,7 +1,7 @@ @page "/list" @using BlazorApp.Models -

List

+

@Localizer["Title"]

diff --git a/Sources/BlazorApp/BlazorApp/Pages/List.razor.cs b/Sources/BlazorApp/BlazorApp/Pages/List.razor.cs index 668d889..370d201 100644 --- a/Sources/BlazorApp/BlazorApp/Pages/List.razor.cs +++ b/Sources/BlazorApp/BlazorApp/Pages/List.razor.cs @@ -16,6 +16,9 @@ public partial class List private int totalItem; + [Inject] + public IStringLocalizer Localizer { get; set; } + [Inject] public IDataService DataService { get; set; } diff --git a/Sources/BlazorApp/BlazorApp/Pages/Pets1.razor b/Sources/BlazorApp/BlazorApp/Pages/Pets1.razor new file mode 100644 index 0000000..065feec --- /dev/null +++ b/Sources/BlazorApp/BlazorApp/Pages/Pets1.razor @@ -0,0 +1,29 @@ +@page "/pets1" + +

Pets

+ + + + ID + Name + + + @pet.PetId + @pet.Name + + + +@code { + private List pets = new() + { + new Pet { PetId = 2, Name = "Mr. Bigglesworth" }, + new Pet { PetId = 4, Name = "Salem Saberhagen" }, + new Pet { PetId = 7, Name = "K-9" } + }; + + private class Pet + { + public int PetId { get; set; } + public string? Name { get; set; } + } +} \ No newline at end of file diff --git a/Sources/BlazorApp/BlazorApp/Pages/Pets2.razor b/Sources/BlazorApp/BlazorApp/Pages/Pets2.razor new file mode 100644 index 0000000..c545e37 --- /dev/null +++ b/Sources/BlazorApp/BlazorApp/Pages/Pets2.razor @@ -0,0 +1,29 @@ +@page "/pets2" + +

Pets

+ + + + ID + Name + + + @pet.PetId + @pet.Name + + + +@code { + private List pets = new() + { + new Pet { PetId = 2, Name = "Mr. Bigglesworth" }, + new Pet { PetId = 4, Name = "Salem Saberhagen" }, + new Pet { PetId = 7, Name = "K-9" } + }; + + private class Pet + { + public int PetId { get; set; } + public string? Name { get; set; } + } +} \ No newline at end of file diff --git a/Sources/BlazorApp/BlazorApp/Pages/Pets3.razor b/Sources/BlazorApp/BlazorApp/Pages/Pets3.razor new file mode 100644 index 0000000..fd52259 --- /dev/null +++ b/Sources/BlazorApp/BlazorApp/Pages/Pets3.razor @@ -0,0 +1,29 @@ +@page "/pets3" + +

Pets

+ + + + ID + Name + + + @context.PetId + @context.Name + + + +@code { + private List pets = new() + { + new Pet { PetId = 2, Name = "Mr. Bigglesworth" }, + new Pet { PetId = 4, Name = "Salem Saberhagen" }, + new Pet { PetId = 7, Name = "K-9" } + }; + + private class Pet + { + public int PetId { get; set; } + public string? Name { get; set; } + } +} \ No newline at end of file diff --git a/Sources/BlazorApp/BlazorApp/Pages/Pets4.razor b/Sources/BlazorApp/BlazorApp/Pages/Pets4.razor new file mode 100644 index 0000000..ac0d918 --- /dev/null +++ b/Sources/BlazorApp/BlazorApp/Pages/Pets4.razor @@ -0,0 +1,29 @@ +@page "/pets4" + +

Pets

+ + + + ID + Name + + + @context.PetId + @context.Name + + + +@code { + private List pets = new() + { + new Pet { PetId = 2, Name = "Mr. Bigglesworth" }, + new Pet { PetId = 4, Name = "Salem Saberhagen" }, + new Pet { PetId = 7, Name = "K-9" } + }; + + private class Pet + { + public int PetId { get; set; } + public string? Name { get; set; } + } +} \ No newline at end of file diff --git a/Sources/BlazorApp/BlazorApp/Program.cs b/Sources/BlazorApp/BlazorApp/Program.cs index 207ee55..e62dc74 100644 --- a/Sources/BlazorApp/BlazorApp/Program.cs +++ b/Sources/BlazorApp/BlazorApp/Program.cs @@ -5,6 +5,9 @@ using Blazorise; using Blazorise.Bootstrap; using Blazorise.Icons.FontAwesome; using Blazored.Modal; +using Microsoft.AspNetCore.Localization; +using System.Globalization; +using Microsoft.Extensions.Options; var builder = WebApplication.CreateBuilder(args); @@ -21,6 +24,22 @@ builder.Services builder.Services.AddScoped(); builder.Services.AddBlazoredModal(); +// Add the controller of the app +builder.Services.AddControllers(); + +// Add the localization to the app and specify the resources path +builder.Services.AddLocalization(opts => { opts.ResourcesPath = "Resources"; }); + +// Configure the localtization +builder.Services.Configure(options => +{ + // Set the default culture of the web site + options.DefaultRequestCulture = new RequestCulture(new CultureInfo("en-US")); + + // Declare the supported culture + options.SupportedCultures = new List { new CultureInfo("en-US"), new CultureInfo("fr-FR") }; + options.SupportedUICultures = new List { new CultureInfo("en-US"), new CultureInfo("fr-FR") }; +}); var app = builder.Build(); // Configure the HTTP request pipeline. @@ -36,7 +55,20 @@ app.UseHttpsRedirection(); app.UseStaticFiles(); app.UseRouting(); +// Get the current localization options +var options = ((IApplicationBuilder)app).ApplicationServices.GetService>(); +if (options?.Value != null) +{ + // use the default localization + app.UseRequestLocalization(options.Value); +} + +// Add the controller to the endpoint +app.UseEndpoints(endpoints => +{ + endpoints.MapControllers(); +}); app.MapBlazorHub(); app.MapFallbackToPage("/_Host"); diff --git a/Sources/BlazorApp/BlazorApp/Ressources/Pages.List.fr-FR.resx b/Sources/BlazorApp/BlazorApp/Ressources/Pages.List.fr-FR.resx new file mode 100644 index 0000000..50bb302 --- /dev/null +++ b/Sources/BlazorApp/BlazorApp/Ressources/Pages.List.fr-FR.resx @@ -0,0 +1,123 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Liste des éléments + + \ No newline at end of file diff --git a/Sources/BlazorApp/BlazorApp/Ressources/Pages.List.resx b/Sources/BlazorApp/BlazorApp/Ressources/Pages.List.resx new file mode 100644 index 0000000..ae67689 --- /dev/null +++ b/Sources/BlazorApp/BlazorApp/Ressources/Pages.List.resx @@ -0,0 +1,123 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Items List + + \ No newline at end of file diff --git a/Sources/BlazorApp/BlazorApp/Shared/CultureSelector.razor b/Sources/BlazorApp/BlazorApp/Shared/CultureSelector.razor new file mode 100644 index 0000000..6d7f012 --- /dev/null +++ b/Sources/BlazorApp/BlazorApp/Shared/CultureSelector.razor @@ -0,0 +1,43 @@ +@using System.Globalization +@inject NavigationManager NavigationManager + +

+ +

+ +@code +{ + private CultureInfo[] supportedCultures = new[] + { + new CultureInfo("en-US"), + new CultureInfo("fr-FR") + }; + + private CultureInfo Culture + { + get => CultureInfo.CurrentCulture; + set + { + if (CultureInfo.CurrentUICulture == value) + { + return; + } + + var culture = value.Name.ToLower(CultureInfo.InvariantCulture); + + var uri = new Uri(this.NavigationManager.Uri).GetComponents(UriComponents.PathAndQuery, UriFormat.Unescaped); + var query = $"?culture={Uri.EscapeDataString(culture)}&" + $"redirectUri={Uri.EscapeDataString(uri)}"; + + // Redirect the user to the culture controller to set the cookie + this.NavigationManager.NavigateTo("/Culture/SetCulture" + query, forceLoad: true); + } + } +} \ No newline at end of file diff --git a/Sources/BlazorApp/BlazorApp/Shared/MainLayout.razor b/Sources/BlazorApp/BlazorApp/Shared/MainLayout.razor index dd158b5..5ff591e 100644 --- a/Sources/BlazorApp/BlazorApp/Shared/MainLayout.razor +++ b/Sources/BlazorApp/BlazorApp/Shared/MainLayout.razor @@ -10,6 +10,9 @@
About +
+ +
diff --git a/Sources/BlazorApp/BlazorApp/Shared/TableTemplate.razor b/Sources/BlazorApp/BlazorApp/Shared/TableTemplate.razor new file mode 100644 index 0000000..72c3ae5 --- /dev/null +++ b/Sources/BlazorApp/BlazorApp/Shared/TableTemplate.razor @@ -0,0 +1,28 @@ +@typeparam TItem +@using System.Diagnostics.CodeAnalysis + + + + @TableHeader + + + @foreach (var item in Items) + { + if (RowTemplate is not null) + { + @RowTemplate(item) + } + } + +
+ +@code { + [Parameter] + public RenderFragment? TableHeader { get; set; } + + [Parameter] + public RenderFragment? RowTemplate { get; set; } + + [Parameter, AllowNull] + public IReadOnlyList Items { get; set; } +} \ No newline at end of file diff --git a/Sources/BlazorApp/BlazorApp/obj/Debug/net6.0/BlazorApp.GeneratedMSBuildEditorConfig.editorconfig b/Sources/BlazorApp/BlazorApp/obj/Debug/net6.0/BlazorApp.GeneratedMSBuildEditorConfig.editorconfig index 8c66c97..56a0f41 100644 --- a/Sources/BlazorApp/BlazorApp/obj/Debug/net6.0/BlazorApp.GeneratedMSBuildEditorConfig.editorconfig +++ b/Sources/BlazorApp/BlazorApp/obj/Debug/net6.0/BlazorApp.GeneratedMSBuildEditorConfig.editorconfig @@ -19,6 +19,18 @@ build_property._RazorSourceGeneratorDebug = build_metadata.AdditionalFiles.TargetPath = QXBwLnJhem9y build_metadata.AdditionalFiles.CssScope = +[C:/Users/felix/Documents/BUT2/Blazor/TP/Sources/BlazorApp/BlazorApp/Components/Card.razor] +build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xDYXJkLnJhem9y +build_metadata.AdditionalFiles.CssScope = + +[C:/Users/felix/Documents/BUT2/Blazor/TP/Sources/BlazorApp/BlazorApp/Components/ShowItems.razor] +build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xTaG93SXRlbXMucmF6b3I= +build_metadata.AdditionalFiles.CssScope = + +[C:/Users/felix/Documents/BUT2/Blazor/TP/Sources/BlazorApp/BlazorApp/Components/TestRenderFragment.razor] +build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xUZXN0UmVuZGVyRnJhZ21lbnQucmF6b3I= +build_metadata.AdditionalFiles.CssScope = + [C:/Users/felix/Documents/BUT2/Blazor/TP/Sources/BlazorApp/BlazorApp/Modals/DeleteConfirmation.razor] build_metadata.AdditionalFiles.TargetPath = TW9kYWxzXERlbGV0ZUNvbmZpcm1hdGlvbi5yYXpvcg== build_metadata.AdditionalFiles.CssScope = @@ -55,6 +67,26 @@ build_metadata.AdditionalFiles.CssScope = build_metadata.AdditionalFiles.TargetPath = UGFnZXNcTGlzdC5yYXpvcg== build_metadata.AdditionalFiles.CssScope = +[C:/Users/felix/Documents/BUT2/Blazor/TP/Sources/BlazorApp/BlazorApp/Pages/Pets1.razor] +build_metadata.AdditionalFiles.TargetPath = UGFnZXNcUGV0czEucmF6b3I= +build_metadata.AdditionalFiles.CssScope = + +[C:/Users/felix/Documents/BUT2/Blazor/TP/Sources/BlazorApp/BlazorApp/Pages/Pets2.razor] +build_metadata.AdditionalFiles.TargetPath = UGFnZXNcUGV0czIucmF6b3I= +build_metadata.AdditionalFiles.CssScope = + +[C:/Users/felix/Documents/BUT2/Blazor/TP/Sources/BlazorApp/BlazorApp/Pages/Pets3.razor] +build_metadata.AdditionalFiles.TargetPath = UGFnZXNcUGV0czMucmF6b3I= +build_metadata.AdditionalFiles.CssScope = + +[C:/Users/felix/Documents/BUT2/Blazor/TP/Sources/BlazorApp/BlazorApp/Pages/Pets4.razor] +build_metadata.AdditionalFiles.TargetPath = UGFnZXNcUGV0czQucmF6b3I= +build_metadata.AdditionalFiles.CssScope = + +[C:/Users/felix/Documents/BUT2/Blazor/TP/Sources/BlazorApp/BlazorApp/Shared/CultureSelector.razor] +build_metadata.AdditionalFiles.TargetPath = U2hhcmVkXEN1bHR1cmVTZWxlY3Rvci5yYXpvcg== +build_metadata.AdditionalFiles.CssScope = + [C:/Users/felix/Documents/BUT2/Blazor/TP/Sources/BlazorApp/BlazorApp/Shared/DoctorWhoLayout.razor] build_metadata.AdditionalFiles.TargetPath = U2hhcmVkXERvY3Rvcldob0xheW91dC5yYXpvcg== build_metadata.AdditionalFiles.CssScope = @@ -63,10 +95,22 @@ build_metadata.AdditionalFiles.CssScope = build_metadata.AdditionalFiles.TargetPath = U2hhcmVkXFN1cnZleVByb21wdC5yYXpvcg== build_metadata.AdditionalFiles.CssScope = +[C:/Users/felix/Documents/BUT2/Blazor/TP/Sources/BlazorApp/BlazorApp/Shared/TableTemplate.razor] +build_metadata.AdditionalFiles.TargetPath = U2hhcmVkXFRhYmxlVGVtcGxhdGUucmF6b3I= +build_metadata.AdditionalFiles.CssScope = + [C:/Users/felix/Documents/BUT2/Blazor/TP/Sources/BlazorApp/BlazorApp/_Imports.razor] build_metadata.AdditionalFiles.TargetPath = X0ltcG9ydHMucmF6b3I= build_metadata.AdditionalFiles.CssScope = +[C:/Users/felix/Documents/BUT2/Blazor/TP/Sources/BlazorApp/BlazorApp/Components/Crafting.razor] +build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xDcmFmdGluZy5yYXpvcg== +build_metadata.AdditionalFiles.CssScope = b-0c7vkjpwvp + +[C:/Users/felix/Documents/BUT2/Blazor/TP/Sources/BlazorApp/BlazorApp/Components/CraftingItem.razor] +build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xDcmFmdGluZ0l0ZW0ucmF6b3I= +build_metadata.AdditionalFiles.CssScope = b-syyk20fth2 + [C:/Users/felix/Documents/BUT2/Blazor/TP/Sources/BlazorApp/BlazorApp/Shared/MainLayout.razor] build_metadata.AdditionalFiles.TargetPath = U2hhcmVkXE1haW5MYXlvdXQucmF6b3I= build_metadata.AdditionalFiles.CssScope = b-3dsd3z3yec diff --git a/Sources/BlazorApp/BlazorApp/obj/staticwebassets.pack.sentinel b/Sources/BlazorApp/BlazorApp/obj/staticwebassets.pack.sentinel index 50f6d0a..debb8a5 100644 --- a/Sources/BlazorApp/BlazorApp/obj/staticwebassets.pack.sentinel +++ b/Sources/BlazorApp/BlazorApp/obj/staticwebassets.pack.sentinel @@ -12,3 +12,4 @@ 2.0 2.0 2.0 +2.0