Skip to content

Commit

Permalink
Merge pull request #4 from ryanjagdfeld/dev
Browse files Browse the repository at this point in the history
version 1.0.0
  • Loading branch information
ryanjagdfeld authored Oct 7, 2024
2 parents ef7cd77 + 502799b commit 42dc1d4
Show file tree
Hide file tree
Showing 22 changed files with 759 additions and 167 deletions.
16 changes: 16 additions & 0 deletions Client/GitHubCardClientStartup.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
using Microsoft.Extensions.DependencyInjection;
using Oqtane.Services;
using RyanJagdfeld.Module.GitHubCard.Services;

namespace RyanJagdfeld.Module.GitHubCard.Startup
{
public class GitHubCardClientStartup : IClientStartup
{
public void ConfigureServices(IServiceCollection services)
{
services.AddScoped<IGitHubCardService, GitHubCardService>();
services.AddScoped(implementationFactory => new GitHubRepoService(new System.Net.Http.HttpClient()));
services.AddScoped(implementationFactory => new GitHubUserService(new System.Net.Http.HttpClient()));
}
}
}
34 changes: 2 additions & 32 deletions Client/Modules/RyanJagdfeld.Module.GitHubCard/Edit.razor
Original file line number Diff line number Diff line change
Expand Up @@ -16,27 +16,6 @@
<input id="entry" class="form-control" @bind="@_entry" required placeholder="username or username/repo" />
</div>
</div>
<div class="row mb-1">
<Label Class="col-md-3" For="theme" HelpText="Select the theme for this card" ResourceKey="Theme">Theme: </Label>
<div class="col-md-8">
<select id="theme" class="form-control" @bind="_theme">
<option value="default" selected>default</option>
<option value="medium">medium</option>
</select>
</div>
</div>
<div class="row mb-1">
<Label Class="col-md-3" For="height" HelpText="Enter the height of the card in pixels. Default is 200" ResourceKey="Height">Height: </Label>
<div class="col-md-8">
<input id="height" class="form-control" @bind="@_height" type="number" min="0" max="27456" />
</div>
</div>
<div class="row mb-1">
<Label Class="col-md-3" For="width" HelpText="Enter the width of the card in pixels. Default is 400" ResourceKey="Width">Width: </Label>
<div class="col-md-8">
<input id="width" class="form-control" @bind="@_width" type="number" min="0" max="13500" />
</div>
</div>
</div>
<button type="button" class="btn btn-success" @onclick="Save">@Localizer["Save"]</button>
<NavLink class="btn btn-secondary" href="@NavigateUrl()">@Localizer["Cancel"]</NavLink>
Expand Down Expand Up @@ -68,8 +47,8 @@
private string _repo;
private string _theme = "default";
private string _createdby;
private int _height = 200;
private int _width = 400;
private int _height = 175;
private int _width = 350;

