Skip to content

Commit 6cf8e81

Browse files
codingbanditdpaquette
authored andcommitted
Implemented Hazard Hunt data entry, added calls to the API, and fixed some labels (#143)
1 parent 3049be7 commit 6cf8e81

File tree

6 files changed

+150
-23
lines changed

6 files changed

+150
-23
lines changed

admin/TwoWeeksReady.Admin/Data/FunctionsRepository.cs

Lines changed: 28 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,9 @@ public Task<IEnumerable<BaseKit>> GetAllBaseKits()
2525
throw new NotImplementedException();
2626
}
2727

28-
public Task<IEnumerable<HazardHunt>> GetAllHazardHunts()
28+
public async Task<IEnumerable<HazardHunt>> GetAllHazardHunts()
2929
{
30-
throw new NotImplementedException();
30+
return await _httpClient.GetFromJsonAsync<IList<HazardHunt>>("hazardhunt-list");
3131
}
3232

3333
public async Task<IEnumerable<HazardInfo>> GetAllHazardInfos()
@@ -40,9 +40,9 @@ public Task<BaseKit> GetBaseKitById(string id)
4040
throw new NotImplementedException();
4141
}
4242

43-
public Task<HazardHunt> GetHazardHuntById(string id)
43+
public async Task<HazardHunt> GetHazardHuntById(string id)
4444
{
45-
throw new NotImplementedException();
45+
return await _httpClient.GetFromJsonAsync<HazardHunt>($"hazardhunt-by-id/{id}");
4646
}
4747

4848
public async Task<HazardInfo> GetHazardInfoById(string id)
@@ -55,9 +55,17 @@ public Task<BaseKitItem> SaveBaseKitItem(BaseKitItem kit)
5555
throw new NotImplementedException();
5656
}
5757

58-
public Task<HazardHunt> SaveHazardHunt(HazardHunt hazardHunt)
58+
public async Task<HazardHunt> SaveHazardHunt(HazardHunt hazardHunt)
5959
{
60-
throw new NotImplementedException();
60+
var response = await _httpClient.PutAsJsonAsync("hazardhunt-update", hazardHunt);
61+
if (response.IsSuccessStatusCode)
62+
{
63+
return await response.Content.ReadFromJsonAsync<HazardHunt>();
64+
}
65+
else
66+
{
67+
throw new Exception("Error saving hazard hunt");
68+
}
6169
}
6270

6371
public async Task<HazardInfo> SaveHazardInfo(HazardInfo hazardInfo)
@@ -73,6 +81,7 @@ public async Task<HazardInfo> SaveHazardInfo(HazardInfo hazardInfo)
7381
}
7482
}
7583

84+
7685
public async Task<HazardInfo> CreateHazardInfo(HazardInfo hazardInfo)
7786
{
7887
var response = await _httpClient.PostAsJsonAsync("hazardinfo-create", hazardInfo);
@@ -85,5 +94,18 @@ public async Task<HazardInfo> CreateHazardInfo(HazardInfo hazardInfo)
8594
throw new Exception("Error saving hazard info");
8695
}
8796
}
97+
98+
public async Task<HazardHunt> CreateHazardHunt(HazardHunt hazardHunt)
99+
{
100+
var response = await _httpClient.PostAsJsonAsync("hazardhunt-create", hazardHunt);
101+
if (response.IsSuccessStatusCode)
102+
{
103+
return await response.Content.ReadFromJsonAsync<HazardHunt>();
104+
}
105+
else
106+
{
107+
throw new Exception("Error saving hazard hunt");
108+
}
109+
}
88110
}
89111
}

admin/TwoWeeksReady.Admin/Data/IRepository.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@ public interface IRepository
2626
Task<HazardInfo> SaveHazardInfo(HazardInfo hazardInfo);
2727

2828
Task<HazardInfo> CreateHazardInfo(HazardInfo hazardInfo);
29+
30+
Task<HazardHunt> CreateHazardHunt(HazardHunt hazardHunt);
2931
}
3032

3133
}

