เพิ่ม editor ต่อ template field — ผู้ดูแลเลือกรูปแบบช่องกรอกในฟอร์มสร้างเอกสารได้: text → textbox/textarea, number/date → control ตาม type (presentation metadata ล้วน — validation ยังยึด Type, ค่า field เป็น string ทั้ง flow, ไม่แตะ generate/sync/add-in) - Backend: TemplateField.Editor (nullable, null = default ของ type) + migration AddTemplateFieldEditor + validate ตาม type ใน PUT templates (ค่าไม่รู้จัก/ไม่เข้ากับ type → 400, normalize-on-write, API คืน resolved เสมอ) - Web: util fieldEditor.ts + editor select หน้าแก้ template (desktop+mobile, ซ่อนเมื่อ type มีทางเดียว) + ฟอร์มสร้างเอกสาร render ตาม editor + แก้ prefill re-generate ของ field date จาก ISO timestamp เต็ม (input[type=date] รับเฉพาะ yyyy-MM-dd เดิมแสดงว่าง) - Docs: spec v6 (FR-14/AC-17) + plan Phase 10 + sub-plan field-editor.md + acceptance-review AC-17 + README/CLAUDE.md - Tests: backend 60/60 (FieldEditorTests ใหม่ 8 กรณี) · web 46/46 + build ผ่าน Co-Authored-By: Claude <noreply@anthropic.com>
257 lines
9 KiB
C#
257 lines
9 KiB
C#
// <auto-generated />
|
|
using System;
|
|
using Microsoft.EntityFrameworkCore;
|
|
using Microsoft.EntityFrameworkCore.Infrastructure;
|
|
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
|
|
using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
|
|
using WordVersioning.Api.Data;
|
|
|
|
#nullable disable
|
|
|
|
namespace WordVersioning.Api.Migrations
|
|
{
|
|
[DbContext(typeof(AppDbContext))]
|
|
partial class AppDbContextModelSnapshot : ModelSnapshot
|
|
{
|
|
protected override void BuildModel(ModelBuilder modelBuilder)
|
|
{
|
|
#pragma warning disable 612, 618
|
|
modelBuilder
|
|
.HasAnnotation("ProductVersion", "8.0.11")
|
|
.HasAnnotation("Relational:MaxIdentifierLength", 63);
|
|
|
|
NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder);
|
|
|
|
modelBuilder.Entity("WordVersioning.Api.Models.Document", b =>
|
|
{
|
|
b.Property<Guid>("Id")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("uuid");
|
|
|
|
b.Property<string>("AddInSignature")
|
|
.IsRequired()
|
|
.HasMaxLength(64)
|
|
.HasColumnType("character varying(64)");
|
|
|
|
b.Property<DateTimeOffset>("CreatedAt")
|
|
.HasColumnType("timestamp with time zone");
|
|
|
|
b.Property<string>("FileName")
|
|
.IsRequired()
|
|
.HasMaxLength(512)
|
|
.HasColumnType("character varying(512)");
|
|
|
|
b.Property<Guid?>("TemplateId")
|
|
.HasColumnType("uuid");
|
|
|
|
b.HasKey("Id");
|
|
|
|
b.HasIndex("TemplateId");
|
|
|
|
b.ToTable("Documents");
|
|
});
|
|
|
|
modelBuilder.Entity("WordVersioning.Api.Models.DocumentFieldValue", b =>
|
|
{
|
|
b.Property<Guid>("DocumentId")
|
|
.HasColumnType("uuid");
|
|
|
|
b.Property<string>("FieldKey")
|
|
.HasMaxLength(256)
|
|
.HasColumnType("character varying(256)");
|
|
|
|
b.Property<Guid>("SourceVersionId")
|
|
.HasColumnType("uuid");
|
|
|
|
b.Property<DateTimeOffset>("UpdatedAt")
|
|
.HasColumnType("timestamp with time zone");
|
|
|
|
b.Property<string>("UpdatedByUserId")
|
|
.IsRequired()
|
|
.HasColumnType("text");
|
|
|
|
b.Property<string>("Value")
|
|
.IsRequired()
|
|
.HasColumnType("text");
|
|
|
|
b.HasKey("DocumentId", "FieldKey");
|
|
|
|
b.ToTable("DocumentFieldValues");
|
|
});
|
|
|
|
modelBuilder.Entity("WordVersioning.Api.Models.DocumentVersion", b =>
|
|
{
|
|
b.Property<Guid>("Id")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("uuid");
|
|
|
|
b.Property<string>("ContentHash")
|
|
.IsRequired()
|
|
.HasMaxLength(64)
|
|
.HasColumnType("character varying(64)");
|
|
|
|
b.Property<DateTimeOffset>("CreatedAt")
|
|
.HasColumnType("timestamp with time zone");
|
|
|
|
b.Property<string>("CreatedByUserId")
|
|
.IsRequired()
|
|
.HasColumnType("text");
|
|
|
|
b.Property<Guid>("DocumentId")
|
|
.HasColumnType("uuid");
|
|
|
|
b.Property<string>("FieldsSnapshotJson")
|
|
.HasColumnType("text");
|
|
|
|
b.Property<string>("Message")
|
|
.HasMaxLength(2048)
|
|
.HasColumnType("character varying(2048)");
|
|
|
|
b.Property<string>("ObjectKey")
|
|
.IsRequired()
|
|
.HasMaxLength(1024)
|
|
.HasColumnType("character varying(1024)");
|
|
|
|
b.Property<int>("VersionNumber")
|
|
.HasColumnType("integer");
|
|
|
|
b.HasKey("Id");
|
|
|
|
b.HasIndex("DocumentId", "VersionNumber")
|
|
.IsUnique();
|
|
|
|
b.ToTable("DocumentVersions");
|
|
});
|
|
|
|
modelBuilder.Entity("WordVersioning.Api.Models.Template", b =>
|
|
{
|
|
b.Property<Guid>("Id")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("uuid");
|
|
|
|
b.Property<DateTimeOffset>("CreatedAt")
|
|
.HasColumnType("timestamp with time zone");
|
|
|
|
b.Property<string>("Description")
|
|
.HasMaxLength(2048)
|
|
.HasColumnType("character varying(2048)");
|
|
|
|
b.Property<bool>("IsActive")
|
|
.HasColumnType("boolean");
|
|
|
|
b.Property<string>("Name")
|
|
.IsRequired()
|
|
.HasMaxLength(256)
|
|
.HasColumnType("character varying(256)");
|
|
|
|
b.Property<string>("ObjectKey")
|
|
.IsRequired()
|
|
.HasMaxLength(1024)
|
|
.HasColumnType("character varying(1024)");
|
|
|
|
b.Property<DateTimeOffset>("UpdatedAt")
|
|
.HasColumnType("timestamp with time zone");
|
|
|
|
b.HasKey("Id");
|
|
|
|
b.ToTable("Templates");
|
|
});
|
|
|
|
modelBuilder.Entity("WordVersioning.Api.Models.TemplateField", b =>
|
|
{
|
|
b.Property<Guid>("Id")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("uuid");
|
|
|
|
b.Property<string>("Editor")
|
|
.HasMaxLength(16)
|
|
.HasColumnType("character varying(16)");
|
|
|
|
b.Property<bool>("IsRequired")
|
|
.HasColumnType("boolean");
|
|
|
|
b.Property<string>("Key")
|
|
.IsRequired()
|
|
.HasMaxLength(256)
|
|
.HasColumnType("character varying(256)");
|
|
|
|
b.Property<string>("Label")
|
|
.IsRequired()
|
|
.HasMaxLength(512)
|
|
.HasColumnType("character varying(512)");
|
|
|
|
b.Property<int>("SortOrder")
|
|
.HasColumnType("integer");
|
|
|
|
b.Property<Guid>("TemplateId")
|
|
.HasColumnType("uuid");
|
|
|
|
b.Property<string>("Type")
|
|
.IsRequired()
|
|
.HasMaxLength(16)
|
|
.HasColumnType("character varying(16)");
|
|
|
|
b.HasKey("Id");
|
|
|
|
b.HasIndex("TemplateId", "Key")
|
|
.IsUnique();
|
|
|
|
b.ToTable("TemplateFields");
|
|
});
|
|
|
|
modelBuilder.Entity("WordVersioning.Api.Models.Document", b =>
|
|
{
|
|
b.HasOne("WordVersioning.Api.Models.Template", "Template")
|
|
.WithMany("Documents")
|
|
.HasForeignKey("TemplateId")
|
|
.OnDelete(DeleteBehavior.Restrict);
|
|
|
|
b.Navigation("Template");
|
|
});
|
|
|
|
modelBuilder.Entity("WordVersioning.Api.Models.DocumentFieldValue", b =>
|
|
{
|
|
b.HasOne("WordVersioning.Api.Models.Document", null)
|
|
.WithMany()
|
|
.HasForeignKey("DocumentId")
|
|
.OnDelete(DeleteBehavior.Cascade)
|
|
.IsRequired();
|
|
});
|
|
|
|
modelBuilder.Entity("WordVersioning.Api.Models.DocumentVersion", b =>
|
|
{
|
|
b.HasOne("WordVersioning.Api.Models.Document", "Document")
|
|
.WithMany("Versions")
|
|
.HasForeignKey("DocumentId")
|
|
.OnDelete(DeleteBehavior.Cascade)
|
|
.IsRequired();
|
|
|
|
b.Navigation("Document");
|
|
});
|
|
|
|
modelBuilder.Entity("WordVersioning.Api.Models.TemplateField", b =>
|
|
{
|
|
b.HasOne("WordVersioning.Api.Models.Template", "Template")
|
|
.WithMany("Fields")
|
|
.HasForeignKey("TemplateId")
|
|
.OnDelete(DeleteBehavior.Cascade)
|
|
.IsRequired();
|
|
|
|
b.Navigation("Template");
|
|
});
|
|
|
|
modelBuilder.Entity("WordVersioning.Api.Models.Document", b =>
|
|
{
|
|
b.Navigation("Versions");
|
|
});
|
|
|
|
modelBuilder.Entity("WordVersioning.Api.Models.Template", b =>
|
|
{
|
|
b.Navigation("Documents");
|
|
|
|
b.Navigation("Fields");
|
|
});
|
|
#pragma warning restore 612, 618
|
|
}
|
|
}
|
|
}
|