1
0
forked from baron/baron-sso

feat: add schema check on bulk user move and support for float/datetime in custom metadata

This commit is contained in:
2026-03-19 14:02:56 +09:00
parent 3e335eb9cf
commit 896a51df3d
4 changed files with 256 additions and 11 deletions

View File

@@ -17,7 +17,13 @@ import { Label } from "../../../components/ui/label";
import { fetchMe, fetchTenant, updateTenant } from "../../../lib/adminApi";
import { t } from "../../../lib/i18n";
type SchemaFieldType = "text" | "number" | "boolean" | "date";
type SchemaFieldType =
| "text"
| "number"
| "boolean"
| "date"
| "float"
| "datetime";
type SchemaField = {
id: string;
@@ -27,6 +33,7 @@ type SchemaField = {
required: boolean;
adminOnly: boolean;
validation?: string;
unsigned?: boolean;
};
function createFieldId() {
@@ -98,13 +105,16 @@ export function TenantSchemaPage() {
type:
field?.type === "number" ||
field?.type === "boolean" ||
field?.type === "date"
field?.type === "date" ||
field?.type === "float" ||
field?.type === "datetime"
? field.type
: "text",
required: Boolean(field?.required),
adminOnly: Boolean(field?.adminOnly),
validation:
typeof field?.validation === "string" ? field.validation : "",
unsigned: Boolean(field?.unsigned),
})),
);
}
@@ -146,6 +156,7 @@ export function TenantSchemaPage() {
required: false,
adminOnly: false,
validation: "",
unsigned: false,
},
]);
};
@@ -242,9 +253,13 @@ export function TenantSchemaPage() {
nextType === "text" ||
nextType === "number" ||
nextType === "boolean" ||
nextType === "date"
nextType === "date" ||
nextType === "float" ||
nextType === "datetime"
) {
updateField(index, { type: nextType });
updateField(index, {
type: nextType as SchemaFieldType,
});
}
}}
>
@@ -257,7 +272,13 @@ export function TenantSchemaPage() {
<option value="number">
{t(
"ui.admin.tenants.schema.field.type_number",
"숫자 (Number)",
"숫자 (Integer)",
)}
</option>
<option value="float">
{t(
"ui.admin.tenants.schema.field.type_float",
"실수 (Float)",
)}
</option>
<option value="boolean">
@@ -272,12 +293,18 @@ export function TenantSchemaPage() {
"날짜 (Date)",
)}
</option>
<option value="datetime">
{t(
"ui.admin.tenants.schema.field.type_datetime",
"일시 (DateTime)",
)}
</option>
</select>
</div>
</div>
<div className="grid grid-cols-1 md:grid-cols-3 gap-4 items-center">
<div className="flex items-center gap-6">
<div className="flex flex-wrap items-center gap-4">
<label className="flex items-center gap-2 cursor-pointer">
<input
type="checkbox"
@@ -307,6 +334,24 @@ export function TenantSchemaPage() {
)}
</span>
</label>
{(field.type === "number" || field.type === "float") && (
<label className="flex items-center gap-2 cursor-pointer">
<input
type="checkbox"
checked={field.unsigned}
onChange={(e) =>
updateField(index, { unsigned: e.target.checked })
}
className="w-4 h-4 rounded border-gray-300 text-primary focus:ring-primary"
/>
<span className="text-sm font-medium">
{t(
"ui.admin.tenants.schema.field.unsigned",
"음수 불가",
)}
</span>
</label>
)}
</div>
<div className="space-y-2">
<Input