Skip to content

Commit 1941e55

Browse files
committed
Add Skill via dialog
1 parent cfbe17b commit 1941e55

File tree

4 files changed

+53
-18
lines changed

4 files changed

+53
-18
lines changed

LinkDotNet.Blog.Web/Shared/Skills/AddSkillDialog.razor

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
@using LinkDotNet.Domain
2+
@inject IToastService toastService
23
<ModalDialog @ref="Dialog" Title="Add Skill">
3-
<EditForm Model="@model">
4+
<EditForm Model="@model" OnValidSubmit="CreateSkillItem">
45
<DataAnnotationsValidator />
56
<ValidationSummary />
67
<div class="mb-3">
@@ -9,7 +10,7 @@
910
</div>
1011
<div class="mb-3">
1112
<label for="image">Image Url</label>
12-
<InputText class="form-control" id="image" @bind-Value="model.ImageUrl" rows="4"/>
13+
<InputText class="form-control" id="image" @bind-Value="model.ImageUrl"/>
1314
<small id="image" class="form-text text-muted">If set is used before the skill (optional). 24x24 pixel
1415
optimal size</small>
1516
</div>
@@ -19,7 +20,7 @@
1920
</div>
2021
<div class="mb-3">
2122
<label for="tags">Proficiency</label>
22-
<select class="form-select" id="tags" @bind="@model.Proficiency">
23+
<select class="form-select" id="tags" @bind="model.Proficiency">
2324
@foreach (var level in ProficiencyLevel.All)
2425
{
2526
<option value="@level.Key">@level.Key</option>
@@ -31,6 +32,9 @@
3132
</ModalDialog>
3233

3334
@code {
35+
[Parameter]
36+
public EventCallback<Skill> SkillAdded { get; set; }
37+
3438
private AddSkillModel model = new();
3539
private ModalDialog Dialog { get; set; }
3640

@@ -39,4 +43,12 @@
3943
Dialog.Open();
4044
StateHasChanged();
4145
}
46+
47+
private async Task CreateSkillItem()
48+
{
49+
var skill = Skill.Create(model.Skill, model.ImageUrl, model.Capability, model.Proficiency);
50+
await SkillAdded.InvokeAsync(skill);
51+
model = new AddSkillModel();
52+
toastService.ShowSuccess($"Created Skill {skill.Name} in capability {skill.Capability} with level {skill.ProficiencyLevel}");
53+
}
4254
}

LinkDotNet.Blog.Web/Shared/Skills/AddSkillModel.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using System.ComponentModel.DataAnnotations;
2+
using LinkDotNet.Domain;
23

34
namespace LinkDotNet.Blog.Web.Shared.Skills
45
{
@@ -10,7 +11,7 @@ public class AddSkillModel
1011
public string ImageUrl { get; set; }
1112

1213
[Required]
13-
public string Proficiency { get; set; }
14+
public string Proficiency { get; set; } = ProficiencyLevel.Familiar.Key;
1415

1516
[Required]
1617
public string Capability { get; set; }

LinkDotNet.Blog.Web/Shared/Skills/SkillTable.razor

Lines changed: 7 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
<button type="button" class="btn btn-primary" @onclick="() => AddSkillDialog.Open()"><i class="fas
77
fa-plus-square"></i>
88
Add skill</button>
9-
<AddSkillDialog @ref="AddSkillDialog"></AddSkillDialog>
9+
<AddSkillDialog @ref="AddSkillDialog" SkillAdded="@AddSkill"></AddSkillDialog>
1010
}
1111
</div>
1212
<div>
@@ -45,18 +45,12 @@
4545

4646
private AddSkillDialog AddSkillDialog { get; set; }
4747

48-
private List<Skill> skills = new()
48+
private List<Skill> skills = new();
49+
50+
private Task AddSkill(Skill skillToAdd)
4951
{
50-
new Skill {Capability = "Backend", Name = "C#", ProficiencyLevel = ProficiencyLevel.Expert, IconUrl = "https://img.icons8.com/color/48/000000/c-sharp-logo.png"},
51-
new Skill {Capability = "Backend", Name = ".NET", ProficiencyLevel = ProficiencyLevel.Expert, IconUrl = ""},
52-
new Skill {Capability = "UX", Name = "Figma", ProficiencyLevel = ProficiencyLevel.Expert, IconUrl = "https://miro.medium.com/max/1400/1*[email protected]"},
53-
new Skill {Capability = "UX", Name = "Webflow", ProficiencyLevel = ProficiencyLevel.Proficient},
54-
new Skill {Capability = "UX", Name = "A/B Testing", ProficiencyLevel = ProficiencyLevel.Proficient},
55-
new Skill {Capability = "UX", Name = "Case studies", ProficiencyLevel = ProficiencyLevel.Expert},
56-
new Skill {Capability = "UX", Name = "Adobe Xd", ProficiencyLevel = ProficiencyLevel.Familiar},
57-
new Skill {Capability = "Backend", Name = "Java", ProficiencyLevel = ProficiencyLevel.Familiar, IconUrl = "https://img.icons8.com/ios/50/000000/java-coffee-cup-logo--v1.png"},
58-
new Skill {Capability = "Frontend", Name = "Typescript", ProficiencyLevel = ProficiencyLevel.Expert, IconUrl = ""},
59-
new Skill {Capability = "DevOps", Name = "git", ProficiencyLevel = ProficiencyLevel.Expert, IconUrl = "https://e7.pngegg.com/pngimages/713/558/png-clipart-computer-icons-pro-git-github-logo-text-logo-thumbnail.png"},
60-
};
52+
skills.Add(skillToAdd);
53+
return Task.CompletedTask;
54+
}
6155

6256
}

LinkDotNet.Domain/Skill.cs

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,17 @@
1-
namespace LinkDotNet.Domain
1+
using System;
2+
3+
namespace LinkDotNet.Domain
24
{
35
public class Skill
46
{
7+
public Skill(string name, string iconUrl, string capability, ProficiencyLevel proficiencyLevel)
8+
{
9+
IconUrl = iconUrl;
10+
Name = name;
11+
Capability = capability;
12+
ProficiencyLevel = proficiencyLevel;
13+
}
14+
515
public string Id { get; set; }
616

717
public string IconUrl { get; set; }
@@ -11,5 +21,23 @@ public class Skill
1121
public string Capability { get; set; }
1222

1323
public ProficiencyLevel ProficiencyLevel { get; set; }
24+
25+
public static Skill Create(string name, string iconUrl, string capability, string proficiencyLevel)
26+
{
27+
if (string.IsNullOrWhiteSpace(name))
28+
{
29+
throw new ArgumentNullException(nameof(name));
30+
}
31+
32+
if (string.IsNullOrWhiteSpace(capability))
33+
{
34+
throw new ArgumentNullException(nameof(capability));
35+
}
36+
37+
var level = ProficiencyLevel.Create(proficiencyLevel);
38+
39+
iconUrl = string.IsNullOrWhiteSpace(iconUrl) ? null : iconUrl;
40+
return new Skill(name.Trim(), iconUrl, capability.Trim(), level);
41+
}
1442
}
1543
}

0 commit comments

Comments
 (0)