Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .github/workflows/admin.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ on:
push:
paths:
- 'admin/**'
- 'TwoWeeksReady.Common/**'
- '.github/workflows/admin.yaml'
branches: [ master ]
pull_request:
Expand Down
1 change: 1 addition & 0 deletions .github/workflows/api.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ on:
push:
paths:
- 'api/**'
- 'TwoWeeksReady.Common/**'
- '.github/workflows/api.yaml'
branches: [ master ]
pull_request:
Expand Down
34 changes: 24 additions & 10 deletions admin/TwoWeeksReady.Admin/Data/FunctionsRepository.cs
Original file line number Diff line number Diff line change
Expand Up @@ -47,14 +47,7 @@ public Task<HazardHunt> GetHazardHuntById(string id)

public async Task<HazardInfo> GetHazardInfoById(string id)
{
try
{
return await _httpClient.GetFromJsonAsync<HazardInfo>($"hazardinfo-by-id/{id}");
} catch (Exception ex)
{
return new HazardInfo();
}

return await _httpClient.GetFromJsonAsync<HazardInfo>($"hazardinfo-by-id/{id}");
}

public Task<BaseKitItem> SaveBaseKitItem(BaseKitItem kit)
Expand All @@ -67,9 +60,30 @@ public Task<HazardHunt> SaveHazardHunt(HazardHunt hazardHunt)
throw new NotImplementedException();
}

public Task<HazardInfo> SaveHazardInfo(HazardInfo hazardInfo)
public async Task<HazardInfo> SaveHazardInfo(HazardInfo hazardInfo)
{
throw new NotImplementedException();
var response = await _httpClient.PutAsJsonAsync("hazardinfo-update", hazardInfo);
if (response.IsSuccessStatusCode)
{
return await response.Content.ReadFromJsonAsync<HazardInfo>();
}
else
{
throw new Exception("Error saving hazard info");
}
}

public async Task<HazardInfo> CreateHazardInfo(HazardInfo hazardInfo)
{
var response = await _httpClient.PostAsJsonAsync("hazardinfo-create", hazardInfo);
if (response.IsSuccessStatusCode)
{
return await response.Content.ReadFromJsonAsync<HazardInfo>();
}
else
{
throw new Exception("Error saving hazard info");
}
}
}
}
4 changes: 3 additions & 1 deletion admin/TwoWeeksReady.Admin/Data/IRepository.cs
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,9 @@ public interface IRepository

Task<HazardInfo> GetHazardInfoById(string id);

Task<HazardInfo> SaveHazardInfo(HazardInfo hazardInfo);
Task<HazardInfo> SaveHazardInfo(HazardInfo hazardInfo);

Task<HazardInfo> CreateHazardInfo(HazardInfo hazardInfo);
}

}
7 changes: 7 additions & 0 deletions admin/TwoWeeksReady.Admin/Data/StubRepository.cs
Original file line number Diff line number Diff line change
Expand Up @@ -103,6 +103,13 @@ public Task<HazardInfo> SaveHazardInfo(HazardInfo hazardInfo)
{
return Task.FromResult(hazardInfo);
}

public Task<HazardInfo> CreateHazardInfo(HazardInfo hazardInfo)
{
return Task.FromResult(hazardInfo);
}


}

}
102 changes: 93 additions & 9 deletions admin/TwoWeeksReady.Admin/Pages/HazardInfos/Details.razor
Original file line number Diff line number Diff line change
@@ -1,27 +1,81 @@
@page "/HazardInfos/{id}"
@page "/HazardInfos/new"
@attribute [Authorize(Roles = "admin")]

@using TinyMCE.Blazor
@inject IRepository repository
@inject IJSRuntime JS
@inject Microsoft.Extensions.Configuration.IConfiguration configuration

@{
var tinyMCEApiKey = configuration["TinyMCEApiKey"];
}

@if (Hazard == null)
{
<p><em>Loading...</em></p>
}
else
{

<h3>Details</h3>
<label for="name">Hazard Name:</label>
<input type="text" @bind="@Hazard.Name" />
<br />
<label for="description">Short Description:</label>
<input type="text" @bind="@Hazard.Description" />
<span class="btn btn-secondary float-right" style="cursor: pointer" @onclick="@Save">Save</span>
<form>
<div class="form-group">
<label for="name">Hazard Name</label>
<input type="text" class="form-control" name="name" @bind="@Hazard.Name">
</div>
<div class="form-group">
<label for="description">Short Description:</label>
<textarea class="form-control" name="description" @bind="@Hazard.Description" rows="5"></textarea>
</div>
<div class="form-group">
<label for="iconUrl">Icon Url</label>
<input type="text" class="form-control" name="iconUrl" @bind="@Hazard.IconUrl">
</div>
<div class="form-group">
<label for="mediaUrl">Media Url</label>
<input type="text" class="form-control" name="mediaUrl" @bind="@Hazard.MediaUrl">
</div>

<div class="form-group">
<label for="beforeSafetyDetails">Before Safety Details</label>
<Editor Id="beforeSafetyDetails" Conf="@EditorConfig" ApiKey="@tinyMCEApiKey" @bind-Value="@Hazard.BeforeSafetyDetails" />
</div>

<div class="form-group">
<label for="duringSafetyDetails">DuringSafety Details</label>
<Editor Id="duringSafetyDetails" Conf="@EditorConfig" ApiKey="@tinyMCEApiKey" @bind-Value="@Hazard.DuringSafetyDetails" />
</div>

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


<div class="form-group">
<label for="externalLinks">External Links (One link per line)</label>
<textarea rows="6" class="form-control" name="externalLinks" @bind="@ExternalLinks"></textarea>
</div>

<button type="button" class="btn btn-primary" @onclick="@Save">Submit</button>
</form>
}

