From 2e927efe0a53ba77ca454a7764f4a70ec1576a8e Mon Sep 17 00:00:00 2001 From: Drew Rautenberg Date: Wed, 10 Jun 2026 19:07:23 -0500 Subject: [PATCH 1/3] removed local automatic barcode generation. changed barcode to string --- barkmanui/src/features/inventory/AddItem.tsx | 10 +--------- barkmanui/src/features/inventory/types.ts | 4 ++-- 2 files changed, 3 insertions(+), 11 deletions(-) diff --git a/barkmanui/src/features/inventory/AddItem.tsx b/barkmanui/src/features/inventory/AddItem.tsx index a335528..02135c9 100644 --- a/barkmanui/src/features/inventory/AddItem.tsx +++ b/barkmanui/src/features/inventory/AddItem.tsx @@ -6,7 +6,6 @@ import {useNavigate} from "react-router"; import {IconX, IconCheck} from '@tabler/icons-react'; import {notifications} from '@mantine/notifications'; import useInventoryList from "./hooks/useInventoryList.tsx"; -import {useEffect} from "react"; function AddItem() { @@ -18,7 +17,7 @@ function AddItem() { const newItemForm = useForm({ mode: 'uncontrolled', initialValues: { - barcode: 0, + barcode: "", name: "", brand: "", serialNumber: "", @@ -68,13 +67,6 @@ function AddItem() { }) - useEffect(() => { - if (inventoryQuery.data) { - const nextBarcode = inventoryQuery.data[inventoryQuery.data.length - 1].barcode + 1; - newItemForm.setValues({barcode: nextBarcode}); - } - },[inventoryQuery.data]); - if (inventoryQuery.isPending) return 'Loading...' if (inventoryQuery.error) return 'An error has occurred: ' + inventoryQuery.error.message diff --git a/barkmanui/src/features/inventory/types.ts b/barkmanui/src/features/inventory/types.ts index 4f1c7c4..7439c51 100644 --- a/barkmanui/src/features/inventory/types.ts +++ b/barkmanui/src/features/inventory/types.ts @@ -1,6 +1,6 @@ export interface InventoryItem { id: number, - barcode: number, + barcode: string, brand: string, name: string, status: {id: string; name: string}, @@ -12,7 +12,7 @@ export interface InventoryItem { } export interface NewItem { - barcode: number, + barcode: string, brand: string, name: string, serialNumber: string, From f77f9fb9eaf6f08e4dc3480a6f6d2bdf9b2167c1 Mon Sep 17 00:00:00 2001 From: Drew Rautenberg Date: Wed, 10 Jun 2026 20:03:07 -0500 Subject: [PATCH 2/3] added unique check for barcode --- .../20260611002716_barcodestring.Designer.cs | 113 +++++++++++++++++ .../20260611002716_barcodestring.cs | 34 +++++ ...20260611005912_barcodeisunique.Designer.cs | 117 ++++++++++++++++++ .../20260611005912_barcodeisunique.cs | 28 +++++ .../Migrations/BarkContextModelSnapshot.cs | 9 +- barkmanAPI/barkDbModel.cs | 3 +- 6 files changed, 301 insertions(+), 3 deletions(-) create mode 100644 barkmanAPI/Migrations/20260611002716_barcodestring.Designer.cs create mode 100644 barkmanAPI/Migrations/20260611002716_barcodestring.cs create mode 100644 barkmanAPI/Migrations/20260611005912_barcodeisunique.Designer.cs create mode 100644 barkmanAPI/Migrations/20260611005912_barcodeisunique.cs diff --git a/barkmanAPI/Migrations/20260611002716_barcodestring.Designer.cs b/barkmanAPI/Migrations/20260611002716_barcodestring.Designer.cs new file mode 100644 index 0000000..bfa084a --- /dev/null +++ b/barkmanAPI/Migrations/20260611002716_barcodestring.Designer.cs @@ -0,0 +1,113 @@ +// +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; +using barkmanapi; + +#nullable disable + +namespace barkmanapi.Migrations +{ + [DbContext(typeof(BarkContext))] + [Migration("20260611002716_barcodestring")] + partial class barcodestring + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "9.0.1") + .HasAnnotation("Relational:MaxIdentifierLength", 63); + + NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); + + modelBuilder.Entity("barkmanapi.InventoryItems", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Barcode") + .IsRequired() + .HasColumnType("text") + .HasColumnName("barcode"); + + b.Property("Brand") + .IsRequired() + .HasColumnType("text") + .HasColumnName("brand"); + + b.Property("Name") + .IsRequired() + .HasColumnType("text") + .HasColumnName("name"); + + b.Property("Notes") + .HasColumnType("text") + .HasColumnName("notes"); + + b.Property("RentalPrice") + .HasColumnType("real") + .HasColumnName("rental_price"); + + b.Property("ReplacementCost") + .HasColumnType("real") + .HasColumnName("replacement_cost"); + + b.Property("SerialNumber") + .HasColumnType("text") + .HasColumnName("serial_number"); + + b.Property("StatusId") + .HasColumnType("text") + .HasColumnName("status_id"); + + b.Property("Weight") + .HasColumnType("real") + .HasColumnName("weight"); + + b.HasKey("Id") + .HasName("pk_inventory"); + + b.HasIndex("StatusId") + .HasDatabaseName("ix_inventory_status_id"); + + b.ToTable("inventory", (string)null); + }); + + modelBuilder.Entity("barkmanapi.ItemStatus", b => + { + b.Property("Id") + .HasColumnType("text") + .HasColumnName("id"); + + b.Property("Name") + .IsRequired() + .HasColumnType("text") + .HasColumnName("name"); + + b.HasKey("Id") + .HasName("pk_item_status"); + + b.ToTable("item_status", (string)null); + }); + + modelBuilder.Entity("barkmanapi.InventoryItems", b => + { + b.HasOne("barkmanapi.ItemStatus", "Status") + .WithMany() + .HasForeignKey("StatusId") + .HasConstraintName("fk_inventory_item_status_status_id"); + + b.Navigation("Status"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/barkmanAPI/Migrations/20260611002716_barcodestring.cs b/barkmanAPI/Migrations/20260611002716_barcodestring.cs new file mode 100644 index 0000000..ac51ff5 --- /dev/null +++ b/barkmanAPI/Migrations/20260611002716_barcodestring.cs @@ -0,0 +1,34 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace barkmanapi.Migrations +{ + /// + public partial class barcodestring : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.AlterColumn( + name: "barcode", + table: "inventory", + type: "text", + nullable: false, + oldClrType: typeof(int), + oldType: "integer"); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.AlterColumn( + name: "barcode", + table: "inventory", + type: "integer", + nullable: false, + oldClrType: typeof(string), + oldType: "text"); + } + } +} diff --git a/barkmanAPI/Migrations/20260611005912_barcodeisunique.Designer.cs b/barkmanAPI/Migrations/20260611005912_barcodeisunique.Designer.cs new file mode 100644 index 0000000..076d7ff --- /dev/null +++ b/barkmanAPI/Migrations/20260611005912_barcodeisunique.Designer.cs @@ -0,0 +1,117 @@ +// +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; +using barkmanapi; + +#nullable disable + +namespace barkmanapi.Migrations +{ + [DbContext(typeof(BarkContext))] + [Migration("20260611005912_barcodeisunique")] + partial class barcodeisunique + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "9.0.1") + .HasAnnotation("Relational:MaxIdentifierLength", 63); + + NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); + + modelBuilder.Entity("barkmanapi.InventoryItems", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Barcode") + .IsRequired() + .HasColumnType("text") + .HasColumnName("barcode"); + + b.Property("Brand") + .IsRequired() + .HasColumnType("text") + .HasColumnName("brand"); + + b.Property("Name") + .IsRequired() + .HasColumnType("text") + .HasColumnName("name"); + + b.Property("Notes") + .HasColumnType("text") + .HasColumnName("notes"); + + b.Property("RentalPrice") + .HasColumnType("real") + .HasColumnName("rental_price"); + + b.Property("ReplacementCost") + .HasColumnType("real") + .HasColumnName("replacement_cost"); + + b.Property("SerialNumber") + .HasColumnType("text") + .HasColumnName("serial_number"); + + b.Property("StatusId") + .HasColumnType("text") + .HasColumnName("status_id"); + + b.Property("Weight") + .HasColumnType("real") + .HasColumnName("weight"); + + b.HasKey("Id") + .HasName("pk_inventory"); + + b.HasIndex("Barcode") + .IsUnique() + .HasDatabaseName("ix_inventory_barcode"); + + b.HasIndex("StatusId") + .HasDatabaseName("ix_inventory_status_id"); + + b.ToTable("inventory", (string)null); + }); + + modelBuilder.Entity("barkmanapi.ItemStatus", b => + { + b.Property("Id") + .HasColumnType("text") + .HasColumnName("id"); + + b.Property("Name") + .IsRequired() + .HasColumnType("text") + .HasColumnName("name"); + + b.HasKey("Id") + .HasName("pk_item_status"); + + b.ToTable("item_status", (string)null); + }); + + modelBuilder.Entity("barkmanapi.InventoryItems", b => + { + b.HasOne("barkmanapi.ItemStatus", "Status") + .WithMany() + .HasForeignKey("StatusId") + .HasConstraintName("fk_inventory_item_status_status_id"); + + b.Navigation("Status"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/barkmanAPI/Migrations/20260611005912_barcodeisunique.cs b/barkmanAPI/Migrations/20260611005912_barcodeisunique.cs new file mode 100644 index 0000000..bd92898 --- /dev/null +++ b/barkmanAPI/Migrations/20260611005912_barcodeisunique.cs @@ -0,0 +1,28 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace barkmanapi.Migrations +{ + /// + public partial class barcodeisunique : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.CreateIndex( + name: "ix_inventory_barcode", + table: "inventory", + column: "barcode", + unique: true); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropIndex( + name: "ix_inventory_barcode", + table: "inventory"); + } + } +} diff --git a/barkmanAPI/Migrations/BarkContextModelSnapshot.cs b/barkmanAPI/Migrations/BarkContextModelSnapshot.cs index d3f1dee..15f4585 100644 --- a/barkmanAPI/Migrations/BarkContextModelSnapshot.cs +++ b/barkmanAPI/Migrations/BarkContextModelSnapshot.cs @@ -30,8 +30,9 @@ namespace barkmanapi.Migrations NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - b.Property("Barcode") - .HasColumnType("integer") + b.Property("Barcode") + .IsRequired() + .HasColumnType("text") .HasColumnName("barcode"); b.Property("Brand") @@ -71,6 +72,10 @@ namespace barkmanapi.Migrations b.HasKey("Id") .HasName("pk_inventory"); + b.HasIndex("Barcode") + .IsUnique() + .HasDatabaseName("ix_inventory_barcode"); + b.HasIndex("StatusId") .HasDatabaseName("ix_inventory_status_id"); diff --git a/barkmanAPI/barkDbModel.cs b/barkmanAPI/barkDbModel.cs index 1decfb8..aac0a20 100644 --- a/barkmanAPI/barkDbModel.cs +++ b/barkmanAPI/barkDbModel.cs @@ -8,10 +8,11 @@ public class BarkContext(DbContextOptions options) : DbContext(opti public DbSet ItemStatus { get; set; } } +[Index(nameof(Barcode), IsUnique = true)] public class InventoryItems { public int Id {get; set;} - public int Barcode {get; set;} + public string Barcode {get; set;} public string Name { get; set; } public string Brand { get; set; } public string? SerialNumber { get; set; } From b70405d2e0a3958ee22b5ab67ee3857315fd6fe4 Mon Sep 17 00:00:00 2001 From: Drew Rautenberg Date: Wed, 10 Jun 2026 20:04:57 -0500 Subject: [PATCH 3/3] updated add and edit items to use TextInput --- barkmanui/src/features/inventory/AddItem.tsx | 2 +- barkmanui/src/features/inventory/EditItem.tsx | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/barkmanui/src/features/inventory/AddItem.tsx b/barkmanui/src/features/inventory/AddItem.tsx index 02135c9..bade3ef 100644 --- a/barkmanui/src/features/inventory/AddItem.tsx +++ b/barkmanui/src/features/inventory/AddItem.tsx @@ -86,7 +86,7 @@ function AddItem() { wrap="wrap"> Add Item - diff --git a/barkmanui/src/features/inventory/EditItem.tsx b/barkmanui/src/features/inventory/EditItem.tsx index 18e9f9e..d1af2d6 100644 --- a/barkmanui/src/features/inventory/EditItem.tsx +++ b/barkmanui/src/features/inventory/EditItem.tsx @@ -16,7 +16,7 @@ function EditItem() { const editItemForm = useForm({ mode: 'uncontrolled', initialValues: { - barcode: 0, + barcode: "", name: "", brand: "", statusId: "", @@ -113,7 +113,7 @@ function EditItem() {
{isFetching ? 'Updating...' : ''}
Edit Item -