UNPKG

scrivito

Version:

Scrivito is a professional, yet easy to use SaaS Enterprise Content Management Service, built for digital agencies and medium to large businesses. It is completely maintenance-free, cost-effective, and has unprecedented performance and security.

117 lines (95 loc) 3.35 kB
import isEmpty from 'lodash-es/isEmpty'; import { getEditingConfigFor } from 'scrivito_sdk/app_support/editing_config_store'; import { presentUiAdapter } from 'scrivito_sdk/app_support/present_ui_adapter'; import { load } from 'scrivito_sdk/loadable'; import { BasicObj, BasicWidget, currentObjSpaceId } from 'scrivito_sdk/models'; import { AttributeValue, Widget, schemaFromBasicObjOrWidget, unwrapAppAttributes, wrapInAppClass, } from 'scrivito_sdk/realm'; export function initialContentFor( className: string, attributeName: string ): AttributeValue | undefined { const initialContent = getEditingConfigFor(className)?.initialContent; if (initialContent) { const attributeContent = initialContent[attributeName]; if (typeof attributeContent === 'function') { return attributeContent(); } if (isWidget(attributeContent)) { return wrapInAppClass(attributeContent._scrivitoPrivateContent!.copy()); } if (isWidgetlist(attributeContent)) { return attributeContent.map((widget) => { const basicWidget = widget._scrivitoPrivateContent; const copy = basicWidget.copy(); return wrapInAppClass(copy); }); } return attributeContent; } } function isWidgetlist( maybeWidgetlist: AttributeValue ): maybeWidgetlist is Widget[] { return ( Array.isArray(maybeWidgetlist) && (maybeWidgetlist as unknown[]).every(isWidget) ); } function isWidget(maybeWidget: unknown | Widget): maybeWidget is Widget { return ( !!maybeWidget && (maybeWidget as Widget)._scrivitoPrivateContent instanceof BasicWidget ); } export async function initializeContentForObj(objId: string): Promise<void> { const basicObj = await load(() => BasicObj.get(objId)); if (basicObj) { initializeContentFor(basicObj); initializeContentFromHook(basicObj); } } export async function initializeContentForWidget( objId: string, widgetId: string ): Promise<void> { const basicObj = await load(() => BasicObj.get(objId)); if (!basicObj) return; await presentUiAdapter().finishReplicatingObj(currentObjSpaceId(), objId); const basicWidget = basicObj.widget(widgetId); if (basicWidget) { initializeContentFor(basicWidget); initializeContentFromHook(basicWidget); } } function initializeContentFor(basicContent: BasicObj | BasicWidget): void { const objClassName = basicContent.objClass(); const schema = schemaFromBasicObjOrWidget(basicContent); if (!schema) return; const initialAttributes: { [index: string]: AttributeValue } = {}; Object.keys(schema.attributes()).forEach((attributeName) => { const typeInfo = schema.attributes()[attributeName]; const currentValue = basicContent.get(attributeName, typeInfo); if (isEmpty(currentValue)) { const initialValue = initialContentFor(objClassName, attributeName); if (initialValue !== undefined) { initialAttributes[attributeName] = initialValue; } } }); const attributesWithTypeInfo = unwrapAppAttributes( initialAttributes, schema, objClassName ); basicContent.update(attributesWithTypeInfo); } function initializeContentFromHook(content: BasicObj | BasicWidget): void { const callback = getEditingConfigFor(content.objClass())?.initialize; if (callback) callback(wrapInAppClass(content)); }