aboutsummaryrefslogtreecommitdiff
path: root/src/fields/Doc.ts
diff options
context:
space:
mode:
authorsharkiecodes <lanyi_stroud@brown.edu>2025-06-10 11:12:23 -0400
committersharkiecodes <lanyi_stroud@brown.edu>2025-06-10 11:12:23 -0400
commit272534c8a7517d08c70928c96d487d84b14772f6 (patch)
tree0e3e9a8cc83b8ba96b2bd49c9fc726b16411d60c /src/fields/Doc.ts
parentc5981504058e0696827b4048fcd908a58fb0b0d3 (diff)
parentb91057d00512446339e48fb8488a97a1e5ef03d5 (diff)
Merge branch 'master' into lanyi-branch
Diffstat (limited to 'src/fields/Doc.ts')
-rw-r--r--src/fields/Doc.ts68
1 files changed, 36 insertions, 32 deletions
diff --git a/src/fields/Doc.ts b/src/fields/Doc.ts
index 990b6606f..6e0c3d112 100644
--- a/src/fields/Doc.ts
+++ b/src/fields/Doc.ts
@@ -536,23 +536,35 @@ export namespace Doc {
export function GetT<T extends FieldType>(doc: Doc, key: string, ctor: ToConstructor<T>, ignoreProto: boolean = false): FieldResult<T> {
return Cast(Get(doc, key, ignoreProto), ctor) as FieldResult<T>;
}
- export function isTemplateDoc(doc: Doc) {
- return GetT(doc, 'isTemplateDoc', 'boolean', true);
- }
- export function isTemplateForField(doc: Doc) {
- return GetT(doc, 'isTemplateForField', 'string', true);
- }
- export function IsDataProto(doc: Doc) {
- return GetT(doc, 'isDataDoc', 'boolean', true);
- }
- export function IsBaseProto(doc: Doc) {
- return GetT(doc, 'isBaseProto', 'boolean', true);
- }
- export function IsSystem(doc: Doc) {
- return GetT(doc, 'isSystem', 'boolean', true);
- }
- export function IsDelegateField(doc: Doc, fieldKey: string) {
- return doc && Get(doc, fieldKey, true) !== undefined;
+ /**
+ * Tests whether the Doc is flagged as being a template.
+ * Templates can be set as a layout for another target Doc. When rendered by the target Doc, the template
+ * creates an instance of itself that holds rendering data specific to the target
+ * @param doc
+ */
+ export function IsTemplateDoc(doc: Doc) { return GetT(doc, 'isTemplateDoc', 'boolean', true); } // prettier-ignore
+ /**
+ * Tests whether the Doc is flagged as being a template for rendering a specific field of a Doc
+ * When flagged as field template and rendered, the template will redirect its componentView to write to the
+ * specified template field. In general, a compound Doc template will contain multiple field templates, one for each of the
+ * data fields rendered by the compound template.
+ * @param doc
+ * @returns
+ */
+ export function IsTemplateForField(doc: Doc) { return GetT(doc, 'isTemplateForField', 'string', true); } // prettier-ignore
+ export function IsDataProto(doc: Doc) { return GetT(doc, 'isDataDoc', 'boolean', true); } // prettier-ignore
+ export function IsBaseProto(doc: Doc) { return GetT(doc, 'isBaseProto', 'boolean', true); } // prettier-ignore
+ export function IsSystem(doc: Doc) { return GetT(doc, 'isSystem', 'boolean', true); } // prettier-ignore
+ export function IsDelegateField(doc: Doc, fieldKey: string) { return doc && Get(doc, fieldKey, true) !== undefined; } // prettier-ignore
+ /**
+ * Tests whether a doc is a freeform collection that renders as a group.
+ * The group variant of a collection automatically resizes so that none of its contents
+ * are ever hidden.
+ * @param doc doc to test for being a freeform group
+ * @returns boolean
+ */
+ export function IsFreeformGroup(doc: Doc) {
+ return doc.freeform_isGroup && doc.type_collection === CollectionViewType.Freeform;
}
//
// this will write the value to the key on either the data doc or the embedding doc. The choice
@@ -596,9 +608,6 @@ export namespace Doc {
const value = (fields as { [key: string]: Opt<FieldType> })[key];
if (!skipUndefineds || value !== undefined) {
// Do we want to filter out undefineds?
- if (typeof value === 'object' && 'values' in value) {
- console.log(value);
- }
doc[key] = value;
}
});
@@ -734,7 +743,7 @@ export namespace Doc {
const FindDocsInRTF = new RegExp(/(audioId|textId|anchorId|docId)"\s*:\s*"(.*?)"/g);
export function makeClone(doc: Doc, cloneMap: Map<string, Doc>, linkMap: Map<string, Doc>, rtfs: { copy: Doc; key: string; field: RichTextField }[], exclusions: string[], pruneDocs: Doc[], cloneLinks: boolean, cloneTemplates: boolean): Doc {
- if (Doc.IsBaseProto(doc) || ((Doc.isTemplateDoc(doc) || Doc.isTemplateForField(doc)) && !cloneTemplates)) {
+ if (Doc.IsBaseProto(doc) || ((Doc.IsTemplateDoc(doc) || Doc.IsTemplateForField(doc)) && !cloneTemplates)) {
return doc;
}
if (cloneMap.get(doc[Id])) return cloneMap.get(doc[Id])!;
@@ -808,7 +817,7 @@ export namespace Doc {
const docAtKey = DocCast(clone[key]);
if (docAtKey && !Doc.IsSystem(docAtKey)) {
if (!Array.from(cloneMap.values()).includes(docAtKey)) {
- clone[key] = !cloneTemplates && (Doc.isTemplateDoc(docAtKey) || Doc.isTemplateForField(docAtKey)) ? docAtKey : cloneMap.get(docAtKey[Id]);
+ clone[key] = !cloneTemplates && (Doc.IsTemplateDoc(docAtKey) || Doc.IsTemplateForField(docAtKey)) ? docAtKey : cloneMap.get(docAtKey[Id]);
} else {
repairClone(docAtKey, cloneMap, cloneTemplates, visited);
}
@@ -859,7 +868,7 @@ export namespace Doc {
*/
export function expandTemplateLayout(templateLayoutDoc: Doc, targetDoc?: Doc, layoutFieldKey?: string) {
// nothing to do if the layout isn't a template or we don't have a target that's different than the template
- if (!targetDoc || templateLayoutDoc === targetDoc || (!Doc.isTemplateForField(templateLayoutDoc) && !Doc.isTemplateDoc(templateLayoutDoc))) {
+ if (!targetDoc || templateLayoutDoc === targetDoc || (!Doc.IsTemplateForField(templateLayoutDoc) && !Doc.IsTemplateDoc(templateLayoutDoc))) {
return templateLayoutDoc;
}
@@ -922,7 +931,7 @@ export namespace Doc {
console.log('Warning: GetLayoutDataDocPair childDoc not defined');
return { layout: childDoc, data: childDoc };
}
- const data = Doc.AreProtosEqual(containerDataDoc, containerDoc) || (!Doc.isTemplateDoc(childDoc) && !Doc.isTemplateForField(childDoc)) ? undefined : containerDataDoc;
+ const data = Doc.AreProtosEqual(containerDataDoc, containerDoc) || (!Doc.IsTemplateDoc(childDoc) && !Doc.IsTemplateForField(childDoc)) ? undefined : containerDataDoc;
const templateRoot = DocCast(containerDoc?.rootDocument);
return { layout: Doc.expandTemplateLayout(childDoc, templateRoot, layoutFieldKey), data };
}
@@ -1190,14 +1199,14 @@ export namespace Doc {
}
export function NativeWidth(doc?: Doc, dataDoc?: Doc, useWidth?: boolean) {
// if this is a field template, then don't use the doc's nativeWidth/height
- return !doc ? 0 : NumCast(doc.isTemplateForField ? undefined : doc._nativeWidth, NumCast((dataDoc || doc)[Doc.LayoutDataKey(doc) + '_nativeWidth'], !doc.isTemplateForField && useWidth ? NumCast(doc._width) : 0));
+ return !doc ? 0 : NumCast(doc._nativeWidth, doc[DocLayout].isTemplateDoc ? 0 : NumCast((dataDoc || doc)[Doc.LayoutDataKey(doc) + '_nativeWidth'], useWidth ? NumCast(doc._width) : 0));
}
export function NativeHeight(doc?: Doc, dataDoc?: Doc, useHeight?: boolean) {
if (!doc) return 0;
const nheight = (Doc.NativeWidth(doc, dataDoc, useHeight) / NumCast(doc._width)) * NumCast(doc._height); // divide before multiply to avoid floating point errrorin case nativewidth = width
- const dheight = NumCast((dataDoc || doc)[Doc.LayoutDataKey(doc) + '_nativeHeight'], useHeight ? NumCast(doc._height) : 0);
+ const dheight = doc[DocLayout].isTemplateDoc ? 0 : NumCast((dataDoc || doc)[Doc.LayoutDataKey(doc) + '_nativeHeight'], useHeight ? NumCast(doc._height) : 0);
// if this is a field template, then don't use the doc's nativeWidth/height
- return NumCast(doc.isTemplateForField ? undefined : doc._nativeHeight, nheight || dheight);
+ return NumCast(doc._nativeHeight, nheight || dheight);
}
export function OutpaintingWidth(doc?: Doc, dataDoc?: Doc, useWidth?: boolean) {
@@ -1467,7 +1476,6 @@ export namespace Doc {
layoutDoc._nativeWidth = undefined;
layoutDoc._nativeHeight = undefined;
} else {
- layoutDoc._layout_autoHeight = false;
if (!Doc.NativeWidth(layoutDoc)) {
layoutDoc._nativeWidth = NumCast(layoutDoc._width, panelWidth);
layoutDoc._nativeHeight = NumCast(layoutDoc._height, panelHeight);
@@ -1833,7 +1841,3 @@ ScriptingGlobals.add(function setDocRangeFilter(container: Doc, key: string, ran
ScriptingGlobals.add(function toJavascriptString(str: string) {
return Field.toJavascriptString(str as FieldType);
});
-// eslint-disable-next-line prefer-arrow-callback
-ScriptingGlobals.add(function getDescription(doc: Doc) {
- return Doc.getDescription(doc);
-});