@code {

public Dictionary<string, object> EditorConfig = new Dictionary<string, object>
{
{ "plugins", "image" },
{ "toolbar", "image" },
{"image_list", new []
{
// TODO: Figure out a strategy for loading a list of images from assets availabe within the app
new { title = "Image 1", value = "http://localhost:8080/images/hazards/earthquake.png"}
} }

};

[Parameter]
public string Id { get; set; }

Expand All @@ -30,17 +84,47 @@ else

private HazardInfo Hazard { get; set; }

private string ExternalLinks
{
get
{
return string.Join(Environment.NewLine, Hazard?.ExternalLinks ?? new string[0]);
}
set
{
var links = value.Split(new string[] { "\n", Environment.NewLine}, StringSplitOptions.RemoveEmptyEntries).Select(s => s.Trim()).Where(s => !string.IsNullOrEmpty(s));
Hazard.ExternalLinks = links.ToArray();
}
}


protected override async Task OnInitializedAsync()
{
Hazard = await repository.GetHazardInfoById(Id);
if (string.IsNullOrEmpty(Id))
{
Hazard = new HazardInfo();

}
else
{
Hazard = await repository.GetHazardInfoById(Id);
}

}


public async Task Save()
{
await repository.SaveHazardInfo(Hazard);
await OnSave.InvokeAsync(Hazard);
if (string.IsNullOrEmpty(Hazard.Id))
{
Hazard = await repository.CreateHazardInfo(Hazard);
}
else
{
Hazard = await repository.SaveHazardInfo(Hazard);
}

//await OnSave.InvokeAsync(Hazard);

await JS.InvokeVoidAsync("alert", new object[] { "Hazard Info Saved" });

Expand Down
17 changes: 10 additions & 7 deletions admin/TwoWeeksReady.Admin/Pages/HazardInfos/List.razor
Original file line number Diff line number Diff line change
@@ -1,17 +1,15 @@
@page "/HazardInfos/"
@attribute [Authorize(Roles = "admin")]
@inject IRepository Repository
<h1>Administer Hazard Info for Two Weeks Ready</h1>

<h3>Current Hazards Defined:</h3>
<h1>Administer Hazard Info</h1>

@if (_HazardInfos != null && _HazardInfos.Any())
{

<table>
<table class="table table-bordered">
<thead>
<tr>
<th>Name</th>
<th>Name</th>
</tr>
</thead>
<tbody>
Expand All @@ -21,19 +19,24 @@
<tr>
<td>
<a href="/HazardInfos/@hazard.Id">
@hazard.Name
@hazard.Name
</a>
</td>
</tr>
}
</tbody>

</table>
<a class="btn btn-primary" href="/HazardInfos/new">Add New Hazard</a>

}
else if (_HazardInfos == null)
{
<p>Loading....</p>
}
else
{
<p>No Hazards defined.</p>
<p>No hazard infos defined</p>
}

@code {
Expand Down
3 changes: 2 additions & 1 deletion admin/TwoWeeksReady.Admin/Pages/_Host.cshtml
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@
</head>

<body>
@{
@{
var token = new TokenProvider
{
AccessToken = await HttpContext.GetTokenAsync("access_token")
Expand All @@ -43,5 +43,6 @@
</div>

<script src="_framework/blazor.server.js"></script>
<script src="_content/TinyMCE.Blazor/tinymce-blazor.js"></script>
</body>
</html>
1 change: 0 additions & 1 deletion admin/TwoWeeksReady.Admin/Startup.cs
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,6 @@ public void ConfigureServices(IServiceCollection services)
options.Scope.Clear();
options.Scope.Add("openid");
options.Scope.Add("profile");
options.Scope.Add("roles");

options.CallbackPath = new PathString("/callback");
options.ClaimsIssuer = "Auth0";
Expand Down
3 changes: 2 additions & 1 deletion admin/TwoWeeksReady.Admin/TwoWeeksReady.Admin.csproj
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
<Project Sdk="Microsoft.NET.Sdk.Web">
<Project Sdk="Microsoft.NET.Sdk.Web">

<PropertyGroup>
<TargetFramework>net5.0</TargetFramework>
Expand All @@ -11,6 +11,7 @@

<ItemGroup>
<PackageReference Include="Microsoft.AspNetCore.Authentication.OpenIdConnect" Version="5.0.6" />
<PackageReference Include="TinyMCE.Blazor" Version="0.0.8" />
</ItemGroup>

</Project>
7 changes: 1 addition & 6 deletions admin/TwoWeeksReady.Admin/appsettings.Development.json
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,5 @@
"Microsoft.Hosting.Lifetime": "Information"
}
},
"AllowedHosts": "*",
"Auth0": {
"Domain": "YOUR_AUTH0_DOMAIN",
"ClientId": "YOUR_CLIENT_ID",
"ClientSecret": "YOUR_CLIENT_SECRET"
}
"AllowedHosts": "*"
}
1 change: 1 addition & 0 deletions admin/TwoWeeksReady.Admin/appsettings.json
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
}
},
"AllowedHosts": "*",
"TinyMCEApiKey": "your-api-key",
"ApiUrl": "http://localhost:7071/api/",
"Auth0": {
"Domain": "YOUR_AUTH0_DOMAIN",
Expand Down