diff --git a/TSystems.LoveOTC/Migrations/20240304140921_SplitName.Designer.cs b/TSystems.LoveOTC/Migrations/20240304140921_SplitName.Designer.cs new file mode 100644 index 0000000..d00a32c --- /dev/null +++ b/TSystems.LoveOTC/Migrations/20240304140921_SplitName.Designer.cs @@ -0,0 +1,588 @@ +// +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; +using TSystems.LoveOTC; + +#nullable disable + +namespace TSystems.LoveOTC.Migrations +{ + [DbContext(typeof(ShopContext))] + [Migration("20240304140921_SplitName")] + partial class SplitName + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "8.0.2") + .HasAnnotation("Relational:MaxIdentifierLength", 63); + + NpgsqlModelBuilderExtensions.UseHiLo(modelBuilder, "EntityFrameworkHiLoSequence"); + + modelBuilder.HasSequence("EntityFrameworkHiLoSequence") + .IncrementsBy(10); + + modelBuilder.Entity("TSystems.LoveOTC.Models.Category", b => + { + b.Property("CategoryId") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + NpgsqlPropertyBuilderExtensions.UseHiLo(b.Property("CategoryId")); + + b.Property("Name") + .IsRequired() + .HasMaxLength(15) + .HasColumnType("character varying(15)"); + + b.Property("Version") + .IsConcurrencyToken() + .ValueGeneratedOnAddOrUpdate() + .HasColumnType("xid") + .HasColumnName("xmin"); + + b.HasKey("CategoryId"); + + b.HasIndex("Name") + .IsUnique(); + + b.ToTable("Categories"); + }); + + modelBuilder.Entity("TSystems.LoveOTC.Models.Combo", b => + { + b.Property("ComboId") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + NpgsqlPropertyBuilderExtensions.UseHiLo(b.Property("ComboId")); + + b.Property("IsArchived") + .HasColumnType("boolean"); + + b.Property("ProductId") + .HasColumnType("bigint"); + + b.Property("Stock") + .HasColumnType("integer"); + + b.Property("Version") + .IsConcurrencyToken() + .ValueGeneratedOnAddOrUpdate() + .HasColumnType("xid") + .HasColumnName("xmin"); + + b.HasKey("ComboId"); + + b.HasIndex("ProductId"); + + b.ToTable("Combos"); + }); + + modelBuilder.Entity("TSystems.LoveOTC.Models.ComboType", b => + { + b.Property("ComboId") + .HasColumnType("bigint"); + + b.Property("TypeId") + .HasColumnType("bigint"); + + b.Property("Version") + .IsConcurrencyToken() + .ValueGeneratedOnAddOrUpdate() + .HasColumnType("xid") + .HasColumnName("xmin"); + + b.HasKey("ComboId", "TypeId"); + + b.HasIndex("TypeId"); + + b.ToTable("ComboTypes"); + }); + + modelBuilder.Entity("TSystems.LoveOTC.Models.Comment", b => + { + b.Property("CommentId") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + NpgsqlPropertyBuilderExtensions.UseHiLo(b.Property("CommentId")); + + b.Property("Content") + .IsRequired() + .HasMaxLength(1000) + .HasColumnType("character varying(1000)"); + + b.Property("CreateAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("timestamp without time zone"); + + b.Property("OrderId") + .HasColumnType("bigint"); + + b.Property("UserId") + .HasColumnType("uuid"); + + b.Property("Version") + .IsConcurrencyToken() + .ValueGeneratedOnAddOrUpdate() + .HasColumnType("xid") + .HasColumnName("xmin"); + + b.HasKey("CommentId"); + + b.HasIndex("OrderId"); + + b.HasIndex("UserId"); + + b.ToTable("Comments"); + }); + + modelBuilder.Entity("TSystems.LoveOTC.Models.Order", b => + { + b.Property("OrderId") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + NpgsqlPropertyBuilderExtensions.UseHiLo(b.Property("OrderId")); + + b.Property("CreateAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("timestamp without time zone"); + + b.Property("Status") + .HasColumnType("integer"); + + b.Property("TrackingNumber") + .HasMaxLength(50) + .HasColumnType("character varying(50)"); + + b.Property("UserId") + .HasColumnType("uuid"); + + b.Property("Version") + .IsConcurrencyToken() + .ValueGeneratedOnAddOrUpdate() + .HasColumnType("xid") + .HasColumnName("xmin"); + + b.HasKey("OrderId"); + + b.HasIndex("UserId"); + + b.ToTable("Orders"); + }); + + modelBuilder.Entity("TSystems.LoveOTC.Models.OrderCombo", b => + { + b.Property("ComboId") + .HasColumnType("bigint"); + + b.Property("OrderId") + .HasColumnType("bigint"); + + b.Property("Quantity") + .HasColumnType("smallint"); + + b.Property("Version") + .IsConcurrencyToken() + .ValueGeneratedOnAddOrUpdate() + .HasColumnType("xid") + .HasColumnName("xmin"); + + b.HasKey("ComboId", "OrderId"); + + b.HasIndex("OrderId"); + + b.ToTable("OrderCombos"); + }); + + modelBuilder.Entity("TSystems.LoveOTC.Models.Photo", b => + { + b.Property("PhotoId") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + NpgsqlPropertyBuilderExtensions.UseHiLo(b.Property("PhotoId")); + + b.Property("Caption") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.Property("ObjectId") + .HasColumnType("uuid"); + + b.Property("Order") + .HasColumnType("smallint"); + + b.Property("ProductId") + .HasColumnType("bigint"); + + b.Property("Version") + .IsConcurrencyToken() + .ValueGeneratedOnAddOrUpdate() + .HasColumnType("xid") + .HasColumnName("xmin"); + + b.HasKey("PhotoId"); + + b.HasIndex("ObjectId"); + + b.HasIndex("ProductId"); + + b.ToTable("Photos"); + }); + + modelBuilder.Entity("TSystems.LoveOTC.Models.Product", b => + { + b.Property("ProductId") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + NpgsqlPropertyBuilderExtensions.UseHiLo(b.Property("ProductId")); + + b.Property("CategoryId") + .HasColumnType("bigint"); + + b.Property("Description") + .HasMaxLength(65535) + .HasColumnType("json"); + + b.Property("IsArchived") + .HasColumnType("boolean"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(50) + .HasColumnType("character varying(50)"); + + b.Property("Version") + .IsConcurrencyToken() + .ValueGeneratedOnAddOrUpdate() + .HasColumnType("xid") + .HasColumnName("xmin"); + + b.HasKey("ProductId"); + + b.HasIndex("CategoryId"); + + b.HasIndex("Name") + .IsUnique(); + + b.ToTable("Products"); + }); + + modelBuilder.Entity("TSystems.LoveOTC.Models.Storage", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("Data") + .IsRequired() + .HasMaxLength(10485760) + .HasColumnType("bytea"); + + b.Property("Expires") + .HasColumnType("timestamp with time zone") + .HasColumnName("timestamp without time zone"); + + b.Property("Version") + .IsConcurrencyToken() + .ValueGeneratedOnAddOrUpdate() + .HasColumnType("xid") + .HasColumnName("xmin"); + + b.HasKey("Id"); + + b.ToTable("Objects"); + }); + + modelBuilder.Entity("TSystems.LoveOTC.Models.Type", b => + { + b.Property("TypeId") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + NpgsqlPropertyBuilderExtensions.UseHiLo(b.Property("TypeId")); + + b.Property("IsArchived") + .HasColumnType("boolean"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(15) + .HasColumnType("character varying(15)"); + + b.Property("VariantId") + .HasColumnType("bigint"); + + b.Property("Version") + .IsConcurrencyToken() + .ValueGeneratedOnAddOrUpdate() + .HasColumnType("xid") + .HasColumnName("xmin"); + + b.HasKey("TypeId"); + + b.HasIndex("VariantId", "Name") + .IsUnique(); + + b.ToTable("Types"); + }); + + modelBuilder.Entity("TSystems.LoveOTC.Models.User", b => + { + b.Property("UserId") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("Address") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.Property("Admin") + .HasColumnType("boolean"); + + b.Property("EMail") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.Property("Forename") + .IsRequired() + .HasMaxLength(20) + .HasColumnType("character varying(20)"); + + b.Property("Phone") + .IsRequired() + .HasMaxLength(15) + .HasColumnType("character varying(15)"); + + b.Property("Surname") + .IsRequired() + .HasMaxLength(20) + .HasColumnType("character varying(20)"); + + b.Property("Version") + .IsConcurrencyToken() + .ValueGeneratedOnAddOrUpdate() + .HasColumnType("xid") + .HasColumnName("xmin"); + + b.HasKey("UserId"); + + b.HasIndex("EMail") + .IsUnique(); + + b.ToTable("Users"); + }); + + modelBuilder.Entity("TSystems.LoveOTC.Models.Variant", b => + { + b.Property("VariantId") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + NpgsqlPropertyBuilderExtensions.UseHiLo(b.Property("VariantId")); + + b.Property("IsArchived") + .HasColumnType("boolean"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(15) + .HasColumnType("character varying(15)"); + + b.Property("ProductId") + .HasColumnType("bigint"); + + b.Property("Version") + .IsConcurrencyToken() + .ValueGeneratedOnAddOrUpdate() + .HasColumnType("xid") + .HasColumnName("xmin"); + + b.HasKey("VariantId"); + + b.HasIndex("ProductId", "Name") + .IsUnique(); + + b.ToTable("Variants"); + }); + + modelBuilder.Entity("TSystems.LoveOTC.Models.Combo", b => + { + b.HasOne("TSystems.LoveOTC.Models.Product", "Product") + .WithMany("Combos") + .HasForeignKey("ProductId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Product"); + }); + + modelBuilder.Entity("TSystems.LoveOTC.Models.ComboType", b => + { + b.HasOne("TSystems.LoveOTC.Models.Combo", "Combo") + .WithMany("ComboTypes") + .HasForeignKey("ComboId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("TSystems.LoveOTC.Models.Type", "Type") + .WithMany("ComboTypes") + .HasForeignKey("TypeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Combo"); + + b.Navigation("Type"); + }); + + modelBuilder.Entity("TSystems.LoveOTC.Models.Comment", b => + { + b.HasOne("TSystems.LoveOTC.Models.Order", "Order") + .WithMany("Comments") + .HasForeignKey("OrderId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("TSystems.LoveOTC.Models.User", "User") + .WithMany() + .HasForeignKey("UserId"); + + b.Navigation("Order"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("TSystems.LoveOTC.Models.Order", b => + { + b.HasOne("TSystems.LoveOTC.Models.User", "User") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("User"); + }); + + modelBuilder.Entity("TSystems.LoveOTC.Models.OrderCombo", b => + { + b.HasOne("TSystems.LoveOTC.Models.Combo", "Combo") + .WithMany("OrderCombos") + .HasForeignKey("ComboId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("TSystems.LoveOTC.Models.Order", "Order") + .WithMany("OrderCombos") + .HasForeignKey("OrderId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Combo"); + + b.Navigation("Order"); + }); + + modelBuilder.Entity("TSystems.LoveOTC.Models.Photo", b => + { + b.HasOne("TSystems.LoveOTC.Models.Storage", "Object") + .WithMany() + .HasForeignKey("ObjectId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("TSystems.LoveOTC.Models.Product", "Product") + .WithMany("Photos") + .HasForeignKey("ProductId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Object"); + + b.Navigation("Product"); + }); + + modelBuilder.Entity("TSystems.LoveOTC.Models.Product", b => + { + b.HasOne("TSystems.LoveOTC.Models.Category", "Category") + .WithMany("Products") + .HasForeignKey("CategoryId"); + + b.Navigation("Category"); + }); + + modelBuilder.Entity("TSystems.LoveOTC.Models.Type", b => + { + b.HasOne("TSystems.LoveOTC.Models.Variant", "Variant") + .WithMany("Types") + .HasForeignKey("VariantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Variant"); + }); + + modelBuilder.Entity("TSystems.LoveOTC.Models.Variant", b => + { + b.HasOne("TSystems.LoveOTC.Models.Product", "Product") + .WithMany("Variants") + .HasForeignKey("ProductId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Product"); + }); + + modelBuilder.Entity("TSystems.LoveOTC.Models.Category", b => + { + b.Navigation("Products"); + }); + + modelBuilder.Entity("TSystems.LoveOTC.Models.Combo", b => + { + b.Navigation("ComboTypes"); + + b.Navigation("OrderCombos"); + }); + + modelBuilder.Entity("TSystems.LoveOTC.Models.Order", b => + { + b.Navigation("Comments"); + + b.Navigation("OrderCombos"); + }); + + modelBuilder.Entity("TSystems.LoveOTC.Models.Product", b => + { + b.Navigation("Combos"); + + b.Navigation("Photos"); + + b.Navigation("Variants"); + }); + + modelBuilder.Entity("TSystems.LoveOTC.Models.Type", b => + { + b.Navigation("ComboTypes"); + }); + + modelBuilder.Entity("TSystems.LoveOTC.Models.Variant", b => + { + b.Navigation("Types"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/TSystems.LoveOTC/Migrations/20240304140921_SplitName.cs b/TSystems.LoveOTC/Migrations/20240304140921_SplitName.cs new file mode 100644 index 0000000..9b75677 --- /dev/null +++ b/TSystems.LoveOTC/Migrations/20240304140921_SplitName.cs @@ -0,0 +1,54 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace TSystems.LoveOTC.Migrations +{ + /// + public partial class SplitName : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropColumn( + name: "Name", + table: "Users"); + + migrationBuilder.AddColumn( + name: "Forename", + table: "Users", + type: "character varying(20)", + maxLength: 20, + nullable: false, + defaultValue: ""); + + migrationBuilder.AddColumn( + name: "Surname", + table: "Users", + type: "character varying(20)", + maxLength: 20, + nullable: false, + defaultValue: ""); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropColumn( + name: "Forename", + table: "Users"); + + migrationBuilder.DropColumn( + name: "Surname", + table: "Users"); + + migrationBuilder.AddColumn( + name: "Name", + table: "Users", + type: "character varying(50)", + maxLength: 50, + nullable: false, + defaultValue: ""); + } + } +} diff --git a/TSystems.LoveOTC/Migrations/ShopContextModelSnapshot.cs b/TSystems.LoveOTC/Migrations/ShopContextModelSnapshot.cs index e432ae7..61431ab 100644 --- a/TSystems.LoveOTC/Migrations/ShopContextModelSnapshot.cs +++ b/TSystems.LoveOTC/Migrations/ShopContextModelSnapshot.cs @@ -353,16 +353,21 @@ protected override void BuildModel(ModelBuilder modelBuilder) .HasMaxLength(100) .HasColumnType("character varying(100)"); - b.Property("Name") + b.Property("Forename") .IsRequired() - .HasMaxLength(50) - .HasColumnType("character varying(50)"); + .HasMaxLength(20) + .HasColumnType("character varying(20)"); b.Property("Phone") .IsRequired() .HasMaxLength(15) .HasColumnType("character varying(15)"); + b.Property("Surname") + .IsRequired() + .HasMaxLength(20) + .HasColumnType("character varying(20)"); + b.Property("Version") .IsConcurrencyToken() .ValueGeneratedOnAddOrUpdate() diff --git a/src/Components/Setting.tsx b/src/Components/Setting.tsx index 379fbcd..89417b5 100644 --- a/src/Components/Setting.tsx +++ b/src/Components/Setting.tsx @@ -1,4 +1,4 @@ -import { Button, Dialog, DialogActions, DialogBody, DialogContent, DialogSurface, DialogTitle, DialogTrigger, Field, Input, Toast, ToastBody, ToastTitle, Tooltip, makeStyles, tokens } from "@fluentui/react-components"; +import { Button, Dialog, DialogActions, DialogBody, DialogContent, DialogSurface, DialogTitle, DialogTrigger, Field, Input, Label, Toast, ToastBody, ToastTitle, Tooltip, makeStyles, tokens } from "@fluentui/react-components"; import { useEffect, useState } from "react"; import { useAuth } from "react-oidc-context"; import { Logger } from "~/Helpers/Logger"; @@ -21,7 +21,7 @@ interface ISetting { /** * @author Aloento * @since 0.5.0 - * @version 0.1.0 + * @version 0.2.0 */ const useStyles = makeStyles({ box: { @@ -32,6 +32,9 @@ const useStyles = makeStyles({ ...Flex, columnGap: tokens.spacingVerticalXXXL }, + fill: { + flexGrow: 1 + } }); const log = new Logger("Setting"); @@ -39,7 +42,7 @@ const log = new Logger("Setting"); /** * @author Aloento * @since 0.1.0 - * @version 0.8.0 + * @version 0.9.0 */ export function Setting({ Open, Toggle, New }: ISetting) { const style = useStyles(); @@ -49,7 +52,7 @@ export function Setting({ Open, Toggle, New }: ISetting) { const [forename, setForename] = useState(); const [phone, setPhone] = useState(); - const [address, setAddress] = useState(); + const [address, setAddress] = useState(Array(5).fill("")); const { data, mutate } = Hub.User.Get.useMe(log); @@ -61,7 +64,7 @@ export function Setting({ Open, Toggle, New }: ISetting) { setSurname(Surname); setForename(Forename); setPhone(Phone); - setAddress(Address); + setAddress(Address.split("; ")); }, [data]); const { dispatch, dispatchToast } = useErrorToast(log); @@ -118,8 +121,13 @@ export function Setting({ Open, Toggle, New }: ISetting) { relationship="description" withArrow > - - setSurname(v.value)} /> + + setSurname(v.value)} + /> @@ -128,8 +136,14 @@ export function Setting({ Open, Toggle, New }: ISetting) { relationship="description" withArrow > - - setForename(v.value)} /> + + setForename(v.value)} + /> @@ -141,7 +155,12 @@ export function Setting({ Open, Toggle, New }: ISetting) { withArrow > - setPhone(v.value)} /> + setPhone(v.value)} + /> @@ -150,21 +169,79 @@ export function Setting({ Open, Toggle, New }: ISetting) { relationship="description" withArrow > - + - - - setAddress(v.value)} /> + + + + { + address[0] = v.value; + setAddress([...address]); + }} + maxLength={50} + minLength={10} + /> + + +
+ + { + address[1] = v.value; + setAddress([...address]); + }} + maxLength={20} + minLength={2} + /> - + + + { + address[2] = v.value; + setAddress([...address]); + }} + maxLength={20} + minLength={2} + /> + +
+ +
+ + { + address[3] = v.value; + setAddress([...address]); + }} + maxLength={10} + minLength={2} + /> + + + + { + address[3] = v.value; + setAddress([...address]); + }} + maxLength={10} + minLength={2} + /> + +
@@ -178,7 +255,7 @@ export function Setting({ Open, Toggle, New }: ISetting) { EMail: auth.user?.profile.email, Surname: surname, Forename: forename, - Address: address, + Address: address.join("; "), Phone: phone })}> Submit