1 | import {SerializeOptions} from './StructureNodes'
|
2 | import {Partial} from './Partial'
|
3 | import {ListItemBuilder, ListItem, UnserializedListItem, ListItemInput} from './ListItem'
|
4 | import {SchemaType} from './parts/Schema'
|
5 | import {SerializeError, HELP_URL} from './SerializeError'
|
6 | import {EditorBuilder} from './Editor'
|
7 |
|
8 | export interface DocumentListItemInput extends ListItemInput {
|
9 | schemaType: SchemaType | string
|
10 | }
|
11 |
|
12 | export interface DocumentListItem extends ListItem {
|
13 | schemaType: SchemaType
|
14 | _id: string
|
15 | }
|
16 |
|
17 | type PartialDocumentListItem = Partial<UnserializedListItem>
|
18 |
|
19 | const 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 |
|
28 | export 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 | }
|