11/* eslint-disable @microsoft/spfx/no-async-await */
22import { SPHttpClient } from "@microsoft/sp-http" ;
3- import { sp } from "@pnp/sp/presets/all" ;
3+ import { IInstalledLanguageInfo , sp } from "@pnp/sp/presets/all" ;
44import * as strings from "ControlStrings" ;
55import {
66 DefaultButton ,
@@ -206,14 +206,16 @@ export class DynamicForm extends React.Component<
206206 } else if ( Array . isArray ( val . newValue ) && val . newValue . length === 0 ) {
207207 val . fieldDefaultValue = null ;
208208 shouldBeReturnBack = true ;
209- } else if ( val . fieldType === "Number" ) {
210- shouldBeReturnBack = this . validateNumberOnSubmit ( val ) ;
211- }
212- } else if ( val . fieldType === "Number" ) {
213- if ( val . newValue === null ) {
214- val . newValue = val . fieldDefaultValue ;
215209 }
216- shouldBeReturnBack = this . validateNumberOnSubmit ( val ) ;
210+ }
211+ if ( val . fieldType === "Number" ) {
212+ if ( val . showAsPercentage ) val . newValue /= 100 ;
213+ if ( this . isEmptyNumOrString ( val . newValue ) && ( val . minimumValue !== null || val . maximumValue !== null ) ) {
214+ val . newValue = val . fieldDefaultValue = null ;
215+ }
216+ if ( ! this . isEmptyNumOrString ( val . newValue ) && ( isNaN ( Number ( val . newValue ) ) || ( val . newValue < val . minimumValue ) || ( val . newValue > val . maximumValue ) ) ) {
217+ shouldBeReturnBack = true ;
218+ }
217219 }
218220 } ) ;
219221 if ( shouldBeReturnBack ) {
@@ -343,7 +345,7 @@ export class DynamicForm extends React.Component<
343345 try {
344346 const contentTypeIdField = "ContentTypeId" ;
345347 //check if item contenttype is passed, then update the object with content type id, else, pass the object
346- contentTypeId !== undefined && contentTypeId . startsWith ( "0x01" ) ? objects [ contentTypeIdField ] = contentTypeId : objects ;
348+ if ( contentTypeId !== undefined && contentTypeId . startsWith ( "0x01" ) ) objects [ contentTypeIdField ] = contentTypeId ;
347349 const iar = await sp . web . lists . getById ( listId ) . items . add ( objects ) ;
348350 if ( onSubmitted ) {
349351 onSubmitted (
@@ -524,6 +526,7 @@ export class DynamicForm extends React.Component<
524526 order ++ ;
525527 const fieldType = field . TypeAsString ;
526528 field . order = order ;
529+ let cultureName : string ;
527530 let hiddenName = "" ;
528531 let termSetId = "" ;
529532 let anchorId = "" ;
@@ -549,10 +552,14 @@ export class DynamicForm extends React.Component<
549552 } ) ;
550553 } else if ( fieldType === "Note" ) {
551554 richText = field . RichText ;
552- } else if ( fieldType === "Number" ) {
555+ } else if ( fieldType === "Number" || fieldType === "Currency" ) {
553556 minValue = field . MinimumValue ;
554557 maxValue = field . MaximumValue ;
555- showAsPercentage = field . ShowAsPercentage ;
558+ if ( fieldType === "Number" ) {
559+ showAsPercentage = field . ShowAsPercentage ;
560+ } else {
561+ cultureName = this . cultureNameLookup ( field . CurrencyLocaleId ) ;
562+ }
556563 } else if ( fieldType === "Lookup" ) {
557564 lookupListId = field . LookupList ;
558565 lookupField = field . LookupField ;
@@ -699,15 +706,16 @@ export class DynamicForm extends React.Component<
699706 defaultValue = JSON . parse ( defaultValue ) ;
700707 } else if ( fieldType === "Boolean" ) {
701708 defaultValue = Boolean ( Number ( defaultValue ) ) ;
702- }
703-
709+ }
710+
704711 tempFields . push ( {
705712 newValue : null ,
706713 fieldTermSetId : termSetId ,
707714 fieldAnchorId : anchorId ,
708715 options : choices ,
709716 lookupListID : lookupListId ,
710717 lookupField : lookupField ,
718+ cultureName,
711719 changedValue : defaultValue ,
712720 fieldType : field . TypeAsString ,
713721 fieldTitle : field . Title ,
@@ -732,20 +740,31 @@ export class DynamicForm extends React.Component<
732740 description : field . Description ,
733741 minimumValue : minValue ,
734742 maximumValue : maxValue ,
735- showAsPercentage : showAsPercentage ,
743+ showAsPercentage : showAsPercentage
736744 } ) ;
737745 tempFields . sort ( ( a , b ) => a . Order - b . Order ) ;
738746 }
739747 }
740748
741- this . setState ( { fieldCollection : tempFields , etag : etag } ) ;
749+ let installedLanguages : IInstalledLanguageInfo [ ] ;
750+ if ( tempFields . filter ( f => f . fieldType === "Currency" ) . length > 0 ) {
751+ installedLanguages = await sp . web . regionalSettings . getInstalledLanguages ( ) ;
752+ }
753+
754+ this . setState ( { fieldCollection : tempFields , installedLanguages, etag } ) ;
742755 //return arrayItems;
743756 } catch ( error ) {
744757 console . log ( `Error get field informations` , error ) ;
745758 return null ;
746759 }
747760 } ;
748761
762+ private cultureNameLookup ( lcid : number ) : string {
763+ const pageCulture = this . props . context . pageContext . cultureInfo . currentCultureName ;
764+ if ( ! lcid ) return pageCulture ;
765+ return this . state . installedLanguages ?. find ( lang => lang . Lcid === lcid ) . DisplayName ?? pageCulture ;
766+ }
767+
749768 private uploadImage = async (
750769 file : IFilePickerResult
751770 ) : Promise < IUploadImageResult > => {
@@ -852,19 +871,8 @@ export class DynamicForm extends React.Component<
852871 return errorMessage ;
853872 } ;
854873
855- private validateNumberOnSubmit = ( val :IDynamicFieldProps ) : boolean => {
856- let shouldBeReturnBack = false ;
857- if ( val . fieldType === "Number" && val . showAsPercentage ) {
858- const minValue = val . minimumValue !== undefined ? val . minimumValue * 100 : undefined ;
859- const maxValue = val . maximumValue !== undefined ? val . maximumValue * 100 : undefined ;
860- if ( ( val . newValue < minValue ) || ( val . newValue > maxValue ) ) {
861- shouldBeReturnBack = true ;
862- }
863- } else if ( val . fieldType === "Number" && ! val . showAsPercentage ) {
864- if ( ( val . newValue < val . minimumValue ) || ( val . newValue > val . maximumValue ) ) {
865- shouldBeReturnBack = true ;
866- }
867- }
868- return shouldBeReturnBack ;
874+ private isEmptyNumOrString ( value : string | number ) : boolean {
875+ if ( value === null ) return true ;
876+ if ( ( value ?. toString ( ) . trim ( ) . length || 0 ) === 0 ) return true ;
869877 }
870878}
0 commit comments