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.

70 lines (60 loc) 1.79 kB
import { ArgumentError } from 'scrivito_sdk/common'; import { AppClass, AttributeDefinitions, Obj, Schema, Widget, } from 'scrivito_sdk/realm'; import { AttributeTypeOf } from 'scrivito_sdk/realm/schema'; import { AttributeValueOf, unwrapAppAttributes, wrapInAppClass, } from 'scrivito_sdk/realm/wrap_in_app_class'; import { objClassNameFor } from './registry'; export function readAppAttribute< AttrDefs extends AttributeDefinitions, AttrName extends keyof AttrDefs & string >( model: Obj | Widget, attributeName: AttrName ): AttributeValueOf<AttrDefs, AttrName> | null { const basicField = Schema.basicFieldFor<AttributeTypeOf<AttrDefs[AttrName]>>( model, attributeName ); return basicField && wrapInAppClass(basicField.get()); } export function updateAppAttributes( model: Obj | Widget, attributes: { [name: string]: unknown } ): void { const appClassName = objClassNameFor(model.constructor as AppClass); if (!appClassName) { let baseClass; if (model.constructor === Obj) { baseClass = 'Obj'; } else { baseClass = 'Widget'; } throw new ArgumentError( `Updating is not supported on the base class "${baseClass}".` ); } if (attributes.constructor !== Object) { throw new ArgumentError( 'The provided attributes are invalid. They have ' + 'to be an Object with valid Scrivito attribute values.' ); } // Bang: truthy appClassName implies that model is neither Obj nor Widget itself. // Every Subclass of Obj and Widget has a Schema. const schema = Schema.forInstance(model)!; const attributesWithTypeInfo = unwrapAppAttributes( attributes, schema, appClassName ); model._scrivitoPrivateContent.updateWithUnknownValues(attributesWithTypeInfo); }