diff options
author | bobzel <zzzman@gmail.com> | 2024-05-17 14:55:36 -0400 |
---|---|---|
committer | bobzel <zzzman@gmail.com> | 2024-05-17 14:55:36 -0400 |
commit | 0b451af28e5aef6b749da61e8a9fcd0a840789ac (patch) | |
tree | bdee4e28ee4715b69299a8da1b615c70b6adc445 /src/client/documents/DocFromField.ts | |
parent | 8c1b420a143e4b72ec551277887c211ca6ca003b (diff) | |
parent | 38a382a03675d6a50ec7de75f05025efd093f570 (diff) |
merged with new master
Diffstat (limited to 'src/client/documents/DocFromField.ts')
-rw-r--r-- | src/client/documents/DocFromField.ts | 31 |
1 files changed, 31 insertions, 0 deletions
diff --git a/src/client/documents/DocFromField.ts b/src/client/documents/DocFromField.ts new file mode 100644 index 000000000..b65bbbdf5 --- /dev/null +++ b/src/client/documents/DocFromField.ts @@ -0,0 +1,31 @@ +import { Doc, DocListCast } from '../../fields/Doc'; +import { InkField } from '../../fields/InkField'; +import { List } from '../../fields/List'; +import { StrCast } from '../../fields/Types'; +import { AudioField, ImageField, PdfField, VideoField } from '../../fields/URLField'; +import { Docs, DocumentOptions } from './Documents'; + +/** + * Changes the field key in the doc's layout string to be the specified field + */ +export function ResetLayoutFieldKey(doc: Doc, fieldKey: string) { + doc.layout = StrCast(doc.layout).replace(/={'.*'}/, `={'${fieldKey}'}`); + return doc; +} +export function DocumentFromField(target: Doc, fieldKey: string, proto?: Doc, options?: DocumentOptions): Doc | undefined { + const field = target[fieldKey]; + const resolved = options ?? {}; + const nonDocFieldToDoc = () => { + if (field instanceof ImageField) return Docs.Create.ImageDocument(field.url.href, resolved); + if (field instanceof VideoField) return Docs.Create.VideoDocument(field.url.href, resolved); + if (field instanceof PdfField) return Docs.Create.PdfDocument(field.url.href, resolved); + if (field instanceof AudioField) return Docs.Create.AudioDocument(field.url.href, resolved); + if (field instanceof InkField) return Docs.Create.InkDocument(field.inkData, resolved); + if (field instanceof List && field[0] instanceof Doc) return Docs.Create.StackingDocument(DocListCast(field), resolved); + return Docs.Create.TextDocument('', { ...{ _width: 200, _height: 25, _layout_autoHeight: true }, ...resolved }); + }; + const created = field instanceof Doc ? field : ResetLayoutFieldKey(nonDocFieldToDoc(), fieldKey); + created.title = fieldKey; + proto && created.proto && (created.proto = Doc.GetProto(proto)); + return created; +} |