Skip to content
Draft
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
99 changes: 98 additions & 1 deletion Gibbon.Git.Server.Tests/Models/UserModelTest.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
using Gibbon.Git.Server.Models;
using Gibbon.Git.Server.Data.Entities;
using Gibbon.Git.Server.Models;

namespace Gibbon.Git.Server.Tests.Models;

Expand Down Expand Up @@ -27,4 +28,100 @@ public void SortNameFormation()
Assert.AreEqual("Smith", new UserModel { GivenName = "", Surname = "Smith" }.SortName);
Assert.AreEqual("JohnSmith", new UserModel { Username = "JohnSmith" }.SortName);
}

[TestMethod]
public void DisplayNameFormation_FirstLast()
{
var user = new UserModel { GivenName = "John", Surname = "Smith" };
Assert.AreEqual("John Smith", user.GetDisplayName(NameFormat.FirstLast));

var userOnlyGiven = new UserModel { GivenName = "John", Surname = null };
Assert.AreEqual("John", userOnlyGiven.GetDisplayName(NameFormat.FirstLast));

var userOnlySurname = new UserModel { GivenName = null, Surname = "Smith" };
Assert.AreEqual("Smith", userOnlySurname.GetDisplayName(NameFormat.FirstLast));

var userNoNames = new UserModel { Username = "JohnSmith" };
Assert.AreEqual("JohnSmith", userNoNames.GetDisplayName(NameFormat.FirstLast));
}

[TestMethod]
public void DisplayNameFormation_LastCommaFirst()
{
var user = new UserModel { GivenName = "John", Surname = "Smith" };
Assert.AreEqual("Smith, John", user.GetDisplayName(NameFormat.LastCommaFirst));

var userOnlyGiven = new UserModel { GivenName = "John", Surname = null };
Assert.AreEqual("John", userOnlyGiven.GetDisplayName(NameFormat.LastCommaFirst));

var userOnlySurname = new UserModel { GivenName = null, Surname = "Smith" };
Assert.AreEqual("Smith", userOnlySurname.GetDisplayName(NameFormat.LastCommaFirst));

var userNoNames = new UserModel { Username = "JohnSmith" };
Assert.AreEqual("JohnSmith", userNoNames.GetDisplayName(NameFormat.LastCommaFirst));
}

[TestMethod]
public void DisplayNameFormation_LastFirst()
{
var user = new UserModel { GivenName = "John", Surname = "Smith" };
Assert.AreEqual("Smith John", user.GetDisplayName(NameFormat.LastFirst));

var userOnlyGiven = new UserModel { GivenName = "John", Surname = null };
Assert.AreEqual("John", userOnlyGiven.GetDisplayName(NameFormat.LastFirst));

var userOnlySurname = new UserModel { GivenName = null, Surname = "Smith" };
Assert.AreEqual("Smith", userOnlySurname.GetDisplayName(NameFormat.LastFirst));

var userNoNames = new UserModel { Username = "JohnSmith" };
Assert.AreEqual("JohnSmith", userNoNames.GetDisplayName(NameFormat.LastFirst));
}

[TestMethod]
public void SortNameFormation_FirstLast()
{
var user = new UserModel { GivenName = "John", Surname = "Smith" };
Assert.AreEqual("JohnSmith", user.GetSortName(NameFormat.FirstLast));

var userOnlyGiven = new UserModel { GivenName = "John", Surname = null };
Assert.AreEqual("John", userOnlyGiven.GetSortName(NameFormat.FirstLast));

var userOnlySurname = new UserModel { GivenName = null, Surname = "Smith" };
Assert.AreEqual("Smith", userOnlySurname.GetSortName(NameFormat.FirstLast));

var userNoNames = new UserModel { Username = "JohnSmith" };
Assert.AreEqual("JohnSmith", userNoNames.GetSortName(NameFormat.FirstLast));
}