private DateTime _createdon;
private string _modifiedby;
Expand All @@ -86,9 +65,6 @@
if (GitHubCard != null)
{
_entry = GitHubCard.Repo != null ? $"{GitHubCard.Username}/{GitHubCard.Repo}" : GitHubCard.Username;
_theme = GitHubCard.Theme;
_height = GitHubCard.Height;
_width = GitHubCard.Width;
_createdby = GitHubCard.CreatedBy;
_createdon = GitHubCard.CreatedOn;
_modifiedby = GitHubCard.ModifiedBy;
Expand Down Expand Up @@ -136,9 +112,6 @@
GitHubCard.ModuleId = ModuleState.ModuleId;
GitHubCard.Username = _username;
GitHubCard.Repo = _repo;
GitHubCard.Theme = _theme;
GitHubCard.Height = _height;
GitHubCard.Width = _width;
GitHubCard = await GitHubCardService.AddGitHubCardAsync(GitHubCard);
await logger.LogInformation("GitHubCard Added {GitHubCard}", GitHubCard);
}
Expand All @@ -147,9 +120,6 @@
GitHubCard GitHubCard = await GitHubCardService.GetGitHubCardAsync(_id, ModuleState.ModuleId);
GitHubCard.Username = _username;
GitHubCard.Repo = _repo;
GitHubCard.Theme = _theme;
GitHubCard.Height = _height;
GitHubCard.Width = _width;
await GitHubCardService.UpdateGitHubCardAsync(GitHubCard);
await logger.LogInformation("GitHubCard Updated {GitHubCard}", GitHubCard);
}
Expand Down
72 changes: 53 additions & 19 deletions Client/Modules/RyanJagdfeld.Module.GitHubCard/Index.razor
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@
@namespace RyanJagdfeld.Module.GitHubCard
@inherits ModuleBase
@inject IGitHubCardService GitHubCardService
@inject GitHubUserService GitHubUserService
@inject GitHubRepoService GitHubRepoService
@inject NavigationManager NavigationManager
@inject IStringLocalizer<Index> Localizer
@inject ISettingService SettingService
Expand All @@ -21,20 +23,13 @@ else
{
<Pager Items="@_GitHubCards" Format="Grid" ColumnClass="@_columnClasses">
<Row>
<div class="github-card" data-github="@FullEntry(context)" data-width="@context.Width" data-height="@context.Height" data-theme="@context.Theme"></div>
@OutputTemplate(context)
<div class="m-auto">
<ActionLink Action="Edit" Parameters="@($"id=" + context.GitHubCardId.ToString())" ResourceKey="Edit" />
<ActionDialog Header="Delete GitHubCard" Message="Are You Sure You Wish To Delete This GitHubCard?" Action="Delete" Security="SecurityAccessLevel.Edit" Class="btn btn-danger" OnClick="@(async () => await Delete(context))" ResourceKey="Delete" Id="@context.GitHubCardId.ToString()" />
</div>
</Row>
</Pager>

@if (PageState.RenderMode == RenderModes.Static)
{
<!-- GitHub Card Main JS File -->
<script src="//cdn.jsdelivr.net/github-cards/latest/widget.js"></script>
}

}
else
{
Expand All @@ -54,13 +49,35 @@ else

List<GitHubCard> _GitHubCards;
string _columnClasses;
string _userTemplate;
string _repoTemplate;

protected override async Task OnInitializedAsync()
{
try
{
_GitHubCards = await GitHubCardService.GetGitHubCardsAsync(ModuleState.ModuleId);
_columnClasses = SettingService.GetSetting(ModuleState.Settings, "ColumnClasses", "col-xl-4 col-lg-6 col-12");
_userTemplate = SettingService.GetSetting(ModuleState.Settings, "UserTemplate", TemplateHelper.DefaultUserTemplate());
_repoTemplate = SettingService.GetSetting(ModuleState.Settings, "RepoTemplate", TemplateHelper.DefaultRepoTemplate());

foreach (var gitHubCard in _GitHubCards)
{
var gitHubUser = await GitHubUserService.GetGitHubUserAsync(gitHubCard.Username);
if (gitHubUser != null)
{
gitHubCard.GitHubUser = gitHubUser;
}

if (!string.IsNullOrEmpty(gitHubCard.Repo))
{
var gitHubRepo = await GitHubRepoService.GetGitHubRepoAsync(gitHubCard.Username, gitHubCard.Repo);
if (gitHubRepo != null)
{
gitHubCard.GitHubRepo = gitHubRepo;
};
}
}
}
catch (Exception ex)
{
Expand All @@ -69,17 +86,6 @@ else
}
}

protected override async Task OnAfterRenderAsync(bool firstRender)
{
if (firstRender && PageState.RenderMode == RenderModes.Interactive)
{
var interop = new Oqtane.UI.Interop(JSRuntime);
await interop.IncludeScript("githubcard", $"//cdn.jsdelivr.net/github-cards/latest/widget.js", "", "", "", "head");
}

await base.OnAfterRenderAsync(firstRender);
}

private async Task Delete(GitHubCard GitHubCard)
{
try
Expand All @@ -100,4 +106,32 @@ else
{
return GitHubCard.Repo != null ? $"{GitHubCard.Username}/{GitHubCard.Repo}" : GitHubCard.Username;
}

private MarkupString OutputTemplate(GitHubCard GitHubCard)
{
if (GitHubCard.GitHubRepo != null)
{
return new MarkupString(TemplateHelper.TokenizeTemplate(_repoTemplate, GitHubCard.GitHubRepo));
}

if (GitHubCard.GitHubUser != null)
{
return new MarkupString(TemplateHelper.TokenizeTemplate(_userTemplate, GitHubCard.GitHubUser, HireableText(GitHubCard.GitHubUser.Hireable)));
}

return new MarkupString(Localizer.GetString("NotFound"));
}

public string HireableText(bool? Hireable)
{
if (Hireable != null)
{
if ((bool)Hireable)
{
return Localizer.GetString("Hireable");
}
return Localizer.GetString("NotHireable");
}
return string.Empty;
}
}
4 changes: 2 additions & 2 deletions Client/Modules/RyanJagdfeld.Module.GitHubCard/ModuleInfo.cs
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,9 @@ public class ModuleInfo : IModule
{
Name = "GitHubCard",
Description = "A module for displaying GitHub cards by lepture.",
Version = "1.0.1",
Version = "1.0.0",
ServerManagerType = "RyanJagdfeld.Module.GitHubCard.Manager.GitHubCardManager, RyanJagdfeld.Module.GitHubCard.Server.Oqtane",
ReleaseVersions = "1.0.1",
ReleaseVersions = "1.0.0",
Dependencies = "RyanJagdfeld.Module.GitHubCard.Shared.Oqtane",
PackageName = "RyanJagdfeld.Module.GitHubCard"
};
Expand Down
26 changes: 26 additions & 0 deletions Client/Modules/RyanJagdfeld.Module.GitHubCard/Settings.razor
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,16 @@
<div class="col-sm-9">
<input id="columnClasses" type="text" class="form-control" @bind="@_columnClasses" />
</div>
<Label Class="col-sm-3" For="userTemplate" HelpText="The template for displaying a GitHub User" ResourceKey="UserTemplate" ResourceType="@resourceType">User Template: </Label>
<div class="col-sm-9">
<textarea id="userTemplate" rows="8" cols="75" class="form-control" @bind="@_userTemplate" />
<button id="reloadUserDefault" class="btn btn-secondary" @onclick="ReloadUserDefaultTemplate">@Localizer.GetString("ReloadDefault")</button>
</div>
<Label Class="col-sm-3" For="repoTemplate" HelpText="The template for displaying a GitHub Repo" ResourceKey="RepoTemplate" ResourceType="@resourceType">Repo Template: </Label>
<div class="col-sm-9">
<textarea id="repoTemplate" rows="8" cols="75" class="form-control" @bind="@_repoTemplate" />
<button id="reloadRepoDefault" class="btn btn-secondary" @onclick="ReloadRepoDefaultTemplate">@Localizer.GetString("ReloadDefault")</button>
</div>
</div>
</div>

Expand All @@ -17,13 +27,17 @@
public override string Title => "GitHubCard Settings";

string _columnClasses;
string _userTemplate;
string _repoTemplate;

protected override async Task OnInitializedAsync()
{
try
{
Dictionary<string, string> settings = await SettingService.GetModuleSettingsAsync(ModuleState.ModuleId);
_columnClasses = SettingService.GetSetting(settings, "ColumnClasses", "col-xl-4 col-lg-6 col-12");
_userTemplate = SettingService.GetSetting(settings, "UserTemplate", TemplateHelper.DefaultUserTemplate());
_repoTemplate = SettingService.GetSetting(settings, "RepoTemplate", TemplateHelper.DefaultRepoTemplate());
}
catch (Exception ex)
{
Expand All @@ -37,11 +51,23 @@
{
Dictionary<string, string> settings = await SettingService.GetModuleSettingsAsync(ModuleState.ModuleId);
SettingService.SetSetting(settings, "ColumnClasses", _columnClasses);
SettingService.SetSetting(settings, "UserTemplate", _userTemplate);
SettingService.SetSetting(settings, "RepoTemplate", _repoTemplate);
await SettingService.UpdateModuleSettingsAsync(settings, ModuleState.ModuleId);
}
catch (Exception ex)
{
AddModuleMessage(ex.Message, MessageType.Error);
}
}

private void ReloadUserDefaultTemplate()
{
_userTemplate = TemplateHelper.DefaultUserTemplate();
}

private void ReloadRepoDefaultTemplate()
{
_repoTemplate = TemplateHelper.DefaultRepoTemplate();
}
}
106 changes: 106 additions & 0 deletions Client/Modules/RyanJagdfeld.Module.GitHubCard/TemplateHelper.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,106 @@
using Microsoft.AspNetCore.Components;
using RyanJagdfeld.Module.GitHubCard.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace RyanJagdfeld.Module.GitHubCard
{
public static class TemplateHelper
{
public static string TokenizeTemplate(string template, GitHubUser user, string hireableText)
{
return template
.Replace("{AvatarUrl}", user.AvatarUrl)
.Replace("{Name}", user.Name)
.Replace("{HireableText}", hireableText)
.Replace("{PublicRepos}", user.PublicRepos.ToString())
.Replace("{PublicGists}", user.PublicGists.ToString())
.Replace("{Followers}", user.Followers.ToString())
.Replace("{Username}", user.Login)
.Replace("{HtmlUrl}", user.HtmlUrl)
.Replace("{Bio}", user.Bio)
.Replace("{Location}", user.Location);
}

public static string TokenizeTemplate(string template, GitHubRepo repo)
{
return template
.Replace("{AvatarUrl}", repo.Owner.AvatarUrl)
.Replace("{Name}", repo.Name)
.Replace("{UserName}", repo.Owner.Login)
.Replace("{HomePage}", repo.Homepage)
.Replace("{Description}", repo.Description)
.Replace("{Language}", repo.Language)
.Replace("{Forks}", repo.Forks.ToString())
.Replace("{Stars}", repo.StargazersCount.ToString())
.Replace("{HtmlUrl}", repo.HtmlUrl)
.Replace("{HomePageText}", repo.HomePageText);
}

public static string DefaultUserTemplate()
{
return @"
<div class='card p-3'>
<div class='d-flex align-items-center'>
<div class='image'>
<img src='{AvatarUrl}' class='rounded' width='155'>
</div>
<div class='ms-3 w-100'>
<h4 class='mb-0 mt-0'>{Name}</h4>
<span>{HireableText}</span>
<div class='p-2 mt-2 bg-primary d-flex justify-content-between rounded text-white stats'>
<div class='d-flex flex-column'>
<span >Repos</span>
<span class='text-center'>{PublicRepos}</span>
</div>
<div class='d-flex flex-column'>
<span>Gists</span>
<span class='text-center'>{PublicGists}</span>
</div>
<div class='d-flex flex-column'>
<span>Followers</span>
<span class='text-center'>{Followers}</span>
</div>
</div>
<div class='button mt-2 d-flex flex-row align-items-center'>
<a href='{HtmlUrl}' class='btn btn-sm btn-primary w-100 ml-2' target='_blank'>Follow</a>
</div>
</div>
</div>
</div>";
}

public static string DefaultRepoTemplate()
{
return @"
<div class='card p-3'>
<div class='d-flex align-items-center'>
<div class='image'>
<img src='{AvatarUrl}' class='rounded' width='155'>
</div>
<div class='ms-3 w-100 card-body'>
<h4 class='mb-0 mt-0 card-title'>{Name}<sup>{Language}</sup></h4>
<div class='p-2 mt-2 card-text'>
{Description} - <a href='{HomePage}' target='_blank'>{HomePageText}</a>
<div class='button mt-2 d-flex flex-row justify-content-between w-100'>
<div class='d-flex flex-column'>
<span>Forks</span>
<span class='text-center'>{Forks}</span>
</div>
<div class='d-flex flex-column'>
<span>Stars</span>
<span class='text-center'>{Stars}</span>
</div>
<div class='d-flex flex-column'>
<a href='{HtmlUrl}' class='btn btn-primary' target='_blank'>Star</a>
</div>
</div>
</div>
</div>
</div>";
}
}
}
Loading

0 comments on commit 42dc1d4

Please sign in to comment.