UNPKG

@firecms/core

Version:

Awesome Firebase/Firestore-based headless open-source CMS

77 lines (72 loc) 3.3 kB
import { AuthController, EntityCollection, Property, PropertyConfig, ResolvedEntityCollection } from "../types"; import { isReferenceProperty } from "./property_utils"; import { isPropertyBuilder } from "./entities"; import { getFieldConfig } from "../core"; export function getEntityPreviewKeys( authController: AuthController, targetCollection: EntityCollection<any>, fields: Record<string, PropertyConfig>, previewProperties?: string[], limit = 3) { const allProperties = Object.keys(targetCollection.properties); let listProperties = previewProperties?.filter(p => allProperties.includes(p as string)); if (!listProperties && targetCollection.previewProperties) { listProperties = targetCollection.previewProperties?.filter(p => allProperties.includes(p as string)); } if (listProperties && listProperties.length > 0) { return listProperties; } else { listProperties = allProperties; return listProperties.filter(key => { const propertyOrBuilder = targetCollection.properties[key]; return propertyOrBuilder && !isPropertyBuilder(propertyOrBuilder) && !isReferenceProperty(authController, propertyOrBuilder, fields); }).slice(0, limit); } } export function getEntityTitlePropertyKey<M extends Record<string, any>>(collection: EntityCollection<M>, propertyConfigs: Record<string, PropertyConfig<any>>): string | undefined { if (collection.titleProperty) { return collection.titleProperty as string; } // find first text field property for (const key in collection.properties) { const property = collection.properties[key]; if (!isPropertyBuilder(property)) { const field = getFieldConfig(property as Property, propertyConfigs); if (field?.key === "text_field") { return key; } } } return undefined; } export function getEntityImagePreviewPropertyKey<M extends object>(collection: ResolvedEntityCollection<M>): string | undefined { // find first storage property of type image for (const key in collection.properties) { const property = collection.properties[key]; if (property.dataType === "string" && property.storage?.acceptedFiles?.includes("image/*")) { return key; } } // alternatively, look for the first array of images for (const key in collection.properties) { const property = collection.properties[key]; if (property.dataType === "array" && property.of?.dataType === "string" && property.of.storage?.acceptedFiles?.includes("image/*")) { return key; } } // also check for URL properties with image preview type for (const key in collection.properties) { const property = collection.properties[key]; if (property.dataType === "string" && property.url === "image") { return key; } } // and arrays of URL properties with image preview type for (const key in collection.properties) { const property = collection.properties[key]; if (property.dataType === "array" && property.of?.dataType === "string" && property.of.url === "image") { return key; } } return undefined; }