[TestMethod]
public void SortNameFormation_LastCommaFirst()
{
var user = new UserModel { GivenName = "John", Surname = "Smith" };
Assert.AreEqual("SmithJohn", user.GetSortName(NameFormat.LastCommaFirst));

var userOnlyGiven = new UserModel { GivenName = "John", Surname = null };
Assert.AreEqual("John", userOnlyGiven.GetSortName(NameFormat.LastCommaFirst));

var userOnlySurname = new UserModel { GivenName = null, Surname = "Smith" };
Assert.AreEqual("Smith", userOnlySurname.GetSortName(NameFormat.LastCommaFirst));

var userNoNames = new UserModel { Username = "JohnSmith" };
Assert.AreEqual("JohnSmith", userNoNames.GetSortName(NameFormat.LastCommaFirst));
}

[TestMethod]
public void SortNameFormation_LastFirst()
{
var user = new UserModel { GivenName = "John", Surname = "Smith" };
Assert.AreEqual("SmithJohn", user.GetSortName(NameFormat.LastFirst));

var userOnlyGiven = new UserModel { GivenName = "John", Surname = null };
Assert.AreEqual("John", userOnlyGiven.GetSortName(NameFormat.LastFirst));

var userOnlySurname = new UserModel { GivenName = null, Surname = "Smith" };
Assert.AreEqual("Smith", userOnlySurname.GetSortName(NameFormat.LastFirst));

var userNoNames = new UserModel { Username = "JohnSmith" };
Assert.AreEqual("JohnSmith", userNoNames.GetSortName(NameFormat.LastFirst));
}
}
45 changes: 45 additions & 0 deletions Gibbon.Git.Server/App_Resources/Resources.Designer.cs

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

15 changes: 15 additions & 0 deletions Gibbon.Git.Server/App_Resources/Resources.resx
Original file line number Diff line number Diff line change
Expand Up @@ -700,6 +700,21 @@
<data name="Settings_Global_DefaultLanguage_Hint" xml:space="preserve">
<value>Language set by default in the application.</value>
</data>
<data name="Settings_NameFormat" xml:space="preserve">
<value>Name Format</value>
</data>
<data name="Settings_NameFormat_Hint" xml:space="preserve">
<value>Choose how names are displayed throughout the application.</value>
</data>
<data name="Settings_NameFormat_FirstLast" xml:space="preserve">
<value>First Last (e.g., John Smith)</value>
</data>
<data name="Settings_NameFormat_LastCommaFirst" xml:space="preserve">
<value>Last, First (e.g., Smith, John)</value>
</data>
<data name="Settings_NameFormat_LastFirst" xml:space="preserve">
<value>Last First (e.g., Smith John)</value>
</data>
<data name="Repository_Detail_Status" xml:space="preserve">
<value>Status</value>
</data>
Expand Down
6 changes: 4 additions & 2 deletions Gibbon.Git.Server/Configuration/UserSettings.cs
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
namespace Gibbon.Git.Server.Configuration;
using Gibbon.Git.Server.Data.Entities;

namespace Gibbon.Git.Server.Configuration;

public sealed class UserSettings
{
public string PreferredLanguage { get; set; }

public NameFormat PreferredNameFormat { get; set; }
}
7 changes: 5 additions & 2 deletions Gibbon.Git.Server/Configuration/UserSettingsService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ public async Task SaveSettings(int userId, UserSettings settings)
}

entity.PreferredLanguage = settings.PreferredLanguage;
entity.PreferredNameFormat = settings.PreferredNameFormat;

await _context.SaveChangesAsync();

Expand All @@ -43,7 +44,8 @@ public async Task<UserSettings> GetSettings(int userId)
.Where(u => u.UserId == userId)
.Select(entity => new UserSettings
{
PreferredLanguage = entity.PreferredLanguage
PreferredLanguage = entity.PreferredLanguage,
PreferredNameFormat = entity.PreferredNameFormat
})
.SingleOrDefaultAsync();

Expand All @@ -58,7 +60,8 @@ public UserSettings GetDefaultSettings()
{
return new UserSettings
{
PreferredLanguage = null
PreferredLanguage = null,
PreferredNameFormat = NameFormat.LastCommaFirst
};
}
}
45 changes: 43 additions & 2 deletions Gibbon.Git.Server/Controllers/AccountController.cs
Original file line number Diff line number Diff line change
Expand Up @@ -136,12 +136,33 @@ public async Task<IActionResult> Settings()
Value = ""
});

