1
1
/* eslint-disable @microsoft/spfx/no-async-await */
2
2
import { SPHttpClient } from "@microsoft/sp-http" ;
3
- import { sp } from "@pnp/sp/presets/all" ;
3
+ import { IInstalledLanguageInfo , sp } from "@pnp/sp/presets/all" ;
4
4
import * as strings from "ControlStrings" ;
5
5
import {
6
6
DefaultButton ,
@@ -206,14 +206,16 @@ export class DynamicForm extends React.Component<
206
206
} else if ( Array . isArray ( val . newValue ) && val . newValue . length === 0 ) {
207
207
val . fieldDefaultValue = null ;
208
208
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 ;
215
209
}
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
+ }
217
219
}
218
220
} ) ;
219
221
if ( shouldBeReturnBack ) {
@@ -343,7 +345,7 @@ export class DynamicForm extends React.Component<
343
345
try {
344
346
const contentTypeIdField = "ContentTypeId" ;
345
347
//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 ;
347
349
const iar = await sp . web . lists . getById ( listId ) . items . add ( objects ) ;
348
350
if ( onSubmitted ) {
349
351
onSubmitted (
@@ -524,6 +526,7 @@ export class DynamicForm extends React.Component<
524
526
order ++ ;
525
527
const fieldType = field . TypeAsString ;
526
528
field . order = order ;
529
+ let cultureName : string ;
527
530
let hiddenName = "" ;
528
531
let termSetId = "" ;
529
532
let anchorId = "" ;
@@ -549,10 +552,14 @@ export class DynamicForm extends React.Component<
549
552
} ) ;
550
553
} else if ( fieldType === "Note" ) {
551
554
richText = field . RichText ;
552
- } else if ( fieldType === "Number" ) {
555
+ } else if ( fieldType === "Number" || fieldType === "Currency" ) {
553
556
minValue = field . MinimumValue ;
554
557
maxValue = field . MaximumValue ;
555
- showAsPercentage = field . ShowAsPercentage ;
558
+ if ( fieldType === "Number" ) {
559
+ showAsPercentage = field . ShowAsPercentage ;
560
+ } else {
561
+ cultureName = this . cultureNameLookup ( field . CurrencyLocaleId ) ;
562
+ }
556
563
} else if ( fieldType === "Lookup" ) {
557
564
lookupListId = field . LookupList ;
558
565
lookupField = field . LookupField ;
@@ -699,15 +706,16 @@ export class DynamicForm extends React.Component<
699
706
defaultValue = JSON . parse ( defaultValue ) ;
700
707
} else if ( fieldType === "Boolean" ) {
701
708
defaultValue = Boolean ( Number ( defaultValue ) ) ;
702
- }
703
-
709
+ }
710
+
704
711
tempFields . push ( {
705
712
newValue : null ,
706
713
fieldTermSetId : termSetId ,
707
714
fieldAnchorId : anchorId ,
708
715
options : choices ,
709
716
lookupListID : lookupListId ,
710
717
lookupField : lookupField ,
718
+ cultureName,
711
719
changedValue : defaultValue ,
712
720
fieldType : field . TypeAsString ,
713
721
fieldTitle : field . Title ,
@@ -732,20 +740,31 @@ export class DynamicForm extends React.Component<
732
740
description : field . Description ,
733
741
minimumValue : minValue ,
734
742
maximumValue : maxValue ,
735
- showAsPercentage : showAsPercentage ,
743
+ showAsPercentage : showAsPercentage
736
744
} ) ;
737
745
tempFields . sort ( ( a , b ) => a . Order - b . Order ) ;
738
746
}
739
747
}
740
748
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 } ) ;
742
755
//return arrayItems;
743
756
} catch ( error ) {
744
757
console . log ( `Error get field informations` , error ) ;
745
758
return null ;
746
759
}
747
760
} ;
748
761
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
+
749
768
private uploadImage = async (
750
769
file : IFilePickerResult
751
770
) : Promise < IUploadImageResult > => {
@@ -852,19 +871,8 @@ export class DynamicForm extends React.Component<
852
871
return errorMessage ;
853
872
} ;
854
873
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 ;
869
877
}
870
878
}
0 commit comments