admin/TwoWeeksReady.Admin/Data/StubRepository.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,10 @@ public Task<HazardInfo> CreateHazardInfo(HazardInfo hazardInfo)
109109
return Task.FromResult(hazardInfo);
110110
}
111111

112+
public Task<HazardHunt> CreateHazardHunt(HazardHunt hazardHunt)
113+
{
114+
return Task.FromResult(hazardHunt);
115+
}
112116

113117
}
114118

Lines changed: 113 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,90 @@
11
@page "/HazardHunts/{id}"
2+
@page "/HazardHunts/new"
23
@attribute [Authorize(Roles = "admin")]
34

5+
@using TinyMCE.Blazor
6+
@using System.IO;
7+
@using System.Linq;
8+
49
@inject IRepository repository
510
@inject IJSRuntime JS
11+
@inject Microsoft.Extensions.Configuration.IConfiguration configuration
12+
@inject ClientImageService clientImages
13+
14+
@{
15+
var tinyMCEApiKey = configuration["TinyMCEApiKey"];
16+
}
17+
18+
@if(Hazard == null)
19+
{
20+
<p><em>Loading...</em></p>
21+
}
22+
else
23+
{
24+
<h3>Details</h3>
25+
<EditForm Model="@Hazard">
26+
<div class="form-group">
27+
<label for="name">Hazard Name</label>
28+
<input type="text" class="form-control" name="name" @bind="@Hazard.Name">
29+
</div>
30+
<div class="form-group">
31+
<label for="description">Short Description:</label>
32+
<textarea class="form-control" name="description" @bind="@Hazard.Description" rows="5"></textarea>
33+
</div>
34+
<div class="form-group">
35+
<label for="iconUrl">Icon Url</label>
36+
37+
<InputSelect id="iconUrl" class="form-control" @bind-Value="Hazard.IconUrl">
38+
@foreach(var image in clientImages.Images)
39+
{
40+
<option value="@image.RelativePath">@image.RelativePath</option>
41+
}
42+
</InputSelect>
43+
<img src="@clientImages.ToAbsolutePath(Hazard.IconUrl)"/>
44+
45+
</div>
46+
<div class="form-group">
47+
<label for="mediaUrl">Media Url</label>
48+
<InputSelect id="mediaUrl" class="form-control" @bind-Value="Hazard.MediaUrl">
49+
@foreach(var image in clientImages.Images)
50+
{
51+
<option value="@image.RelativePath">@image.RelativePath</option>
52+
}
53+
</InputSelect>
54+
<img src="@clientImages.ToAbsolutePath(Hazard.MediaUrl)"/>
55+
</div>
56+
57+
<div class="form-group">
58+
<label for="beforeSafetyDetails">Before Safety Details</label>
59+
<Editor Id="beforeSafetyDetails" Conf="@EditorConfig" ApiKey="@tinyMCEApiKey" @bind-Value="@Hazard.BeforeSafetyDetails" />
60+
</div>
61+
62+
<div class="form-group">
63+
<label for="duringSafetyDetails">During Safety Details</label>
64+
<Editor Id="duringSafetyDetails" Conf="@EditorConfig" ApiKey="@tinyMCEApiKey" @bind-Value="@Hazard.DuringSafetyDetails" />
65+
</div>
66+
67+
<div class="form-group">
68+
<label for="afterSafetyDetails">After Safety Details</label>
69+
<Editor Id="afterSafetyDetails" Conf="@EditorConfig" ApiKey="@tinyMCEApiKey" @bind-Value="@Hazard.AfterSafetyDetails" />
70+
</div>
671

7-
<h3>Details</h3>
8-
Hazard Name:
9-
<input type="text" @bind="@Hazard.Name" />
10-
<br />
11-
Short Description:
12-
<input type="text" @bind="@Hazard.Description" />
13-
<span class="btn btn-secondary float-right" style="cursor: pointer" @onclick="@Save">Save</span>
72+
73+
<div class="form-group">
74+
<label for="externalLinks">External Links (One link per line)</label>
75+
<textarea rows="6" class="form-control" name="externalLinks" @bind="@ExternalLinks"></textarea>
76+
</div>
77+
78+
<button type="button" class="btn btn-primary" @onclick="@Save">Submit</button>
79+
</EditForm>
80+
}
1481

