feat: relation field and picker
This commit is contained in:
1 parent
b45c99be3b
commit
37a77c9c22
92 files changed
+6826
-80
No files matched your search
@@ -2,9 +2,10 @@ import { t } from '@/i18n'
|
||||
import type { BuiltinField, ContentEntry } from '@/lib/contentTypes'
|
||||
import { describeCell, plainCellText } from '@/lib/entryCells'
|
||||
import { ruleMessage, type EntryRule } from '@/lib/entryMessages'
|
||||
import { isBlank } from '@/lib/entryValue'
|
||||
import { isBlank, sameValue } from '@/lib/entryValue'
|
||||
import { fieldTypeSpec } from '@/lib/fieldTypes'
|
||||
import { mediaOf, type MediaMap } from '@/lib/mediaField'
|
||||
import { relationSummariesFor, type RelationSummaries } from '@/lib/relationField'
|
||||
|
||||
export type EntryValues = Record<string, unknown>
|
||||
|
||||
@@ -39,6 +40,17 @@ export function initialImages(fields: BuiltinField[], stored: ContentEntry | nul
|
||||
return images
|
||||
}
|
||||
|
||||
export function isRelationField(field: BuiltinField) {
|
||||
return fieldTypeSpec(field.type).editor.control === 'relation'
|
||||
}
|
||||
|
||||
export function initialRelations(
|
||||
fields: BuiltinField[],
|
||||
stored: ContentEntry | null,
|
||||
): RelationSummaries {
|
||||
return relationSummariesFor(fields, stored, isRelationField)
|
||||
}
|
||||
|
||||
export function buildData(fields: BuiltinField[], values: EntryValues) {
|
||||
return Object.fromEntries(
|
||||
fields.map((field) => [
|
||||
@@ -56,11 +68,13 @@ export function validateEntry(
|
||||
fields: BuiltinField[],
|
||||
values: EntryValues,
|
||||
images: MediaMap = {},
|
||||
relations: RelationSummaries = {},
|
||||
): EntryIssues {
|
||||
const issues: EntryIssues = {}
|
||||
for (const field of fields) {
|
||||
const rule = fieldTypeSpec(field.type).editor.validate(field, values[field.key], {
|
||||
image: images[field.key] ?? null,
|
||||
relations: relations[field.key] ?? [],
|
||||
})
|
||||
if (rule) {
|
||||
issues[field.key] = issueFor(field, rule)
|
||||
@@ -74,7 +88,7 @@ export function firstIssueKey(fields: BuiltinField[], issues: EntryIssues) {
|
||||
}
|
||||
|
||||
export function valuesDiffer(fields: BuiltinField[], current: EntryValues, saved: EntryValues) {
|
||||
return fields.some((field) => !Object.is(current[field.key], saved[field.key]))
|
||||
return fields.some((field) => !sameValue(current[field.key], saved[field.key]))
|
||||
}
|
||||
|
||||
export function carriesDefault(field: BuiltinField, value: unknown) {
|
||||
@@ -91,7 +105,7 @@ export function entryTitle(fields: BuiltinField[], entry: ContentEntry | null) {
|
||||
return entry ? t('Entry {0}', [entry.id]) : t('New entry')
|
||||
}
|
||||
const cell = describeCell(first, entry.data[first.key])
|
||||
return cell.kind === 'empty' || cell.kind === 'thumbnail'
|
||||
return cell.kind === 'empty' || cell.kind === 'thumbnail' || cell.kind === 'relation'
|
||||
? t('Entry {0}', [entry.id])
|
||||
: plainCellText(cell)
|
||||
}
|
||||
Reference in new issue
Block a user