var nameFormatItems = new List<SelectListItem>
{
new SelectListItem
{
Text = Resources.Settings_NameFormat_FirstLast,
Value = ((int)Data.Entities.NameFormat.FirstLast).ToString()
},
new SelectListItem
{
Text = Resources.Settings_NameFormat_LastCommaFirst,
Value = ((int)Data.Entities.NameFormat.LastCommaFirst).ToString()
},
new SelectListItem
{
Text = Resources.Settings_NameFormat_LastFirst,
Value = ((int)Data.Entities.NameFormat.LastFirst).ToString()
}
};

var settings = await _userSettingsService.GetSettings(UserModel.Id);

return View(new MeSettingsModel
{
PreferredLanguage = settings.PreferredLanguage,
AvailableLanguages = cultureItems
PreferredNameFormat = settings.PreferredNameFormat,
AvailableLanguages = cultureItems,
AvailableNameFormats = nameFormatItems
});
}

Expand All @@ -160,12 +181,32 @@ public async Task<IActionResult> Settings(MeSettingsModel settings)
})
.ToList();

settings.AvailableNameFormats = new List<SelectListItem>
{
new SelectListItem
{
Text = Resources.Settings_NameFormat_FirstLast,
Value = ((int)Data.Entities.NameFormat.FirstLast).ToString()
},
new SelectListItem
{
Text = Resources.Settings_NameFormat_LastCommaFirst,
Value = ((int)Data.Entities.NameFormat.LastCommaFirst).ToString()
},
new SelectListItem
{
Text = Resources.Settings_NameFormat_LastFirst,
Value = ((int)Data.Entities.NameFormat.LastFirst).ToString()
}
};

return View(settings);
}

await _userSettingsService.SaveSettings(UserModel.Id, new UserSettings
{
PreferredLanguage = settings.PreferredLanguage
PreferredLanguage = settings.PreferredLanguage,
PreferredNameFormat = settings.PreferredNameFormat
});

return RedirectToAction("Settings");
Expand Down
8 changes: 8 additions & 0 deletions Gibbon.Git.Server/Data/Entities/NameFormat.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
namespace Gibbon.Git.Server.Data.Entities;

public enum NameFormat
{
FirstLast = 0,
LastCommaFirst = 1,
LastFirst = 2
}
1 change: 1 addition & 0 deletions Gibbon.Git.Server/Data/Entities/UserSettingsEntity.cs
Original file line number Diff line number Diff line change
Expand Up @@ -9,4 +9,5 @@ public class UserSettingsEntity
public string TimeZone { get; set; }
public string DateFormat { get; set; }
public string DefaultHomePage { get; set; }
public NameFormat PreferredNameFormat { get; set; }
}
Original file line number Diff line number Diff line change
Expand Up @@ -33,5 +33,8 @@ public void Configure(EntityTypeBuilder<UserSettingsEntity> builder)

builder.Property(e => e.DefaultHomePage)
.HasMaxLength(100);

builder.Property(e => e.PreferredNameFormat)
.HasConversion<int>();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
using Microsoft.EntityFrameworkCore.Migrations;

#nullable disable

namespace Gibbon.Git.Server.Migrations.SqlServerMigrations
{
/// <inheritdoc />
public partial class AddPreferredNameFormat : Migration
{
/// <inheritdoc />
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.AddColumn<int>(
name: "PreferredNameFormat",
table: "UserSettings",
type: "int",
nullable: false,
defaultValue: 1);
}

/// <inheritdoc />
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropColumn(
name: "PreferredNameFormat",
table: "UserSettings");
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
using Microsoft.EntityFrameworkCore.Migrations;

#nullable disable

namespace Gibbon.Git.Server.Migrations.SqliteMigrations
{
/// <inheritdoc />
public partial class AddPreferredNameFormat : Migration
{
/// <inheritdoc />
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.AddColumn<int>(
name: "PreferredNameFormat",
table: "UserSettings",
type: "INTEGER",
nullable: false,
defaultValue: 1);
}

/// <inheritdoc />
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropColumn(
name: "PreferredNameFormat",
table: "UserSettings");
}
}
}
Loading