diff --git a/Arma3TacMapWebApp/Arma3TacMapWebApp.csproj b/Arma3TacMapWebApp/Arma3TacMapWebApp.csproj index b8b94f0..0d54719 100644 --- a/Arma3TacMapWebApp/Arma3TacMapWebApp.csproj +++ b/Arma3TacMapWebApp/Arma3TacMapWebApp.csproj @@ -18,8 +18,8 @@ runtime; build; native; contentfiles; analyzers; buildtransitive - - + + diff --git a/Arma3TacMapWebApp/Controllers/OrbatUnitsController.cs b/Arma3TacMapWebApp/Controllers/OrbatUnitsController.cs index 34549e2..5548c1a 100644 --- a/Arma3TacMapWebApp/Controllers/OrbatUnitsController.cs +++ b/Arma3TacMapWebApp/Controllers/OrbatUnitsController.cs @@ -8,6 +8,7 @@ using Arma3TacMapWebApp.Entities; using Arma3TacMapWebApp.Maps; using Microsoft.AspNetCore.Authorization; +using Pmad.Milsymbol.AspNetCore.Services; namespace Arma3TacMapWebApp.Controllers { @@ -17,12 +18,14 @@ public class OrbatUnitsController : Controller private readonly Arma3TacMapContext _context; private readonly MapService _mapSvc; private readonly IAuthorizationService _authorizationService; + private readonly IApp6dSymbolGenerator _app6DSymbolGenerator; - public OrbatUnitsController(Arma3TacMapContext context, MapService mapSvc, IAuthorizationService authorizationService) + public OrbatUnitsController(Arma3TacMapContext context, MapService mapSvc, IAuthorizationService authorizationService, IApp6dSymbolGenerator app6DSymbolGenerator) { _context = context; _mapSvc = mapSvc; _authorizationService = authorizationService; + _app6DSymbolGenerator = app6DSymbolGenerator; } private async Task IsEditAllowed(Orbat orbat) @@ -67,7 +70,7 @@ public async Task Create(int orbatID) // For more details, see http://go.microsoft.com/fwlink/?LinkId=317598. [HttpPost] [ValidateAntiForgeryToken] - public async Task Create([Bind("OrbatUnitID,OrbatID,ParentOrbatUnitID,Name,UniqueDesignation,NatoSymbolIcon,NatoSymbolMod1,NatoSymbolMod2,NatoSymbolSize,NatoSymbolHQ,NatoSymbolFriendlyImageBase64,NatoSymbolHostileImageBase64,NatoSymbolHostileAssumedImageBase64,Position")] OrbatUnit orbatUnit) + public async Task Create([Bind("OrbatUnitID,OrbatID,ParentOrbatUnitID,Name,UniqueDesignation,FriendSidc,Position")] OrbatUnit orbatUnit) { orbatUnit.Orbat = await _context.Orbats.FindAsync(orbatUnit.OrbatID); if (orbatUnit.Orbat == null) @@ -81,6 +84,7 @@ public async Task Create([Bind("OrbatUnitID,OrbatID,ParentOrbatUn if (ModelState.IsValid) { orbatUnit.Trigram = await GetTrigam(orbatUnit.OrbatID); + await PrecomputeSvgImages(orbatUnit); _context.Add(orbatUnit); await _context.SaveChangesAsync(); return RedirectToAction(nameof(OrbatsController.Details), "Orbats", new { id = orbatUnit.OrbatID }); @@ -89,6 +93,21 @@ public async Task Create([Bind("OrbatUnitID,OrbatID,ParentOrbatUn return View(orbatUnit); } + private async Task PrecomputeSvgImages(OrbatUnit orbatUnit) + { + orbatUnit.NatoSymbolFriendlyImageBase64 = await PrecomputeSvg(orbatUnit.GetNatoSymbol('3'), orbatUnit.UniqueDesignation); + orbatUnit.NatoSymbolHostileImageBase64 = await PrecomputeSvg(orbatUnit.GetNatoSymbol('6'), orbatUnit.UniqueDesignation); + orbatUnit.NatoSymbolHostileAssumedImageBase64 = await PrecomputeSvg(orbatUnit.GetNatoSymbol('6', '1'), orbatUnit.UniqueDesignation); + } + + private async Task PrecomputeSvg(string sidc, string? uniqueDesignation) + { + var symbol = await _app6DSymbolGenerator.GenerateAsync(sidc, new Pmad.Milsymbol.Icons.SymbolIconOptions() { UniqueDesignation = uniqueDesignation }); + var svg = System.Text.Encoding.UTF8.GetBytes(symbol.Svg); + var b64 = "data:image/svg+xml;base64," + Convert.ToBase64String(svg); + return b64; + } + private async Task GetTrigam(int orbatID) { var rnd = new Random(); @@ -135,7 +154,7 @@ public async Task Edit(int? id) // For more details, see http://go.microsoft.com/fwlink/?LinkId=317598. [HttpPost] [ValidateAntiForgeryToken] - public async Task Edit(int id, [Bind("OrbatUnitID,OrbatID,ParentOrbatUnitID,Name,UniqueDesignation,NatoSymbolIcon,NatoSymbolMod1,NatoSymbolMod2,NatoSymbolSize,NatoSymbolHQ,NatoSymbolFriendlyImageBase64,NatoSymbolHostileImageBase64,NatoSymbolHostileAssumedImageBase64,Position,Trigram")] OrbatUnit orbatUnit) + public async Task Edit(int id, [Bind("OrbatUnitID,OrbatID,ParentOrbatUnitID,Name,UniqueDesignation,FriendSidc,Position,Trigram")] OrbatUnit orbatUnit) { if (id != orbatUnit.OrbatUnitID) { @@ -162,6 +181,7 @@ public async Task Edit(int id, [Bind("OrbatUnitID,OrbatID,ParentO if (ModelState.IsValid) { + await PrecomputeSvgImages(orbatUnit); try { _context.Update(orbatUnit); diff --git a/Arma3TacMapWebApp/Entities/Arma3TacMapContext.cs b/Arma3TacMapWebApp/Entities/Arma3TacMapContext.cs index 5c9e00c..5b9ab9e 100644 --- a/Arma3TacMapWebApp/Entities/Arma3TacMapContext.cs +++ b/Arma3TacMapWebApp/Entities/Arma3TacMapContext.cs @@ -1,7 +1,6 @@ using System; using System.Linq; using Microsoft.EntityFrameworkCore; -using Arma3TacMapWebApp.Entities; namespace Arma3TacMapWebApp.Entities { @@ -46,7 +45,9 @@ protected override void OnModelCreating(ModelBuilder modelBuilder) modelBuilder.Entity().ToTable(nameof(Orbat)); - modelBuilder.Entity().ToTable(nameof(OrbatUnit)); + var orbatUnit = modelBuilder.Entity(); + orbatUnit.Property(t => t.NatoSymbolSet).HasDefaultValue("10"); + orbatUnit.ToTable(nameof(OrbatUnit)); var userApiKey = modelBuilder.Entity(); userApiKey.ToTable(nameof(UserApiKey)); diff --git a/Arma3TacMapWebApp/Entities/OrbatUnit.cs b/Arma3TacMapWebApp/Entities/OrbatUnit.cs index 78ffcc0..00ca82c 100644 --- a/Arma3TacMapWebApp/Entities/OrbatUnit.cs +++ b/Arma3TacMapWebApp/Entities/OrbatUnit.cs @@ -1,6 +1,8 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; +using Pmad.Milsymbol.App6d; using Pmad.Milsymbol.AspNetCore.Orbat; namespace Arma3TacMapWebApp.Entities @@ -23,6 +25,9 @@ public class OrbatUnit : IOrbatUnit [Display(Name = "Unique Designation")] public string? UniqueDesignation { get; set; } + [Display(Name = "Symbol set")] + public string? NatoSymbolSet { get; set; } + [Display(Name = "Symbol")] public string? NatoSymbolIcon { get; set; } @@ -49,7 +54,7 @@ public class OrbatUnit : IOrbatUnit public int Position { get; set; } - public string GetNatoSymbol(char c, char e = '0') => "100" + c + "10" + e + + public string GetNatoSymbol(char c, char e = '0') => "100" + c + (NatoSymbolSet ?? "10") + e + (NatoSymbolHQ ?? string.Empty).PadLeft(1, '0') + (NatoSymbolSize ?? string.Empty).PadLeft(2, '0') + (NatoSymbolIcon ?? string.Empty).PadLeft(6, '0') + @@ -65,6 +70,33 @@ public string GetNatoSymbol(char c, char e = '0') => "100" + c + "10" + e + [MaxLength(3)] public string? Trigram { get; set; } + [NotMapped] + public string FriendSidc + { + get { return GetNatoSymbol('3'); } + set + { + if (App6dSymbolId.TryParse(value, out var symbolId)) + { + NatoSymbolHQ = symbolId.HqTfFdCode; + NatoSymbolSize = symbolId.Amplifier; + NatoSymbolIcon = symbolId.Icon; + NatoSymbolMod1 = symbolId.Modifier1; + NatoSymbolMod2 = symbolId.Modifier2; + NatoSymbolSet = symbolId.SymbolSet; + } + else + { + NatoSymbolHQ = "0"; + NatoSymbolSize = "00"; + NatoSymbolIcon = "000000"; + NatoSymbolMod1 = "00"; + NatoSymbolMod2 = "00"; + NatoSymbolSet = "10"; + } + } + } + string IOrbatUnit.Sdic => GetNatoSymbol('3'); string? IOrbatUnit.CommonIdentifier => Name; diff --git a/Arma3TacMapWebApp/Migrations/20250225194447_OrbatNatoSymbolSet.Designer.cs b/Arma3TacMapWebApp/Migrations/20250225194447_OrbatNatoSymbolSet.Designer.cs new file mode 100644 index 0000000..b5e8bf7 --- /dev/null +++ b/Arma3TacMapWebApp/Migrations/20250225194447_OrbatNatoSymbolSet.Designer.cs @@ -0,0 +1,575 @@ +// +using System; +using Arma3TacMapWebApp.Entities; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; + +#nullable disable + +namespace Arma3TacMapWebApp.Migrations +{ + [DbContext(typeof(Arma3TacMapContext))] + [Migration("20250225194447_OrbatNatoSymbolSet")] + partial class OrbatNatoSymbolSet + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder.HasAnnotation("ProductVersion", "8.0.11"); + + modelBuilder.Entity("Arma3TacMapWebApp.Entities.MessageFieldTemplate", b => + { + b.Property("MessageFieldTemplateID") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("Description") + .HasColumnType("TEXT"); + + b.Property("MessageLineTemplateID") + .HasColumnType("INTEGER"); + + b.Property("SortNumber") + .HasColumnType("INTEGER"); + + b.Property("Title") + .HasColumnType("TEXT"); + + b.Property("Type") + .HasColumnType("INTEGER"); + + b.HasKey("MessageFieldTemplateID"); + + b.HasIndex("MessageLineTemplateID"); + + b.ToTable("MessageFieldTemplate", (string)null); + }); + + modelBuilder.Entity("Arma3TacMapWebApp.Entities.MessageLineTemplate", b => + { + b.Property("MessageLineTemplateID") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("Description") + .HasColumnType("TEXT"); + + b.Property("MessageTemplateID") + .HasColumnType("INTEGER"); + + b.Property("SortNumber") + .HasColumnType("INTEGER"); + + b.Property("Title") + .HasColumnType("TEXT"); + + b.HasKey("MessageLineTemplateID"); + + b.HasIndex("MessageTemplateID"); + + b.ToTable("MessageLineTemplate", (string)null); + }); + + modelBuilder.Entity("Arma3TacMapWebApp.Entities.MessageTemplate", b => + { + b.Property("MessageTemplateID") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("CountryCode") + .HasColumnType("TEXT"); + + b.Property("Created") + .HasColumnType("TEXT"); + + b.Property("Description") + .HasColumnType("TEXT"); + + b.Property("OwnerUserID") + .HasColumnType("INTEGER"); + + b.Property("Title") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("Token") + .HasColumnType("TEXT"); + + b.Property("Type") + .HasColumnType("INTEGER"); + + b.Property("Visibility") + .HasColumnType("INTEGER"); + + b.HasKey("MessageTemplateID"); + + b.HasIndex("OwnerUserID"); + + b.ToTable("MessageTemplate", (string)null); + }); + + modelBuilder.Entity("Arma3TacMapWebApp.Entities.Orbat", b => + { + b.Property("OrbatID") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("Created") + .HasColumnType("TEXT"); + + b.Property("Label") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("OwnerUserID") + .HasColumnType("INTEGER"); + + b.Property("Token") + .HasColumnType("TEXT"); + + b.Property("Visibility") + .HasColumnType("INTEGER"); + + b.HasKey("OrbatID"); + + b.HasIndex("OwnerUserID"); + + b.ToTable("Orbat", (string)null); + }); + + modelBuilder.Entity("Arma3TacMapWebApp.Entities.OrbatUnit", b => + { + b.Property("OrbatUnitID") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("Name") + .HasColumnType("TEXT"); + + b.Property("NatoSymbolFriendlyImageBase64") + .HasColumnType("TEXT"); + + b.Property("NatoSymbolHQ") + .HasColumnType("TEXT"); + + b.Property("NatoSymbolHostileAssumedImageBase64") + .HasColumnType("TEXT"); + + b.Property("NatoSymbolHostileImageBase64") + .HasColumnType("TEXT"); + + b.Property("NatoSymbolIcon") + .HasColumnType("TEXT"); + + b.Property("NatoSymbolMod1") + .HasColumnType("TEXT"); + + b.Property("NatoSymbolMod2") + .HasColumnType("TEXT"); + + b.Property("NatoSymbolSet") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT") + .HasDefaultValue("10"); + + b.Property("NatoSymbolSize") + .HasColumnType("TEXT"); + + b.Property("OrbatID") + .HasColumnType("INTEGER"); + + b.Property("ParentOrbatUnitID") + .HasColumnType("INTEGER"); + + b.Property("Position") + .HasColumnType("INTEGER"); + + b.Property("Trigram") + .HasMaxLength(3) + .HasColumnType("TEXT"); + + b.Property("UniqueDesignation") + .HasColumnType("TEXT"); + + b.HasKey("OrbatUnitID"); + + b.HasIndex("OrbatID"); + + b.HasIndex("ParentOrbatUnitID"); + + b.ToTable("OrbatUnit", (string)null); + }); + + modelBuilder.Entity("Arma3TacMapWebApp.Entities.TacMap", b => + { + b.Property("TacMapID") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("Created") + .HasColumnType("TEXT"); + + b.Property("EventHref") + .HasColumnType("TEXT"); + + b.Property("FriendlyOrbatID") + .HasColumnType("INTEGER"); + + b.Property("GameName") + .IsRequired() + .ValueGeneratedOnAdd() + .HasColumnType("TEXT") + .HasDefaultValue("arma3"); + + b.Property("HostileOrbatID") + .HasColumnType("INTEGER"); + + b.Property("Label") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("Order") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER") + .HasDefaultValue(0); + + b.Property("OwnerUserID") + .HasColumnType("INTEGER"); + + b.Property("ParentTacMapID") + .HasColumnType("INTEGER"); + + b.Property("Phase") + .HasColumnType("INTEGER"); + + b.Property("ReadOnlyToken") + .HasColumnType("TEXT"); + + b.Property("ReadWriteToken") + .HasColumnType("TEXT"); + + b.Property("WorldName") + .IsRequired() + .HasColumnType("TEXT"); + + b.HasKey("TacMapID"); + + b.HasIndex("FriendlyOrbatID"); + + b.HasIndex("HostileOrbatID"); + + b.HasIndex("OwnerUserID"); + + b.HasIndex("ParentTacMapID"); + + b.ToTable("TacMap", (string)null); + }); + + modelBuilder.Entity("Arma3TacMapWebApp.Entities.TacMapAccess", b => + { + b.Property("TacMapAccessID") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("CanWrite") + .HasColumnType("INTEGER"); + + b.Property("TacMapID") + .HasColumnType("INTEGER"); + + b.Property("UserID") + .HasColumnType("INTEGER"); + + b.HasKey("TacMapAccessID"); + + b.HasIndex("TacMapID"); + + b.HasIndex("UserID"); + + b.ToTable("TacMapAccess", (string)null); + }); + + modelBuilder.Entity("Arma3TacMapWebApp.Entities.TacMapMarker", b => + { + b.Property("TacMapMarkerID") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("LastUpdate") + .HasColumnType("TEXT"); + + b.Property("MarkerData") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("TacMapID") + .HasColumnType("INTEGER"); + + b.Property("UserID") + .HasColumnType("INTEGER"); + + b.HasKey("TacMapMarkerID"); + + b.HasIndex("TacMapID"); + + b.HasIndex("UserID"); + + b.ToTable("TacMapMarker", (string)null); + }); + + modelBuilder.Entity("Arma3TacMapWebApp.Entities.User", b => + { + b.Property("UserID") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("IsService") + .HasColumnType("INTEGER"); + + b.Property("LastSymbolBookmarksSaveUtc") + .HasColumnType("TEXT"); + + b.Property("SteamId") + .HasColumnType("TEXT"); + + b.Property("UserLabel") + .IsRequired() + .HasColumnType("TEXT"); + + b.HasKey("UserID"); + + b.ToTable("User", (string)null); + }); + + modelBuilder.Entity("Arma3TacMapWebApp.Entities.UserApiKey", b => + { + b.Property("UserApiKeyID") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("HashedKey") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("Salt") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("UserID") + .HasColumnType("INTEGER"); + + b.Property("ValidUntil") + .HasColumnType("TEXT"); + + b.HasKey("UserApiKeyID"); + + b.HasIndex("UserID"); + + b.ToTable("UserApiKey", (string)null); + }); + + modelBuilder.Entity("Arma3TacMapWebApp.Entities.UserSymbolBookmark", b => + { + b.Property("UserSymbolBookmarkID") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("Label") + .HasColumnType("TEXT"); + + b.Property("Sidc") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("UserID") + .HasColumnType("INTEGER"); + + b.HasKey("UserSymbolBookmarkID"); + + b.HasIndex("UserID"); + + b.ToTable("UserSymbolBookmark", (string)null); + }); + + modelBuilder.Entity("Arma3TacMapWebApp.Entities.MessageFieldTemplate", b => + { + b.HasOne("Arma3TacMapWebApp.Entities.MessageLineTemplate", "MessageLineTemplate") + .WithMany("Fields") + .HasForeignKey("MessageLineTemplateID") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("MessageLineTemplate"); + }); + + modelBuilder.Entity("Arma3TacMapWebApp.Entities.MessageLineTemplate", b => + { + b.HasOne("Arma3TacMapWebApp.Entities.MessageTemplate", "MessageTemplate") + .WithMany("Lines") + .HasForeignKey("MessageTemplateID") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("MessageTemplate"); + }); + + modelBuilder.Entity("Arma3TacMapWebApp.Entities.MessageTemplate", b => + { + b.HasOne("Arma3TacMapWebApp.Entities.User", "Owner") + .WithMany() + .HasForeignKey("OwnerUserID") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Owner"); + }); + + modelBuilder.Entity("Arma3TacMapWebApp.Entities.Orbat", b => + { + b.HasOne("Arma3TacMapWebApp.Entities.User", "Owner") + .WithMany() + .HasForeignKey("OwnerUserID") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Owner"); + }); + + modelBuilder.Entity("Arma3TacMapWebApp.Entities.OrbatUnit", b => + { + b.HasOne("Arma3TacMapWebApp.Entities.Orbat", "Orbat") + .WithMany("Units") + .HasForeignKey("OrbatID") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Arma3TacMapWebApp.Entities.OrbatUnit", "Parent") + .WithMany("Children") + .HasForeignKey("ParentOrbatUnitID"); + + b.Navigation("Orbat"); + + b.Navigation("Parent"); + }); + + modelBuilder.Entity("Arma3TacMapWebApp.Entities.TacMap", b => + { + b.HasOne("Arma3TacMapWebApp.Entities.Orbat", "FriendlyOrbat") + .WithMany() + .HasForeignKey("FriendlyOrbatID") + .OnDelete(DeleteBehavior.SetNull); + + b.HasOne("Arma3TacMapWebApp.Entities.Orbat", "HostileOrbat") + .WithMany() + .HasForeignKey("HostileOrbatID") + .OnDelete(DeleteBehavior.SetNull); + + b.HasOne("Arma3TacMapWebApp.Entities.User", "Owner") + .WithMany() + .HasForeignKey("OwnerUserID") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Arma3TacMapWebApp.Entities.TacMap", "Parent") + .WithMany() + .HasForeignKey("ParentTacMapID") + .OnDelete(DeleteBehavior.Cascade); + + b.Navigation("FriendlyOrbat"); + + b.Navigation("HostileOrbat"); + + b.Navigation("Owner"); + + b.Navigation("Parent"); + }); + + modelBuilder.Entity("Arma3TacMapWebApp.Entities.TacMapAccess", b => + { + b.HasOne("Arma3TacMapWebApp.Entities.TacMap", "TacMap") + .WithMany() + .HasForeignKey("TacMapID") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Arma3TacMapWebApp.Entities.User", "User") + .WithMany() + .HasForeignKey("UserID") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("TacMap"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("Arma3TacMapWebApp.Entities.TacMapMarker", b => + { + b.HasOne("Arma3TacMapWebApp.Entities.TacMap", "TacMap") + .WithMany() + .HasForeignKey("TacMapID") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Arma3TacMapWebApp.Entities.User", "User") + .WithMany() + .HasForeignKey("UserID"); + + b.Navigation("TacMap"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("Arma3TacMapWebApp.Entities.UserApiKey", b => + { + b.HasOne("Arma3TacMapWebApp.Entities.User", "User") + .WithMany("ApiKeys") + .HasForeignKey("UserID") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("User"); + }); + + modelBuilder.Entity("Arma3TacMapWebApp.Entities.UserSymbolBookmark", b => + { + b.HasOne("Arma3TacMapWebApp.Entities.User", "User") + .WithMany() + .HasForeignKey("UserID") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("User"); + }); + + modelBuilder.Entity("Arma3TacMapWebApp.Entities.MessageLineTemplate", b => + { + b.Navigation("Fields"); + }); + + modelBuilder.Entity("Arma3TacMapWebApp.Entities.MessageTemplate", b => + { + b.Navigation("Lines"); + }); + + modelBuilder.Entity("Arma3TacMapWebApp.Entities.Orbat", b => + { + b.Navigation("Units"); + }); + + modelBuilder.Entity("Arma3TacMapWebApp.Entities.OrbatUnit", b => + { + b.Navigation("Children"); + }); + + modelBuilder.Entity("Arma3TacMapWebApp.Entities.User", b => + { + b.Navigation("ApiKeys"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/Arma3TacMapWebApp/Migrations/20250225194447_OrbatNatoSymbolSet.cs b/Arma3TacMapWebApp/Migrations/20250225194447_OrbatNatoSymbolSet.cs new file mode 100644 index 0000000..041bb60 --- /dev/null +++ b/Arma3TacMapWebApp/Migrations/20250225194447_OrbatNatoSymbolSet.cs @@ -0,0 +1,29 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace Arma3TacMapWebApp.Migrations +{ + /// + public partial class OrbatNatoSymbolSet : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.AddColumn( + name: "NatoSymbolSet", + table: "OrbatUnit", + type: "TEXT", + nullable: true, + defaultValue: "10"); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropColumn( + name: "NatoSymbolSet", + table: "OrbatUnit"); + } + } +} diff --git a/Arma3TacMapWebApp/Migrations/Arma3TacMapContextModelSnapshot.cs b/Arma3TacMapWebApp/Migrations/Arma3TacMapContextModelSnapshot.cs index 32ab378..2c23d30 100644 --- a/Arma3TacMapWebApp/Migrations/Arma3TacMapContextModelSnapshot.cs +++ b/Arma3TacMapWebApp/Migrations/Arma3TacMapContextModelSnapshot.cs @@ -167,6 +167,11 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.Property("NatoSymbolMod2") .HasColumnType("TEXT"); + b.Property("NatoSymbolSet") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT") + .HasDefaultValue("10"); + b.Property("NatoSymbolSize") .HasColumnType("TEXT"); diff --git a/Arma3TacMapWebApp/Views/OrbatUnits/Create.cshtml b/Arma3TacMapWebApp/Views/OrbatUnits/Create.cshtml index a575126..799324b 100644 --- a/Arma3TacMapWebApp/Views/OrbatUnits/Create.cshtml +++ b/Arma3TacMapWebApp/Views/OrbatUnits/Create.cshtml @@ -5,7 +5,6 @@ ViewData["Title"] = Localizer["Create an unit"]; } -