diff --git a/AnyCompositeFields/AnyCompositeFIelds/ControlManifest.Input.xml b/AnyCompositeFields/AnyCompositeFIelds/ControlManifest.Input.xml index 8a32397..f9b4aa0 100644 --- a/AnyCompositeFields/AnyCompositeFIelds/ControlManifest.Input.xml +++ b/AnyCompositeFields/AnyCompositeFIelds/ControlManifest.Input.xml @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="utf-8"?> <manifest> - <control namespace="Carfup" constructor="AnyCompositeFIelds" version="0.0.75" display-name-key="Carfup.AnyCompositeFIelds" description-key="AnyCompositeFIelds will allow you to display any stack of fields as composite rendering." control-type="standard" preview-image="img/preview.png"> + <control namespace="Carfup" constructor="AnyCompositeFIelds" version="0.0.72" display-name-key="Carfup.AnyCompositeFIelds" description-key="AnyCompositeFIelds will allow you to display any stack of fields as composite rendering." control-type="standard" preview-image="img/preview.png"> <!-- property node identifies a specific, configurable piece of data that the control expects from CDS --> <property name="FieldToAttachControl" display-name-key="FieldToAttachControl" description-key="Field to attach the control to" of-type-group="strings" usage="bound" required="true" /> <property name="separator" display-name-key="Values separator" description-key="Separator to split the mapped values (for a space, put %20)" of-type="SingleLine.Text" usage="input" required="true" default-value="%20" /> @@ -20,9 +20,6 @@ <type>SingleLine.Email</type> <type>SingleLine.Text</type> <type>SingleLine.Phone</type> - <type>SingleLine.TextArea</type> - <type>SingleLine.URL</type> - <type>Multiple</type> </type-group> <!-- Property node's of-type attribute can be of-type-group attribute. diff --git a/AnyCompositeFields/AnyCompositeFIelds/components/CompositeControl.tsx b/AnyCompositeFields/AnyCompositeFIelds/components/CompositeControl.tsx index 540e70c..aea7d69 100644 --- a/AnyCompositeFields/AnyCompositeFIelds/components/CompositeControl.tsx +++ b/AnyCompositeFields/AnyCompositeFIelds/components/CompositeControl.tsx @@ -4,8 +4,6 @@ import { TextField, ITextFieldStyles } from '@fluentui/react/lib/TextField'; import { Stack, IStackStyles } from '@fluentui/react/lib/Stack'; import { Callout, ICalloutContentStyles, DirectionalHint } from '@fluentui/react/lib/Callout'; import { CompositeValue } from '../EntitiesDefinition'; -import { IInputs } from '../generated/ManifestTypes'; -import { cpuUsage } from 'process'; export interface ICompositeControlProps { disabled : boolean; @@ -14,7 +12,6 @@ export interface ICompositeControlProps { doneLabel : string; randNumber: number; onClickedDone : (compositeValue? : CompositeValue) => void; - context?: ComponentFramework.Context<IInputs>; } export interface IBCompositeControlState { @@ -56,7 +53,7 @@ export default class CompositeControl extends React.Component<ICompositeControlP {this.state.showCallout && ( <Callout target={"#acf_compositeFullValue"+this.props.randNumber} - onDismiss={this.onDismissCallout} + onDismiss={() => this.setState({ showCallout : false }) } styles={calloutStyles} directionalHint={DirectionalHint.topCenter} > @@ -64,21 +61,16 @@ export default class CompositeControl extends React.Component<ICompositeControlP {elements.map((value, index) => { // @ts-ignore let element = this.state.compositeValue[value]; - const isMultiline = element.type === "SingleLine.TextArea" || element.type === "Multiple"; return element.attributes.LogicalName != undefined && <TextField value={element.raw!} label={element.attributes.DisplayName} id={"acf_"+value} onChange={this.onChangeField} - onDoubleClick={this.onDoubleClick} disabled={this.state.disabled || element.disabled!} styles={textFieldStyles} - multiline={isMultiline} - autoAdjustHeight={isMultiline} required={element.attributes.RequiredLevel == 1 || element.attributes.RequiredLevel == 2} maxLength={element.attributes.MaxLength} - iconProps={{ iconName: this.getIcon(element.type) }} /> })} @@ -91,12 +83,6 @@ export default class CompositeControl extends React.Component<ICompositeControlP ); } - private onDismissCallout = (ev?: any) : void => { - if(this.props.context?.client.getClient() !== "Mobile"){ - this.setState({ showCallout : false }); - } - } - private onChangeField = (event: React.FormEvent<HTMLInputElement | HTMLTextAreaElement>, newValue?: string | undefined) : void => { // @ts-ignore let target = event.target.id.replace('acf_', ''); @@ -113,47 +99,6 @@ export default class CompositeControl extends React.Component<ICompositeControlP this.props.onClickedDone(this.state.compositeValue); } - private onDoubleClick = (event: React.MouseEvent<HTMLInputElement | HTMLTextAreaElement, MouseEvent>) : void => { - // @ts-ignore - let target = event.target.id.replace('acf_', ''); - const compositeValue = {...this.state}.compositeValue; - // @ts-ignore - var contextInfo = this.props.context?.mode.contextInfo; - // @ts-ignore - switch(compositeValue[target].type){ - case "SingleLine.Phone": - // @ts-ignore - const currentValue : any = compositeValue[target].raw!; - this.props.context?.navigation.openUrl(`tel:${currentValue}`); - this.props.context?.navigation.openForm({ - entityName : "phonecall", - createFromEntity : { - // @ts-ignore - id : contextInfo.entityId, - // @ts-ignore - entityType : contextInfo.entityTypeName, - // @ts-ignore - name : contextInfo.entityRecordName - } - }); - this.setState({showCallout : false}); - break; - case "SingleLine.URL": - // @ts-ignore - const currentValue : any = compositeValue[target].raw!; - this.props.context?.navigation.openUrl(`${currentValue}`); - break; - case "SingleLine.Email": - // @ts-ignore - const currentValue : any = compositeValue[target].raw!; - this.props.context?.navigation.openUrl(`mailto:${currentValue}`); - break; - default : - return; - } - - } - private buildFullValue = (compositeValue : CompositeValue) : void => { let arrayValues = []; @@ -170,23 +115,5 @@ export default class CompositeControl extends React.Component<ICompositeControlP this.setState({compositeValue : compositeValue}); } - - private getIcon = (type: string) : string => { - let icon = ""; - - switch(type){ - case "SingleLine.Phone" : - icon = "Phone"; - break; - case "SingleLine.URL": - icon = "Globe"; - break; - case "SingleLine.Email": - icon = "EditMail"; - break; - } - - return icon; - } }; diff --git a/AnyCompositeFields/AnyCompositeFIelds/index.ts b/AnyCompositeFields/AnyCompositeFIelds/index.ts index f733b88..4f6c049 100644 --- a/AnyCompositeFields/AnyCompositeFIelds/index.ts +++ b/AnyCompositeFields/AnyCompositeFIelds/index.ts @@ -112,7 +112,6 @@ export class AnyCompositeFIelds implements ComponentFramework.StandardControl<II ); let optionsText = { - context : this._context, compositeValue : this._compositeValue, doneLabel : this._context.resources.getString("Done"), disabled : this._context.mode.isControlDisabled, diff --git a/QuickEditForm/QuickEditForm/ControlManifest.Input.xml b/QuickEditForm/QuickEditForm/ControlManifest.Input.xml index 0965929..3e80fab 100644 --- a/QuickEditForm/QuickEditForm/ControlManifest.Input.xml +++ b/QuickEditForm/QuickEditForm/ControlManifest.Input.xml @@ -9,7 +9,6 @@ <value name="true" display-name-key="True" description-key="true">true</value> <value name="false" display-name-key="False" description-key="false">false</value> </property> - <property name="NumberOfColumn" display-name-key="Number of columns" description-key="Ability to split the fields in several columns" of-type="Whole.None" usage="input" required="false" default-value="1"/> <!-- Property node's of-type attribute can be of-type-group attribute. Example: diff --git a/QuickEditForm/QuickEditForm/EntitiesDefinition.ts b/QuickEditForm/QuickEditForm/EntitiesDefinition.ts index 18b6d16..ccb0cf1 100644 --- a/QuickEditForm/QuickEditForm/EntitiesDefinition.ts +++ b/QuickEditForm/QuickEditForm/EntitiesDefinition.ts @@ -3,8 +3,6 @@ export class EntityReferenceInfo{ public Id:string; public Name:string; public Attributes?: any; - public SchemaName?: string; - public QuickCreateEnabled?: boolean; } export class EntityReferenceIdName{ diff --git a/QuickEditForm/QuickEditForm/components/MessageBarControl.tsx b/QuickEditForm/QuickEditForm/components/MessageBarControl.tsx index 593846a..251a6f3 100644 --- a/QuickEditForm/QuickEditForm/components/MessageBarControl.tsx +++ b/QuickEditForm/QuickEditForm/components/MessageBarControl.tsx @@ -1,13 +1,11 @@ import * as React from 'react'; import {MessageBar, MessageBarType } from '@fluentui/react/lib/MessageBar'; -import { MessageBarButton } from '@fluentui/react/lib/Button'; + export interface IMessageProps { messageType? : MessageBarType; messageText? : string; showMessageBar : boolean; - onClickQuickCreate: () => void; - showQuickCreateButton?: boolean; } export interface IMessageState { @@ -36,11 +34,6 @@ export default class MessageBarControl extends React.Component<IMessageProps, IM <div style={{marginTop: "5px"}}> {this.state.showMessageBar && <MessageBar - actions={this.state.messageType == MessageBarType.info && this.props.showQuickCreateButton ? <div> - <MessageBarButton - onClick={this.props.onClickQuickCreate} >Open Quick Create Form - </MessageBarButton> - </div> : undefined} messageBarType={this.state.messageType} isMultiline={false} dismissButtonAriaLabel="Close" diff --git a/QuickEditForm/QuickEditForm/components/TextFieldControl.tsx b/QuickEditForm/QuickEditForm/components/TextFieldControl.tsx index 51fdbb9..66b733a 100644 --- a/QuickEditForm/QuickEditForm/components/TextFieldControl.tsx +++ b/QuickEditForm/QuickEditForm/components/TextFieldControl.tsx @@ -33,7 +33,7 @@ export default class TextFieldControl extends React.Component<ITextFieldControlP super(props); this.state = { fieldDefinition: this.props.fieldDefinition, - type: props.icon === "NumberField" || props.icon === "Money" ? "number": "text", + type: props.icon === "Money" ? "number": "text", }; } @@ -69,15 +69,10 @@ export default class TextFieldControl extends React.Component<ITextFieldControlP } private grabValueFromFieldDefinition = (fieldDef : DataFieldDefinition | undefined) : string => { - let result = ""; - if(this.state.fieldDefinition?.fieldValue?.Name != undefined) { - result = this.state.fieldDefinition?.fieldValue?.Name; - } - else { - result = this.state.fieldDefinition?.fieldValue; - } + if(this.state.fieldDefinition?.fieldValue?.Name !== undefined) + return this.state.fieldDefinition?.fieldValue?.Name; - return result; + return this.state.fieldDefinition?.fieldValue; } private onDoubleClick = (event: React.MouseEvent<HTMLInputElement | HTMLTextAreaElement, MouseEvent>) : void => { diff --git a/QuickEditForm/QuickEditForm/index.ts b/QuickEditForm/QuickEditForm/index.ts index afe8160..fe4c134 100644 --- a/QuickEditForm/QuickEditForm/index.ts +++ b/QuickEditForm/QuickEditForm/index.ts @@ -13,7 +13,6 @@ import { IDropdownOption } from "@fluentui/react/lib/Dropdown"; import { MessageBarType } from "@fluentui/react/lib/MessageBar"; import { EntityReferenceInfo, DataFieldDefinition} from "./EntitiesDefinition"; -import { unwatchFile } from "fs"; export class QuickEditForm implements ComponentFramework.StandardControl<IInputs, IOutputs> { @@ -38,7 +37,6 @@ export class QuickEditForm implements ComponentFramework.StandardControl<IInputs private _useTextFieldAsLookup : boolean; private _forceRecordId : string; private _relationShips : any; - private _columnNumber : number; private notifyOutputChanged: () => void; @@ -89,11 +87,10 @@ export class QuickEditForm implements ComponentFramework.StandardControl<IInputs public async updateView(context: ComponentFramework.Context<IInputs>) { // Add code to update control view - if(this._context.updatedProperties.length === 1 && this._context.updatedProperties[0] === "layout"){ - return; - } - + ReactDOM.unmountComponentAtNode(this._container); if(this._context.updatedProperties.includes("FieldToAttachControl")){ + //if(this._forceRecordId == context.parameters.FieldToAttachControl.raw! || !this._useTextFieldAsLookup) + // return; if(this._useTextFieldAsLookup) this._forceRecordId = context.parameters.FieldToAttachControl.raw!; } @@ -333,48 +330,11 @@ export class QuickEditForm implements ComponentFramework.StandardControl<IInputs */ private displayMessage(type : MessageBarType, message : string){ // this._messageDiv.innerHTML = ""; - let _this = this; + let options = { messageText : message, messageType : type, - showMessageBar: true, - showQuickCreateButton : _this._recordToUpdate.QuickCreateEnabled, - onClickQuickCreate : () => { - this._context.navigation.openForm({ - entityName : _this._recordToUpdate.EntityName, - useQuickCreateForm: true, - createFromEntity : { - // @ts-ignore - id : this._parentRecordDetails.Id, - name : this._parentRecordDetails.Name, - entityType : this._parentRecordDetails.EntityName - } - }).then(function success(data: any){ - if(data.savedEntityReference.length === 0 || data.savedEntityReference.length > 1){ - return; - } - - let savedRecord = data.savedEntityReference[0]; - let dataToUpdate : any = {}; - dataToUpdate[_this._recordToUpdate.SchemaName!+"@odata.bind"] = `/${_this.getEntityPluralName(savedRecord.entityType)}(${savedRecord.id.slice(1,-1)})`; - _this._context.webAPI.updateRecord(_this._parentRecordDetails.EntityName, _this._parentRecordDetails.Id, dataToUpdate).then( - function success(result){ - console.log(result); - _this.displayMessage(MessageBarType.success, "Record successfully created, please refresh in order to see the newly created record."); - }, - function (error){ - // Error.code for privilege - if(error.code != undefined && error.code == 2147746336){ - _this.displayMessage(MessageBarType.blocked, `${_this._context.resources.getString("UpdateErrorMessage")}\n\r${_this._context.resources.getString("MissingPrivilegeOnRecordMessage")}.\n\r${error.message}`); - } else{ - _this.displayMessage(MessageBarType.blocked, `${_this._context.resources.getString("UpdateErrorMessage")}\n\r${error.message}`); - } - - _this._updateError = true; - } - ); - }); - } + showMessageBar: true }; if(this._messageComponent != undefined || this._messageComponent != null){ @@ -386,6 +346,7 @@ export class QuickEditForm implements ComponentFramework.StandardControl<IInputs } else { this._messageComponent = ReactDOM.render(React.createElement(MessageBarControl, options), this._messageDiv); + //console.log("displayMessage : Rendering message "); } } @@ -407,13 +368,11 @@ export class QuickEditForm implements ComponentFramework.StandardControl<IInputs this._lookupFieldDetails = lookupDetails; - // Creating the new instance here - _this._recordToUpdate = new EntityReferenceInfo(); - if(lookup != undefined ){ let id = this._lookupFieldDetails[_this._lookupMapped] ?? ""; let entity = this._lookupFieldDetails[_this._lookupMapped+"@Microsoft.Dynamics.CRM.lookuplogicalname"] ?? ""; + _this._recordToUpdate = new EntityReferenceInfo(); _this._recordToUpdate.EntityName = entity; _this._recordToUpdate.Id = (_this._useTextFieldAsLookup && _this._forceRecordId != undefined && _this._forceRecordId != null) ? _this._forceRecordId : id; _this._recordToUpdate.Name = "lookup name here"; @@ -422,28 +381,12 @@ export class QuickEditForm implements ComponentFramework.StandardControl<IInputs let attr = await _this._context.webAPI.retrieveRecord(_this._recordToUpdate.EntityName, _this._recordToUpdate.Id); _this.isRecordReadOnly(attr["statecode"]); _this._parentRecordDetails.Attributes = attr; + //console.log("[getLookupDetails] _this._parentRecordDetails.Attributes : record values retrieved "); } - // We display a message and get property for potential quick create button else { - // Grabbing necessary info for quick create possibility - let lookupCleaned = this._lookupMapped.replace("_value","").replace("_",""); - let lookupField : string[] = []; - lookupField.push(lookupCleaned); - this._context.utils.getEntityMetadata(this._parentRecordDetails.EntityName, lookupField ).then(em => { - let relationships = em.ManyToOneRelationships.getAll(); - let relationshipDetails = relationships.filter(function(relation : any){ - return relation._referencingAttribute === lookupCleaned; - })[0]; - - this._recordToUpdate.SchemaName = relationshipDetails?.ReferencingEntityNavigationPropertyName; - this._recordToUpdate.EntityName = relationshipDetails?.ReferencedEntity; - this._recordToUpdate.QuickCreateEnabled = em.IsQuickCreateEnabled as boolean; - - // displaying message to warn user that lookup is empty - this.displayMessage(MessageBarType.info, _this._context.resources.getString("LookupFieldHasNoValue").replace("{0}", this._context.parameters.LookupFieldMapped.raw!)); - this._renderingInProgress = false; - this.showLoading(false); - }); + this.displayMessage(MessageBarType.info, _this._context.resources.getString("LookupFieldHasNoValue").replace("{0}", this._context.parameters.LookupFieldMapped.raw!)); + this._renderingInProgress = false; + this.showLoading(false); } } @@ -464,9 +407,6 @@ export class QuickEditForm implements ComponentFramework.StandardControl<IInputs this._lookupMapped = this._context.parameters.LookupFieldMapped.raw!; - // Since it's a new parameter, it can be undefined. - this._columnNumber = this._context.parameters.NumberOfColumn === undefined ? 1 : this._context.parameters.NumberOfColumn?.raw!; - this._useTextFieldAsLookup = (this._context.parameters.UseTextFieldAsLookup && this._context.parameters.UseTextFieldAsLookup.raw && this._context.parameters.UseTextFieldAsLookup.raw.toLowerCase() === "true") ? true : false; this._clientUrl = (<any>this._context).page.getClientUrl(); @@ -549,7 +489,7 @@ export class QuickEditForm implements ComponentFramework.StandardControl<IInputs catch (e){ this._renderingInProgress = false; this.showLoading(false); - this.displayMessage(MessageBarType.error, `An error occured : ${e}`); + this.displayMessage(MessageBarType.error, `An error occured ${e.mesage}`); } } @@ -591,7 +531,7 @@ export class QuickEditForm implements ComponentFramework.StandardControl<IInputs //console.log("[processFormXmlData] : processing fields from formxml "); // Building the result details var sections = $.parseXML(formxml).getElementsByTagName("section"); - var i, j, k; + var i, j; for(i = 0; i < sections.length; i++){ var section = sections[i].outerHTML; @@ -601,7 +541,6 @@ export class QuickEditForm implements ComponentFramework.StandardControl<IInputs continue; } - // We prepare the section block // @ts-ignore if($.parseXML(section).getElementsByTagName("section")[0].attributes.showlabel.value == "true"){ // @ts-ignore @@ -616,53 +555,32 @@ export class QuickEditForm implements ComponentFramework.StandardControl<IInputs this._formDiv.appendChild(sectionh1); } - - const divWidth = Math.ceil(100 / this._columnNumber); - - // Creating the parent div handling column management - var divflex = document.createElement("div"); - divflex.style.display = "flex"; - this._formDiv.appendChild(divflex); - for(k = 0; k < this._columnNumber; k++){ - - var subColumnDiv = document.createElement("div"); - subColumnDiv.style.width = divWidth+"%"; - subColumnDiv.style.marginRight = "5px"; - divflex.appendChild(subColumnDiv); + // a row = a field + var rows = $.parseXML(section).getElementsByTagName("row"); + for(j = 0; j < rows.length; j++) + { + let row = rows[j].outerHTML; + // @ts-ignore + if($.parseXML(row).getElementsByTagName("control").length == 0 || $.parseXML(row).getElementsByTagName("label").length == 0 || $.parseXML(row).getElementsByTagName("control")[0].attributes.datafieldname == undefined || $.parseXML(row).getElementsByTagName("label")[0].attributes.description == undefined){ + continue; + } - // a row = a field - var rows = $.parseXML(section).getElementsByTagName("row"); - let numberOfRowPerColumn = Math.ceil(rows.length / this._columnNumber); - let nextColumnCount = numberOfRowPerColumn * (k+1) > rows.length ? rows.length : numberOfRowPerColumn * (k+1); + // @ts-ignore + var rowTechName = $.parseXML(row).getElementsByTagName("control")[0].attributes.datafieldname.value; - for(j = numberOfRowPerColumn * k; j < nextColumnCount; j++) + // Checking if in the attributes metadata we find the current field + let fieldDetail = attributesDetail.filter(function(a: any){ + return a._logicalName == rowTechName} + ); + + if(fieldDetail.length == 1) { - console.log("K : "+k+" - J:"+j); - let row = rows[j].outerHTML; - // @ts-ignore - if($.parseXML(row).getElementsByTagName("control").length == 0 || $.parseXML(row).getElementsByTagName("label").length == 0 || $.parseXML(row).getElementsByTagName("control")[0].attributes.datafieldname == undefined || $.parseXML(row).getElementsByTagName("label")[0].attributes.description == undefined){ - continue; - } - - // @ts-ignore - var rowTechName = $.parseXML(row).getElementsByTagName("control")[0].attributes.datafieldname.value; - // @ts-ignore - let isReadOnly = $.parseXML(row).getElementsByTagName("control")[0].attributes.disabled.value === "true"; - - // Checking if in the attributes metadata we find the current field - let fieldDetail = attributesDetail.filter(function(a: any){ - return a._logicalName == rowTechName} - ); - - if(fieldDetail.length == 1) - { - fieldDetail = fieldDetail[0]; - } - - // Generating the fields rendering - this.retrieveFieldOptions(fieldDetail, isReadOnly, subColumnDiv); + fieldDetail = fieldDetail[0]; } + + // Generating the fields rendering + this.retrieveFieldOptions(fieldDetail); } } } @@ -671,7 +589,7 @@ export class QuickEditForm implements ComponentFramework.StandardControl<IInputs * Render the fields based on the metatada * @param fieldDetail field metadata */ - private retrieveFieldOptions(fieldDetail: any, fieldReadOnly : boolean, divflex : HTMLDivElement){ + private retrieveFieldOptions(fieldDetail: any){ let _this = this; let item = document.createElement("div"); var techFieldName = fieldDetail.attributeDescriptor.LogicalName; @@ -679,7 +597,7 @@ export class QuickEditForm implements ComponentFramework.StandardControl<IInputs var type = fieldDetail.attributeDescriptor.Type; var label = fieldDetail.DisplayName; - let isReadOnly = !fieldDetail.attributeDescriptor.IsValidForUpdate || this._isRecordReadOnly || fieldReadOnly; + let isReadOnly = !fieldDetail.attributeDescriptor.IsValidForUpdate || this._isRecordReadOnly; let isRequired = fieldDetail.attributeDescriptor.RequiredLevel == 1 || fieldDetail.attributeDescriptor.RequiredLevel == 2; // Grabing the proper datafieldDefinition @@ -701,7 +619,7 @@ export class QuickEditForm implements ComponentFramework.StandardControl<IInputs width : this._context.mode.allocatedWidth, label : label, fieldDefinition : { - fieldSchemaName: schemaName.length == 1 ? schemaName[0].ReferencingEntityNavigationPropertyName : null, + fieldSchemaName: schemaName.length == 1 ? schemaName[0]._referencingEntityNavigationPropertyName : null, isRequired : isRequired, isDirty : false, fieldName : techFieldName, @@ -791,9 +709,6 @@ export class QuickEditForm implements ComponentFramework.StandardControl<IInputs ReactDOM.render(React.createElement(FilteredOptionsetControl, ddOptions), item); break; case 'money': - case 'decimal': - case 'double': - case 'integer': let moneyOptions = { width : this._context.mode.allocatedWidth, label : label, @@ -806,7 +721,7 @@ export class QuickEditForm implements ComponentFramework.StandardControl<IInputs fieldValue : this._parentRecordDetails.Attributes[techFieldName] ?? "" }, disabled : isReadOnly, - icon : type === "money" ? "Money" : "NumberField", + icon : "Money", onClickResult : (fieldDefinition?: DataFieldDefinition) => { if(dataFieldDefinitionsDetails != undefined && fieldDefinition != undefined){ dataFieldDefinitionsDetails.isDirty = true; @@ -818,6 +733,7 @@ export class QuickEditForm implements ComponentFramework.StandardControl<IInputs } } }; + dataFieldDefinitionsDetails = this.completeDataDefinition(dataFieldDefinitionsDetails, moneyOptions.fieldDefinition); ReactDOM.render(React.createElement(TextFieldControl, moneyOptions), item); @@ -878,7 +794,7 @@ export class QuickEditForm implements ComponentFramework.StandardControl<IInputs break; } - divflex.appendChild(item); + this._formDiv.appendChild(item); } /**