diff --git a/frontend/src/admin/AdminContext.tsx b/frontend/src/admin/AdminContext.tsx index e732eff..1034455 100644 --- a/frontend/src/admin/AdminContext.tsx +++ b/frontend/src/admin/AdminContext.tsx @@ -4,7 +4,7 @@ import Swal from 'sweetalert2' import type { SiteData } from '../api' import { useSiteData } from '../api' import { adminApi, getToken, HttpError, setToken, AUTH_CHANGE_EVENT } from './adminClient' -import { ENTITIES, isTranslatable } from './entities' +import { entityConfig, isTranslatable } from './entities' export type SaveStatus = 'idle' | 'saving' | 'error' /** زبان ویرایش محتوا — رابط مدیریتی فارسی می‌ماند؛ این فقط تعیین می‌کند کدام ستون زبان ذخیره شود */ @@ -246,7 +246,7 @@ export function useFieldSaver() { } await adminApi.patch(resource, id, changes) updateSite((d) => { - const config = ENTITIES[resource] + const config = entityConfig(resource) let node: Record | undefined if (config) { const target = d[config.dataKey as keyof SiteData] as unknown diff --git a/frontend/src/admin/Editable.tsx b/frontend/src/admin/Editable.tsx index 73abc97..1dad767 100644 --- a/frontend/src/admin/Editable.tsx +++ b/frontend/src/admin/Editable.tsx @@ -8,14 +8,14 @@ import { useSiteData } from '../api' import type { SiteData } from '../api' import { useAdmin } from './AdminContext' import { adminApi } from './adminClient' -import { ENTITIES } from './entities' +import { entityConfig } from './entities' import { EntityDrawer } from './EntityDrawer' type ItemWithId = Record & { id: number } function useEntityList(resource: string): ItemWithId[] { const { data } = useSiteData() - const config = ENTITIES[resource] + const config = entityConfig(resource) if (!config) throw new Error(`منبع ناشناخته: ${resource}`) return (data?.[config.dataKey as keyof NonNullable] ?? []) as ItemWithId[] } @@ -72,7 +72,7 @@ export function EditableItem({ }) { const { isAuthenticated, isEditMode, runSave, canManageSite } = useAdmin() const { reload } = useSiteData() - const config = ENTITIES[resource] + const config = entityConfig(resource) const list = useEntityList(resource) const [drawerOpen, setDrawerOpen] = useState(false) @@ -175,7 +175,7 @@ export function AddItemButton({ const { isAuthenticated, isEditMode, runSave, canManageSite } = useAdmin() const navigate = useNavigate() const { updateSite } = useSiteData() - const config = ENTITIES[resource] + const config = entityConfig(resource) const [newItem, setNewItem] = useState(null) if (!config || !isAuthenticated || !isEditMode || !canManageSite) return null @@ -250,7 +250,7 @@ export function SingletonPill({ createDefaults?: Record | (() => Record) }) { const { isAuthenticated, isEditMode, runSave, canManageSite } = useAdmin() - const config = ENTITIES[resource] + const config = entityConfig(resource) const { data, updateSite } = useSiteData() const [drawerOpen, setDrawerOpen] = useState(false) const [created, setCreated] = useState(null) diff --git a/frontend/src/admin/entities.ts b/frontend/src/admin/entities.ts index d709638..c83b34f 100644 --- a/frontend/src/admin/entities.ts +++ b/frontend/src/admin/entities.ts @@ -270,10 +270,16 @@ export const ENTITIES: Record = { }, } +/** تعریف موجودیت بر اساس resource (نشانی API) — کلید فهرست همیشه با resource یکی نیست + * (why_us/contact_section/seo_meta/… کلید snake_case دارند ولی resource کباب‌کامل است) */ +export function entityConfig(resource: string): EntityConfig | undefined { + return Object.values(ENTITIES).find((c) => c.resource === resource) +} + /** آیا فیلد در منبع داده قابل ترجمه است؟ (فیلدهای مشترک و پسوندهای انگلیسی قبلی خیر) */ export function isTranslatable(resource: string, name: string): boolean { if (name.endsWith('_en')) return false - const config = ENTITIES[resource] + const config = entityConfig(resource) return !!config?.fields.some((f) => f.name === name && !f.shared) }