diff --git a/AnyCompositeFields/AnyCompositeFIelds/ControlManifest.Input.xml b/AnyCompositeFields/AnyCompositeFIelds/ControlManifest.Input.xml index f9b4aa0..8a32397 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.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"> + <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"> <!-- 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,6 +20,9 @@ <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 aea7d69..540e70c 100644 --- a/AnyCompositeFields/AnyCompositeFIelds/components/CompositeControl.tsx +++ b/AnyCompositeFields/AnyCompositeFIelds/components/CompositeControl.tsx @@ -4,6 +4,8 @@ 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; @@ -12,6 +14,7 @@ export interface ICompositeControlProps { doneLabel : string; randNumber: number; onClickedDone : (compositeValue? : CompositeValue) => void; + context?: ComponentFramework.Context<IInputs>; } export interface IBCompositeControlState { @@ -53,7 +56,7 @@ export default class CompositeControl extends React.Component<ICompositeControlP {this.state.showCallout && ( <Callout target={"#acf_compositeFullValue"+this.props.randNumber} - onDismiss={() => this.setState({ showCallout : false }) } + onDismiss={this.onDismissCallout} styles={calloutStyles} directionalHint={DirectionalHint.topCenter} > @@ -61,16 +64,21 @@ 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) }} /> })} @@ -83,6 +91,12 @@ 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_', ''); @@ -99,6 +113,47 @@ 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 = []; @@ -115,5 +170,23 @@ 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 4f6c049..f733b88 100644 --- a/AnyCompositeFields/AnyCompositeFIelds/index.ts +++ b/AnyCompositeFields/AnyCompositeFIelds/index.ts @@ -112,6 +112,7 @@ 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 3e80fab..0965929 100644 --- a/QuickEditForm/QuickEditForm/ControlManifest.Input.xml +++ b/QuickEditForm/QuickEditForm/ControlManifest.Input.xml @@ -9,6 +9,7 @@ <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 ccb0cf1..18b6d16 100644 --- a/QuickEditForm/QuickEditForm/EntitiesDefinition.ts +++ b/QuickEditForm/QuickEditForm/EntitiesDefinition.ts @@ -3,6 +3,8 @@ 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 251a6f3..593846a 100644 --- a/QuickEditForm/QuickEditForm/components/MessageBarControl.tsx +++ b/QuickEditForm/QuickEditForm/components/MessageBarControl.tsx @@ -1,11 +1,13 @@ 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 { @@ -34,6 +36,11 @@ 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 66b733a..51fdbb9 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 === "Money" ? "number": "text", + type: props.icon === "NumberField" || props.icon === "Money" ? "number": "text", }; } @@ -69,10 +69,15 @@ export default class TextFieldControl extends React.Component<ITextFieldControlP } private grabValueFromFieldDefinition = (fieldDef : DataFieldDefinition | undefined) : string => { - if(this.state.fieldDefinition?.fieldValue?.Name !== undefined) - return this.state.fieldDefinition?.fieldValue?.Name; + let result = ""; + if(this.state.fieldDefinition?.fieldValue?.Name != undefined) { + result = this.state.fieldDefinition?.fieldValue?.Name; + } + else { + result = this.state.fieldDefinition?.fieldValue; + } - return this.state.fieldDefinition?.fieldValue; + return result; } private onDoubleClick = (event: React.MouseEvent<HTMLInputElement | HTMLTextAreaElement, MouseEvent>) : void => { diff --git a/QuickEditForm/QuickEditForm/index.ts b/QuickEditForm/QuickEditForm/index.ts index fe4c134..afe8160 100644 --- a/QuickEditForm/QuickEditForm/index.ts +++ b/QuickEditForm/QuickEditForm/index.ts @@ -13,6 +13,7 @@ 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> { @@ -37,6 +38,7 @@ export class QuickEditForm implements ComponentFramework.StandardControl<IInputs private _useTextFieldAsLookup : boolean; private _forceRecordId : string; private _relationShips : any; + private _columnNumber : number; private notifyOutputChanged: () => void; @@ -87,10 +89,11 @@ export class QuickEditForm implements ComponentFramework.StandardControl<IInputs public async updateView(context: ComponentFramework.Context<IInputs>) { // Add code to update control view - ReactDOM.unmountComponentAtNode(this._container); + if(this._context.updatedProperties.length === 1 && this._context.updatedProperties[0] === "layout"){ + return; + } + 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!; } @@ -330,11 +333,48 @@ 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 + 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; + } + ); + }); + } }; if(this._messageComponent != undefined || this._messageComponent != null){ @@ -346,7 +386,6 @@ export class QuickEditForm implements ComponentFramework.StandardControl<IInputs } else { this._messageComponent = ReactDOM.render(React.createElement(MessageBarControl, options), this._messageDiv); - //console.log("displayMessage : Rendering message "); } } @@ -368,11 +407,13 @@ 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"; @@ -381,12 +422,28 @@ 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 { - this.displayMessage(MessageBarType.info, _this._context.resources.getString("LookupFieldHasNoValue").replace("{0}", this._context.parameters.LookupFieldMapped.raw!)); - this._renderingInProgress = false; - this.showLoading(false); + // 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); + }); } } @@ -407,6 +464,9 @@ 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(); @@ -489,7 +549,7 @@ export class QuickEditForm implements ComponentFramework.StandardControl<IInputs catch (e){ this._renderingInProgress = false; this.showLoading(false); - this.displayMessage(MessageBarType.error, `An error occured ${e.mesage}`); + this.displayMessage(MessageBarType.error, `An error occured : ${e}`); } } @@ -531,7 +591,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; + var i, j, k; for(i = 0; i < sections.length; i++){ var section = sections[i].outerHTML; @@ -541,6 +601,7 @@ 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 @@ -555,32 +616,53 @@ export class QuickEditForm implements ComponentFramework.StandardControl<IInputs this._formDiv.appendChild(sectionh1); } + + const divWidth = Math.ceil(100 / this._columnNumber); - // 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; - } - - // @ts-ignore - var rowTechName = $.parseXML(row).getElementsByTagName("control")[0].attributes.datafieldname.value; + // Creating the parent div handling column management + var divflex = document.createElement("div"); + divflex.style.display = "flex"; + this._formDiv.appendChild(divflex); - // Checking if in the attributes metadata we find the current field - let fieldDetail = attributesDetail.filter(function(a: any){ - return a._logicalName == rowTechName} - ); + for(k = 0; k < this._columnNumber; k++){ - if(fieldDetail.length == 1) + 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"); + let numberOfRowPerColumn = Math.ceil(rows.length / this._columnNumber); + let nextColumnCount = numberOfRowPerColumn * (k+1) > rows.length ? rows.length : numberOfRowPerColumn * (k+1); + + for(j = numberOfRowPerColumn * k; j < nextColumnCount; j++) { - fieldDetail = fieldDetail[0]; - } + 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; + } - // Generating the fields rendering - this.retrieveFieldOptions(fieldDetail); + // @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); + } } } } @@ -589,7 +671,7 @@ export class QuickEditForm implements ComponentFramework.StandardControl<IInputs * Render the fields based on the metatada * @param fieldDetail field metadata */ - private retrieveFieldOptions(fieldDetail: any){ + private retrieveFieldOptions(fieldDetail: any, fieldReadOnly : boolean, divflex : HTMLDivElement){ let _this = this; let item = document.createElement("div"); var techFieldName = fieldDetail.attributeDescriptor.LogicalName; @@ -597,7 +679,7 @@ export class QuickEditForm implements ComponentFramework.StandardControl<IInputs var type = fieldDetail.attributeDescriptor.Type; var label = fieldDetail.DisplayName; - let isReadOnly = !fieldDetail.attributeDescriptor.IsValidForUpdate || this._isRecordReadOnly; + let isReadOnly = !fieldDetail.attributeDescriptor.IsValidForUpdate || this._isRecordReadOnly || fieldReadOnly; let isRequired = fieldDetail.attributeDescriptor.RequiredLevel == 1 || fieldDetail.attributeDescriptor.RequiredLevel == 2; // Grabing the proper datafieldDefinition @@ -619,7 +701,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, @@ -709,6 +791,9 @@ 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, @@ -721,7 +806,7 @@ export class QuickEditForm implements ComponentFramework.StandardControl<IInputs fieldValue : this._parentRecordDetails.Attributes[techFieldName] ?? "" }, disabled : isReadOnly, - icon : "Money", + icon : type === "money" ? "Money" : "NumberField", onClickResult : (fieldDefinition?: DataFieldDefinition) => { if(dataFieldDefinitionsDetails != undefined && fieldDefinition != undefined){ dataFieldDefinitionsDetails.isDirty = true; @@ -733,7 +818,6 @@ export class QuickEditForm implements ComponentFramework.StandardControl<IInputs } } }; - dataFieldDefinitionsDetails = this.completeDataDefinition(dataFieldDefinitionsDetails, moneyOptions.fieldDefinition); ReactDOM.render(React.createElement(TextFieldControl, moneyOptions), item); @@ -794,7 +878,7 @@ export class QuickEditForm implements ComponentFramework.StandardControl<IInputs break; } - this._formDiv.appendChild(item); + divflex.appendChild(item); } /**