UNPKG

1.72 kBPlain TextView Raw
1import {SerializeOptions} from './StructureNodes'
2import {Partial} from './Partial'
3import {ListItemBuilder, ListItem, UnserializedListItem, ListItemInput} from './ListItem'
4import {SchemaType} from './parts/Schema'
5import {SerializeError, HELP_URL} from './SerializeError'
6import {EditorBuilder} from './Editor'
7
8export interface DocumentListItemInput extends ListItemInput {
9 schemaType: SchemaType | string
10}
11
12export interface DocumentListItem extends ListItem {
13 schemaType: SchemaType
14 _id: string
15}
16
17type PartialDocumentListItem = Partial<UnserializedListItem>
18
19const getDefaultChildResolver = (spec: PartialDocumentListItem) => (documentId: string) => {
20 let editor = new EditorBuilder().id('editor').documentId(documentId)
21 if (spec.schemaType) {
22 editor = editor.schemaType(spec.schemaType)
23 }
24
25 return editor
26}
27
28export class DocumentListItemBuilder extends ListItemBuilder {
29 protected spec: PartialDocumentListItem
30
31 constructor(spec?: DocumentListItemInput) {
32 super(spec)
33 this.spec = spec ? spec : {}
34 }
35
36 serialize(options: SerializeOptions = {path: []}): DocumentListItem {
37 const spec = super.serialize({...options, titleIsOptional: true})
38
39 if (!spec.schemaType) {
40 throw new SerializeError(
41 '`schemaType` is required for document list items',
42 options.path,
43 options.index
44 ).withHelpUrl(HELP_URL.SCHEMA_TYPE_REQUIRED)
45 }
46
47 const child = spec.child || getDefaultChildResolver(spec)
48 return {...spec, child, schemaType: spec.schemaType, _id: spec.id}
49 }
50
51 clone(withSpec?: PartialDocumentListItem) {
52 const builder = new DocumentListItemBuilder()
53 builder.spec = {...this.spec, ...(withSpec || {})}
54 return builder
55 }
56}