UNPKG

@progress/sitefinity-widget-designers-sdk

Version:

This package aims to create a parity for widget designer generation similar to the [autogenerated widget designers](https://www.progress.com/documentation/sitefinity-cms/next.js-autogenerated-field-types) in Sitefinity. Due to some limitations in Typescri

400 lines (301 loc) 169 kB
# Sitefinity widget designers SDK This package aims to create a parity for widget designer generation similar to the [autogenerated widget designers](https://www.progress.com/documentation/sitefinity-cms/next.js-autogenerated-field-types) in Sitefinity. Due to some limitations in Typescript and Javascript, there are several cases where additional data must be provided ([see usage guide](#usage)). Full API documentation could be found in the 'api.md' in the source. ## Intallation via NPM: ``` npm i @progress/sitefinity-widget-designers-sdk --save ``` via yarn: ``` yarn add @progress/sitefinity-widget-designers-sdk ``` The package relies on the Typescript decorators, which requires adding support for decorators to your tsconfig.json file: ```json { "compilerOptions": { "experimentalDecorators": true } } ``` ## Concept The metadata, generated from this package, aims to equal the metadata generated by Sitefinity or the ASP.NET Core external renderer and replace the usage of JSON metadata files in external renderers. ## Usage ### Exctracting the metadata ```ts import { EntityMetadataGenerator, MetadataModel } from "@progress/sitefinity-widget-designers-sdk"; const designerMetadata: MetadataModel = EntityMetadataGenerator.extractMetadata(widgetEntity); ``` ### Extracting default values from the metadata The the metadata generator will go through the designer JSON definition, extract and parse the default value for each property is such is set. Normally the return type would match the type definition of the widget entity model. ```ts import { EntityMetadataGenerator } from "@progress/sitefinity-widget-designers-sdk"; const defaultValues: { [key: string]: any } = EntityMetadataGenerator.extractDefaultValues(designerMetadata); ``` ### Parsing serialized widget model values Sitefinity preserves the widget data on the server in stringified JSON form so when it is received, a parsing depending on the property type is necessary to match the entity model properties' types. ```ts import { EntityMetadataGenerator } from "@progress/sitefinity-widget-designers-sdk"; const deserializedValues: { [key: string]: any } = EntityMetadataGenerator.parseValues(valuesFromServerCall, designerMetadata); ``` ### Creating a widget entity and property metadata The widget model should be decorated using the WidgetEntity decorator. ```ts import { WidgetEntity } from "@progress/sitefinity-widget-designers-sdk"; @WidgetEntity("SitefinitySection", "Section") export class SectionEntity { @Category('QuickEdit') CssSystemGridSize: number = 12; } ``` #### DataModel and Model property decorators Properties that have complex models as types need their data models explicitly specified (while in C# these types and their subproperties would be generated OOB). For more details on complex objects [see here](#complex-objects) ```ts import { Model, WidgetEntity} from "@progress/sitefinity-widget-designers-sdk"; @WidgetEntity("ComplexWidget", "Complex Widget") class EntityWithComplexProperties { @DisplayName("Complex property") @DataModel(ComplexPropModel) ComplexProperty?: ComplexPropModel; } @Model() class ComplexPropModel { @DataType("string") ChildString: string | null = null; } ``` is the same as in C# ```cs public class EntityWithComplexProperties { [DisplayName("Complex property")] public ComplexPropModel ComplexProperty { get; set; } } public class ComplexPropModel { public string ChildString { get; set; } } ``` ### Default values The default value of the properties would be taken either from the DefaultValue decorator or a default value set to the property in the class declaration: ```ts @DisplayName("Number prop") @DefaultValue(42) @DataType("number") NumberProperty: number; // DeafultValue="42" Type="number" ``` If a default value is set to basic types, the DataType decorator can be omitted. The following code would produce the same output: ```ts @DisplayName("Number prop") NumberProperty: number = 42; // DeafultValue="42" Type="number" ``` ### Property display configuration Sections can be arraged either manually or via the _SectionsOrder_ class decorator. Properties can be arranged in sections in the autogenerated designers and ordered by a given index via the _ContentSection_ decorator. Sections can be separed in categories: _Basic_, _Advanced_, _QuickEdit_. Setting the category to the property will move the property there and create a section for it in that category. Properties can be given several types of description via the _Description_ and _DescriptionExtended_ decorators. ```ts @WidgetEntity('CustomEntity', 'Custom entity') @SectionsOrder('First section', 'Second section') class Entity { @ContentSection('Second section', 0) SecondSectionFirstProperty: any; @ContentSection('Second section', 1) SecondSectionSecondProperty: any; @ContentSection('First section', 0) @Description('simple description') FirstSectionFirstProperty: any; @Category('Advanced') @DescriptionExtended({ Description: '...', InlineDescription: '...', InstructionalNotes: '...' }) FirstPropertyAdvancedCategoryNewSection: any; } ``` ### Field type The property editor field is defined via the _DataType_ decorator. Besides the basic types such as _string_, _number_, _bool_/_boolean_, there are some predefined types in the _KnownFieldTypes_ enum as well as the several variations in the _ComplexType_ enum. Types that are a variation of _choices_ should have a _Choice_ decorator defined as well. ```ts @DataType('string') StringProperty: string | null = null; // @DataType('string') for basic types the decorator can be omitted if there is a default value of the same type set StringProperty: string = 'default value'; @DataType(KnownFieldTypes.Choices) @Choice([{Title: 'First choice', Value: 'first'}, {Title: 'Second choice', Value: 'second'}]) ChoiceProperty: string | null = null; // checkbox @DataType(KnownFieldTypes.CheckBox) YesNoProperty: boolean = false; // choices with multiple selection @DataType(KnownFieldTypes.Choices) @Choice([{Title: 'First choice', Value: 'first'}, {Title: 'Second choice', Value: 'second'}], true) MultipleChoiceProperty: string = 'first'; // chip choice @DataType(KnownFieldTypes.ChipChoice) @Choice({Choices: [ {Title:'Yes', Name: 'Yes', Value: 'True', Icon: null}, {Title:'No', Name: 'No', Value: false, Icon: null} ]}) ChipChoiceSingle: boolean = true; ``` ### Validation Property values can be validated on the front end based on decorators set in the entity. Most of them can receive and custom validation failed error message. - _Required_ - _Readonly_ - _Range_ - _MinLength_ - _MaxLength_ - _RegularExpression_: - _Url_ (predefined regexp) - _EmailAddress_ (predefined regexp) - _DecimalPlaces_ (for floating point numbers) - _StringLength_ ### Associated content or media items A property can refer to a content item of any of the types that are found or created in Sitefinity. The autogenerated designer will display a content selector for that content type. The full type name should be used - e.g. for _pages_: _Telerik.Sitefinity.Pages.Model.PageNode_ #### Related content and media ```ts @Content({ Type: 'Telerik.Sitefinity.Pages.Model.PageNode', AllowMultipleItemsSelection: false }) SelectedPage: MixedContentContext = null; // Media item is shorthand for Content @MediaItem('images', true) SelectedMedia: MixedContentContext = null; @Content({ Type: 'Telerik.Sitefinity.Libraries.Model.Image', AllowMultipleItemsSelection: false }) FullDecoratorSelectedMedia: MixedContentContext = null; ``` #### Taxonomy ```ts @TaxonomyContent({Type: 'Taxonomy_Tags'}) SelectedTags: MixedContentContext = null // or @TaxonomyContent({Type: 'Tags'}) ShorthandSelectedTags: MixedContentContext = null ``` ### Conditional visibility Fields can be shown or hidden based on other property values using the _ConditionalVisibility_ decorator. ```ts FirstProperty: string = ''; @ConditionalVisibility({ conditions: [{ fieldName: 'FirstProperty', operator: 'Equals', value: 'show second property' }] }) SecondProperty: string = ''; ``` ### Complex objects In the autogenerated designers in Sitefinity there are several ways to define and to represent properties with complex object types. ```ts @DataModel(PropModel) // @DataType(ComplexType.Complex) ComplexObjProp: PropModel = null; // => renders a section with the model @DataModel(PropModel) // @DataType(ComplexType.Complex) @TableView("TableTitle") ComplextTableProp: PropModel = null; // => renders the model as a table @DataModel(PropModel) @DataType(ComplexType.Enumerable) MultipleComplexObj: PropModel[] = null; // renders editable rows for each instance of the model @DataModel(PropModel) // @DataType(ComplexType.Enumerable) @TableView({ Reorderable: true, Selectable: true, MultipleSelect: true }) MultipleComplexObj: PropModel[] = null; // renders full editable table with a row for each instance of the model ... @Model() class PropModel { stringProp: string = "default-value"; numberProp: number = 13; ... } ``` ### Collections Having a properties of collection types, it should be explicitly specified: #### Array Currently arrays are supported for **objects/classes** and **string** types. Other types would be rendered as a simple string field. ```ts import { ComplexType, DataModel, DataType } from "@progress/sitefinity-widget-designers-sdk"; // would receive Type="enumerable" @DataType(ComplexType.Enumerable, "string") ValidStringCollection: string[] = null; // would receive Type="enumerable" @DataModel("string") @DataType(ComplexType.Enumerable) AlsoValidStringCollection: string[] = null; // would receive Type="enumerable" // with TypeChildProperties of the DataModel @DataModel(ObjectModel) @DataType(ComplexType.Enumerable) ObjectCollection: ObjectModel[] = null // invalid properties // would receive Type=null @DataType(ComplexType.Enumerable) InvalidCollection: boolean[] | number[] = null; ``` #### Dictionary Currently a collection of type dictionary is supported only when *LengthDependsOn* property decorator is also present and the value type is an object/class. Otherwise the field would be rendered as a simple string field. For collections of objects that don't depend on another property, we suggest using an array. ```ts import { ComplexType, DataType, Model } from "@progress/sitefinity-widget-designers-sdk"; @DataModel(DictValue) @DataType(ComplexType.Dictionary) @LengthDependsOn("PropName", "PropDisplayName", "PropTitle") ObjectDictionary: { [key: string]: DictValue } = null; .... @Model() class DictValue { @DataType("number") Int: number; @DataType("string") Str: string; } ``` ### Nested complex objects, collections with multiple properties #### Nesting single objects Single objects can be nested inside of each other and will appear as section in the parent object in the desginer. The objects on root will be displayed as an expanding section. ```ts @Model() class SimpleObject { ChildProp1: string = ''; ChildProp2: string = ''; } @Model() class ParentComplex { @ContentSection('', 0) ParentProp1: string = ''; @ContentSection('', 1) @DataModel(SimpleObject) SimpleObject: SimpleObject; } @WidgetEntity('NestedSimpleObjects', 'Nested simple objects') class NestedSimpleObjects { @DataModel(ParentComplex) ParentComplexObject: ParentComplex; } ``` ![nested single objects](data:image/png;base64,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) #### Complex objects/collections as tables The limitations and suggested best practices, stated below, are based on the resulting usibility of the generated UI. ##### Nesting collections of objects Nesting collections inside of collections (table views) are not allowed and will result in a string field instead of the child collection (it can be used to manually store the JSON representation of the values of the field). The only exception is a list of string as a child of the model for the collection. ```ts @Model() class ObjectWithStringList { @ContentSection('', 0) Prop1: string = ''; @ContentSection('', 1) @DataType(ComplexType.Enumerable, 'string') StringList: string[] = []; } @WidgetEntity('ComplexObjectsWithStrings', 'ComplexObjectsWithStrings') class ComplexTableWithStringList { @DataType(ComplexType.Enumerable) @DataModel(ObjectWithStringList) ComplexObjectsList: ObjectWithStringList[] = []; } ``` ![complex objects with string list](data:image/png;base64,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