Includes all Phase 1 features: - Search-first navigation with auto-complete - Responsive reading interface (desktop/tablet/mobile) - 4 customization presets + full fine-tuning controls - Layered details panel with notes, bookmarks, highlights - Smart offline caching with IndexedDB and auto-sync - Full accessibility (WCAG 2.1 AA) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
95 lines
2.1 KiB
TypeScript
95 lines
2.1 KiB
TypeScript
import { CollectionConfig } from 'payload';
|
|
|
|
export const BibleVerses: CollectionConfig = {
|
|
slug: 'bible-verses',
|
|
admin: {
|
|
useAsTitle: 'reference',
|
|
defaultColumns: ['reference', 'version', 'book', 'chapter'],
|
|
group: 'Bible Content',
|
|
pagination: {
|
|
defaultLimit: 50,
|
|
},
|
|
},
|
|
fields: [
|
|
{
|
|
name: 'book',
|
|
type: 'relationship',
|
|
relationTo: 'bible-books',
|
|
required: true,
|
|
index: true,
|
|
},
|
|
{
|
|
name: 'chapter',
|
|
type: 'number',
|
|
required: true,
|
|
min: 1,
|
|
index: true,
|
|
},
|
|
{
|
|
name: 'verse',
|
|
type: 'number',
|
|
required: true,
|
|
min: 1,
|
|
index: true,
|
|
},
|
|
{
|
|
name: 'text',
|
|
type: 'textarea',
|
|
required: true,
|
|
localized: true,
|
|
},
|
|
{
|
|
name: 'version',
|
|
type: 'select',
|
|
options: [
|
|
{ label: 'Cornilescu (VDC)', value: 'VDC' },
|
|
{ label: 'NASB', value: 'NASB' },
|
|
{ label: 'RVR', value: 'RVR' },
|
|
{ label: 'NR', value: 'NR' },
|
|
],
|
|
required: true,
|
|
index: true,
|
|
},
|
|
{
|
|
name: 'reference',
|
|
type: 'text',
|
|
admin: {
|
|
readOnly: true,
|
|
},
|
|
hooks: {
|
|
beforeChange: [
|
|
async ({ data, siblingData, req }) => {
|
|
if (!data) return '';
|
|
|
|
if (siblingData?.book && data.chapter && data.verse) {
|
|
const book = await req.payload.findByID({
|
|
collection: 'bible-books',
|
|
id: siblingData.book,
|
|
});
|
|
|
|
if (book) {
|
|
return `${book.name} ${data.chapter}:${data.verse}`;
|
|
}
|
|
}
|
|
return data.reference || '';
|
|
},
|
|
],
|
|
},
|
|
},
|
|
{
|
|
name: 'embedding',
|
|
type: 'json',
|
|
admin: {
|
|
hidden: true,
|
|
description: 'Vector embedding for semantic search',
|
|
},
|
|
},
|
|
],
|
|
access: {
|
|
read: () => true,
|
|
create: ({ req }) => req.user?.role === 'admin' || req.user?.role === 'super-admin',
|
|
update: ({ req }) => req.user?.role === 'admin' || req.user?.role === 'super-admin',
|
|
delete: ({ req }) => req.user?.role === 'super-admin',
|
|
},
|
|
};
|