1582
@code {
83+
public Dictionary<string, object> EditorConfig = new Dictionary<string, object>
84+
{
85+
{ "plugins", "image" },
86+
{ "toolbar", "image" },
87+
};
1688

1789
[Parameter]
1890
public string Id { get; set; }
@@ -22,19 +94,47 @@ Short Description:
2294

2395
private HazardHunt Hazard { get; set; }
2496

97+
private string ExternalLinks
98+
{
99+
get
100+
{
101+
return string.Join(Environment.NewLine, Hazard?.ExternalLinks ?? new string[0]);
102+
}
103+
set
104+
{
105+
var links = value.Split(new string[] { "\n", Environment.NewLine}, StringSplitOptions.RemoveEmptyEntries).Select(s => s.Trim()).Where(s => !string.IsNullOrEmpty(s));
106+
Hazard.ExternalLinks = links.ToArray();
107+
}
108+
}
109+
25110

26111
protected override async Task OnInitializedAsync()
27112
{
28-
Hazard = await repository.GetHazardHuntById(Id);
113+
if (string.IsNullOrEmpty(Id))
114+
{
115+
Hazard = new HazardHunt();
116+
}
117+
else
118+
{
119+
Hazard = await repository.GetHazardHuntById(Id);
120+
}
121+
EditorConfig["image_list"] = clientImages.Images.Select(i => new { title = i.RelativePath, value = i.AbsolutePath }).ToArray();
29122
}
30-
31-
123+
32124
public async Task Save()
33125
{
34-
await repository.SaveHazardHunt(Hazard);
35-
await OnSave.InvokeAsync(Hazard);
126+
if (string.IsNullOrEmpty(Hazard.Id))
127+
{
128+
Hazard = await repository.CreateHazardHunt(Hazard);
129+
}
130+
else
131+
{
132+
Hazard = await repository.SaveHazardHunt(Hazard);
133+
}
134+
135+
//await OnSave.InvokeAsync(Hazard);
36136
37-
await JS.InvokeVoidAsync("alert", new object[] { "Hazard Hunt Saved" });
137+
await JS.InvokeVoidAsync("alert", new object[] { "Hazard Info Saved" });
38138

39139
}
40140
}

admin/TwoWeeksReady.Admin/Pages/HazardHunts/List.razor

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,6 @@
44
@inject IRepository Repository
55
<h1>Administer Hazard Hunt for Two Weeks Ready</h1>
66

7-
<h3>Current Hazards Defined:</h3>
8-
97
@if (_HazardHunts != null && _HazardHunts.Any())
108
{
119

@@ -35,6 +33,7 @@
3533
else
3634
{
3735
<p>No Hazards defined.</p>
36+
<a class="btn btn-primary" href="/HazardHunts/new">Add New Hazard</a>
3837
}
3938

4039
@code {

admin/TwoWeeksReady.Admin/Pages/HazardInfos/Details.razor

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -61,12 +61,12 @@ else
6161
</div>
6262

6363
<div class="form-group">
64-
<label for="duringSafetyDetails">DuringSafety Details</label>
64+
<label for="duringSafetyDetails">During Safety Details</label>
6565
<Editor Id="duringSafetyDetails" Conf="@EditorConfig" ApiKey="@tinyMCEApiKey" @bind-Value="@Hazard.DuringSafetyDetails" />
6666
</div>
6767

6868
<div class="form-group">
69-
<label for="afterSafetyDetails">Before Safety Details</label>
69+
<label for="afterSafetyDetails">After Safety Details</label>
7070
<Editor Id="afterSafetyDetails" Conf="@EditorConfig" ApiKey="@tinyMCEApiKey" @bind-Value="@Hazard.AfterSafetyDetails" />
7171
</div>
7272

0 commit comments

Comments
 (0)