mirror of
https://github.com/docmost/docmost.git
synced 2026-07-27 09:44:42 +10:00
feat(base): auto-suffix fallback property names to avoid collisions
This commit is contained in:
@@ -74,6 +74,23 @@ export function CreatePropertyPopover({ baseId, properties, onPropertyCreated }:
|
|||||||
);
|
);
|
||||||
}, [name, properties]);
|
}, [name, properties]);
|
||||||
|
|
||||||
|
// When the user leaves Name blank, fall back to the type label — and if
|
||||||
|
// that's already taken, suffix `n` until we find one that's free
|
||||||
|
// ("Text", "Text 1", "Text 2", …). Mirrors how other tools auto-number
|
||||||
|
// default field names.
|
||||||
|
const fallbackName = useMemo(() => {
|
||||||
|
const base = selectedTypeLabel || "Field";
|
||||||
|
const existing = new Set(
|
||||||
|
(properties ?? []).map((p) => p.name.trim().toLowerCase()),
|
||||||
|
);
|
||||||
|
if (!existing.has(base.toLowerCase())) return base;
|
||||||
|
for (let i = 1; i < 1000; i++) {
|
||||||
|
const candidate = `${base} ${i}`;
|
||||||
|
if (!existing.has(candidate.toLowerCase())) return candidate;
|
||||||
|
}
|
||||||
|
return `${base} ${Date.now()}`;
|
||||||
|
}, [selectedTypeLabel, properties]);
|
||||||
|
|
||||||
const resetState = useCallback(() => {
|
const resetState = useCallback(() => {
|
||||||
setPanel("typePicker");
|
setPanel("typePicker");
|
||||||
setSelectedType(null);
|
setSelectedType(null);
|
||||||
@@ -121,7 +138,7 @@ export function CreatePropertyPopover({ baseId, properties, onPropertyCreated }:
|
|||||||
|
|
||||||
const handleCreate = useCallback(() => {
|
const handleCreate = useCallback(() => {
|
||||||
if (!selectedType || nameTaken) return;
|
if (!selectedType || nameTaken) return;
|
||||||
const finalName = name.trim() || selectedTypeLabel;
|
const finalName = name.trim() || fallbackName;
|
||||||
createPropertyMutation.mutate(
|
createPropertyMutation.mutate(
|
||||||
{
|
{
|
||||||
baseId,
|
baseId,
|
||||||
@@ -138,7 +155,7 @@ export function CreatePropertyPopover({ baseId, properties, onPropertyCreated }:
|
|||||||
},
|
},
|
||||||
);
|
);
|
||||||
handleClose();
|
handleClose();
|
||||||
}, [selectedType, nameTaken, name, selectedTypeLabel, typeOptions, baseId, createPropertyMutation, handleClose, onPropertyCreated]);
|
}, [selectedType, nameTaken, name, fallbackName, typeOptions, baseId, createPropertyMutation, handleClose, onPropertyCreated]);
|
||||||
|
|
||||||
const handleBackToTypePicker = useCallback(() => {
|
const handleBackToTypePicker = useCallback(() => {
|
||||||
setPanel("typePicker");
|
setPanel("typePicker");
|
||||||
@@ -247,7 +264,7 @@ export function CreatePropertyPopover({ baseId, properties, onPropertyCreated }:
|
|||||||
ref={nameInputRef}
|
ref={nameInputRef}
|
||||||
size="xs"
|
size="xs"
|
||||||
label={t("Name")}
|
label={t("Name")}
|
||||||
placeholder={selectedTypeLabel}
|
placeholder={fallbackName}
|
||||||
value={name}
|
value={name}
|
||||||
onChange={(e) => setName(e.currentTarget.value)}
|
onChange={(e) => setName(e.currentTarget.value)}
|
||||||
error={nameTaken ? t("A property with this name already exists") : undefined}
|
error={nameTaken ? t("A property with this name already exists") : undefined}
|
||||||
@@ -263,7 +280,7 @@ export function CreatePropertyPopover({ baseId, properties, onPropertyCreated }:
|
|||||||
createPropertyMutation.mutate(
|
createPropertyMutation.mutate(
|
||||||
{
|
{
|
||||||
baseId,
|
baseId,
|
||||||
name: name.trim() || t("Formula"),
|
name: name.trim() || fallbackName,
|
||||||
type: "formula",
|
type: "formula",
|
||||||
typeOptions: {
|
typeOptions: {
|
||||||
source,
|
source,
|
||||||
@@ -286,7 +303,7 @@ export function CreatePropertyPopover({ baseId, properties, onPropertyCreated }:
|
|||||||
ref={nameInputRef}
|
ref={nameInputRef}
|
||||||
size="xs"
|
size="xs"
|
||||||
label={t("Name")}
|
label={t("Name")}
|
||||||
placeholder={selectedTypeLabel}
|
placeholder={fallbackName}
|
||||||
value={name}
|
value={name}
|
||||||
onChange={(e) => setName(e.currentTarget.value)}
|
onChange={(e) => setName(e.currentTarget.value)}
|
||||||
onKeyDown={handleNameKeyDown}
|
onKeyDown={handleNameKeyDown}
|
||||||
|
|||||||
Reference in New Issue
Block a user